diff options
author | sotech117 <michael_foiani@brown.edu> | 2024-05-13 09:27:24 +0000 |
---|---|---|
committer | sotech117 <michael_foiani@brown.edu> | 2024-05-13 09:27:24 +0000 |
commit | f09878f6327426631d9419d825a4e8396e3b9dc4 (patch) | |
tree | 009d1f1b1386baf6d07b3b7d9a436590ada14094 /kernel/api/access.c | |
parent | 0e2acbe54e5800621692c2f6e9e9590aa369e165 (diff) |
weenix
Diffstat (limited to 'kernel/api/access.c')
-rw-r--r-- | kernel/api/access.c | 32 |
1 files changed, 28 insertions, 4 deletions
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; } |