Fixed mmap() so that offset is a number of pages
authorBarret Rhoden <brho@cs.berkeley.edu>
Tue, 10 Aug 2010 05:36:39 +0000 (22:36 -0700)
committerKevin Klues <klueska@cs.berkeley.edu>
Thu, 3 Nov 2011 00:35:50 +0000 (17:35 -0700)
While the syscall/mmap() takes a number of pages, the rest of the system
tracks it as bytes - like the file pointer does.  See the change if
you're curious.

kern/include/mm.h
kern/src/mm.c

index bcc5b52..313422a 100644 (file)
@@ -68,14 +68,14 @@ void print_vmrs(struct proc *p);
 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
            int fd, size_t offset);
 void *do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
-             struct file *f, size_t offset);
+              struct file *f, size_t offset);
 int mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
 int munmap(struct proc *p, uintptr_t addr, size_t len);
 int handle_page_fault(struct proc *p, uintptr_t va, int prot);
 
 /* These assume the memory/proc_lock is held already */
 void *__do_mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
-               struct file *f, size_t offset);
+                struct file *f, size_t offset);
 int __do_mprotect(struct proc *p, uintptr_t addr, size_t len, int prot);
 int __do_munmap(struct proc *p, uintptr_t addr, size_t len);
 int __handle_page_fault(struct proc* p, uintptr_t va, int prot);
index 90a53c4..1c4810d 100644 (file)
@@ -274,11 +274,20 @@ void print_vmrs(struct proc *p)
 
 
 /* Error values aren't quite comprehensive - check man mmap() once we do better
- * with the FS */
+ * with the FS.
+ *
+ * The mmap call's offset is in units of PGSIZE (like Linux's mmap2()), but
+ * internally, the offset is tracked in bytes.  The reason for the PGSIZE is for
+ * 32bit apps to enumerate large files, but a full 64bit system won't need that.
+ * We track things internally in bytes since that is how file pointers work, vmr
+ * bases and ends, and similar math.  While it's not a hard change, there's no
+ * need for it, and ideally we'll be a fully 64bit system before we deal with
+ * files that large. */
 void *mmap(struct proc *p, uintptr_t addr, size_t len, int prot, int flags,
            int fd, size_t offset)
 {
        struct file *file = NULL;
+       offset <<= PGSHIFT;
        printd("mmap(addr %x, len %x, prot %x, flags %x, fd %x, off %x)\n", addr,
               len, prot, flags, fd, offset);
        if (fd >= 0 && (flags & MAP_ANON)) {