[haiku-commits] r37224 - in haiku/trunk: headers/private/kernel/boot src/system/boot/loader

  • From: ingo_weinhold@xxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Wed, 23 Jun 2010 13:10:01 +0200 (CEST)

Author: bonefish
Date: 2010-06-23 13:10:01 +0200 (Wed, 23 Jun 2010)
New Revision: 37224
Changeset: http://dev.haiku-os.org/changeset/37224/haiku

Modified:
   haiku/trunk/headers/private/kernel/boot/addr_range.h
   haiku/trunk/src/system/boot/loader/kernel_args.cpp
Log:
Added ignore_physical_memory_ranges_beyond_4gb() which removes the memory
beyond 4 GB from the physical memory ranges.


Modified: haiku/trunk/headers/private/kernel/boot/addr_range.h
===================================================================
--- haiku/trunk/headers/private/kernel/boot/addr_range.h        2010-06-22 
18:11:08 UTC (rev 37223)
+++ haiku/trunk/headers/private/kernel/boot/addr_range.h        2010-06-23 
11:10:01 UTC (rev 37224)
@@ -49,6 +49,7 @@
 status_t insert_physical_memory_range(phys_addr_t start, phys_size_t size);
 status_t insert_physical_allocated_range(phys_addr_t start, phys_size_t size);
 status_t insert_virtual_allocated_range(addr_t start, size_t size);
+void ignore_physical_memory_ranges_beyond_4gb();
 
 #ifdef __cplusplus
 }

Modified: haiku/trunk/src/system/boot/loader/kernel_args.cpp
===================================================================
--- haiku/trunk/src/system/boot/loader/kernel_args.cpp  2010-06-22 18:11:08 UTC 
(rev 37223)
+++ haiku/trunk/src/system/boot/loader/kernel_args.cpp  2010-06-23 11:10:01 UTC 
(rev 37224)
@@ -396,6 +396,46 @@
 }
 
 
+#if B_HAIKU_PHYSICAL_BITS > 32
+
+void
+ignore_physical_memory_ranges_beyond_4gb()
+{
+       // sort
+       sort_physical_address_ranges(gKernelArgs.physical_memory_range,
+               gKernelArgs.num_physical_memory_ranges);
+
+       static const phys_addr_t kLimit = (phys_addr_t)1 << 32;
+
+       // remove everything past 4 GB
+       for (uint32 i = gKernelArgs.num_physical_memory_ranges; i > 0; i--) {
+               phys_addr_range& range = gKernelArgs.physical_memory_range[i - 
1];
+               if (range.start >= kLimit) {
+                       // the complete range is beyond the limit
+                       dprintf("ignore_physical_memory_ranges_beyond_4gb(): 
ignoring "
+                               "range: %#" B_PRIxPHYSADDR " - %#" 
B_PRIxPHYSADDR "\n",
+                               range.start, range.start + range.size);
+                       gKernelArgs.ignored_physical_memory += range.size;
+                       gKernelArgs.num_physical_memory_ranges = i - 1;
+                       continue;
+               }
+
+               if (kLimit - range.start < range.size) {
+                       // the range is partially beyond the limit
+                       dprintf("ignore_physical_memory_ranges_beyond_4gb(): 
ignoring "
+                               "range: %#" B_PRIxPHYSADDR " - %#" 
B_PRIxPHYSADDR "\n", kLimit,
+                               range.start + range.size);
+                       gKernelArgs.ignored_physical_memory
+                               += range.size - (kLimit - range.start);
+               }
+
+               break;
+       }
+}
+
+#endif // B_HAIKU_PHYSICAL_BITS > 32
+
+
 // #pragma mark - kernel_args allocations
 
 


Other related posts:

  • » [haiku-commits] r37224 - in haiku/trunk: headers/private/kernel/boot src/system/boot/loader - ingo_weinhold