aboutsummaryrefslogtreecommitdiff
path: root/common/vmem.c
diff options
context:
space:
mode:
authorKimplul <kimi.h.kuparinen@gmail.com>2021-12-23 19:18:07 +0200
committerKimplul <kimi.h.kuparinen@gmail.com>2021-12-23 19:18:07 +0200
commita64f3588ff5da7f148659ccb0eff844ccfb57088 (patch)
treee7f02e67ba4e9f7c0ca8608addda4bacab09b7a4 /common/vmem.c
parentf2300b433e152968a0fcabd79fb9d0f5fda6bca3 (diff)
downloadkmi-a64f3588ff5da7f148659ccb0eff844ccfb57088.tar.gz
kmi-a64f3588ff5da7f148659ccb0eff844ccfb57088.zip
Fixups to four previous commits
+ Christ, I'm shit at git etiquette
Diffstat (limited to 'common/vmem.c')
-rw-r--r--common/vmem.c20
1 files changed, 15 insertions, 5 deletions
diff --git a/common/vmem.c b/common/vmem.c
index 70ef24e..7b1fa4f 100644
--- a/common/vmem.c
+++ b/common/vmem.c
@@ -256,6 +256,8 @@ static size_t sp_use_region(struct sp_reg_root *r, struct sp_mem *m,
m->prev = n;
if(n->prev)
n->prev->next = n;
+
+ sp_free_insert_region(r, n);
}
if(post_start != post_end){
@@ -263,6 +265,8 @@ static size_t sp_use_region(struct sp_reg_root *r, struct sp_mem *m,
m->next = n;
if(n->next)
n->next->prev = n;
+
+ sp_free_insert_region(r, n);
}
m->end = end;
@@ -411,25 +415,31 @@ size_t uvmem_size()
vm_t map_fill_region(struct vm_branch_t *b, vm_t start, size_t bytes, uint8_t flags)
{
pm_t offset = 0;
- pm_t runner = start;
+ pm_t runner = __page(start);
size_t pages = __pages(bytes);
enum mm_order_t top = __mm_max_order;
+ /* actual start might not be the same as the user specified start */
+ start = __addr(runner);
+
for(; pages; top--){
size_t o_size = __o_size(top);
size_t o_pages = __pages(o_size);
- if(!aligned(runner, o_size))
+ /* NULL does pass this check, so technically all NULL pages are
+ * aligned, but they're caught in the while expr so this should
+ * work even if someone tries to map NULL */
+ if(!aligned(runner, o_pages))
continue;
- while(pages > o_pages){
+ while(pages >= o_pages){
offset = alloc_page(top, offset);
if(!offset)
break;
- map_vmem(b, offset, runner, flags, top);
+ map_vmem(b, offset, __addr(runner), flags, top);
pages -= o_pages;
- runner += o_size;
+ runner += o_pages;
}
}