Build an overlap map if entries completely overlap
This commit adds the logic to construct the overlap map used by the split_entry() function later. The reason an overlap map must be constructed is because complete overlaps within a usable region of memory may happen multiple times. The overlap map keeps track of these overlaps so that entries are correctly split if that is the case.
This commit is contained in:
parent
c8581242a9
commit
5c289f58b4
|
@ -150,8 +150,10 @@ static size_t split_entry(struct memmap_entry *dst, struct memmap_entry *bad, st
|
|||
}
|
||||
|
||||
static void sanitise_entries(struct memmap_entry *m, size_t *_count, bool align_entries) {
|
||||
size_t num_overlaps;
|
||||
size_t count = *_count;
|
||||
|
||||
num_overlaps = 0;
|
||||
for (size_t i = 0; i < count; i++) {
|
||||
if (m[i].type != MEMMAP_USABLE)
|
||||
continue;
|
||||
|
@ -171,10 +173,9 @@ static void sanitise_entries(struct memmap_entry *m, size_t *_count, bool align_
|
|||
|
||||
if ( (res_base >= base && res_base < top)
|
||||
&& (res_top >= base && res_top < top) ) {
|
||||
// TODO actually handle splitting off usable chunks
|
||||
panic(false, "A non-usable memory map entry is inside a usable section.");
|
||||
}
|
||||
|
||||
overlap[num_overlaps++] = m + j;
|
||||
overlap[num_overlaps++] = m + i;
|
||||
} else {
|
||||
if (res_base >= base && res_base < top) {
|
||||
top = res_base;
|
||||
}
|
||||
|
@ -186,6 +187,7 @@ static void sanitise_entries(struct memmap_entry *m, size_t *_count, bool align_
|
|||
m[i].base = base;
|
||||
m[i].length = top - base;
|
||||
}
|
||||
}
|
||||
|
||||
if (!m[i].length
|
||||
|| (align_entries && !align_entry(&m[i].base, &m[i].length))) {
|
||||
|
|
Loading…
Reference in New Issue