summaryrefslogtreecommitdiff
path: root/kernel/file.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/file.c
parentd86118fc80267649b4791c8c0c72ebd60edf1ef2 (diff)
downloadxv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.gz
xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.tar.bz2
xv6-labs-09ba9112386d5d59d7f2a31c469768c582acb939.zip
lab mmap: finish
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;
+}