From 8da0171e5ca3492cdb34422184a1c96acd0b5165 Mon Sep 17 00:00:00 2001 From: Kimplul Date: Sat, 21 May 2022 21:02:17 +0300 Subject: add status info to memory mappings + next up would probably be to start working on process/thread relationships, largely as documented. Still not entirely sure about how I want to handle fork, but I suppose I might figure it out at some point. --- arch/riscv64/kernel/vmem.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) (limited to 'arch/riscv64/kernel/vmem.c') diff --git a/arch/riscv64/kernel/vmem.c b/arch/riscv64/kernel/vmem.c index 46ddf29..7ffde86 100644 --- a/arch/riscv64/kernel/vmem.c +++ b/arch/riscv64/kernel/vmem.c @@ -45,10 +45,17 @@ static pm_t *__find_vmem(struct vm_branch *b, vm_t v, enum mm_order *o) stat_t mod_vpage(struct vm_branch *branch, vm_t vaddr, pm_t paddr, vmflags_t flags) { - pm_t *pte = __find_vmem(branch, vaddr, 0); + enum mm_order order; + pm_t *pte = __find_vmem(branch, vaddr, &order); if (pte) { *pte = to_pte((pm_t)__pa(paddr), vp_flags(flags)); - return OK; + /* if we're modifying a top level mapping, we will have to + * update the same one for all the other threads in this process + * */ + if (order == __mm_max_order) + return INFO_SEFF; + else + return OK; } return ERR_NF; @@ -115,7 +122,8 @@ stat_t map_vpage(struct vm_branch *branch, pm_t paddr, vm_t vaddr, branch->leaf[idx] = (struct vm_branch *)to_pte((pm_t)__pa(paddr), vp_flags(flags)); - return OK; + + return top == __mm_max_order ? INFO_SEFF : OK; } stat_t unmap_vpage(struct vm_branch *branch, vm_t vaddr) @@ -191,3 +199,12 @@ vm_t setup_kernel_io(struct vm_branch *b, vm_t paddr) return -SZ_1G + paddr - (gigapage * MM_GPAGE_SIZE); } #endif + +stat_t clone_vmbranch(struct vm_branch *r, struct vm_branch *b) +{ + /* TODO: error checking? */ + for (size_t i = 0; i <= CSTACK_PAGE; ++i) + b->leaf[i] = r->leaf[i]; + + return OK; +} -- cgit v1.3