Clean up mmapFunc.
authorSteve Reinhardt <stever@eecs.umich.edu>
Tue, 11 Apr 2006 00:02:36 +0000 (20:02 -0400)
committerSteve Reinhardt <stever@eecs.umich.edu>
Tue, 11 Apr 2006 00:02:36 +0000 (20:02 -0400)
sim/syscall_emul.hh:
    Clean up mmapFunc: args should be aligned and PageTable::allocate
    already handles multi-page allocations, so most of thw work done here
    was unnecessary (as far as I can tell).  I didn't test this beyond
    compiling though...

--HG--
extra : convert_revision : d79591a1cc58ea82ea911cc05e0970e81e1d2c60

sim/syscall_emul.hh

index ae1196f03f5596e70b050109955648edc43e8fd0..58db2469e42495947c1b9c673545873e3f12305e 100644 (file)
@@ -700,22 +700,25 @@ mmapFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
     int flags = xc->getSyscallArg(3);
     // int fd = p->sim_fd(xc->getSyscallArg(4));
     // int offset = xc->getSyscallArg(5);
-    Addr junk;
-
-    if (start == 0) {
-        // user didn't give an address... pick one from our "mmap region"
-        start = p->mmap_end;
-        for (ChunkGenerator gen(start, roundUp(length, TheISA::VMPageSize), TheISA::VMPageSize); !gen.done(); gen.next()) {
-            if (!p->pTable->translate(gen.addr(), junk))
-                p->pTable->allocate(roundDown(gen.addr(), TheISA::VMPageSize), TheISA::VMPageSize);
-        }
-        p->mmap_end += roundUp(length, TheISA::VMPageSize);
-        if (p->nxm_start != 0) {
-            //If we have an nxm space, make sure we haven't colided
-            assert(p->mmap_end < p->nxm_start);
-        }
+
+    if ((start  % TheISA::VMPageSize) != 0 ||
+        (length % TheISA::VMPageSize) != 0) {
+        warn("mmap failing: arguments not page-aligned: "
+             "start 0x%x length 0x%x",
+             start, length);
+        return -EINVAL;
     }
 
+    if (start != 0) {
+        warn("mmap: ignoring suggested map address 0x%x, using 0x%x",
+             start, p->mmap_end);
+    }
+
+    // pick next address from our "mmap region"
+    start = p->mmap_end;
+    p->pTable->allocate(start, length);
+    p->mmap_end += length;
+
     if (!(flags & OS::TGT_MAP_ANONYMOUS)) {
         warn("allowing mmap of file @ fd %d. "
              "This will break if not /dev/zero.", xc->getSyscallArg(4));