[haiku-commits] r36595 - haiku/trunk/src/system/boot/platform/bios_ia32

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Mon, 3 May 2010 15:15:18 +0200 (CEST)

Author: bonefish
Date: 2010-05-03 15:15:18 +0200 (Mon, 03 May 2010)
New Revision: 36595
Changeset: http://dev.haiku-os.org/changeset/36595/haiku

Modified:
   haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp
Log:
Patch by Andreas Faerber: Implemented fallbacks (e801 and 88) to get the
memory map in case e820 is not supported by the BIOS.


Modified: haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp
===================================================================
--- haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp      2010-05-03 
12:44:48 UTC (rev 36594)
+++ haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp      2010-05-03 
13:15:18 UTC (rev 36595)
@@ -309,7 +309,7 @@
                regs.edx = 'SMAP';
 
                call_bios(0x15, &regs);
-               if (regs.flags & CARRY_FLAG)
+               if ((regs.flags & CARRY_FLAG) != 0)
                        return 0;
 
                regs.edi += sizeof(extended_memory);
@@ -716,17 +716,36 @@
                        }
                }
        } 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, &regs);
+               if ((regs.flags & CARRY_FLAG) != 0) {
+                       regs.eax = 0x8800; // AH 88h
+                       call_bios(0x15, &regs);
+                       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;


Other related posts:

  • » [haiku-commits] r36595 - haiku/trunk/src/system/boot/platform/bios_ia32 - ingo_weinhold