From f09878f6327426631d9419d825a4e8396e3b9dc4 Mon Sep 17 00:00:00 2001 From: sotech117 Date: Mon, 13 May 2024 09:27:24 +0000 Subject: weenix --- kernel/api/access.c | 32 ++++++++++++++++++++++++++++---- 1 file changed, 28 insertions(+), 4 deletions(-) (limited to 'kernel/api/access.c') diff --git a/kernel/api/access.c b/kernel/api/access.c index 0e11b73..9a7bed0 100644 --- a/kernel/api/access.c +++ b/kernel/api/access.c @@ -116,8 +116,18 @@ long user_vecdup(argvec_t *uvec, char ***kvecp) */ long addr_perm(proc_t *p, const void *vaddr, int perm) { - NOT_YET_IMPLEMENTED("VM: addr_perm"); - return 0; + // NOT_YET_IMPLEMENTED("VM: addr_perm"); + + // loop through the vmareas in the process's vmmap + vmarea_t *vma = vmmap_lookup(p->p_vmmap, ADDR_TO_PN(vaddr)); + + // if the vma doesn't exist, return 0 + if (!vma) + { + return 0; + } + + return !!(perm & vma->vma_prot); } /* @@ -131,6 +141,20 @@ long addr_perm(proc_t *p, const void *vaddr, int perm) */ long range_perm(proc_t *p, const void *vaddr, size_t len, int perm) { - NOT_YET_IMPLEMENTED("VM: range_perm"); - return 0; + // NOT_YET_IMPLEMENTED("VM: range_perm"); + + // loop through the page numbers in the range + size_t vfn = ADDR_TO_PN(vaddr); + size_t end_vfn = ADDR_TO_PN(vaddr + len); + for (size_t i = vfn; i < end_vfn; i++) + { + // check the permissions for each page + if (!addr_perm(p, PN_TO_ADDR(i), perm)) + { + return 0; + } + } + + // return 1 if all pages have the correct permissions + return 1; } -- cgit v1.2.3-70-g09d2