X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=grading%2Fvm%2Fposix-compat.c;h=a4aae6ba5e8171119261922ac6af238eab0a658f;hb=90e779441b8ed82f464f35624ad9a79d93651d9b;hp=dc5b5ab668798ce05c01c0b7000950cb8acb0286;hpb=96c122af8890db8f39dfd2ee21df761c6131e8f5;p=pintos-anon diff --git a/grading/vm/posix-compat.c b/grading/vm/posix-compat.c index dc5b5ab..a4aae6b 100644 --- a/grading/vm/posix-compat.c +++ b/grading/vm/posix-compat.c @@ -1,4 +1,5 @@ #include +#include #include #include #include @@ -100,10 +101,9 @@ pintos_open (const char *file) int pintos_filesize (int fd) { - off_t old = lseek (fd, 0, SEEK_CUR); - off_t size = lseek (fd, 0, SEEK_END); - lseek (fd, old, SEEK_SET); - return size; + struct stat s; + fstat (fd, &s); + return s.st_size; } int @@ -137,17 +137,24 @@ pintos_close (int fd) close (fd); } -bool -pintos_mmap (int fd, void *addr, unsigned length) +mapid_t +pintos_mmap (int fd, void *addr) { - return mmap (addr, length, PROT_READ | PROT_WRITE, - MAP_SHARED | MAP_FIXED, fd, 0) == addr; + size_t page_size = getpagesize (); + int length = pintos_filesize (fd); + uintptr_t ptr = (uintptr_t) mmap (addr, length, PROT_READ | PROT_WRITE, + MAP_SHARED | MAP_FIXED, fd, 0); + return ptr | DIV_ROUND_UP (size, page_size); } bool pintos_munmap (void *addr, unsigned length) { - return munmap (addr, length) == 0; + size_t page_size = getpagesize (); + uintptr_t page_mask = page_size - 1; + void *base = (void *) ((uintptr_t) addr & ~page_mask); + size_t length = ((uintptr_t) addr & page_mask) * page_size; + return munmap (base, length); } bool