diff options
author | Andrew Waterman <waterman@eecs.berkeley.edu> | 2014-05-22 18:10:49 -0700 |
---|---|---|
committer | Andrew Waterman <waterman@eecs.berkeley.edu> | 2014-05-22 18:11:18 -0700 |
commit | 894fe673b4f1326abd29512c8419759698d8ea2c (patch) | |
tree | daa7eac910cc7c3511dd6df925cd6e1f955c8d41 /pk | |
parent | 3d8acf5bf5ec26c28316874a5e55e15552584a09 (diff) | |
download | riscv-pk-894fe673b4f1326abd29512c8419759698d8ea2c.zip riscv-pk-894fe673b4f1326abd29512c8419759698d8ea2c.tar.gz riscv-pk-894fe673b4f1326abd29512c8419759698d8ea2c.tar.bz2 |
Support mmapping files whose length is not divisible by pgsize
Diffstat (limited to 'pk')
-rw-r--r-- | pk/vm.c | 7 |
1 files changed, 4 insertions, 3 deletions
@@ -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); |