summaryrefslogtreecommitdiff
path: root/kernel/sysproc.c
diff options
context:
space:
mode:
authorMole Shang <[email protected]>2024-02-19 21:51:26 +0800
committerMole Shang <[email protected]>2024-02-19 22:13:01 +0800
commit09ba9112386d5d59d7f2a31c469768c582acb939 (patch)
treeb1dce737cdd94164e8d7f3f651ea7a86a22a42f3 /kernel/sysproc.c
parentd86118fc80267649b4791c8c0c72ebd60edf1ef2 (diff)
downloadxv6-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.c36
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);
+}