vmm: fix linked list

This commit is contained in:
Matheus
2023-07-03 22:54:52 -03:00
parent 032560bda0
commit 222ff36fb6
+10 -1
View File
@@ -161,6 +161,7 @@ static void insertrange(vmmspace_t *space, vmmrange_t *newrange) {
space->ranges = newrange; space->ranges = newrange;
newrange->next = range; newrange->next = range;
range->prev = newrange; range->prev = newrange;
newrange->prev = NULL;
goto fragcheck; goto fragcheck;
} }
@@ -185,6 +186,9 @@ static void insertrange(vmmspace_t *space, vmmrange_t *newrange) {
vmmrange_t *oldrange = newrange->next; vmmrange_t *oldrange = newrange->next;
newrange->size += oldrange->size; newrange->size += oldrange->size;
newrange->next = oldrange->next; newrange->next = oldrange->next;
if (oldrange->next)
oldrange->next->prev = newrange;
freerange(oldrange); freerange(oldrange);
} }
@@ -192,8 +196,13 @@ static void insertrange(vmmspace_t *space, vmmrange_t *newrange) {
vmmrange_t *oldrange = newrange->prev; vmmrange_t *oldrange = newrange->prev;
oldrange->size += newrange->size; oldrange->size += newrange->size;
oldrange->next = newrange->next; oldrange->next = newrange->next;
if (newrange->next)
newrange->next->prev = oldrange;
freerange(newrange); freerange(newrange);
} }
} }
static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _offset, size_t size, int flags) { static void destroyrange(vmmcontext_t *context, vmmrange_t *range, uintmax_t _offset, size_t size, int flags) {
@@ -224,6 +233,7 @@ static void unmap(vmmcontext_t *context, void *address, size_t size) {
vmmrange_t *range = space->ranges; vmmrange_t *range = space->ranges;
while (range) { while (range) {
__assert(range != space->ranges || range->prev == NULL);
void *rangetop = RANGE_TOP(range); void *rangetop = RANGE_TOP(range);
// completely unmapped // completely unmapped
if (range->start >= address && rangetop <= top) { if (range->start >= address && rangetop <= top) {
@@ -247,7 +257,6 @@ static void unmap(vmmcontext_t *context, void *address, size_t size) {
new->start = top; new->start = top;
new->size = (uintptr_t)rangetop - (uintptr_t)new->start; new->size = (uintptr_t)rangetop - (uintptr_t)new->start;
range->size = (uintptr_t)address - (uintptr_t)range->start; range->size = (uintptr_t)address - (uintptr_t)range->start;
new->prev = range; new->prev = range;
range->next = new; range->next = new;