aboutsummaryrefslogtreecommitdiff
path: root/kernel/api/access.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/api/access.c')
-rw-r--r--kernel/api/access.c32
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;
}