summaryrefslogtreecommitdiff
path: root/kernel/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/file.c')
-rw-r--r--kernel/file.c31
1 files changed, 31 insertions, 0 deletions
diff --git a/kernel/file.c b/kernel/file.c
index 0fba21b..add6575 100644
--- a/kernel/file.c
+++ b/kernel/file.c
@@ -6,6 +6,7 @@
#include "riscv.h"
#include "defs.h"
#include "param.h"
+#include "fcntl.h"
#include "fs.h"
#include "spinlock.h"
#include "sleeplock.h"
@@ -197,3 +198,33 @@ filewrite(struct file *f, uint64 addr, int n)
return ret;
}
+int fileperm(struct file* f)
+{
+ int flags = 0;
+ if(f->writable)
+ flags |= PROT_WRITE;
+ if(f->readable)
+ flags |= PROT_READ;
+ return flags;
+}
+
+// reads file from disk to physical address, needed by mmap
+int mmap_read(struct file *file, uint64 pa, uint64 off, int size) {
+ int n = 0;
+ ilock(file->ip);
+ n = readi(file->ip, 0, pa, off, size);
+ off += n;
+ iunlock(file->ip);
+ return off;
+}
+
+// writes from virtual address to disk, needed by munmap
+int munmap_write(struct file *file, uint64 va, uint64 off, int size) {
+ int r;
+ begin_op();
+ ilock(file->ip);
+ r = writei(file->ip, 1, va, off, size);
+ iunlock(file->ip);
+ end_op();
+ return r;
+}