[haiku-commits] r35644 - haiku/trunk/src/system/kernel/arch/x86

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 27 Feb 2010 22:20:29 +0100 (CET)

Author: bonefish
Date: 2010-02-27 22:20:29 +0100 (Sat, 27 Feb 2010)
New Revision: 35644
Changeset: http://dev.haiku-os.org/changeset/35644/haiku
Ticket: http://dev.haiku-os.org/ticket/1925

Modified:
   haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp
   
haiku/trunk/src/system/kernel/arch/x86/x86_physical_page_mapper_large_memory.cpp
Log:
* large_memory_physical_page_ops_init(): Don't assign the return value before
  it is fully initialized.
* arch_vm_translation_map_is_kernel_page_accessible(): Check whether
  sPhysicalPageMapper has already been initialized.

If a panic() during or before the initialization of the physical page mapper
occurred, we no longer access a partially initialized object or a NULL pointer.
This should fix the triple fault part of #1925.


Modified: haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp
===================================================================
--- haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp  
2010-02-27 21:03:40 UTC (rev 35643)
+++ haiku/trunk/src/system/kernel/arch/x86/arch_vm_translation_map.cpp  
2010-02-27 21:20:29 UTC (rev 35644)
@@ -1446,7 +1446,7 @@
 
        if (physicalPageDirectory == (addr_t)sKernelPhysicalPageDirectory) {
                pageDirectoryEntry = sKernelVirtualPageDirectory[index];
-       } else {
+       } else if (sPhysicalPageMapper != NULL) {
                // map the original page directory and get the entry
                void* handle;
                addr_t virtualPageDirectory;
@@ -1459,13 +1459,15 @@
                                handle);
                } else
                        pageDirectoryEntry = 0;
-       }
+       } else
+               pageDirectoryEntry = 0;
 
        // map the page table and get the entry
        page_table_entry pageTableEntry;
        index = VADDR_TO_PTENT(virtualAddress);
 
-       if ((pageDirectoryEntry & X86_PDE_PRESENT) != 0) {
+       if ((pageDirectoryEntry & X86_PDE_PRESENT) != 0
+                       && sPhysicalPageMapper != NULL) {
                void* handle;
                addr_t virtualPageTable;
                status_t error = sPhysicalPageMapper->GetPageDebug(

Modified: 
haiku/trunk/src/system/kernel/arch/x86/x86_physical_page_mapper_large_memory.cpp
===================================================================
--- 
haiku/trunk/src/system/kernel/arch/x86/x86_physical_page_mapper_large_memory.cpp
    2010-02-27 21:03:40 UTC (rev 35643)
+++ 
haiku/trunk/src/system/kernel/arch/x86/x86_physical_page_mapper_large_memory.cpp
    2010-02-27 21:20:29 UTC (rev 35644)
@@ -918,8 +918,9 @@
        X86PhysicalPageMapper*& _pageMapper,
        TranslationMapPhysicalPageMapper*& _kernelPageMapper)
 {
-       _pageMapper = new(&sPhysicalPageMapper) LargeMemoryPhysicalPageMapper;
+       new(&sPhysicalPageMapper) LargeMemoryPhysicalPageMapper;
        sPhysicalPageMapper.Init(args, _kernelPageMapper);
 
+       _pageMapper = &sPhysicalPageMapper;
        return B_OK;
 }


Other related posts:

  • » [haiku-commits] r35644 - haiku/trunk/src/system/kernel/arch/x86 - ingo_weinhold