mirror of
https://github.com/Mathewnd/Astral.git
synced 2026-11-01 15:08:21 +00:00
vmm: fix linked list
This commit is contained in:
+10
-1
@@ -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;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user