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