diff options
author | Mole Shang <[email protected]> | 2024-02-19 21:51:26 +0800 |
---|---|---|
committer | Mole Shang <[email protected]> | 2024-02-19 22:13:01 +0800 |
commit | 09ba9112386d5d59d7f2a31c469768c582acb939 (patch) | |
tree | b1dce737cdd94164e8d7f3f651ea7a86a22a42f3 /kernel/sysproc.c | |
parent | d86118fc80267649b4791c8c0c72ebd60edf1ef2 (diff) | |
download | xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.gz xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.bz2 xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.zip |
lab mmap: finish
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); +} |