diff options
Diffstat (limited to 'kernel/sysproc.c')
-rw-r--r-- | kernel/sysproc.c | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/kernel/sysproc.c b/kernel/sysproc.c index 715a511..abe1cdd 100644 --- a/kernel/sysproc.c +++ b/kernel/sysproc.c @@ -1,4 +1,5 @@ #include "types.h" +#include "fcntl.h" #include "riscv.h" #include "param.h" #include "defs.h" @@ -140,7 +141,8 @@ sys_sigalarm(void) return 0; } -uint64 sys_sigreturn(void) +uint64 +sys_sigreturn(void) { struct proc *p = myproc(); // retore saved trapframe to resume @@ -150,3 +152,35 @@ uint64 sys_sigreturn(void) // make sure return the original a0 in trapframe to pass test3 return p->trapframe->a0; } + +uint64 +sys_mmap(void) +{ + uint64 addr, len, offset; + int prot, flags, fd; + struct file* file; + + argaddr(0, &addr); + argaddr(1, &len); + argint(2, &prot); + argint(3, &flags); + if(argfd(4, &fd, &file) == -1) + return 0xffffffffffffffff; + argaddr(5, &offset); + + if(!(fileperm(file) & PROT_WRITE) && (prot & PROT_WRITE) && (flags == MAP_SHARED)) + return 0xffffffffffffffff; + + return mmap(addr, len, prot, flags, fd, file, offset); +} + +uint64 +sys_munmap(void) +{ + uint64 addr, len; + + argaddr(0, &addr); + argaddr(1, &len); + + return munmap(addr, len); +} |