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; }