diff options
author | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-14 17:16:42 -0400 |
---|---|---|
committer | Michael Foiani <mfoiani@cs.brown.edu> | 2024-05-14 17:16:42 -0400 |
commit | 53b54f664ed2b4630c23cacc9e216a6a5935b57f (patch) | |
tree | f0138f1ed2f8894efa560e0e9721e510883f439b /kernel/api | |
parent | b90313ddfa4c03f688c6c1cd5ded34aff1bf39c5 (diff) |
fixes to work on dept machine
Diffstat (limited to 'kernel/api')
-rw-r--r-- | kernel/api/access.c | 46 | ||||
-rw-r--r-- | kernel/api/syscall.c | 14 |
2 files changed, 23 insertions, 37 deletions
diff --git a/kernel/api/access.c b/kernel/api/access.c index 82f03ed..944277c 100644 --- a/kernel/api/access.c +++ b/kernel/api/access.c @@ -114,40 +114,21 @@ long user_vecdup(argvec_t *uvec, char ***kvecp) * * Check against the vmarea's protections on the mapping. */ -// long addr_perm(proc_t *p, const void *vaddr, int perm) -// { -// // 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)); -// return vma && !!(perm & vma->vma_prot); -// } long addr_perm(proc_t *p, const void *vaddr, int perm) { - // NOT_YET_IMPLEMENTED("VM: addr_perm"); - // return 0; - vmarea_t *vma = vmmap_lookup(p->p_vmmap, ADDR_TO_PN(vaddr)); - if (vma == NULL) - { - return 0; - } - - if ((perm & PROT_READ) && !(vma->vma_prot & PROT_READ)) - { - return 0; - } + // NOT_YET_IMPLEMENTED("vm:: addr_perm"); - if ((perm & PROT_WRITE) && !(vma->vma_prot & PROT_WRITE)) - { - return 0; - } + // loop through the vmareas in the process's vmmap + // vmarea_t *vma = vmmap_lookup(p->p_vmmap, ADDR_TO_PN(vaddr)); + // return vma && !!(perm & vma->vma_prot); - if ((perm & PROT_EXEC) && !(vma->vma_prot & PROT_EXEC)) + vmarea_t *vma = vmmap_lookup(p->p_vmmap, ADDR_TO_PN(vaddr)); + if (vma == NULL) { return 0; } - return 1; + return (vma->vma_prot & perm) == perm; } @@ -162,17 +143,16 @@ 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) { - - for ( - size_t vfn = ADDR_TO_PN(vaddr); - vfn < ADDR_TO_PN(PAGE_ALIGN_UP((uintptr_t)vaddr + len)); - vfn++ - ) + // NOT_YET_IMPLEMENTED("vm:: range_perm"); + size_t start = ADDR_TO_PN(vaddr); + size_t end = ADDR_TO_PN(PAGE_ALIGN_UP(vaddr + len)); + while (start < end) { - if (!addr_perm(p, PN_TO_ADDR(vfn), perm)) + if (addr_perm(p, PN_TO_ADDR(start), perm) == 0) { return 0; } + start++; } return 1; } diff --git a/kernel/api/syscall.c b/kernel/api/syscall.c index 7c76e51..c5fea6d 100644 --- a/kernel/api/syscall.c +++ b/kernel/api/syscall.c @@ -77,10 +77,11 @@ static long sys_read(read_args_t *args) ERROR_OUT_RET(ret); // Allocate a temporary buffer (a page-aligned block of n pages that are enough space to store the number of bytes to read) - size_t size_in_pages = 0; - while(++size_in_pages * PAGE_SIZE < kargs.nbytes) - ; - void *addr = page_alloc_n(size_in_pages); + // size_t size_in_pages = 0; + // while(++size_in_pages * PAGE_SIZE < kargs.nbytes) + // ; + size_t size_in_pages = ADDR_TO_PN(PAGE_ALIGN_UP(kargs.nbytes)); + char *addr = (char *)page_alloc_n(size_in_pages); if (!addr) { ret = -ENOMEM; @@ -134,6 +135,11 @@ static long sys_write(write_args_t *args) long ret = copy_from_user(&kargs, args, sizeof(kargs)); ERROR_OUT_RET(ret); + if (kargs.nbytes == 0) + { + return 0; + } + // Allocate a temporary buffer (a page-aligned block of n pages that are enough space to store the number of bytes to write) size_t size_in_pages = 0; while(++size_in_pages * PAGE_SIZE < kargs.nbytes) |