summaryrefslogtreecommitdiff
path: root/kernel/sysproc.c
diff options
context:
space:
mode:
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);
+}