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