From 863c623f9ab2bb1cb942d4bfc42a9baf12b0e069 Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Wed, 5 May 2010 21:09:11 +0000 Subject: [PATCH] Added is_address_range_covered(), returning whether the given address range is fully covered by the ranges in the array. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@36631 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/private/kernel/boot/addr_range.h | 2 ++ src/system/boot/loader/kernel_args.cpp | 36 ++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 2 deletions(-) diff --git a/headers/private/kernel/boot/addr_range.h b/headers/private/kernel/boot/addr_range.h index f2fdc4aaac..1fd2f0c98a 100644 --- a/headers/private/kernel/boot/addr_range.h +++ b/headers/private/kernel/boot/addr_range.h @@ -25,6 +25,8 @@ status_t remove_address_range(addr_range *ranges, uint32 *_numRanges, uint32 maxRanges, addr_t start, uint32 size); 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); status_t insert_physical_memory_range(addr_t start, uint32 size); status_t insert_physical_allocated_range(addr_t start, uint32 size); diff --git a/src/system/boot/loader/kernel_args.cpp b/src/system/boot/loader/kernel_args.cpp index f66014e0a2..d34266e29e 100644 --- a/src/system/boot/loader/kernel_args.cpp +++ b/src/system/boot/loader/kernel_args.cpp @@ -6,12 +6,14 @@ #include +#include + +#include + #include #include #include -#include - static const size_t kChunkSize = 8 * B_PAGE_SIZE; @@ -214,6 +216,36 @@ get_free_address_range(addr_range *ranges, uint32 numRanges, addr_t base, } +bool +is_address_range_covered(addr_range* ranges, uint32 numRanges, addr_t base, + size_t size) +{ + // Note: We don't assume that the ranges are sorted, so we can't do this + // in a simple loop. Instead we restart the loop whenever the start of the + // given range intersects with an existing one. + + for (uint32 i = 0; i < numRanges;) { + addr_t rangeStart = ranges[i].start; + addr_t rangeSize = ranges[i].size; + + if (rangeStart <= base && rangeSize > base - rangeStart) { + size_t intersect = std::min(rangeStart + rangeSize - base, size); + base += intersect; + size -= intersect; + if (size == 0) + return true; + + i = 0; + continue; + } + + i++; + } + + return false; +} + + status_t insert_physical_memory_range(addr_t start, uint32 size) {