diff options
Diffstat (limited to 'kernel/file.c')
-rw-r--r-- | kernel/file.c | 31 |
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; +} |