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);
|
size_t size, addr_t* _rangeBase);
|
||||||
bool is_address_range_covered(addr_range* ranges, uint32 numRanges, addr_t base,
|
bool is_address_range_covered(addr_range* ranges, uint32 numRanges, addr_t base,
|
||||||
size_t size);
|
size_t size);
|
||||||
|
void sort_address_ranges(addr_range* ranges, uint32 numRanges);
|
||||||
|
|
||||||
status_t insert_physical_address_range(phys_addr_range* ranges,
|
status_t insert_physical_address_range(phys_addr_range* ranges,
|
||||||
uint32* _numRanges, uint32 maxRanges, phys_addr_t start, phys_size_t size);
|
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);
|
phys_addr_t base, phys_size_t size, phys_addr_t* _rangeBase);
|
||||||
bool is_physical_address_range_covered(phys_addr_range* ranges,
|
bool is_physical_address_range_covered(phys_addr_range* ranges,
|
||||||
uint32 numRanges, phys_addr_t base, phys_size_t size);
|
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_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_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 -
|
// #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
|
// #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
|
// #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
|
static void
|
||||||
init_page_directory(void)
|
init_page_directory(void)
|
||||||
{
|
{
|
||||||
@@ -524,9 +503,12 @@ mmu_init_for_kernel(void)
|
|||||||
gKernelArgs.num_virtual_allocated_ranges = 1;
|
gKernelArgs.num_virtual_allocated_ranges = 1;
|
||||||
|
|
||||||
// sort the address ranges
|
// sort the address ranges
|
||||||
sort_addr_range(gKernelArgs.physical_memory_range, gKernelArgs.num_physical_memory_ranges);
|
sort_physical_address_ranges(gKernelArgs.physical_memory_range,
|
||||||
sort_addr_range(gKernelArgs.physical_allocated_range, gKernelArgs.num_physical_allocated_ranges);
|
gKernelArgs.num_physical_memory_ranges);
|
||||||
sort_addr_range(gKernelArgs.virtual_allocated_range, gKernelArgs.num_virtual_allocated_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
|
#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
|
#ifdef TRACE_MEMORY_MAP
|
||||||
static const char *
|
static const char *
|
||||||
e820_memory_type(uint32 type)
|
e820_memory_type(uint32 type)
|
||||||
@@ -601,11 +578,11 @@ mmu_init_for_kernel(void)
|
|||||||
gKernelArgs.num_virtual_allocated_ranges = 1;
|
gKernelArgs.num_virtual_allocated_ranges = 1;
|
||||||
|
|
||||||
// sort the address ranges
|
// sort the address ranges
|
||||||
sort_addr_range(gKernelArgs.physical_memory_range,
|
sort_physical_address_ranges(gKernelArgs.physical_memory_range,
|
||||||
gKernelArgs.num_physical_memory_ranges);
|
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);
|
gKernelArgs.num_physical_allocated_ranges);
|
||||||
sort_addr_range(gKernelArgs.virtual_allocated_range,
|
sort_address_ranges(gKernelArgs.virtual_allocated_range,
|
||||||
gKernelArgs.num_virtual_allocated_ranges);
|
gKernelArgs.num_virtual_allocated_ranges);
|
||||||
|
|
||||||
#ifdef TRACE_MEMORY_MAP
|
#ifdef TRACE_MEMORY_MAP
|
||||||
@@ -706,7 +683,7 @@ mmu_init(void)
|
|||||||
}
|
}
|
||||||
|
|
||||||
// sort the ranges
|
// sort the ranges
|
||||||
sort_addr_range(gKernelArgs.physical_memory_range,
|
sort_physical_address_ranges(gKernelArgs.physical_memory_range,
|
||||||
gKernelArgs.num_physical_memory_ranges);
|
gKernelArgs.num_physical_memory_ranges);
|
||||||
|
|
||||||
// On some machines we get several ranges that contain only a few pages
|
// On some machines we get several ranges that contain only a few pages
|
||||||
|
|||||||
Reference in New Issue
Block a user