diff --git a/src/system/kernel/arch/x86/paging/32bit/X86PagingMethod32Bit.cpp b/src/system/kernel/arch/x86/paging/32bit/X86PagingMethod32Bit.cpp index 181baa9d3e..2bbfeeb55f 100644 --- a/src/system/kernel/arch/x86/paging/32bit/X86PagingMethod32Bit.cpp +++ b/src/system/kernel/arch/x86/paging/32bit/X86PagingMethod32Bit.cpp @@ -276,6 +276,16 @@ X86PagingMethod32Bit::Init(kernel_args* args, { TRACE("X86PagingMethod32Bit::Init(): entry\n"); + // Ignore all memory beyond the maximum 32-bit address. + static const phys_addr_t kLimit = 1ULL << 32; + for (uint32 i = 0; i < args->num_physical_memory_ranges; i++) { + addr_range& range = args->physical_memory_range[i]; + if (range.start >= kLimit) + range.size = 0; + else if ((range.start + range.size) > kLimit) + range.size = kLimit - range.start; + } + // page hole set up in stage2 fPageHole = (page_table_entry*)(addr_t)args->arch_args.page_hole; // calculate where the pgdir would be diff --git a/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp b/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp index 824974f03a..56b51a17c0 100644 --- a/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp +++ b/src/system/kernel/arch/x86/paging/pae/X86PagingMethodPAE.cpp @@ -584,6 +584,16 @@ status_t X86PagingMethodPAE::Init(kernel_args* args, VMPhysicalPageMapper** _physicalPageMapper) { + // Ignore all memory beyond the maximum PAE address. + static const phys_addr_t kLimit = 1ULL << 36; + for (uint32 i = 0; i < args->num_physical_memory_ranges; i++) { + addr_range& range = args->physical_memory_range[i]; + if (range.start >= kLimit) + range.size = 0; + else if ((range.start + range.size) > kLimit) + range.size = kLimit - range.start; + } + // switch to PAE ToPAESwitcher(args).Switch(fKernelVirtualPageDirPointerTable, fKernelPhysicalPageDirPointerTable, fEarlyPageStructures,