From c4697c01a93ee3e61e9edd4f6358199835c2a762 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 3 May 2010 13:15:18 +0000 Subject: [PATCH] Patch by Andreas Faerber: Implemented fallbacks (e801 and 88) to get the memory map in case e820 is not supported by the BIOS. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36595 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/system/boot/platform/bios_ia32/mmu.cpp | 33 +++++++++++++++++----- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/system/boot/platform/bios_ia32/mmu.cpp b/src/system/boot/platform/bios_ia32/mmu.cpp index 1f0fb21791..8e324dbc5f 100644 --- a/src/system/boot/platform/bios_ia32/mmu.cpp +++ b/src/system/boot/platform/bios_ia32/mmu.cpp @@ -309,7 +309,7 @@ get_memory_map(extended_memory **_extendedMemory) regs.edx = 'SMAP'; call_bios(0x15, ®s); - if (regs.flags & CARRY_FLAG) + if ((regs.flags & CARRY_FLAG) != 0) return 0; regs.edi += sizeof(extended_memory); @@ -716,17 +716,36 @@ mmu_init(void) } } } else { - // TODO: for now! - dprintf("No extended memory block - using 64 MB (fix me!)\n"); - uint32 memSize = 64 * 1024 * 1024; - + bios_regs regs; + // We dont have an extended map, assume memory is contiguously mapped // at 0x0, but leave out the BIOS range ((640k - 1 page) to 1 MB). gKernelArgs.physical_memory_range[0].start = 0; gKernelArgs.physical_memory_range[0].size = 0x9f000; gKernelArgs.physical_memory_range[1].start = 0x100000; - gKernelArgs.physical_memory_range[1].size = memSize - 0x100000; - gKernelArgs.num_physical_memory_ranges = 2; + + regs.eax = 0xe801; // AX + call_bios(0x15, ®s); + if ((regs.flags & CARRY_FLAG) != 0) { + regs.eax = 0x8800; // AH 88h + call_bios(0x15, ®s); + if ((regs.flags & CARRY_FLAG) != 0) { + // TODO: for now! + dprintf("No memory size - using 64 MB (fix me!)\n"); + uint32 memSize = 64 * 1024 * 1024; + gKernelArgs.physical_memory_range[1].size = memSize - 0x100000; + } else { + dprintf("Get Extended Memory Size succeeded.\n"); + gKernelArgs.physical_memory_range[1].size = regs.eax * 1024; + } + gKernelArgs.num_physical_memory_ranges = 2; + } else { + dprintf("Get Memory Size for Large Configurations succeeded.\n"); + gKernelArgs.physical_memory_range[1].size = regs.ecx * 1024; + gKernelArgs.physical_memory_range[2].start = 0x1000000; + gKernelArgs.physical_memory_range[2].size = regs.edx * 64 * 1024; + gKernelArgs.num_physical_memory_ranges = 3; + } } gKernelArgs.arch_args.page_hole = 0xffc00000;