syscall_emul: move mmapGrowsDown() to LiveProcess
authorSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 17 Mar 2016 17:29:32 +0000 (10:29 -0700)
committerSteve Reinhardt <steve.reinhardt@amd.com>
Thu, 17 Mar 2016 17:29:32 +0000 (10:29 -0700)
The mmapGrowsDown() method was a static method on the OperatingSystem
class (and derived classes), which worked OK for the templated syscall
emulation methods, but made it hard to access elsewhere.  This patch
moves the method to be a virtual function on the LiveProcess method,
where it can be overridden for specific platforms (for now, Alpha).

This patch also changes the value of mmapGrowsDown() from being false
by default and true only on X86Linux32 to being true by default and
false only on Alpha, which seems closer to reality (though in reality
most people use ASLR and this doesn't really matter anymore).

In the process, also got rid of the unused mmap_start field on
LiveProcess and OperatingSystem mmapGrowsUp variable.

13 files changed:
src/arch/alpha/process.cc
src/arch/alpha/process.hh
src/arch/arm/process.cc
src/arch/mips/process.cc
src/arch/power/process.cc
src/arch/sparc/process.hh
src/arch/x86/linux/linux.hh
src/arch/x86/process.cc
src/gpu-compute/shader.cc
src/kern/operatingsystem.hh
src/sim/process.cc
src/sim/process.hh
src/sim/syscall_emul.hh

index eb1a2ee6d7ef53f02e481fc083855037f89343ac..54ef338f304ea4c8d00e12466ddbff8dcc789c30 100644 (file)
@@ -57,7 +57,7 @@ AlphaLiveProcess::AlphaLiveProcess(LiveProcessParams *params,
 
     // Set up region for mmaps.  Tru64 seems to start just above 0 and
     // grow up from there.
-    mmap_start = mmap_end = 0x10000;
+    mmap_end = 0x10000;
 
     // Set pointer for next thread stack.  Reserve 8M for main stack.
     next_thread_stack_base = stack_base - (8 * 1024 * 1024);
index fcaa6539cc2a09940e3e76abfd7bc83960b59803..c41ece8374b10a9a9bcfb7f4c355c591ca855422 100644 (file)
@@ -54,6 +54,10 @@ class AlphaLiveProcess : public LiveProcess
     void setSyscallArg(ThreadContext *tc, int i, AlphaISA::IntReg val) override;
     void setSyscallReturn(ThreadContext *tc,
                           SyscallReturn return_value) override;
+
+    // override default implementation in LiveProcess as the mmap
+    // region for Alpha platforms grows upward
+    virtual bool mmapGrowsDown() const override { return false; }
 };
 
 /* No architectural page table defined for this ISA */
index ba56f0cdc90bde3e4ef0b8a035205ad217cf2616..0c6f48fb54df878c34874a31fb8282f62f6a8107 100644 (file)
@@ -77,7 +77,7 @@ ArmLiveProcess32::ArmLiveProcess32(LiveProcessParams *params,
     brk_point = roundUp(brk_point, PageBytes);
 
     // Set up region for mmaps. For now, start at bottom of kuseg space.
-    mmap_start = mmap_end = 0x40000000L;
+    mmap_end = 0x40000000L;
 }
 
 ArmLiveProcess64::ArmLiveProcess64(LiveProcessParams *params,
@@ -94,7 +94,7 @@ ArmLiveProcess64::ArmLiveProcess64(LiveProcessParams *params,
     brk_point = roundUp(brk_point, PageBytes);
 
     // Set up region for mmaps. For now, start at bottom of kuseg space.
-    mmap_start = mmap_end = 0x4000000000L;
+    mmap_end = 0x4000000000L;
 }
 
 void
index 404c84da6b925c2ebbdfaf87777cdd1c5eef2b63..8754191fa301fbdf697302e51a5723f6d2f75c8f 100644 (file)
@@ -61,7 +61,7 @@ MipsLiveProcess::MipsLiveProcess(LiveProcessParams * params,
     brk_point = roundUp(brk_point, PageBytes);
 
     // Set up region for mmaps.  Start it 1GB above the top of the heap.
-    mmap_start = mmap_end = brk_point + 0x40000000L;
+    mmap_end = brk_point + 0x40000000L;
 }
 
 void
index 3dc2c0d17410a925d116c1b62d8018811b8cf244..a770d8137b446e99ea3edbab64e613b232361902 100644 (file)
@@ -59,7 +59,7 @@ PowerLiveProcess::PowerLiveProcess(LiveProcessParams *params,
     brk_point = roundUp(brk_point, PageBytes);
 
     // Set up region for mmaps. For now, start at bottom of kuseg space.
-    mmap_start = mmap_end = 0x70000000L;
+    mmap_end = 0x70000000L;
 }
 
 void
index 2eda40aacef053a12706ede253d254eef4d569d6..e9d81367b7ff05d08f352ce0f8da0a5b5bc72f84 100644 (file)
@@ -82,7 +82,7 @@ class Sparc32LiveProcess : public SparcLiveProcess
         stack_base = (Addr)0xf0000000ULL;
 
         // Set up region for mmaps.
-        mmap_start = mmap_end = 0x70000000;
+        mmap_end = 0x70000000;
     }
 
     void initState();
@@ -111,9 +111,8 @@ class Sparc64LiveProcess : public SparcLiveProcess
         // downward, less the hole for the kernel address space.
         stack_base = (Addr)0x80000000000ULL;
 
-        // Set up region for mmaps.  Tru64 seems to start just above 0 and
-        // grow up from there.
-        mmap_start = mmap_end = 0xfffff80000000000ULL;
+        // Set up region for mmaps.
+        mmap_end = 0xfffff80000000000ULL;
     }
 
     void initState();
index ce395f17df5e81ff4fcf64c9912e1c54f22bb3e1..47eac12b894514752de62db65fb2bcf4cef56e70 100644 (file)
@@ -290,8 +290,6 @@ class X86Linux32 : public Linux
        uint32_t freehigh;  /* Available high memory size */
        uint32_t mem_unit;  /* Memory unit size in bytes */
     } tgt_sysinfo;
-
-    static bool mmapGrowsDown() { return true; }
 };
 
 #endif
index 13cbf6eddf871fb5a88ec79baa12ccd0a18bf3ad..f0b8370c047ac9c27dc0319bcdf177e999d3a827 100644 (file)
@@ -114,7 +114,7 @@ X86_64LiveProcess::X86_64LiveProcess(LiveProcessParams *params,
 
     // Set up region for mmaps. This was determined empirically and may not
     // always be correct.
-    mmap_start = mmap_end = (Addr)0x2aaaaaaab000ULL;
+    mmap_end = (Addr)0x2aaaaaaab000ULL;
 }
 
 void
@@ -151,7 +151,7 @@ I386LiveProcess::I386LiveProcess(LiveProcessParams *params,
 
     // Set up region for mmaps. This was determined empirically and may not
     // always be correct.
-    mmap_start = mmap_end = (Addr)0xf7ffe000ULL;
+    mmap_end = (Addr)0xf7ffe000ULL;
 }
 
 SyscallDesc*
index e8d7946ffbb3eea500b55c26b009ad92bbe38c69..31aa1e4cff4954d71d9169fa7fa0c7e3d73d8150 100644 (file)
@@ -78,25 +78,24 @@ Shader::mmap(int length)
     // round up length to the next page
     length = roundUp(length, TheISA::PageBytes);
 
-    if (X86Linux64::mmapGrowsDown()) {
+    Process *proc = gpuTc->getProcessPtr();
+
+    if (proc->mmapGrowsDown()) {
         DPRINTF(HSAIL, "GROWS DOWN");
-        start = gpuTc->getProcessPtr()->mmap_end -length;
-        gpuTc->getProcessPtr()->mmap_end = start;
+        start = proc->mmap_end - length;
+        proc->mmap_end = start;
     } else {
         DPRINTF(HSAIL, "GROWS UP");
-        start = gpuTc->getProcessPtr()->mmap_end;
-        gpuTc->getProcessPtr()->mmap_end += length;
+        start = proc->mmap_end;
+        proc->mmap_end += length;
 
         // assertion to make sure we don't overwrite the stack (it grows down)
-        assert(gpuTc->getProcessPtr()->mmap_end <
-                gpuTc->getProcessPtr()->stack_base -
-                gpuTc->getProcessPtr()->max_stack_size);
-
+        assert(proc->mmap_end < proc->stack_base - proc->max_stack_size);
     }
 
     DPRINTF(HSAIL,"Shader::mmap start= %#x, %#x\n", start, length);
 
-    gpuTc->getProcessPtr()->allocateMem(start,length);
+    proc->allocateMem(start, length);
 
     return start;
 }
index f6f035f43e3078226760482ae3fcef57724f233a..12aff946c089544aa4ae6698d2cdc70a7abb3bf5 100644 (file)
@@ -116,10 +116,6 @@ class OperatingSystem {
 
     static int openSpecialFile(std::string path, LiveProcess *process, ThreadContext *tc);
 
-    static const bool mmapGrowsUp = true;
-
-    static bool mmapGrowsDown() { return false; }
-
 };  // class OperatingSystem
 
 #endif // __OPERATINGSYSTEM_HH__
index 6c12b8100d5b04316a0fb0984beaea06a9a85b98..81a7ec89e3b71f627a65c2648d1c33f3be01bac7 100644 (file)
@@ -182,7 +182,7 @@ Process::Process(ProcessParams * params)
     fde_stderr->set(sim_fd, params->errout, O_WRONLY | O_CREAT | O_TRUNC,
                     0664, false);
 
-    mmap_start = mmap_end = 0;
+    mmap_end = 0;
     nxm_start = nxm_end = 0;
     // other parameters will be initialized when the program is loaded
 }
@@ -412,7 +412,6 @@ Process::serialize(CheckpointOut &cp) const
     SERIALIZE_SCALAR(stack_size);
     SERIALIZE_SCALAR(stack_min);
     SERIALIZE_SCALAR(next_thread_stack_base);
-    SERIALIZE_SCALAR(mmap_start);
     SERIALIZE_SCALAR(mmap_end);
     SERIALIZE_SCALAR(nxm_start);
     SERIALIZE_SCALAR(nxm_end);
@@ -432,7 +431,6 @@ Process::unserialize(CheckpointIn &cp)
     UNSERIALIZE_SCALAR(stack_size);
     UNSERIALIZE_SCALAR(stack_min);
     UNSERIALIZE_SCALAR(next_thread_stack_base);
-    UNSERIALIZE_SCALAR(mmap_start);
     UNSERIALIZE_SCALAR(mmap_end);
     UNSERIALIZE_SCALAR(nxm_start);
     UNSERIALIZE_SCALAR(nxm_end);
index df007c9f2a0d3c33f832f817c445b7675a4a8386..72f789ec735abd78b798fa62df78bc5a97dccfda 100644 (file)
@@ -107,9 +107,13 @@ class Process : public SimObject
     Addr next_thread_stack_base;
 
     // Base of region for mmaps (when user doesn't specify an address).
-    Addr mmap_start;
     Addr mmap_end;
 
+    // Does mmap region grow upward or downward from mmap_end?  Most
+    // platforms grow downward, but a few (such as Alpha) grow upward
+    // instead, so they can override thie method to return false.
+    virtual bool mmapGrowsDown() const { return true; }
+
     // Base of region for nxm data
     Addr nxm_start;
     Addr nxm_end;
index a859fbe434372446dae49f511fa8fbddd2eaced5..71c0dd09024180fd526b959ed37c10ae4dac6b2b 100644 (file)
@@ -1297,8 +1297,8 @@ mmapImpl(SyscallDesc *desc, int num, LiveProcess *p, ThreadContext *tc,
     // Extend global mmap region if necessary. Note that we ignore the
     // start address unless MAP_FIXED is specified.
     if (!(tgt_flags & OS::TGT_MAP_FIXED)) {
-        start = (OS::mmapGrowsDown()) ? p->mmap_end - length : p->mmap_end;
-        p->mmap_end = (OS::mmapGrowsDown()) ? start : p->mmap_end + length;
+        start = p->mmapGrowsDown() ? p->mmap_end - length : p->mmap_end;
+        p->mmap_end = p->mmapGrowsDown() ? start : p->mmap_end + length;
     }
 
     DPRINTF_SYSCALL(Verbose, " mmap range is 0x%x - 0x%x\n",