diff --git a/core/mem_region.c b/core/mem_region.c index eb48a1a11c2a..003a91812c26 100644 --- a/core/mem_region.c +++ b/core/mem_region.c @@ -734,7 +734,7 @@ static bool maybe_split(struct mem_region *r, uint64_t split_at) return false; /* Tail add is important: we may need to split again! */ - list_add_tail(®ions, &tail->list); + list_add_after(®ions, &tail->list, &r->list); return true; } @@ -763,6 +763,20 @@ static struct mem_region *get_overlap(const struct mem_region *region) return NULL; } +static void add_region_to_regions(struct mem_region *region) +{ + struct mem_region *r; + + list_for_each(®ions, r, list) { + if (r->start < region->start) + continue; + + list_add_before(®ions, ®ion->list, &r->list); + return; + } + list_add_tail(®ions, ®ion->list); +} + static bool add_region(struct mem_region *region) { struct mem_region *r; @@ -807,7 +821,7 @@ static bool add_region(struct mem_region *region) } /* Finally, add in our own region. */ - list_add(®ions, ®ion->list); + add_region_to_regions(region); return true; } @@ -1091,7 +1105,7 @@ void mem_region_init(void) prerror("MEM: Could not add mem region %s!\n", i->name); abort(); } - list_add(®ions, ®ion->list); + add_region_to_regions(region); if ((start + len) > top_of_ram) top_of_ram = start + len; unlock(&mem_region_lock); diff --git a/core/test/run-mem_region_next.c b/core/test/run-mem_region_next.c index b14e41d07072..bab214f740ac 100644 --- a/core/test/run-mem_region_next.c +++ b/core/test/run-mem_region_next.c @@ -85,13 +85,13 @@ int main(void) r = mem_region_next(NULL); assert(r); - assert(r->start == 0x2000); + assert(r->start == 0x1000); assert(r->len == 0x1000); assert(r->type == REGION_RESERVED); r = mem_region_next(r); assert(r); - assert(r->start == 0x1000); + assert(r->start == 0x2000); assert(r->len == 0x1000); assert(r->type == REGION_RESERVED); diff --git a/core/test/run-mem_region_release_unused_noalloc.c b/core/test/run-mem_region_release_unused_noalloc.c index aa8c23a2674e..5c4b1ddce374 100644 --- a/core/test/run-mem_region_release_unused_noalloc.c +++ b/core/test/run-mem_region_release_unused_noalloc.c @@ -147,8 +147,8 @@ int main(void) * only in test and only for valgrind */ free((void*)r->name); + last = r->name; } - last = r->name; } dt_free(dt_root);