changeset 9fe574944f31 in /z/repo/m5
details: http://repo.m5sim.org/m5?cmd=changeset;node=9fe574944f31
description:
        sycalls: implement mremap() and add DATA flag for getrlimit(). mremap 
has been tested on Alpha, compiles for the rest but not tested. I don't see why 
it wouldn't work though.

diffstat:

11 files changed, 121 insertions(+), 6 deletions(-)
src/arch/alpha/linux/process.cc  |    2 -
src/arch/alpha/pagetable.hh      |    7 ++++
src/arch/mips/linux/process.cc   |    2 -
src/arch/mips/tlb.hh             |    3 ++
src/arch/sparc/linux/syscalls.cc |    4 +-
src/arch/sparc/pagetable.hh      |    6 ++++
src/arch/x86/linux/syscalls.cc   |    2 -
src/arch/x86/pagetable.hh        |    6 ++++
src/mem/page_table.cc            |   38 ++++++++++++++++++++++++++
src/mem/page_table.hh            |    2 +
src/sim/syscall_emul.hh          |   55 +++++++++++++++++++++++++++++++++++++-

diffs (263 lines):

diff -r 7202be891bb4 -r 9fe574944f31 src/arch/alpha/linux/process.cc
--- a/src/arch/alpha/linux/process.cc   Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/alpha/linux/process.cc   Mon Feb 16 17:47:39 2009 -0500
@@ -463,7 +463,7 @@
     /* 338 */ SyscallDesc("afs_syscall", unimplementedFunc),
     /* 339 */ SyscallDesc("uname", unameFunc),
     /* 340 */ SyscallDesc("nanosleep", unimplementedFunc),
-    /* 341 */ SyscallDesc("mremap", unimplementedFunc),
+    /* 341 */ SyscallDesc("mremap", mremapFunc<AlphaLinux>),
     /* 342 */ SyscallDesc("nfsservctl", unimplementedFunc),
     /* 343 */ SyscallDesc("setresuid", unimplementedFunc),
     /* 344 */ SyscallDesc("getresuid", unimplementedFunc),
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/alpha/pagetable.hh
--- a/src/arch/alpha/pagetable.hh       Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/alpha/pagetable.hh       Mon Feb 16 17:47:39 2009 -0500
@@ -123,6 +123,13 @@
     TlbEntry()
     {}
 
+    void
+    updateVaddr(Addr new_vaddr)
+    {
+        VAddr vaddr(new_vaddr);
+        tag = vaddr.vpn();
+    }
+
     Addr
     pageStart()
     {
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/mips/linux/process.cc
--- a/src/arch/mips/linux/process.cc    Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/mips/linux/process.cc    Mon Feb 16 17:47:39 2009 -0500
@@ -288,7 +288,7 @@
     /* 164 */ SyscallDesc("sched_get_priority_min", unimplementedFunc),
     /* 165 */ SyscallDesc("sched_rr_get_interval", unimplementedFunc),
     /* 166 */ SyscallDesc("nanosleep", unimplementedFunc),
-    /* 167 */ SyscallDesc("mremap", unimplementedFunc),
+    /* 167 */ SyscallDesc("mremap", mremapFunc<MipsLinux>),
     /* 168 */ SyscallDesc("accept", unimplementedFunc),
     /* 169 */ SyscallDesc("bind", unimplementedFunc),
     /* 170 */ SyscallDesc("connect", unimplementedFunc),
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/mips/tlb.hh
--- a/src/arch/mips/tlb.hh      Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/mips/tlb.hh      Mon Feb 16 17:47:39 2009 -0500
@@ -68,6 +68,9 @@
         return _pageStart;
     }
 
+    void
+    updateVaddr(Addr new_vaddr) {}
+    
     void serialize(std::ostream &os)
     {
         SERIALIZE_SCALAR(_pageStart);
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/sparc/linux/syscalls.cc
--- a/src/arch/sparc/linux/syscalls.cc  Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/sparc/linux/syscalls.cc  Mon Feb 16 17:47:39 2009 -0500
@@ -339,7 +339,7 @@
     /* 247 */ SyscallDesc("sched_get_priority_min", unimplementedFunc), //32 
bit
     /* 248 */ SyscallDesc("sched_rr_get_interval", unimplementedFunc), //32 bit
     /* 249 */ SyscallDesc("nanosleep", unimplementedFunc),
-    /* 250 */ SyscallDesc("mremap", unimplementedFunc), //32 bit
+    /* 250 */ SyscallDesc("mremap", mremapFunc<Sparc32Linux>), //32 bit
     /* 251 */ SyscallDesc("_sysctl", unimplementedFunc), //32 bit
     /* 252 */ SyscallDesc("getsid", unimplementedFunc), //32 bit
     /* 253 */ SyscallDesc("fdatasync", unimplementedFunc),
@@ -642,7 +642,7 @@
     /* 247 */ SyscallDesc("sched_get_priority_min", unimplementedFunc),
     /* 248 */ SyscallDesc("sched_rr_get_interval", unimplementedFunc),
     /* 249 */ SyscallDesc("nanosleep", unimplementedFunc),
-    /* 250 */ SyscallDesc("mremap", unimplementedFunc),
+    /* 250 */ SyscallDesc("mremap", mremapFunc<SparcLinux>),
     /* 251 */ SyscallDesc("_sysctl", unimplementedFunc),
     /* 252 */ SyscallDesc("getsid", unimplementedFunc),
     /* 253 */ SyscallDesc("fdatasync", unimplementedFunc),
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/sparc/pagetable.hh
--- a/src/arch/sparc/pagetable.hh       Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/sparc/pagetable.hh       Mon Feb 16 17:47:39 2009 -0500
@@ -266,6 +266,12 @@
         return pte.paddr();
     }
 
+    void
+    updateVaddr(Addr new_vaddr)
+    {
+        range.va = new_vaddr;
+    }
+
     void serialize(std::ostream &os);
     void unserialize(Checkpoint *cp, const std::string &section);
 };
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/x86/linux/syscalls.cc
--- a/src/arch/x86/linux/syscalls.cc    Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/x86/linux/syscalls.cc    Mon Feb 16 17:47:39 2009 -0500
@@ -148,7 +148,7 @@
     /*  22 */ SyscallDesc("pipe", unimplementedFunc),
     /*  23 */ SyscallDesc("select", unimplementedFunc),
     /*  24 */ SyscallDesc("sched_yield", unimplementedFunc),
-    /*  25 */ SyscallDesc("mremap", unimplementedFunc),
+    /*  25 */ SyscallDesc("mremap", mremapFunc<X86Linux64>),
     /*  26 */ SyscallDesc("msync", unimplementedFunc),
     /*  27 */ SyscallDesc("mincore", unimplementedFunc),
     /*  28 */ SyscallDesc("madvise", unimplementedFunc),
diff -r 7202be891bb4 -r 9fe574944f31 src/arch/x86/pagetable.hh
--- a/src/arch/x86/pagetable.hh Mon Feb 16 12:09:45 2009 -0500
+++ b/src/arch/x86/pagetable.hh Mon Feb 16 17:47:39 2009 -0500
@@ -113,6 +113,12 @@
         TlbEntry(Addr asn, Addr _vaddr, Addr _paddr);
         TlbEntry() {}
 
+        void
+        updateVaddr(Addr new_vaddr)
+        {
+            vaddr = new_vaddr;
+        }
+
         Addr pageStart()
         {
             return paddr;
diff -r 7202be891bb4 -r 9fe574944f31 src/mem/page_table.cc
--- a/src/mem/page_table.cc     Mon Feb 16 12:09:45 2009 -0500
+++ b/src/mem/page_table.cc     Mon Feb 16 17:47:39 2009 -0500
@@ -87,6 +87,44 @@
     }
 }
 
+void
+PageTable::remap(Addr vaddr, int64_t size, Addr new_vaddr)
+{
+    assert(pageOffset(vaddr) == 0);
+    assert(pageOffset(new_vaddr) == 0);
+
+    DPRINTF(MMU, "moving pages from vaddr %08p to %08p, size = %d\n", vaddr,
+            new_vaddr, size);
+
+    for (; size > 0; size -= pageSize, vaddr += pageSize, new_vaddr += 
pageSize) {
+        PTableItr iter = pTable.find(vaddr);
+
+        assert(iter != pTable.end());
+
+        pTable[new_vaddr] = pTable[vaddr];
+        pTable.erase(vaddr);
+        pTable[new_vaddr].updateVaddr(new_vaddr);
+        updateCache(new_vaddr, pTable[new_vaddr]);
+    }
+}
+
+void
+PageTable::deallocate(Addr vaddr, int64_t size)
+{
+    assert(pageOffset(vaddr) == 0);
+
+    DPRINTF(MMU, "Deallocating page: %#x-%#x\n", vaddr, vaddr+ size);
+
+    for (; size > 0; size -= pageSize, vaddr += pageSize) {
+        PTableItr iter = pTable.find(vaddr);
+
+        assert(iter != pTable.end());
+
+        pTable.erase(vaddr);
+    }
+
+}
+
 bool
 PageTable::lookup(Addr vaddr, TheISA::TlbEntry &entry)
 {
diff -r 7202be891bb4 -r 9fe574944f31 src/mem/page_table.hh
--- a/src/mem/page_table.hh     Mon Feb 16 12:09:45 2009 -0500
+++ b/src/mem/page_table.hh     Mon Feb 16 17:47:39 2009 -0500
@@ -80,6 +80,8 @@
     Addr pageOffset(Addr a) { return (a &  offsetMask); }
 
     void allocate(Addr vaddr, int64_t size);
+    void remap(Addr vaddr, int64_t size, Addr new_vaddr);
+    void deallocate(Addr vaddr, int64_t size);
 
     /**
      * Lookup function
diff -r 7202be891bb4 -r 9fe574944f31 src/sim/syscall_emul.hh
--- a/src/sim/syscall_emul.hh   Mon Feb 16 12:09:45 2009 -0500
+++ b/src/sim/syscall_emul.hh   Mon Feb 16 17:47:39 2009 -0500
@@ -607,6 +607,51 @@
     return 0;
 }
 
+/// Target mremap() handler.
+template <class OS>
+SyscallReturn
+mremapFunc(SyscallDesc *desc, int callnum, LiveProcess *process, ThreadContext 
*tc)
+{
+    Addr start = tc->getSyscallArg(0);
+    uint64_t old_length = tc->getSyscallArg(1);
+    uint64_t new_length = tc->getSyscallArg(2);
+    uint64_t flags = tc->getSyscallArg(3);
+
+    if ((start % TheISA::VMPageSize != 0) ||
+            (new_length % TheISA::VMPageSize != 0)) {
+        warn("mremap failing: arguments not page aligned");
+        return -EINVAL;
+    }
+
+    if (new_length > old_length) {
+        if ((start + old_length) == process->mmap_end) {
+            uint64_t diff = new_length - old_length;
+            process->pTable->allocate(process->mmap_end, diff);
+            process->mmap_end += diff;
+            return start;
+        } else {
+            // sys/mman.h defined MREMAP_MAYMOVE
+            if (!(flags & 1)) {
+                warn("can't remap here and MREMAP_MAYMOVE flag not set\n");
+                return -ENOMEM;
+            } else {
+                process->pTable->remap(start, old_length, process->mmap_end);
+                warn("mremapping to totally new vaddr %08p-%08p, adding %d\n", 
+                        process->mmap_end, process->mmap_end + new_length, 
new_length);
+                start = process->mmap_end;
+                // add on the remaining unallocated pages
+                process->pTable->allocate(start + old_length, new_length - 
old_length);
+                process->mmap_end += new_length;
+                warn("returning %08p as start\n", start);
+                return start;
+            }
+        }
+    } else {
+        process->pTable->deallocate(start + new_length, old_length -
+                new_length);
+        return start;
+    }
+}
 
 /// Target stat() handler.
 template <class OS>
@@ -892,6 +937,7 @@
     // int fd = p->sim_fd(tc->getSyscallArg(4));
     // int offset = tc->getSyscallArg(5);
 
+
     if ((start  % TheISA::VMPageSize) != 0 ||
         (length % TheISA::VMPageSize) != 0) {
         warn("mmap failing: arguments not page-aligned: "
@@ -929,12 +975,19 @@
 
     switch (resource) {
         case OS::TGT_RLIMIT_STACK:
-            // max stack size in bytes: make up a number (2MB for now)
+            // max stack size in bytes: make up a number (8MB for now)
             rlp->rlim_cur = rlp->rlim_max = 8 * 1024 * 1024;
             rlp->rlim_cur = htog(rlp->rlim_cur);
             rlp->rlim_max = htog(rlp->rlim_max);
             break;
 
+        case OS::TGT_RLIMIT_DATA:
+            // max data segment size in bytes: make up a number
+            rlp->rlim_cur = rlp->rlim_max = 256 * 1024 * 1024;
+            rlp->rlim_cur = htog(rlp->rlim_cur);
+            rlp->rlim_max = htog(rlp->rlim_max);
+            break;
+
         default:
             std::cerr << "getrlimitFunc: unimplemented resource " << resource
                 << std::endl;
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to