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:
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
|
||||
@@ -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
|
||||
{
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user