Author: bonefish Date: 2010-05-27 19:08:47 +0200 (Thu, 27 May 2010) New Revision: 36951 Changeset: http://dev.haiku-os.org/changeset/36951/haiku Modified: haiku/trunk/headers/private/kernel/boot/addr_range.h haiku/trunk/src/system/boot/loader/kernel_args.cpp haiku/trunk/src/system/boot/platform/atari_m68k/mmu.cpp haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp Log: Added shared sort_[physical_]address_ranges() to avoid code duplication. Also fixes the m68k build. Modified: haiku/trunk/headers/private/kernel/boot/addr_range.h =================================================================== --- haiku/trunk/headers/private/kernel/boot/addr_range.h 2010-05-27 15:53:35 UTC (rev 36950) +++ haiku/trunk/headers/private/kernel/boot/addr_range.h 2010-05-27 17:08:47 UTC (rev 36951) @@ -34,6 +34,7 @@ size_t size, addr_t* _rangeBase); bool is_address_range_covered(addr_range* ranges, uint32 numRanges, addr_t base, size_t size); +void sort_address_ranges(addr_range* ranges, uint32 numRanges); status_t insert_physical_address_range(phys_addr_range* ranges, uint32* _numRanges, uint32 maxRanges, phys_addr_t start, phys_size_t size); @@ -43,6 +44,7 @@ phys_addr_t base, phys_size_t size, phys_addr_t* _rangeBase); bool is_physical_address_range_covered(phys_addr_range* ranges, uint32 numRanges, phys_addr_t base, phys_size_t size); +void sort_physical_address_ranges(phys_addr_range* ranges, uint32 numRanges); 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); Modified: haiku/trunk/src/system/boot/loader/kernel_args.cpp =================================================================== --- haiku/trunk/src/system/boot/loader/kernel_args.cpp 2010-05-27 15:53:35 UTC (rev 36950) +++ haiku/trunk/src/system/boot/loader/kernel_args.cpp 2010-05-27 17:08:47 UTC (rev 36951) @@ -233,6 +233,28 @@ } +template<typename RangeType> +static void +sort_ranges(RangeType* ranges, uint32 count) +{ + // TODO: This is a pretty sucky bubble sort implementation! + bool done; + + do { + done = true; + for (uint32 i = 1; i < count; i++) { + if (ranges[i].start < ranges[i - 1].start) { + done = false; + RangeType tempRange; + memcpy(&tempRange, &ranges[i], sizeof(RangeType)); + memcpy(&ranges[i], &ranges[i - 1], sizeof(RangeType)); + memcpy(&ranges[i - 1], &tempRange, sizeof(RangeType)); + } + } + } while (!done); +} + + // #pragma mark - @@ -291,6 +313,13 @@ } +void +sort_address_ranges(addr_range* ranges, uint32 numRanges) +{ + sort_ranges(ranges, numRanges); +} + + // #pragma mark - phys_addr_range utility functions @@ -330,6 +359,13 @@ } +void +sort_physical_address_ranges(phys_addr_range* ranges, uint32 numRanges) +{ + sort_ranges(ranges, numRanges); +} + + // #pragma mark - kernel args range functions Modified: haiku/trunk/src/system/boot/platform/atari_m68k/mmu.cpp =================================================================== --- haiku/trunk/src/system/boot/platform/atari_m68k/mmu.cpp 2010-05-27 15:53:35 UTC (rev 36950) +++ haiku/trunk/src/system/boot/platform/atari_m68k/mmu.cpp 2010-05-27 17:08:47 UTC (rev 36951) @@ -238,27 +238,6 @@ static void -sort_addr_range(addr_range *range, int count) -{ - addr_range tempRange; - bool done; - int i; - - do { - done = true; - for (i = 1; i < count; i++) { - if (range[i].start < range[i - 1].start) { - done = false; - memcpy(&tempRange, &range[i], sizeof(addr_range)); - memcpy(&range[i], &range[i - 1], sizeof(addr_range)); - memcpy(&range[i - 1], &tempRange, sizeof(addr_range)); - } - } - } while (!done); -} - - -static void init_page_directory(void) { TRACE(("init_page_directory\n")); @@ -524,9 +503,12 @@ gKernelArgs.num_virtual_allocated_ranges = 1; // sort the address ranges - sort_addr_range(gKernelArgs.physical_memory_range, gKernelArgs.num_physical_memory_ranges); - sort_addr_range(gKernelArgs.physical_allocated_range, gKernelArgs.num_physical_allocated_ranges); - sort_addr_range(gKernelArgs.virtual_allocated_range, gKernelArgs.num_virtual_allocated_ranges); + sort_physical_address_ranges(gKernelArgs.physical_memory_range, + gKernelArgs.num_physical_memory_ranges); + sort_physical_address_ranges(gKernelArgs.physical_allocated_range, + gKernelArgs.num_physical_allocated_ranges); + sort_address_ranges(gKernelArgs.virtual_allocated_range, + gKernelArgs.num_virtual_allocated_ranges); #ifdef TRACE_MMU { Modified: haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp =================================================================== --- haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp 2010-05-27 15:53:35 UTC (rev 36950) +++ haiku/trunk/src/system/boot/platform/bios_ia32/mmu.cpp 2010-05-27 17:08:47 UTC (rev 36951) @@ -258,29 +258,6 @@ } -template<typename RangeType> -static void -sort_addr_range(RangeType *range, int count) -{ - RangeType tempRange; - bool done; - int i; - - do { - done = true; - for (i = 1; i < count; i++) { - if (range[i].start < range[i - 1].start) { - done = false; - memcpy(&tempRange, &range[i], sizeof(RangeType)); - memcpy(&range[i], &range[i - 1], sizeof(RangeType)); - memcpy(&range[i - 1], &tempRange, sizeof(RangeType)); - } - } - } while (!done); -} - - - #ifdef TRACE_MEMORY_MAP static const char * e820_memory_type(uint32 type) @@ -601,11 +578,11 @@ gKernelArgs.num_virtual_allocated_ranges = 1; // sort the address ranges - sort_addr_range(gKernelArgs.physical_memory_range, + sort_physical_address_ranges(gKernelArgs.physical_memory_range, gKernelArgs.num_physical_memory_ranges); - sort_addr_range(gKernelArgs.physical_allocated_range, + sort_physical_address_ranges(gKernelArgs.physical_allocated_range, gKernelArgs.num_physical_allocated_ranges); - sort_addr_range(gKernelArgs.virtual_allocated_range, + sort_address_ranges(gKernelArgs.virtual_allocated_range, gKernelArgs.num_virtual_allocated_ranges); #ifdef TRACE_MEMORY_MAP @@ -706,7 +683,7 @@ } // sort the ranges - sort_addr_range(gKernelArgs.physical_memory_range, + sort_physical_address_ranges(gKernelArgs.physical_memory_range, gKernelArgs.num_physical_memory_ranges); // On some machines we get several ranges that contain only a few pages