From e5846dfa616a8ddf80af0c5840991fca4d669031 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Thu, 27 May 2010 17:08:47 +0000 Subject: [PATCH] Added shared sort_[physical_]address_ranges() to avoid code duplication. Also fixes the m68k build. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36951 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/boot/addr_range.h | 2 ++ src/system/boot/loader/kernel_args.cpp | 36 +++++++++++++++++++++ src/system/boot/platform/atari_m68k/mmu.cpp | 30 ++++------------- src/system/boot/platform/bios_ia32/mmu.cpp | 31 +++--------------- 4 files changed, 48 insertions(+), 51 deletions(-) diff --git a/headers/private/kernel/boot/addr_range.h b/headers/private/kernel/boot/addr_range.h index 53622682cc..378df17101 100644 --- a/headers/private/kernel/boot/addr_range.h +++ b/headers/private/kernel/boot/addr_range.h @@ -34,6 +34,7 @@ bool get_free_address_range(addr_range* ranges, uint32 numRanges, addr_t base, 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 @@ bool get_free_physical_address_range(phys_addr_range* ranges, uint32 numRanges, 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); diff --git a/src/system/boot/loader/kernel_args.cpp b/src/system/boot/loader/kernel_args.cpp index f68d9c8f9d..4741bc4029 100644 --- a/src/system/boot/loader/kernel_args.cpp +++ b/src/system/boot/loader/kernel_args.cpp @@ -233,6 +233,28 @@ is_range_covered(RangeType* ranges, uint32 numRanges, AddressType base, } +template +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 @@ is_address_range_covered(addr_range* ranges, uint32 numRanges, addr_t base, } +void +sort_address_ranges(addr_range* ranges, uint32 numRanges) +{ + sort_ranges(ranges, numRanges); +} + + // #pragma mark - phys_addr_range utility functions @@ -330,6 +359,13 @@ is_physical_address_range_covered(phys_addr_range* ranges, uint32 numRanges, } +void +sort_physical_address_ranges(phys_addr_range* ranges, uint32 numRanges) +{ + sort_ranges(ranges, numRanges); +} + + // #pragma mark - kernel args range functions diff --git a/src/system/boot/platform/atari_m68k/mmu.cpp b/src/system/boot/platform/atari_m68k/mmu.cpp index b4631f1940..9c459b1e88 100644 --- a/src/system/boot/platform/atari_m68k/mmu.cpp +++ b/src/system/boot/platform/atari_m68k/mmu.cpp @@ -237,27 +237,6 @@ map_page(addr_t virtualAddress, addr_t physicalAddress, uint32 flags) } -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) { @@ -524,9 +503,12 @@ mmu_init_for_kernel(void) 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 { diff --git a/src/system/boot/platform/bios_ia32/mmu.cpp b/src/system/boot/platform/bios_ia32/mmu.cpp index 63c81dae48..d92e9757e7 100644 --- a/src/system/boot/platform/bios_ia32/mmu.cpp +++ b/src/system/boot/platform/bios_ia32/mmu.cpp @@ -258,29 +258,6 @@ map_page(addr_t virtualAddress, addr_t physicalAddress, uint32 flags) } -template -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 @@ mmu_init_for_kernel(void) 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 @@ mmu_init(void) } // 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