aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--arch/riscv/kernel/vmem.c8
-rw-r--r--common/elf.c3
-rw-r--r--common/vmem.c20
3 files changed, 21 insertions, 10 deletions
diff --git a/arch/riscv/kernel/vmem.c b/arch/riscv/kernel/vmem.c
index 80644bd..bf49716 100644
--- a/arch/riscv/kernel/vmem.c
+++ b/arch/riscv/kernel/vmem.c
@@ -97,11 +97,6 @@ void map_vmem(struct vm_branch_t *branch,
while (top != order) {
size_t idx = vm_to_index(vaddr, top);
- if (is_branch(branch->leaf[idx])){
- __destroy_branch(branch->leaf[idx]);
- branch->leaf[idx] = 0;
- }
-
if (!branch->leaf[idx])
branch->leaf[idx] = __create_leaf();
@@ -111,6 +106,9 @@ void map_vmem(struct vm_branch_t *branch,
}
size_t idx = vm_to_index(vaddr, top);
+ if (is_branch(branch->leaf[idx])) /* something has gone terribly wrong */
+ __destroy_branch(branch->leaf[idx]);
+
branch->leaf[idx] = (struct vm_branch_t *)to_pte(paddr, flags);
}
diff --git a/common/elf.c b/common/elf.c
index 83411e9..c6a37e0 100644
--- a/common/elf.c
+++ b/common/elf.c
@@ -5,5 +5,8 @@ vm_t bin_entry(vm_t bin)
{
struct elf_header *e = (struct elf_header *)bin;
/* TODO: check that address points to a valid ELF executable */
+ /* oh yeah, this only works for DYN objects, fuck */
+ /* eh, fuck it, I'll fix this later, today has been a decently
+ * productive day as is */
return ((vm_t)e->e_entry) + bin;
}
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;
}
}