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
This commit is contained in:
Ingo Weinhold
2010-05-27 17:08:47 +00:00
parent 0cf9610449
commit e5846dfa61
4 changed files with 48 additions and 51 deletions
+2
View File
@@ -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);
+36
View File
@@ -233,6 +233,28 @@ is_range_covered(RangeType* ranges, uint32 numRanges, AddressType base,
}
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 @@ 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
+6 -24
View File
@@ -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
{
+4 -27
View File
@@ -258,29 +258,6 @@ map_page(addr_t virtualAddress, addr_t physicalAddress, uint32 flags)
}
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 @@ 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