aboutsummaryrefslogtreecommitdiff
path: root/pk
diff options
context:
space:
mode:
authorAndrew Waterman <waterman@eecs.berkeley.edu>2014-05-22 18:10:49 -0700
committerAndrew Waterman <waterman@eecs.berkeley.edu>2014-05-22 18:11:18 -0700
commit894fe673b4f1326abd29512c8419759698d8ea2c (patch)
treedaa7eac910cc7c3511dd6df925cd6e1f955c8d41 /pk
parent3d8acf5bf5ec26c28316874a5e55e15552584a09 (diff)
downloadpk-894fe673b4f1326abd29512c8419759698d8ea2c.zip
pk-894fe673b4f1326abd29512c8419759698d8ea2c.tar.gz
pk-894fe673b4f1326abd29512c8419759698d8ea2c.tar.bz2
Support mmapping files whose length is not divisible by pgsize
Diffstat (limited to 'pk')
-rw-r--r--pk/vm.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/pk/vm.c b/pk/vm.c
index 768a9b3..6922b29 100644
--- a/pk/vm.c
+++ b/pk/vm.c
@@ -177,9 +177,10 @@ static int __handle_page_fault(uintptr_t vaddr, int prot)
if (v->file)
{
size_t flen = MIN(RISCV_PGSIZE, v->length - (vaddr - v->addr));
- kassert(flen == file_pread(v->file, (void*)vaddr, flen, vaddr - v->addr + v->offset));
- if (flen < RISCV_PGSIZE)
- memset((void*)vaddr + flen, 0, RISCV_PGSIZE - flen);
+ ssize_t ret = file_pread(v->file, (void*)vaddr, flen, vaddr - v->addr + v->offset);
+ kassert(ret > 0);
+ if (ret < RISCV_PGSIZE)
+ memset((void*)vaddr + ret, 0, RISCV_PGSIZE - ret);
}
else
memset((void*)vaddr, 0, RISCV_PGSIZE);