Brandon Potter has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/12305

Change subject: syscall_emul: remove mem proxy in ThreadContext
......................................................................

syscall_emul: remove mem proxy in ThreadContext

Many parts of the source code use a memory proxy reference to
access the simulated memory space in Syscall Emulation Mode.
However, it would be nice if all memory responsibilities were
delegated to a single object rather than spread across many
objects.

This patch helps to consolidate the memory responsibilities
inside the MemState class by removing the ThreadContext's memory
proxy.

Change-Id: Ic1a6c3017c412a24db91770396d0a9bde790421d
---
M src/arch/alpha/linux/process.cc
M src/arch/arm/freebsd/process.cc
M src/arch/arm/linux/process.cc
M src/arch/mips/linux/process.cc
M src/arch/power/linux/process.cc
M src/arch/riscv/linux/process.cc
M src/arch/sparc/linux/syscalls.cc
M src/arch/sparc/process.cc
M src/arch/sparc/solaris/process.cc
M src/arch/x86/linux/process.cc
M src/arch/x86/pseudo_inst.cc
M src/base/remote_gdb.cc
M src/cpu/o3/thread_context.hh
M src/cpu/thread_context.hh
M src/cpu/thread_state.cc
M src/cpu/thread_state.hh
M src/gpu-compute/cl_driver.cc
M src/sim/syscall_emul.cc
M src/sim/syscall_emul.hh
19 files changed, 385 insertions(+), 248 deletions(-)



diff --git a/src/arch/alpha/linux/process.cc b/src/arch/alpha/linux/process.cc
index 65ea268..fbbcdfc 100644
--- a/src/arch/alpha/linux/process.cc
+++ b/src/arch/alpha/linux/process.cc
@@ -58,7 +58,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "alpha");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

@@ -74,13 +76,15 @@
     Addr bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, 2);

+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     switch (op) {

       case 45: { // GSI_IEEE_FP_CONTROL
           TypedBufferArg<uint64_t> fpcr(bufPtr);
           // I don't think this exactly matches the HW FPCR
           *fpcr = 0;
-          fpcr.copyOut(tc->getMemProxy());
+          fpcr.copyOut(virt_mem);
           return 0;
       }

@@ -103,12 +107,14 @@
     Addr bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, 2);

+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     switch (op) {

       case 14: { // SSI_IEEE_FP_CONTROL
           TypedBufferArg<uint64_t> fpcr(bufPtr);
           // I don't think this exactly matches the HW FPCR
-          fpcr.copyIn(tc->getMemProxy());
+          fpcr.copyIn(virt_mem);
           DPRINTFR(SyscallVerbose, "osf_setsysinfo(SSI_IEEE_FP_CONTROL): "
                    " setting FPCR to 0x%x\n", gtoh(*(uint64_t*)fpcr));
           return 0;
diff --git a/src/arch/arm/freebsd/process.cc b/src/arch/arm/freebsd/process.cc
index d965813..4ed44c4 100644
--- a/src/arch/arm/freebsd/process.cc
+++ b/src/arch/arm/freebsd/process.cc
@@ -77,13 +77,15 @@
     BufferArg buf3(oldlenp, sizeof(size_t));
     BufferArg buf4(newp, sizeof(size_t));

-    buf.copyIn(tc->getMemProxy());
-    buf2.copyIn(tc->getMemProxy());
-    buf3.copyIn(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    buf.copyIn(virt_mem);
+    buf2.copyIn(virt_mem);
+    buf3.copyIn(virt_mem);

     void *hnewp = NULL;
     if (newp) {
-        buf4.copyIn(tc->getMemProxy());
+        buf4.copyIn(virt_mem);
         hnewp = (void *)buf4.bufferPtr();
     }

@@ -93,11 +95,11 @@

     ret = sysctl((int *)hnamep, namelen, holdp, holdlenp, hnewp, newlen);

-    buf.copyOut(tc->getMemProxy());
-    buf2.copyOut(tc->getMemProxy());
-    buf3.copyOut(tc->getMemProxy());
+    buf.copyOut(virt_mem);
+    buf2.copyOut(virt_mem);
+    buf3.copyOut(virt_mem);
     if (newp)
-        buf4.copyOut(tc->getMemProxy());
+        buf4.copyOut(virt_mem);

     return (ret);
 }
diff --git a/src/arch/arm/linux/process.cc b/src/arch/arm/linux/process.cc
index 276964f..d271364 100644
--- a/src/arch/arm/linux/process.cc
+++ b/src/arch/arm/linux/process.cc
@@ -73,7 +73,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "armv7l");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

@@ -91,7 +93,9 @@
     strcpy(name->version, "#1 SMP Sat Dec  1 00:00:00 GMT 2012");
     strcpy(name->machine, "armv8l");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

@@ -103,8 +107,10 @@
     auto process = tc->getProcessPtr();
     uint32_t tlsPtr = process->getSyscallArg(tc, index);

-    tc->getMemProxy().writeBlob(ArmLinuxProcess32::commPage + 0x0ff0,
-                                 (uint8_t *)&tlsPtr, sizeof(tlsPtr));
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    virt_mem.writeBlob(ArmLinuxProcess32::commPage + 0x0ff0,
+                       (uint8_t *)&tlsPtr, sizeof(tlsPtr));
     tc->setMiscReg(MISCREG_TPIDRURO,tlsPtr);
     return 0;
 }
@@ -1675,10 +1681,11 @@
         0xff, 0xff, 0xff, 0xef  // swi -1
     };

+    auto virt_mem = memState->getVirtMem();
+
     // Fill this page with swi -1 so we'll no if we land in it somewhere.
     for (Addr addr = 0; addr < PageBytes; addr += sizeof(swiNeg1)) {
-        tc->getMemProxy().writeBlob(commPage + addr,
-                                    swiNeg1, sizeof(swiNeg1));
+        virt_mem.writeBlob(commPage + addr, swiNeg1, sizeof(swiNeg1));
     }

     uint8_t memory_barrier[] =
@@ -1686,8 +1693,8 @@
         0x5f, 0xf0, 0x7f, 0xf5, // dmb
         0x0e, 0xf0, 0xa0, 0xe1  // return
     };
-    tc->getMemProxy().writeBlob(commPage + 0x0fa0, memory_barrier,
-                                sizeof(memory_barrier));
+    virt_mem.writeBlob(commPage + 0x0fa0, memory_barrier,
+                       sizeof(memory_barrier));

     uint8_t cmpxchg[] =
     {
@@ -1700,7 +1707,7 @@
         0x5f, 0xf0, 0x7f, 0xf5,  // dmb
         0x0e, 0xf0, 0xa0, 0xe1   // return
     };
- tc->getMemProxy().writeBlob(commPage + 0x0fc0, cmpxchg, sizeof(cmpxchg));
+    virt_mem.writeBlob(commPage + 0x0fc0, cmpxchg, sizeof(cmpxchg));

     uint8_t get_tls[] =
     {
@@ -1708,7 +1715,7 @@
         0x70, 0x0f, 0x1d, 0xee, // mrc p15, 0, r0, c13, c0, 3
         0x0e, 0xf0, 0xa0, 0xe1  // return
     };
- tc->getMemProxy().writeBlob(commPage + 0x0fe0, get_tls, sizeof(get_tls));
+    virt_mem.writeBlob(commPage + 0x0fe0, get_tls, sizeof(get_tls));
 }

 void
diff --git a/src/arch/mips/linux/process.cc b/src/arch/mips/linux/process.cc
index 4f885a3..8a90fbf 100644
--- a/src/arch/mips/linux/process.cc
+++ b/src/arch/mips/linux/process.cc
@@ -61,7 +61,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "mips");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

@@ -77,6 +79,8 @@
     unsigned bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, index);

+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     switch (op) {
       case 45:
         {
@@ -84,7 +88,7 @@
             TypedBufferArg<uint64_t> fpcr(bufPtr);
             // I don't think this exactly matches the HW FPCR
             *fpcr = 0;
-            fpcr.copyOut(tc->getMemProxy());
+            fpcr.copyOut(virt_mem);
             return 0;
         }
       default:
@@ -106,6 +110,8 @@
     Addr bufPtr = process->getSyscallArg(tc, index);
     // unsigned nbytes = process->getSyscallArg(tc, index);

+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     switch (op) {

       case 14:
@@ -113,7 +119,7 @@
             // SSI_IEEE_FP_CONTROL
             TypedBufferArg<uint64_t> fpcr(bufPtr);
             // I don't think this exactly matches the HW FPCR
-            fpcr.copyIn(tc->getMemProxy());
+            fpcr.copyIn(virt_mem);
DPRINTFR(SyscallVerbose, "sys_setsysinfo(SSI_IEEE_FP_CONTROL): "
                    " setting FPCR to 0x%x\n", gtoh(*(uint64_t*)fpcr));
             return 0;
diff --git a/src/arch/power/linux/process.cc b/src/arch/power/linux/process.cc
index 3eeb1f5..a065360 100644
--- a/src/arch/power/linux/process.cc
+++ b/src/arch/power/linux/process.cc
@@ -61,7 +61,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "power");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

diff --git a/src/arch/riscv/linux/process.cc b/src/arch/riscv/linux/process.cc
index d65ba71..866de7c 100644
--- a/src/arch/riscv/linux/process.cc
+++ b/src/arch/riscv/linux/process.cc
@@ -65,7 +65,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "riscv");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);
     return 0;
 }

diff --git a/src/arch/sparc/linux/syscalls.cc b/src/arch/sparc/linux/syscalls.cc
index c06f5a0..a5e1d3b 100644
--- a/src/arch/sparc/linux/syscalls.cc
+++ b/src/arch/sparc/linux/syscalls.cc
@@ -51,7 +51,9 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "sparc");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);

     return 0;
 }
@@ -63,6 +65,8 @@
     const IntReg id = htog(100);
     int index = 0;
     auto p = tc->getProcessPtr();
+    auto mem_state = p->memState;
+    auto virt_mem = mem_state->getVirtMem();
     Addr ruid = p->getSyscallArg(tc, index);
     Addr euid = p->getSyscallArg(tc, index);
     Addr suid = p->getSyscallArg(tc, index);
@@ -71,19 +75,19 @@
     if (ruid) {
         BufferArg ruidBuff(ruid, sizeof(IntReg));
         memcpy(ruidBuff.bufferPtr(), &id, sizeof(IntReg));
-        ruidBuff.copyOut(tc->getMemProxy());
+        ruidBuff.copyOut(virt_mem);
     }
     // Set the euid
     if (euid) {
         BufferArg euidBuff(euid, sizeof(IntReg));
         memcpy(euidBuff.bufferPtr(), &id, sizeof(IntReg));
-        euidBuff.copyOut(tc->getMemProxy());
+        euidBuff.copyOut(virt_mem);
     }
     // Set the suid
     if (suid) {
         BufferArg suidBuff(suid, sizeof(IntReg));
         memcpy(suidBuff.bufferPtr(), &id, sizeof(IntReg));
-        suidBuff.copyOut(tc->getMemProxy());
+        suidBuff.copyOut(virt_mem);
     }
     return 0;
 }
diff --git a/src/arch/sparc/process.cc b/src/arch/sparc/process.cc
index 55cea46..c98c9b7 100644
--- a/src/arch/sparc/process.cc
+++ b/src/arch/sparc/process.cc
@@ -450,6 +450,9 @@
     MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
     MiscReg origCWP = CWP;
     CWP = (CWP + Cansave + 2) % NWindows;
+    auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     while (NWindows - 2 - Cansave != 0) {
         if (Otherwin) {
             panic("Otherwin non-zero.\n");
@@ -460,7 +463,7 @@
             for (int index = 16; index < 32; index++) {
                 uint32_t regVal = tc->readIntReg(index);
                 regVal = htog(regVal);
-                if (!tc->getMemProxy().tryWriteBlob(
+                if (!virt_mem.tryWriteBlob(
                         sp + (index - 16) * 4, (uint8_t *)&regVal, 4)) {
                     warn("Failed to save register to the stack when "
                             "flushing windows.\n");
@@ -485,6 +488,9 @@
     MiscReg CWP = tc->readMiscReg(MISCREG_CWP);
     MiscReg origCWP = CWP;
     CWP = (CWP + Cansave + 2) % NWindows;
+    auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
     while (NWindows - 2 - Cansave != 0) {
         if (Otherwin) {
             panic("Otherwin non-zero.\n");
@@ -495,7 +501,7 @@
             for (int index = 16; index < 32; index++) {
                 IntReg regVal = tc->readIntReg(index);
                 regVal = htog(regVal);
-                if (!tc->getMemProxy().tryWriteBlob(
+                if (!virt_mem.tryWriteBlob(
sp + 2047 + (index - 16) * 8, (uint8_t *)&regVal, 8)) {
                     warn("Failed to save register to the stack when "
                             "flushing windows.\n");
diff --git a/src/arch/sparc/solaris/process.cc b/src/arch/sparc/solaris/process.cc
index b9fe36e..637fe4d 100644
--- a/src/arch/sparc/solaris/process.cc
+++ b/src/arch/sparc/solaris/process.cc
@@ -57,7 +57,9 @@
     strcpy(name->version, "Generic_118558-21");
     strcpy(name->machine, "sun4u");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);

     return 0;
 }
diff --git a/src/arch/x86/linux/process.cc b/src/arch/x86/linux/process.cc
index 83c47f9..ceaa4ba 100644
--- a/src/arch/x86/linux/process.cc
+++ b/src/arch/x86/linux/process.cc
@@ -66,7 +66,8 @@
     strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
     strcpy(name->machine, "x86_64");

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    name.copyOut(mem_state->getVirtProxy());

     return 0;
 }
@@ -88,7 +89,10 @@
     int code = process->getSyscallArg(tc, index);
     uint64_t addr = process->getSyscallArg(tc, index);
     uint64_t fsBase, gsBase;
-    SETranslatingPortProxy &p = tc->getMemProxy();
+
+    auto mem_state = process->memState;
+    auto &virt_proxy = mem_state->getVirtProxy();
+
     switch(code)
     {
       // Each of these valid options should actually check addr.
@@ -98,7 +102,7 @@
         return 0;
       case GetFS:
         fsBase = tc->readMiscRegNoEffect(MISCREG_FS_BASE);
-        p.write(addr, fsBase);
+        virt_proxy.write(addr, fsBase);
         return 0;
       case SetGS:
         tc->setMiscRegNoEffect(MISCREG_GS_BASE, addr);
@@ -106,7 +110,7 @@
         return 0;
       case GetGS:
         gsBase = tc->readMiscRegNoEffect(MISCREG_GS_BASE);
-        p.write(addr, gsBase);
+        virt_proxy.write(addr, gsBase);
         return 0;
       default:
         return -EINVAL;
@@ -145,6 +149,8 @@
     const int maxTLSEntry = minTLSEntry + numTLSEntries - 1;

     auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    auto &virt_proxy = mem_state->getVirtProxy();

     X86Process *x86p = dynamic_cast<X86Process *>(process);
     assert(x86p);
@@ -157,10 +163,10 @@
         gdt(x86p->gdtStart() + minTLSEntry * sizeof(uint64_t),
             numTLSEntries * sizeof(uint64_t));

-    if (!userDesc.copyIn(tc->getMemProxy()))
+    if (!userDesc.copyIn(virt_proxy))
         return -EFAULT;

-    if (!gdt.copyIn(tc->getMemProxy()))
+    if (!gdt.copyIn(virt_proxy))
         panic("Failed to copy in GDT for %s.\n", desc->name());

     if (userDesc->entry_number == (uint32_t)(-1)) {
@@ -212,9 +218,9 @@

     gdt[index] = (uint64_t)segDesc;

-    if (!userDesc.copyOut(tc->getMemProxy()))
+    if (!userDesc.copyOut(virt_proxy))
         return -EFAULT;
-    if (!gdt.copyOut(tc->getMemProxy()))
+    if (!gdt.copyOut(virt_proxy))
         panic("Failed to copy out GDT for %s.\n", desc->name());

     return 0;
diff --git a/src/arch/x86/pseudo_inst.cc b/src/arch/x86/pseudo_inst.cc
index c0ec110..5cb3698 100644
--- a/src/arch/x86/pseudo_inst.cc
+++ b/src/arch/x86/pseudo_inst.cc
@@ -66,15 +66,16 @@
 {
     DPRINTF(PseudoInst, "PseudoInst::m5PageFault()\n");

-    Process *p = tc->getProcessPtr();
-    if (!p->fixupStackFault(tc->readMiscReg(MISCREG_CR2))) {
-        SETranslatingPortProxy proxy = tc->getMemProxy();
+    auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    if (!mem_state->fixupFault(tc->readMiscReg(MISCREG_CR2))) {
+        auto &virt_proxy = mem_state->getVirtProxy();
         // at this point we should have 6 values on the interrupt stack
         int size = 6;
         uint64_t is[size];
         // reading the interrupt handler stack
-        proxy.readBlob(ISTVirtAddr + PageBytes - size*sizeof(uint64_t),
-                       (uint8_t *)&is, sizeof(is));
+ virt_proxy.readBlob(ISTVirtAddr + PageBytes - size*sizeof(uint64_t),
+                            (uint8_t *)&is, sizeof(is));
         panic("Page fault at addr %#x\n\tInterrupt handler stack:\n"
                 "\tss: %#x\n"
                 "\trsp: %#x\n"
diff --git a/src/base/remote_gdb.cc b/src/base/remote_gdb.cc
index 37ecef9..81549a1 100644
--- a/src/base/remote_gdb.cc
+++ b/src/base/remote_gdb.cc
@@ -142,6 +142,7 @@
 #include "mem/port.hh"
 #include "mem/se_translating_port_proxy.hh"
 #include "sim/full_system.hh"
+#include "sim/process.hh"
 #include "sim/system.hh"

 using namespace std;
@@ -627,10 +628,12 @@
     DPRINTF(GDBRead, "read:  addr=%#x, size=%d", vaddr, size);

     if (FullSystem) {
-        FSTranslatingPortProxy &proxy = tc->getVirtProxy();
+        auto &proxy = context()->getVirtProxy();
         proxy.readBlob(vaddr, (uint8_t*)data, size);
     } else {
-        SETranslatingPortProxy &proxy = tc->getMemProxy();
+        auto process = context()->getProcessPtr();
+        auto mem_state = process->memState;
+        auto &proxy = mem_state->getVirtMem();
         proxy.readBlob(vaddr, (uint8_t*)data, size);
     }

@@ -670,10 +673,12 @@
             DPRINTFNR("\n");
     }
     if (FullSystem) {
-        FSTranslatingPortProxy &proxy = tc->getVirtProxy();
+        auto &proxy = context()->getVirtProxy();
         proxy.writeBlob(vaddr, (uint8_t*)data, size);
     } else {
-        SETranslatingPortProxy &proxy = tc->getMemProxy();
+        auto process = context()->getProcessPtr();
+        auto mem_state = process->memState;
+        auto &proxy = mem_state->getVirtMem();
         proxy.writeBlob(vaddr, (uint8_t*)data, size);
     }

diff --git a/src/cpu/o3/thread_context.hh b/src/cpu/o3/thread_context.hh
index 2256a8a..a62b5df 100644
--- a/src/cpu/o3/thread_context.hh
+++ b/src/cpu/o3/thread_context.hh
@@ -128,9 +128,6 @@
     virtual void initMemProxies(ThreadContext *tc)
     { thread->initMemProxies(tc); }

-    virtual SETranslatingPortProxy &getMemProxy()
-    { return thread->getMemProxy(); }
-
     /** Returns this thread's status. */
     virtual Status status() const { return thread->status(); }

diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh
index 1e30649..1c534a1 100644
--- a/src/cpu/thread_context.hh
+++ b/src/cpu/thread_context.hh
@@ -160,8 +160,6 @@
      */
     virtual void initMemProxies(ThreadContext *tc) = 0;

-    virtual SETranslatingPortProxy &getMemProxy() = 0;
-
     virtual Process *getProcessPtr() = 0;

     virtual void setProcessPtr(Process *p) = 0;
@@ -413,8 +411,6 @@

void initMemProxies(ThreadContext *tc) { actualTC->initMemProxies(tc); }

- SETranslatingPortProxy &getMemProxy() { return actualTC->getMemProxy(); }
-
     Process *getProcessPtr() { return actualTC->getProcessPtr(); }

     void setProcessPtr(Process *p) { actualTC->setProcessPtr(p); }
diff --git a/src/cpu/thread_state.cc b/src/cpu/thread_state.cc
index 92be179..ac32547 100644
--- a/src/cpu/thread_state.cc
+++ b/src/cpu/thread_state.cc
@@ -48,8 +48,8 @@
       _status(ThreadContext::Halted), baseCpu(cpu),
       _contextId(0), _threadId(_tid), lastActivate(0), lastSuspend(0),
       profile(NULL), profileNode(NULL), profilePC(0), quiesceEvent(NULL),
- kernelStats(NULL), process(_process), physProxy(NULL), virtProxy(NULL),
-      proxy(NULL), funcExeInst(0), storeCondFailures(0)
+ kernelStats(NULL), process(_process), physProxy(NULL), _virtProxy(NULL),
+      funcExeInst(0), storeCondFailures(0)
 {
 }

@@ -57,10 +57,8 @@
 {
     if (physProxy != NULL)
         delete physProxy;
-    if (virtProxy != NULL)
-        delete virtProxy;
-    if (proxy != NULL)
-        delete proxy;
+    if (_virtProxy != NULL)
+        delete _virtProxy;
 }

 void
@@ -115,13 +113,8 @@
         physProxy = new PortProxy(baseCpu->getDataPort(),
                                   baseCpu->cacheLineSize());

-        assert(virtProxy == NULL);
-        virtProxy = new FSTranslatingPortProxy(tc);
-    } else {
-        assert(proxy == NULL);
-        proxy = new SETranslatingPortProxy(baseCpu->getDataPort(),
-                                           process,
- SETranslatingPortProxy::NextPage);
+        assert(_virtProxy == NULL);
+        _virtProxy = new FSTranslatingPortProxy(tc);
     }
 }

@@ -137,16 +130,8 @@
 ThreadState::getVirtProxy()
 {
     assert(FullSystem);
-    assert(virtProxy != NULL);
-    return *virtProxy;
-}
-
-SETranslatingPortProxy &
-ThreadState::getMemProxy()
-{
-    assert(!FullSystem);
-    assert(proxy != NULL);
-    return *proxy;
+    assert(_virtProxy != NULL);
+    return *_virtProxy;
 }

 void
diff --git a/src/cpu/thread_state.hh b/src/cpu/thread_state.hh
index 5cbc332..9db3f1a 100644
--- a/src/cpu/thread_state.hh
+++ b/src/cpu/thread_state.hh
@@ -110,20 +110,8 @@
     void setProcessPtr(Process *p)
     {
         process = p;
-        /**
-         * When the process pointer changes while operating in SE Mode,
-         * the se translating port proxy needs to be reinitialized since it
-         * holds a pointer to the process class.
-         */
-        if (proxy) {
-            delete proxy;
-            proxy = NULL;
-            initMemProxies(NULL);
-        }
     }

-    SETranslatingPortProxy &getMemProxy();
-
     /** Reads the number of instructions functionally executed and
      * committed.
      */
@@ -197,8 +185,7 @@

     /** A translating port proxy, outgoing only, for functional
      * accesse to virtual addresses. */
-    FSTranslatingPortProxy *virtProxy;
-    SETranslatingPortProxy *proxy;
+    FSTranslatingPortProxy *_virtProxy;

   public:
     /*
diff --git a/src/gpu-compute/cl_driver.cc b/src/gpu-compute/cl_driver.cc
index 2297343..d17232c 100644
--- a/src/gpu-compute/cl_driver.cc
+++ b/src/gpu-compute/cl_driver.cc
@@ -107,6 +107,8 @@
 {
     int index = 2;
     auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     Addr buf_addr = process->getSyscallArg(tc, index);

     switch (req) {
@@ -137,7 +139,7 @@
                     k->numInsts() * sizeof(TheGpuISA::RawMachInst);
             }

-            sizes.copyOut(tc->getMemProxy());
+            sizes.copyOut(virt_mem);
         }
         break;

@@ -158,7 +160,7 @@
                 ki->spill_mem_size   = kernelInfo[i].spill_mem_size;
             }

-            kinfo.copyOut(tc->getMemProxy());
+            kinfo.copyOut(virt_mem);
         }
         break;

@@ -183,7 +185,7 @@

             assert(bufp - (char *)buf.bufferPtr() == string_table_size);

-            buf.copyOut(tc->getMemProxy());
+            buf.copyOut(virt_mem);
         }
         break;

@@ -198,7 +200,7 @@
             memcpy(datap,
                    kernels.back()->readonly_data,
                    size);
-            data.copyOut(tc->getMemProxy());
+            data.copyOut(virt_mem);
         }
         break;

@@ -227,7 +229,7 @@
                 }
             }

-            buf.copyOut(tc->getMemProxy());
+            buf.copyOut(virt_mem);
         }
         break;

@@ -235,7 +237,7 @@
         {
             BufferArg buf(buf_addr, sizeof(uint32_t));
             *((uint32_t*)buf.bufferPtr()) = dispatcher->getNumCUs();
-            buf.copyOut(tc->getMemProxy());
+            buf.copyOut(virt_mem);
         }
         break;

@@ -243,14 +245,14 @@
         {
             BufferArg buf(buf_addr, sizeof(uint32_t));
             *((uint32_t*)buf.bufferPtr()) = dispatcher->wfSize();
-            buf.copyOut(tc->getMemProxy());
+            buf.copyOut(virt_mem);
         }
         break;
       case HSA_GET_HW_STATIC_CONTEXT_SIZE:
         {
             BufferArg buf(buf_addr, sizeof(uint32_t));
*((uint32_t*)buf.bufferPtr()) = dispatcher->getStaticContextSize();
-            buf.copyOut(tc->getMemProxy());
+            buf.copyOut(virt_mem);
         }
         break;

diff --git a/src/sim/syscall_emul.cc b/src/sim/syscall_emul.cc
index ae54e1f..515da26 100644
--- a/src/sim/syscall_emul.cc
+++ b/src/sim/syscall_emul.cc
@@ -84,7 +84,10 @@
     BufferArg ctidBuf(addr, sizeof(long));
     long *ctid = (long *)ctidBuf.bufferPtr();
     *ctid = 0;
-    ctidBuf.copyOut(tc->getMemProxy());
+    auto process = tc->getProcessPtr();
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    ctidBuf.copyOut(virt_mem);

     FutexMap &futex_map = tc->getSystemPtr()->futexMap;
     // Wake one of the waiting threads.
@@ -325,7 +328,11 @@
     // Assuming that the size of loff_t is 64 bits on the target platform
     BufferArg result_buf(result_ptr, sizeof(result));
     memcpy(result_buf.bufferPtr(), &result, sizeof(result));
-    result_buf.copyOut(tc->getMemProxy());
+
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    result_buf.copyOut(virt_mem);
+
     return 0;
 }

@@ -353,7 +360,9 @@

     strncpy((char *)name.bufferPtr(), hostname, name_len);

-    name.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    name.copyOut(virt_mem);

     return 0;
 }
@@ -385,7 +394,9 @@
         }
     }

-    buf.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    buf.copyOut(virt_mem);

     return (result == -1) ? -errno : result;
 }
@@ -401,8 +412,9 @@
 {
     string path;
     auto p = tc->getProcessPtr();
-
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     // Adjust path for cwd and redirection
@@ -451,7 +463,7 @@
                   (char*)buf.bufferPtr());
     }

-    buf.copyOut(tc->getMemProxy());
+    buf.copyOut(virt_mem);

     return (result == -1) ? -errno : result;
 }
@@ -467,8 +479,9 @@
 {
     string path;
     auto p = tc->getProcessPtr();
-
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     path = p->checkPathRedirect(path);
@@ -485,7 +498,8 @@
     auto p = tc->getProcessPtr();

     int index = 0;
-    auto &virt_mem = tc->getMemProxy();
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;
     if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
@@ -506,7 +520,8 @@
     auto p = tc->getProcessPtr();

     int index = 0;
-    auto &virt_mem = tc->getMemProxy();
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;
     if (!virt_mem.tryReadString(new_path, p->getSyscallArg(tc, index)))
@@ -526,12 +541,14 @@
     auto p = tc->getProcessPtr();

     int index = 0;
- if (!tc->getMemProxy().tryReadString(old_name, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(old_name, p->getSyscallArg(tc, index)))
         return -EFAULT;

     string new_name;

- if (!tc->getMemProxy().tryReadString(new_name, p->getSyscallArg(tc, index)))
+    if (!virt_mem.tryReadString(new_name, p->getSyscallArg(tc, index)))
         return -EFAULT;

     // Adjust path for cwd and redirection
@@ -549,7 +566,9 @@
     auto p = tc->getProcessPtr();

     int index = 0;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     off_t length = p->getSyscallArg(tc, index);
@@ -585,7 +604,9 @@
     auto process = tc->getProcessPtr();
     string path;

- if (!tc->getMemProxy().tryReadString(path, process->getSyscallArg(tc, index)))
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;

     int64_t length = process->getSyscallArg(tc, index, 64);
@@ -640,7 +661,9 @@
     auto p = tc->getProcessPtr();

     int index = 0;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     /* XXX endianess */
@@ -859,7 +882,10 @@
     int *buf_ptr = (int*)tgt_handle.bufferPtr();
     buf_ptr[0] = tgt_fds[0];
     buf_ptr[1] = tgt_fds[1];
-    tgt_handle.copyOut(tc->getMemProxy());
+
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    tgt_handle.copyOut(virt_mem);
     return 0;
 }

@@ -1036,7 +1062,9 @@
 {
     string path;
     auto p = tc->getProcessPtr();
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     // Adjust path for cwd and redirection
@@ -1060,7 +1088,9 @@
     auto p = tc->getProcessPtr();
     int index = 0;
     std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     path = p->checkPathRedirect(path);
@@ -1076,7 +1106,9 @@
     auto p = tc->getProcessPtr();
     int index = 0;
     std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     path = p->checkPathRedirect(path);
@@ -1093,7 +1125,9 @@
     auto p = tc->getProcessPtr();
     int index = 0;
     std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     std::string tgt_old_cwd = p->getTgtCwd();
@@ -1125,7 +1159,9 @@
     auto p = tc->getProcessPtr();
     int index = 0;
     std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     path = p->checkPathRedirect(path);
@@ -1179,7 +1215,9 @@
         traversed += host_reclen;
     }

-    buf_arg.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    buf_arg.copyOut(virt_mem);
     return status;
 }

@@ -1211,7 +1249,9 @@
     int addrlen = p->getSyscallArg(tc, index);

     BufferArg bufSock(buf_ptr, addrlen);
-    bufSock.copyIn(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    bufSock.copyIn(virt_mem);

auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
     if (!sfdp)
@@ -1253,7 +1293,9 @@
     int addrlen = p->getSyscallArg(tc, index);

     BufferArg addr(buf_ptr, addrlen);
-    addr.copyIn(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    addr.copyIn(virt_mem);

auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
     if (!sfdp)
@@ -1287,19 +1329,22 @@
     // Reserve buffer space.
     BufferArg bufrBuf(bufrPtr, bufrLen);

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     // Get address length.
     socklen_t addrLen = 0;
     if (addrlenPtr != 0) {
         // Read address length parameter.
         BufferArg addrlenBuf(addrlenPtr, sizeof(socklen_t));
-        addrlenBuf.copyIn(tc->getMemProxy());
+        addrlenBuf.copyIn(virt_mem);
         addrLen = *((socklen_t *)addrlenBuf.bufferPtr());
     }

     struct sockaddr sa, *sap = NULL;
     if (addrLen != 0) {
         BufferArg addrBuf(addrPtr, addrLen);
-        addrBuf.copyIn(tc->getMemProxy());
+        addrBuf.copyIn(virt_mem);
         memcpy(&sa, (struct sockaddr *)addrBuf.bufferPtr(),
                sizeof(struct sockaddr));
         sap = &sa;
@@ -1313,20 +1358,20 @@
         return -errno;

     // Pass the received data out.
-    bufrBuf.copyOut(tc->getMemProxy());
+    bufrBuf.copyOut(virt_mem);

     // Copy address to addrPtr and pass it on.
     if (sap != NULL) {
         BufferArg addrBuf(addrPtr, addrLen);
         memcpy(addrBuf.bufferPtr(), sap, sizeof(sa));
-        addrBuf.copyOut(tc->getMemProxy());
+        addrBuf.copyOut(virt_mem);
     }

     // Copy len to addrlenPtr and pass it on.
     if (addrLen != 0) {
         BufferArg addrlenBuf(addrlenPtr, sizeof(socklen_t));
         *(socklen_t *)addrlenBuf.bufferPtr() = addrLen;
-        addrlenBuf.copyOut(tc->getMemProxy());
+        addrlenBuf.copyOut(virt_mem);
     }

     return recvd_size;
@@ -1349,15 +1394,18 @@
         return -EBADF;
     int sim_fd = sfdp->getSimFD();

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     // Reserve buffer space.
     BufferArg bufrBuf(bufrPtr, bufrLen);
-    bufrBuf.copyIn(tc->getMemProxy());
+    bufrBuf.copyIn(virt_mem);

     struct sockaddr sa, *sap = nullptr;
     memset(&sa, 0, sizeof(sockaddr));
     if (addrLen != 0) {
         BufferArg addrBuf(addrPtr, addrLen);
-        addrBuf.copyIn(tc->getMemProxy());
+        addrBuf.copyIn(virt_mem);
         memcpy(&sa, (sockaddr*)addrBuf.bufferPtr(), addrLen);
         sap = &sa;
     }
@@ -1400,6 +1448,8 @@
       *    size_t iov_len;               // number of bytes to transfer
       *  };
       */
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();

     /**
* The plan with this system call is to replace all of the pointers in the
@@ -1407,7 +1457,7 @@
      * copy every field from the structures into our BufferArg classes.
      */
     BufferArg msgBuf(msgPtr, sizeof(struct msghdr));
-    msgBuf.copyIn(tc->getMemProxy());
+    msgBuf.copyIn(virt_mem);
     struct msghdr *msgHdr = (struct msghdr *)msgBuf.bufferPtr();

     /**
@@ -1427,7 +1477,7 @@
     if (msgHdr->msg_name) {
         /*1*/msg_name_phold = (Addr)msgHdr->msg_name;
         /*2*/nameBuf = new BufferArg(msg_name_phold, msgHdr->msg_namelen);
-        /*3*/nameBuf->copyIn(tc->getMemProxy());
+        /*3*/nameBuf->copyIn(virt_mem);
         /*4*/msgHdr->msg_name = nameBuf->bufferPtr();
     }

@@ -1447,14 +1497,14 @@
         /*1*/msg_iov_phold = (Addr)msgHdr->msg_iov;
         /*2*/iovBuf = new BufferArg(msg_iov_phold, msgHdr->msg_iovlen *
                                     sizeof(struct iovec));
-        /*3*/iovBuf->copyIn(tc->getMemProxy());
+        /*3*/iovBuf->copyIn(virt_mem);
         for (int i = 0; i < msgHdr->msg_iovlen; i++) {
             if (((struct iovec *)iovBuf->bufferPtr())[i].iov_base) {
                 /*1*/iovec_base_phold[i] =
(Addr)((struct iovec *)iovBuf->bufferPtr())[i].iov_base;
                 /*2*/iovecBuf[i] = new BufferArg(iovec_base_phold[i],
                      ((struct iovec *)iovBuf->bufferPtr())[i].iov_len);
-                /*3*/iovecBuf[i]->copyIn(tc->getMemProxy());
+                /*3*/iovecBuf[i]->copyIn(virt_mem);
                 /*4*/((struct iovec *)iovBuf->bufferPtr())[i].iov_base =
                      iovecBuf[i]->bufferPtr();
             }
@@ -1470,7 +1520,7 @@
         /*1*/msg_control_phold = (Addr)msgHdr->msg_control;
         /*2*/controlBuf = new BufferArg(msg_control_phold,
CMSG_ALIGN(msgHdr->msg_controllen));
-        /*3*/controlBuf->copyIn(tc->getMemProxy());
+        /*3*/controlBuf->copyIn(virt_mem);
         /*4*/msgHdr->msg_control = controlBuf->bufferPtr();
     }

@@ -1480,7 +1530,7 @@
         return -errno;

     if (msgHdr->msg_name) {
-        nameBuf->copyOut(tc->getMemProxy());
+        nameBuf->copyOut(virt_mem);
         delete(nameBuf);
         msgHdr->msg_name = (void *)msg_name_phold;
     }
@@ -1488,24 +1538,24 @@
     if (msgHdr->msg_iov) {
         for (int i = 0; i< msgHdr->msg_iovlen; i++) {
             if (((struct iovec *)iovBuf->bufferPtr())[i].iov_base) {
-                iovecBuf[i]->copyOut(tc->getMemProxy());
+                iovecBuf[i]->copyOut(virt_mem);
                 delete iovecBuf[i];
                 ((struct iovec *)iovBuf->bufferPtr())[i].iov_base =
                 (void *)iovec_base_phold[i];
             }
         }
-        iovBuf->copyOut(tc->getMemProxy());
+        iovBuf->copyOut(virt_mem);
         delete iovBuf;
         msgHdr->msg_iov = (struct iovec *)msg_iov_phold;
     }

     if (msgHdr->msg_control) {
-        controlBuf->copyOut(tc->getMemProxy());
+        controlBuf->copyOut(virt_mem);
         delete(controlBuf);
         msgHdr->msg_control = (void *)msg_control_phold;
     }

-    msgBuf.copyOut(tc->getMemProxy());
+    msgBuf.copyOut(virt_mem);

     return recvd_size;
 }
@@ -1524,11 +1574,14 @@
         return -EBADF;
     int sim_fd = sfdp->getSimFD();

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     /**
      * Reserve buffer space.
      */
     BufferArg msgBuf(msgPtr, sizeof(struct msghdr));
-    msgBuf.copyIn(tc->getMemProxy());
+    msgBuf.copyIn(virt_mem);
     struct msghdr msgHdr = *((struct msghdr *)msgBuf.bufferPtr());

     /**
@@ -1537,7 +1590,7 @@
      */
     struct iovec *iovPtr = msgHdr.msg_iov;
BufferArg iovBuf((Addr)iovPtr, sizeof(struct iovec) * msgHdr.msg_iovlen);
-    iovBuf.copyIn(tc->getMemProxy());
+    iovBuf.copyIn(virt_mem);
     struct iovec *iov = (struct iovec *)iovBuf.bufferPtr();
     msgHdr.msg_iov = iov;

@@ -1557,7 +1610,7 @@
     for (int iovIndex = 0 ; iovIndex < msgHdr.msg_iovlen; iovIndex++) {
         Addr basePtr = (Addr) iov[iovIndex].iov_base;
bufferArray[iovIndex] = new BufferArg(basePtr, iov[iovIndex].iov_len);
-        bufferArray[iovIndex]->copyIn(tc->getMemProxy());
+        bufferArray[iovIndex]->copyIn(virt_mem);
         iov[iovIndex].iov_base = bufferArray[iovIndex]->bufferPtr();
     }

@@ -1610,15 +1663,18 @@
     if (status == -1)
         return -errno;

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     // copy val to valPtr and pass it on
     BufferArg valBuf(valPtr, sizeof(val));
     memcpy(valBuf.bufferPtr(), &val, sizeof(val));
-    valBuf.copyOut(tc->getMemProxy());
+    valBuf.copyOut(virt_mem);

     // copy len to lenPtr and pass  it on
     BufferArg lenBuf(lenPtr, sizeof(len));
     memcpy(lenBuf.bufferPtr(), &len, sizeof(len));
-    lenBuf.copyOut(tc->getMemProxy());
+    lenBuf.copyOut(virt_mem);

     return status;
 }
@@ -1637,12 +1693,15 @@
         return -EBADF;
     int sim_fd = sfdp->getSimFD();

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     // lenPtr is an in-out paramenter:
     // sending the address length in, conveying the final length out

     // Read in the value of len from the passed pointer.
     BufferArg lenBuf(lenPtr, sizeof(socklen_t));
-    lenBuf.copyIn(tc->getMemProxy());
+    lenBuf.copyIn(virt_mem);
     socklen_t len = *(socklen_t *)lenBuf.bufferPtr();

     struct sockaddr sa;
@@ -1654,11 +1713,11 @@
     // Copy address to addrPtr and pass it on.
     BufferArg addrBuf(addrPtr, sizeof(sa));
     memcpy(addrBuf.bufferPtr(), &sa, sizeof(sa));
-    addrBuf.copyOut(tc->getMemProxy());
+    addrBuf.copyOut(virt_mem);

     // Copy len to lenPtr and pass  it on.
     *(socklen_t *)lenBuf.bufferPtr() = len;
-    lenBuf.copyOut(tc->getMemProxy());
+    lenBuf.copyOut(virt_mem);

     return status;
 }
@@ -1677,8 +1736,11 @@
         return -EBADF;
     int sim_fd = sfdp->getSimFD();

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     BufferArg bufAddrlen(addrlenPtr, sizeof(unsigned));
-    bufAddrlen.copyIn(tc->getMemProxy());
+    bufAddrlen.copyIn(virt_mem);
     BufferArg bufSock(sockAddrPtr, *(unsigned *)bufAddrlen.bufferPtr());

     int retval = getpeername(sim_fd,
@@ -1686,8 +1748,8 @@
                              (unsigned *)bufAddrlen.bufferPtr());

     if (retval != -1) {
-        bufSock.copyOut(tc->getMemProxy());
-        bufAddrlen.copyOut(tc->getMemProxy());
+        bufSock.copyOut(virt_mem);
+        bufAddrlen.copyOut(virt_mem);
     }

     return (retval == -1) ? -errno : retval;
@@ -1704,8 +1766,11 @@
     Addr valPtr = p->getSyscallArg(tc, index);
     socklen_t len = p->getSyscallArg(tc, index);

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+
     BufferArg valBuf(valPtr, len);
-    valBuf.copyIn(tc->getMemProxy());
+    valBuf.copyIn(virt_mem);

auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
     if (!sfdp)
diff --git a/src/sim/syscall_emul.hh b/src/sim/syscall_emul.hh
index 2e121bf..41c0c51 100644
--- a/src/sim/syscall_emul.hh
+++ b/src/sim/syscall_emul.hh
@@ -355,7 +355,9 @@
     if (OS::TGT_FUTEX_WAIT == op) {
         // Ensure futex system call accessed atomically.
         BufferArg buf(uaddr, sizeof(int));
-        buf.copyIn(tc->getMemProxy());
+        auto mem_state = process->memState;
+        auto &virt_mem = mem_state->getVirtMem();
+        buf.copyIn(virt_mem);
         int mem_val = *(int*)buf.bufferPtr();

         /*
@@ -608,25 +610,26 @@
auto sfdp = std::dynamic_pointer_cast<SocketFDEntry>((*p->fds)[tgt_fd]);
     if (sfdp) {
         int status;
-
+        auto mem_state = p->memState;
+        auto &virt_mem = mem_state->getVirtMem();
         switch (req) {
           case SIOCGIFCONF: {
             Addr conf_addr = p->getSyscallArg(tc, index);
             BufferArg conf_arg(conf_addr, sizeof(ifconf));
-            conf_arg.copyIn(tc->getMemProxy());
+            conf_arg.copyIn(virt_mem);

             ifconf *conf = (ifconf*)conf_arg.bufferPtr();
             Addr ifc_buf_addr = (Addr)conf->ifc_buf;
             BufferArg ifc_buf_arg(ifc_buf_addr, conf->ifc_len);
-            ifc_buf_arg.copyIn(tc->getMemProxy());
+            ifc_buf_arg.copyIn(virt_mem);

             conf->ifc_buf = (char*)ifc_buf_arg.bufferPtr();

             status = ioctl(sfdp->getSimFD(), req, conf_arg.bufferPtr());
             if (status != -1) {
                 conf->ifc_buf = (char*)ifc_buf_addr;
-                ifc_buf_arg.copyOut(tc->getMemProxy());
-                conf_arg.copyOut(tc->getMemProxy());
+                ifc_buf_arg.copyOut(virt_mem);
+                conf_arg.copyOut(virt_mem);
             }

             return status;
@@ -639,11 +642,11 @@
           case SIOCGIFMTU: {
             Addr req_addr = p->getSyscallArg(tc, index);
             BufferArg req_arg(req_addr, sizeof(ifreq));
-            req_arg.copyIn(tc->getMemProxy());
+            req_arg.copyIn(virt_mem);

             status = ioctl(sfdp->getSimFD(), req, req_arg.bufferPtr());
             if (status != -1)
-                req_arg.copyOut(tc->getMemProxy());
+                req_arg.copyOut(virt_mem);
             return status;
           }
         }
@@ -678,7 +681,9 @@
      * string from that memory space into the host's working memory space.
      */
     std::string path;
- if (!tc->getMemProxy().tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

 #ifdef __CYGWIN32__
@@ -871,8 +876,9 @@

     std::string old_name;

-    if (!tc->getMemProxy().tryReadString(old_name,
- process->getSyscallArg(tc, index)))
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+ if (!virt_mem.tryReadString(old_name, process->getSyscallArg(tc, index)))
         return -EFAULT;

     int newdirfd = process->getSyscallArg(tc, index);
@@ -881,8 +887,7 @@

     std::string new_name;

-    if (!tc->getMemProxy().tryReadString(new_name,
- process->getSyscallArg(tc, index))) + if (!virt_mem.tryReadString(new_name, process->getSyscallArg(tc, index)))
         return -EFAULT;

     // Adjust path for cwd and redirection
@@ -908,7 +913,9 @@
     sysinfo->totalram = process->system->memSize();
     sysinfo->mem_unit = 1;

-    sysinfo.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    sysinfo.copyOut(virt_mem);

     return 0;
 }
@@ -922,10 +929,10 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }

     uint32_t mode = process->getSyscallArg(tc, index);
     mode_t hostMode = 0;
@@ -955,7 +962,9 @@
     int tmout = p->getSyscallArg(tc, index);

     BufferArg fdsBuf(fdsPtr, sizeof(struct pollfd) * nfds);
-    fdsBuf.copyIn(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    fdsBuf.copyIn(virt_mem);

     /**
      * Record the target file descriptors in a local variable. We need to
@@ -1015,7 +1024,7 @@
      * Copy out the pollfd struct because the host may have updated fields
      * in the structure.
      */
-    fdsBuf.copyOut(tc->getMemProxy());
+    fdsBuf.copyOut(virt_mem);

     return status;
 }
@@ -1131,10 +1140,11 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }
+
     Addr bufPtr = process->getSyscallArg(tc, index);

     // Adjust path for cwd and redirection
@@ -1146,7 +1156,7 @@
     if (result < 0)
         return -errno;

-    copyOutStatBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStatBuf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1161,9 +1171,11 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index)))
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
+
     Addr bufPtr = process->getSyscallArg(tc, index);

     // Adjust path for cwd and redirection
@@ -1180,7 +1192,7 @@
     if (result < 0)
         return -errno;

-    copyOutStat64Buf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStat64Buf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1198,8 +1210,9 @@
         warn("fstatat64: first argument not AT_FDCWD; unlikely to work");

     std::string path;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index)))
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
     Addr bufPtr = process->getSyscallArg(tc, index);

@@ -1217,7 +1230,7 @@
     if (result < 0)
         return -errno;

-    copyOutStat64Buf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStat64Buf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1249,7 +1262,9 @@
     if (result < 0)
         return -errno;

- copyOutStat64Buf<OS>(tc->getMemProxy(), bufPtr, &hostBuf, (sim_fd == 1));
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    copyOutStat64Buf<OS>(virt_mem, bufPtr, &hostBuf, (sim_fd == 1));

     return 0;
 }
@@ -1264,10 +1279,10 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }
     Addr bufPtr = process->getSyscallArg(tc, index);

     // Adjust path for cwd and redirection
@@ -1279,7 +1294,7 @@
     if (result < 0)
         return -errno;

-    copyOutStatBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStatBuf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1293,10 +1308,10 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }
     Addr bufPtr = process->getSyscallArg(tc, index);

     // Adjust path for cwd and redirection
@@ -1313,7 +1328,7 @@
     if (result < 0)
         return -errno;

-    copyOutStat64Buf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStat64Buf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1341,7 +1356,9 @@
     if (result < 0)
         return -errno;

-    copyOutStatBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf, (sim_fd == 1));
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    copyOutStatBuf<OS>(virt_mem, bufPtr, &hostBuf, (sim_fd == 1));

     return 0;
 }
@@ -1358,10 +1375,10 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }
     Addr bufPtr = process->getSyscallArg(tc, index);

     // Adjust path for cwd and redirection
@@ -1373,7 +1390,7 @@
     if (result < 0)
         return -errno;

-    copyOutStatfsBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    copyOutStatfsBuf<OS>(virt_mem, bufPtr, &hostBuf);
 #endif
     return 0;
 }
@@ -1455,7 +1472,9 @@
         BufferArg ptidBuf(ptidPtr, sizeof(long));
         long *ptid = (long *)ptidBuf.bufferPtr();
         *ptid = cp->pid();
-        ptidBuf.copyOut(tc->getMemProxy());
+        auto parent_mem_state = p->memState;
+        auto &parent_virt_mem = parent_mem_state->getVirtMem();
+        ptidBuf.copyOut(parent_virt_mem);
     }

     cp->initState();
@@ -1472,7 +1491,8 @@
         BufferArg ctidBuf(ctidPtr, sizeof(long));
         long *ctid = (long *)ctidBuf.bufferPtr();
         *ctid = cp->pid();
-        ctidBuf.copyOut(ctc->getMemProxy());
+        auto &child_virt_mem = child_mem_state->getVirtMem();
+        ctidBuf.copyOut(child_virt_mem);
     }

     if (flags & OS::TGT_CLONE_CHILD_CLEARTID)
@@ -1544,7 +1564,9 @@
     if (result < 0)
         return -errno;

-    copyOutStatfsBuf<OS>(tc->getMemProxy(), bufPtr, &hostBuf);
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    copyOutStatfsBuf<OS>(virt_mem, bufPtr, &hostBuf);

     return 0;
 }
@@ -1563,14 +1585,15 @@
         return -EBADF;
     int sim_fd = ffdp->getSimFD();

-    SETranslatingPortProxy &prox = tc->getMemProxy();
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     uint64_t tiov_base = p->getSyscallArg(tc, index);
     size_t count = p->getSyscallArg(tc, index);
     typename OS::tgt_iovec tiov[count];
     struct iovec hiov[count];
     for (size_t i = 0; i < count; ++i) {
-        prox.readBlob(tiov_base + (i * sizeof(typename OS::tgt_iovec)),
-                      (uint8_t*)&tiov[i], sizeof(typename OS::tgt_iovec));
+        virt_mem.readBlob(tiov_base + (i * sizeof(typename OS::tgt_iovec)),
+ (uint8_t*)&tiov[i], sizeof(typename OS::tgt_iovec));
         hiov[i].iov_len = TheISA::gtoh(tiov[i].iov_len);
         hiov[i].iov_base = new char [hiov[i].iov_len];
     }
@@ -1580,8 +1603,8 @@

     for (size_t i = 0; i < count; ++i) {
         if (result != -1) {
-            prox.writeBlob(TheISA::htog(tiov[i].iov_base),
-                           (uint8_t*)hiov[i].iov_base, hiov[i].iov_len);
+            virt_mem.writeBlob(TheISA::htog(tiov[i].iov_base),
+ (uint8_t*)hiov[i].iov_base, hiov[i].iov_len);
         }
         delete [] (char *)hiov[i].iov_base;
     }
@@ -1603,19 +1626,21 @@
         return -EBADF;
     int sim_fd = hbfdp->getSimFD();

-    SETranslatingPortProxy &prox = tc->getMemProxy();
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     uint64_t tiov_base = p->getSyscallArg(tc, index);
     size_t count = p->getSyscallArg(tc, index);
     struct iovec hiov[count];
     for (size_t i = 0; i < count; ++i) {
         typename OS::tgt_iovec tiov;

-        prox.readBlob(tiov_base + i*sizeof(typename OS::tgt_iovec),
-                      (uint8_t*)&tiov, sizeof(typename OS::tgt_iovec));
+        virt_mem.readBlob(tiov_base + i*sizeof(typename OS::tgt_iovec),
+                          (uint8_t*)&tiov, sizeof(typename OS::tgt_iovec));
         hiov[i].iov_len = TheISA::gtoh(tiov.iov_len);
         hiov[i].iov_base = new char [hiov[i].iov_len];
- prox.readBlob(TheISA::gtoh(tiov.iov_base), (uint8_t *)hiov[i].iov_base,
-                      hiov[i].iov_len);
+        virt_mem.readBlob(TheISA::gtoh(tiov.iov_base),
+                          (uint8_t *)hiov[i].iov_base,
+                          hiov[i].iov_len);
     }

     int result = writev(sim_fd, hiov, count);
@@ -1822,7 +1847,9 @@
     int sim_fd = ffdp->getSimFD();

     BufferArg bufArg(bufPtr, nbytes);
-    bufArg.copyIn(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    bufArg.copyIn(virt_mem);

     int bytes_written = pwrite(sim_fd, bufArg.bufferPtr(), nbytes, offset);

@@ -1876,7 +1903,9 @@
         break;
     }

-    rlp.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    rlp.copyOut(virt_mem);
     return 0;
 }

@@ -1917,7 +1946,9 @@
             return -EINVAL;
             break;
         }
-        rlp.copyOut(tc->getMemProxy());
+        auto mem_state = process->memState;
+        auto &virt_mem = mem_state->getVirtMem();
+        rlp.copyOut(virt_mem);
     }
     return 0;
 }
@@ -1937,7 +1968,9 @@
     tp->tv_sec = TheISA::htog(tp->tv_sec);
     tp->tv_nsec = TheISA::htog(tp->tv_nsec);

-    tp.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    tp.copyOut(virt_mem);

     return 0;
 }
@@ -1955,7 +1988,9 @@
     tp->tv_sec = 0;
     tp->tv_nsec = 1;

-    tp.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    tp.copyOut(virt_mem);

     return 0;
 }
@@ -1974,7 +2009,9 @@
     tp->tv_sec = TheISA::htog(tp->tv_sec);
     tp->tv_usec = TheISA::htog(tp->tv_usec);

-    tp.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    tp.copyOut(virt_mem);

     return 0;
 }
@@ -1989,14 +2026,14 @@
     auto process = tc->getProcessPtr();

     int index = 0;
-    if (!tc->getMemProxy().tryReadString(path,
-                process->getSyscallArg(tc, index))) {
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, process->getSyscallArg(tc, index)))
         return -EFAULT;
-    }

     TypedBufferArg<typename OS::timeval [2]>
         tp(process->getSyscallArg(tc, index));
-    tp.copyIn(tc->getMemProxy());
+    tp.copyIn(virt_mem);

     struct timeval hostTimeval[2];
     for (int i = 0; i < 2; ++i) {
@@ -2024,26 +2061,27 @@

     int index = 0;
     std::string path;
-    SETranslatingPortProxy & mem_proxy = tc->getMemProxy();
-    if (!mem_proxy.tryReadString(path, p->getSyscallArg(tc, index)))
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    if (!virt_mem.tryReadString(path, p->getSyscallArg(tc, index)))
         return -EFAULT;

     if (access(path.c_str(), F_OK) == -1)
         return -EACCES;

     auto read_in = [](std::vector<std::string> & vect,
-                      SETranslatingPortProxy & mem_proxy,
+                      const SETranslatingPortProxy & virt_mem,
                       Addr mem_loc)
     {
         for (int inc = 0; ; inc++) {
             BufferArg b((mem_loc + sizeof(Addr) * inc), sizeof(Addr));
-            b.copyIn(mem_proxy);
+            b.copyIn(virt_mem);

             if (!*(Addr*)b.bufferPtr())
                 break;

             vect.push_back(std::string());
-            mem_proxy.tryReadString(vect[inc], *(Addr*)b.bufferPtr());
+            virt_mem.tryReadString(vect[inc], *(Addr*)b.bufferPtr());
         }
     };

@@ -2056,9 +2094,9 @@
     ProcessParams *pp = new ProcessParams();
     pp->executable = path;
     Addr argv_mem_loc = p->getSyscallArg(tc, index);
-    read_in(pp->cmd, mem_proxy, argv_mem_loc);
+    read_in(pp->cmd, virt_mem, argv_mem_loc);
     Addr envp_mem_loc = p->getSyscallArg(tc, index);
-    read_in(pp->env, mem_proxy, envp_mem_loc);
+    read_in(pp->env, virt_mem, envp_mem_loc);
     pp->uid = p->uid();
     pp->egid = p->egid();
     pp->euid = p->euid();
@@ -2155,7 +2193,9 @@
              who);
     }

-    rup.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    rup.copyOut(virt_mem);

     return 0;
 }
@@ -2180,7 +2220,9 @@
     bufp->tms_utime = TheISA::htog(bufp->tms_utime);

     // Write back
-    bufp.copyOut(tc->getMemProxy());
+    auto mem_state = process->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    bufp.copyOut(virt_mem);

     // Return clock ticks since system boot
     return clocks;
@@ -2201,8 +2243,10 @@
     if (taddr != 0) {
         typename OS::time_t t = sec;
         t = TheISA::htog(t);
-        SETranslatingPortProxy &p = tc->getMemProxy();
-        p.writeBlob(taddr, (uint8_t*)&t, (int)sizeof(typename OS::time_t));
+        auto mem_state = process->memState;
+        auto &virt_mem = mem_state->getVirtMem();
+        virt_mem.writeBlob(taddr, (uint8_t*)&t,
+                           (int)sizeof(typename OS::time_t));
     }
     return sec;
 }
@@ -2309,7 +2353,9 @@
     fds[0] = p->fds->allocFD(sfdp1);
auto sfdp2 = std::make_shared<SocketFDEntry>(fds[1], domain, type, prot);
     fds[1] = p->fds->allocFD(sfdp2);
-    svBuf.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    svBuf.copyOut(virt_mem);

     return status;
 }
@@ -2348,12 +2394,14 @@
     /**
      * Copy in the fd_set from the target.
      */
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     if (fds_read_ptr)
-        rd_t.copyIn(tc->getMemProxy());
+        rd_t.copyIn(virt_mem);
     if (fds_writ_ptr)
-        wr_t.copyIn(tc->getMemProxy());
+        wr_t.copyIn(virt_mem);
     if (fds_excp_ptr)
-        ex_t.copyIn(tc->getMemProxy());
+        ex_t.copyIn(virt_mem);

     /**
      * We need to translate the target file descriptor set into a host file
@@ -2499,13 +2547,13 @@
     }

     if (fds_read_ptr)
-        rd_t.copyOut(tc->getMemProxy());
+        rd_t.copyOut(virt_mem);
     if (fds_writ_ptr)
-        wr_t.copyOut(tc->getMemProxy());
+        wr_t.copyOut(virt_mem);
     if (fds_excp_ptr)
-        ex_t.copyOut(tc->getMemProxy());
+        ex_t.copyOut(virt_mem);
     if (time_val_ptr)
-        tp.copyOut(tc->getMemProxy());
+        tp.copyOut(virt_mem);

     return retval;
 }
@@ -2535,8 +2583,10 @@
     BufferArg buf_arg(buf_ptr, nbytes);
     int bytes_read = read(sim_fd, buf_arg.bufferPtr(), nbytes);

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     if (bytes_read > 0)
-        buf_arg.copyOut(tc->getMemProxy());
+        buf_arg.copyOut(virt_mem);

     return (bytes_read == -1) ? -errno : bytes_read;
 }
@@ -2557,7 +2607,9 @@
     int sim_fd = hbfdp->getSimFD();

     BufferArg buf_arg(buf_ptr, nbytes);
-    buf_arg.copyIn(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    buf_arg.copyIn(virt_mem);

     struct pollfd pfd;
     pfd.fd = sim_fd;
@@ -2637,7 +2689,9 @@
     const int EXITED = 0;
     BufferArg statusBuf(statPtr, sizeof(int));
     *(int *)statusBuf.bufferPtr() = EXITED;
-    statusBuf.copyOut(tc->getMemProxy());
+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
+    statusBuf.copyOut(virt_mem);

     // Return the child PID.
     pid_t retval = iter->sender->pid();
@@ -2679,16 +2733,18 @@
         && !(sfdp->getFlags() & OS::TGT_O_NONBLOCK))
         return SyscallReturn::retry();

+    auto mem_state = p->memState;
+    auto &virt_mem = mem_state->getVirtMem();
     if (lenPtr) {
         lenBufPtr = new BufferArg(lenPtr, sizeof(socklen_t));
-        lenBufPtr->copyIn(tc->getMemProxy());
+        lenBufPtr->copyIn(virt_mem);
         memcpy(&addrLen, (socklen_t *)lenBufPtr->bufferPtr(),
                sizeof(socklen_t));
     }

     if (addrPtr) {
         addrBufPtr = new BufferArg(addrPtr, sizeof(struct sockaddr));
-        addrBufPtr->copyIn(tc->getMemProxy());
+        addrBufPtr->copyIn(virt_mem);
         memcpy(&sa, (struct sockaddr *)addrBufPtr->bufferPtr(),
                sizeof(struct sockaddr));
     }
@@ -2700,13 +2756,13 @@

     if (addrPtr) {
         memcpy(addrBufPtr->bufferPtr(), &sa, sizeof(sa));
-        addrBufPtr->copyOut(tc->getMemProxy());
+        addrBufPtr->copyOut(virt_mem);
         delete(addrBufPtr);
     }

     if (lenPtr) {
         *(socklen_t *)lenBufPtr->bufferPtr() = addrLen;
-        lenBufPtr->copyOut(tc->getMemProxy());
+        lenBufPtr->copyOut(virt_mem);
         delete(lenBufPtr);
     }


--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/12305
To unsubscribe, or for help writing mail filters, visit https://gem5-review.googlesource.com/settings

Gerrit-Project: public/gem5
Gerrit-Branch: master
Gerrit-Change-Id: Ic1a6c3017c412a24db91770396d0a9bde790421d
Gerrit-Change-Number: 12305
Gerrit-PatchSet: 1
Gerrit-Owner: Brandon Potter <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list
[email protected]
http://m5sim.org/mailman/listinfo/gem5-dev

Reply via email to