Add in a new translating port that allows syscalls to translate addresses via the...
authorRon Dreslinski <rdreslin@umich.edu>
Tue, 21 Feb 2006 04:26:39 +0000 (23:26 -0500)
committerRon Dreslinski <rdreslin@umich.edu>
Tue, 21 Feb 2006 04:26:39 +0000 (23:26 -0500)
Other compile issues cleaned up.

SConscript:
    Changes to compile the new Translating Port.
    Split out memtester and eio support, will rework them back in after first getting a simpleCPU to work
arch/alpha/alpha_linux_process.cc:
arch/alpha/alpha_tru64_process.cc:
sim/syscall_emul.cc:
sim/syscall_emul.hh:
    Changes to use the new translating Port.
cpu/exec_context.cc:
cpu/exec_context.hh:
    Create a translating port in each execution context.
sim/process.cc:
    Fix the way we do proxy memory

--HG--
extra : convert_revision : 3d33218fe8b425a5d9ce24757f1112b4aa6001fd

SConscript
arch/alpha/alpha_linux_process.cc
arch/alpha/alpha_tru64_process.cc
cpu/exec_context.cc
cpu/exec_context.hh
mem/translating_port.cc [new file with mode: 0644]
mem/translating_port.hh [new file with mode: 0644]
sim/process.cc
sim/syscall_emul.cc
sim/syscall_emul.hh

index b4f57ddbcc64967bd5da54af10d61dbb31685f17..3e613d840b2ba257ecc08a2d327a08a76849867b 100644 (file)
@@ -93,7 +93,7 @@ base_sources = Split('''
         mem/memory.cc
         mem/page_table.cc
         mem/physical.cc
-        mem/proxy.cc
+        mem/translating_port.cc
 
         python/pyconfig.cc
         python/embedded_py.cc
@@ -294,14 +294,21 @@ syscall_emulation_sources = Split('''
        arch/alpha/alpha_common_syscall_emul.cc
        arch/alpha/alpha_linux_process.cc
        arch/alpha/alpha_tru64_process.cc
-       cpu/memtest/memtest.cc
-       encumbered/eio/eio.cc
+
        encumbered/eio/exolex.cc
        encumbered/eio/libexo.cc
        sim/process.cc
        sim/syscall_emul.cc
         ''')
 
+eio_sources = Split('''
+       encumbered/eio/eio.cc
+        ''')
+
+memtest_sources = Split('''
+       cpu/memtest/memtest.cc
+        ''')
+
 targetarch_files = Split('''
         alpha_common_syscall_emul.hh
         alpha_linux_process.hh
index be2013e1efdc8c63dc0c3adf100ea67697b78bd6..16816e901865db84e161023c5894997b58c583b4 100644 (file)
@@ -36,7 +36,7 @@
 
 #include "cpu/base.hh"
 #include "cpu/exec_context.hh"
-#include "mem/port.hh"
+#include "mem/translating_port.hh"
 #include "sim/fake_syscall.hh"
 #include "sim/host.hh"
 #include "sim/process.hh"
@@ -236,7 +236,7 @@ class Linux {
     /// buffer.  Also copies the target buffer out to the simulated
     /// memory space.  Used by stat(), fstat(), and lstat().
     static void
-    copyOutStatBuf(Port *memPort, Addr addr, struct stat *host)
+    copyOutStatBuf(TranslatingPort *memPort, Addr addr, struct stat *host)
     {
         TypedBufferArg<Linux::tgt_stat> tgt(addr);
 
@@ -259,7 +259,7 @@ class Linux {
 
     // Same for stat64
     static void
-    copyOutStat64Buf(Port *memPort, Addr addr, struct stat64 *host)
+    copyOutStat64Buf(TranslatingPort *memPort, Addr addr, struct stat64 *host)
     {
         TypedBufferArg<Linux::tgt_stat64> tgt(addr);
 
@@ -307,7 +307,7 @@ class Linux {
         strcpy(name->version, "#1 Mon Aug 18 11:32:15 EDT 2003");
         strcpy(name->machine, "alpha");
 
-        name.copyOut(xc->cpu->memPort);
+        name.copyOut(xc->port);
         return 0;
     }
 
@@ -327,7 +327,7 @@ class Linux {
               TypedBufferArg<uint64_t> fpcr(xc->getSyscallArg(1));
               // I don't think this exactly matches the HW FPCR
               *fpcr = 0;
-              fpcr.copyOut(xc->cpu->memPort);
+              fpcr.copyOut(xc->port);
               return 0;
           }
 
@@ -353,7 +353,7 @@ class Linux {
           case 14: { // SSI_IEEE_FP_CONTROL
               TypedBufferArg<uint64_t> fpcr(xc->getSyscallArg(1));
               // I don't think this exactly matches the HW FPCR
-              fpcr.copyIn(xc->cpu->memPort);
+              fpcr.copyIn(xc->port);
               DPRINTFR(SyscallVerbose, "osf_setsysinfo(SSI_IEEE_FP_CONTROL): "
                        " setting FPCR to 0x%x\n", *(uint64_t*)fpcr);
               return 0;
index 3b5eef8b0cdf375d78fe45c2ebfa40d5447b6191..a9c7b5c7450c9cf47bab7ba722ba6f0a44c38052 100644 (file)
@@ -46,7 +46,7 @@
 #include "base/trace.hh"
 #include "cpu/base.hh"
 #include "cpu/exec_context.hh"
-#include "mem/functional/functional.hh"
+#include "mem/translating_port.hh"
 #include "sim/fake_syscall.hh"
 #include "sim/host.hh"
 #include "sim/process.hh"
@@ -537,7 +537,7 @@ class Tru64 {
     /// memory space.  Used by stat(), fstat(), and lstat().
     template <class T>
     static void
-    copyOutStatBuf(FunctionalMemory *mem, Addr addr, global_stat *host)
+    copyOutStatBuf(TranslatingPort *memPort, Addr addr, global_stat *host)
     {
         TypedBufferArg<T> tgt(addr);
 
@@ -555,7 +555,7 @@ class Tru64 {
         tgt->st_blksize = host->st_blksize;
         tgt->st_blocks = host->st_blocks;
 
-        tgt.copyOut(mem);
+        tgt.copyOut(memPort);
     }
 
     /// Helper function to convert a host statfs buffer to a target statfs
@@ -563,7 +563,7 @@ class Tru64 {
     /// memory space.  Used by statfs() and fstatfs().
     template <class T>
     static void
-    copyOutStatfsBuf(FunctionalMemory *mem, Addr addr, global_statfs *host)
+    copyOutStatfsBuf(TranslatingPort *memPort, Addr addr, global_statfs *host)
     {
         TypedBufferArg<T> tgt(addr);
 
@@ -580,36 +580,36 @@ class Tru64 {
         tgt->f_ffree = host->f_ffree;
         memcpy(&tgt->f_fsid, &host->f_fsid, sizeof(host->f_fsid));
 
-        tgt.copyOut(mem);
+        tgt.copyOut(memPort);
     }
 
     class F64 {
       public:
-        static void copyOutStatBuf(FunctionalMemory *mem, Addr addr,
+        static void copyOutStatBuf(TranslatingPort *memPort, Addr addr,
                                    global_stat *host)
         {
-            Tru64::copyOutStatBuf<Tru64::F64_stat>(mem, addr, host);
+            Tru64::copyOutStatBuf<Tru64::F64_stat>(memPort, addr, host);
         }
 
-        static void copyOutStatfsBuf(FunctionalMemory *mem, Addr addr,
+        static void copyOutStatfsBuf(TranslatingPort *memPort, Addr addr,
                                      global_statfs *host)
         {
-            Tru64::copyOutStatfsBuf<Tru64::F64_statfs>(mem, addr, host);
+            Tru64::copyOutStatfsBuf<Tru64::F64_statfs>(memPort, addr, host);
         }
     };
 
     class PreF64 {
       public:
-        static void copyOutStatBuf(FunctionalMemory *mem, Addr addr,
+        static void copyOutStatBuf(TranslatingPort *memPort, Addr addr,
                                    global_stat *host)
         {
-            Tru64::copyOutStatBuf<Tru64::pre_F64_stat>(mem, addr, host);
+            Tru64::copyOutStatBuf<Tru64::pre_F64_stat>(memPort, addr, host);
         }
 
-        static void copyOutStatfsBuf(FunctionalMemory *mem, Addr addr,
+        static void copyOutStatfsBuf(TranslatingPort *memPort, Addr addr,
                                      global_statfs *host)
         {
-            Tru64::copyOutStatfsBuf<Tru64::pre_F64_statfs>(mem, addr, host);
+            Tru64::copyOutStatfsBuf<Tru64::pre_F64_statfs>(memPort, addr, host);
         }
     };
 
@@ -618,7 +618,7 @@ class Tru64 {
     /// the simulated memory space.  Used by pre_F64_stat(),
     /// pre_F64_fstat(), and pre_F64_lstat().
     static void
-    copyOutPreF64StatBuf(FunctionalMemory *mem, Addr addr, struct stat *host)
+    copyOutPreF64StatBuf(TranslatingPort *memPort, Addr addr, struct stat *host)
     {
         TypedBufferArg<Tru64::pre_F64_stat> tgt(addr);
 
@@ -636,7 +636,7 @@ class Tru64 {
         tgt->st_blksize = host->st_blksize;
         tgt->st_blocks = host->st_blocks;
 
-        tgt.copyOut(mem);
+        tgt.copyOut(memPort);
     }
 
 
@@ -656,7 +656,7 @@ class Tru64 {
         strcpy(name->version, "732");
         strcpy(name->machine, "alpha");
 
-        name.copyOut(xc->mem);
+        name.copyOut(xc->port);
         return 0;
     }
 
@@ -674,21 +674,21 @@ class Tru64 {
           case Tru64::GSI_MAX_CPU: {
               TypedBufferArg<uint32_t> max_cpu(xc->getSyscallArg(1));
               *max_cpu = process->numCpus();
-              max_cpu.copyOut(xc->mem);
+              max_cpu.copyOut(xc->port);
               return 1;
           }
 
           case Tru64::GSI_CPUS_IN_BOX: {
               TypedBufferArg<uint32_t> cpus_in_box(xc->getSyscallArg(1));
               *cpus_in_box = process->numCpus();
-              cpus_in_box.copyOut(xc->mem);
+              cpus_in_box.copyOut(xc->port);
               return 1;
           }
 
           case Tru64::GSI_PHYSMEM: {
               TypedBufferArg<uint64_t> physmem(xc->getSyscallArg(1));
               *physmem = 1024 * 1024;  // physical memory in KB
-              physmem.copyOut(xc->mem);
+              physmem.copyOut(xc->port);
               return 1;
           }
 
@@ -705,14 +705,14 @@ class Tru64 {
               infop->cpu_ex_binding = 0;
               infop->mhz = 667;
 
-              infop.copyOut(xc->mem);
+              infop.copyOut(xc->port);
               return 1;
           }
 
           case Tru64::GSI_PROC_TYPE: {
               TypedBufferArg<uint64_t> proc_type(xc->getSyscallArg(1));
               *proc_type = 11;
-              proc_type.copyOut(xc->mem);
+              proc_type.copyOut(xc->port);
               return 1;
           }
 
@@ -721,14 +721,14 @@ class Tru64 {
               strncpy((char *)bufArg.bufferPtr(),
                       "COMPAQ Professional Workstation XP1000",
                       nbytes);
-              bufArg.copyOut(xc->mem);
+              bufArg.copyOut(xc->port);
               return 1;
           }
 
           case Tru64::GSI_CLK_TCK: {
               TypedBufferArg<uint64_t> clk_hz(xc->getSyscallArg(1));
               *clk_hz = 1024;
-              clk_hz.copyOut(xc->mem);
+              clk_hz.copyOut(xc->port);
               return 1;
           }
 
@@ -822,7 +822,7 @@ class Tru64 {
 
         // just pass basep through uninterpreted.
         TypedBufferArg<int64_t> basep(tgt_basep);
-        basep.copyIn(xc->mem);
+        basep.copyIn(xc->port);
         long host_basep = (off_t)*basep;
         int host_result = getdirentries(fd, host_buf, tgt_nbytes, &host_basep);
 
@@ -849,7 +849,7 @@ class Tru64 {
             tgt_dp->d_reclen = tgt_bufsize;
             tgt_dp->d_namlen = namelen;
             strcpy(tgt_dp->d_name, host_dp->d_name);
-            tgt_dp.copyOut(xc->mem);
+            tgt_dp.copyOut(xc->port);
 
             tgt_buf_ptr += tgt_bufsize;
             host_buf_ptr += host_dp->d_reclen;
@@ -858,7 +858,7 @@ class Tru64 {
         delete [] host_buf;
 
         *basep = host_basep;
-        basep.copyOut(xc->mem);
+        basep.copyOut(xc->port);
 
         return tgt_buf_ptr - tgt_buf;
 #endif
@@ -872,7 +872,7 @@ class Tru64 {
         RegFile *regs = &xc->regs;
         TypedBufferArg<Tru64::sigcontext> sc(xc->getSyscallArg(0));
 
-        sc.copyIn(xc->mem);
+        sc.copyIn(xc->port);
 
         // Restore state from sigcontext structure.
         // Note that we'll advance PC <- NPC before the end of the cycle,
@@ -917,7 +917,7 @@ class Tru64 {
               elp->si_phz = clk_hz;
               elp->si_boottime = seconds_since_epoch; // seconds since epoch?
               elp->si_max_procs = process->numCpus();
-              elp.copyOut(xc->mem);
+              elp.copyOut(xc->port);
               return 0;
           }
 
@@ -947,7 +947,7 @@ class Tru64 {
     {
         TypedBufferArg<Tru64::vm_stack> argp(xc->getSyscallArg(0));
 
-        argp.copyIn(xc->mem);
+        argp.copyIn(xc->port);
 
         // if the user chose an address, just let them have it.  Otherwise
         // pick one for them.
@@ -955,7 +955,7 @@ class Tru64 {
             argp->address = process->next_thread_stack_base;
             int stack_size = (argp->rsize + argp->ysize + argp->gsize);
             process->next_thread_stack_base -= stack_size;
-            argp.copyOut(xc->mem);
+            argp.copyOut(xc->port);
         }
 
         return 0;
@@ -975,7 +975,7 @@ class Tru64 {
         TypedBufferArg<Tru64::nxm_task_attr> attrp(xc->getSyscallArg(0));
         TypedBufferArg<Addr> configptr_ptr(xc->getSyscallArg(1));
 
-        attrp.copyIn(xc->mem);
+        attrp.copyIn(xc->port);
 
         if (attrp->nxm_version != NXM_LIB_VERSION) {
             cerr << "nxm_task_init: thread library version mismatch! "
@@ -1016,7 +1016,7 @@ class Tru64 {
         config->nxm_slot_state = slot_state_addr;
         config->nxm_rad[0] = rad_state_addr;
 
-        config.copyOut(xc->mem);
+        config.copyOut(xc->port);
 
         // initialize the slot_state array and copy it out
         TypedBufferArg<Tru64::nxm_slot_state_t> slot_state(slot_state_addr,
@@ -1027,7 +1027,7 @@ class Tru64 {
                 (i == 0) ? Tru64::NXM_SLOT_BOUND : Tru64::NXM_SLOT_AVAIL;
         }
 
-        slot_state.copyOut(xc->mem);
+        slot_state.copyOut(xc->port);
 
         // same for the per-RAD "shared" struct.  Note that we need to
         // allocate extra bytes for the per-VP array which is embedded at
@@ -1061,13 +1061,13 @@ class Tru64 {
             }
         }
 
-        rad_state.copyOut(xc->mem);
+        rad_state.copyOut(xc->port);
 
         //
         // copy pointer to shared config area out to user
         //
         *configptr_ptr = config_addr;
-        configptr_ptr.copyOut(xc->mem);
+        configptr_ptr.copyOut(xc->port);
 
         // Register this as a valid address range with the process
         process->nxm_start = base_addr;
@@ -1104,7 +1104,7 @@ class Tru64 {
         int thread_index = xc->getSyscallArg(2);
 
         // get attribute args
-        attrp.copyIn(xc->mem);
+        attrp.copyIn(xc->port);
 
         if (attrp->version != NXM_LIB_VERSION) {
             cerr << "nxm_thread_create: thread library version mismatch! "
@@ -1129,7 +1129,7 @@ class Tru64 {
 
         TypedBufferArg<Tru64::nxm_shared> rad_state(0x14000,
                                                     rad_state_size);
-        rad_state.copyIn(xc->mem);
+        rad_state.copyIn(xc->port);
 
         uint64_t uniq_val = attrp->pthid - rad_state->nxm_uniq_offset;
 
@@ -1140,7 +1140,7 @@ class Tru64 {
 
             // This is supposed to be a port number.  Make something up.
             *kidp = 99;
-            kidp.copyOut(xc->mem);
+            kidp.copyOut(xc->port);
 
             return 0;
         } else if (attrp->type == Tru64::NXM_TYPE_VP) {
@@ -1154,7 +1154,7 @@ class Tru64 {
             ssp->nxm_u.pth_id = attrp->pthid;
             ssp->nxm_u.nxm_active = uniq_val | 1;
 
-            rad_state.copyOut(xc->mem);
+            rad_state.copyOut(xc->port);
 
             Addr slot_state_addr = 0x12000 + sizeof(Tru64::nxm_config_info);
             int slot_state_size =
@@ -1164,7 +1164,7 @@ class Tru64 {
                 slot_state(slot_state_addr,
                            slot_state_size);
 
-            slot_state.copyIn(xc->mem);
+            slot_state.copyIn(xc->port);
 
             if (slot_state[thread_index] != Tru64::NXM_SLOT_AVAIL) {
                 cerr << "nxm_thread_createFunc: requested VP slot "
@@ -1174,7 +1174,7 @@ class Tru64 {
 
             slot_state[thread_index] = Tru64::NXM_SLOT_BOUND;
 
-            slot_state.copyOut(xc->mem);
+            slot_state.copyOut(xc->port);
 
             // Find a free simulator execution context.
             for (int i = 0; i < process->numCpus(); ++i) {
@@ -1188,7 +1188,7 @@ class Tru64 {
                     // and get away with just sticking the thread index
                     // here.
                     *kidp = thread_index;
-                    kidp.copyOut(xc->mem);
+                    kidp.copyOut(xc->port);
 
                     return 0;
                 }
@@ -1317,12 +1317,12 @@ class Tru64 {
     {
         TypedBufferArg<uint64_t> lockp(uaddr);
 
-        lockp.copyIn(xc->mem);
+        lockp.copyIn(xc->port);
 
         if (*lockp == 0) {
             // lock is free: grab it
             *lockp = 1;
-            lockp.copyOut(xc->mem);
+            lockp.copyOut(xc->port);
         } else {
             // lock is busy: disable until free
             process->waitList.push_back(Process::WaitRec(uaddr, xc));
@@ -1336,7 +1336,7 @@ class Tru64 {
     {
         TypedBufferArg<uint64_t> lockp(uaddr);
 
-        lockp.copyIn(xc->mem);
+        lockp.copyIn(xc->port);
         assert(*lockp != 0);
 
         // Check for a process waiting on the lock.
@@ -1345,7 +1345,7 @@ class Tru64 {
         // clear lock field if no waiting context is taking over the lock
         if (num_waiting == 0) {
             *lockp = 0;
-            lockp.copyOut(xc->mem);
+            lockp.copyOut(xc->port);
         }
     }
 
@@ -1372,12 +1372,12 @@ class Tru64 {
         Addr uaddr = xc->getSyscallArg(0);
         TypedBufferArg<uint64_t> lockp(uaddr);
 
-        lockp.copyIn(xc->mem);
+        lockp.copyIn(xc->port);
 
         if (*lockp == 0) {
             // lock is free: grab it
             *lockp = 1;
-            lockp.copyOut(xc->mem);
+            lockp.copyOut(xc->port);
             return 0;
         } else {
             return 1;
@@ -1432,7 +1432,7 @@ class Tru64 {
         TypedBufferArg<uint64_t> lockp(lock_addr);
 
         // user is supposed to acquire lock before entering
-        lockp.copyIn(xc->mem);
+        lockp.copyIn(xc->port);
         assert(*lockp != 0);
 
         m5_unlock_mutex(lock_addr, process, xc);
index a281609f49ecbb29f0b4ed0228c1f622acbb913c..10894230b84f47e8347d7fabe0f021ab910956ab 100644 (file)
@@ -37,6 +37,7 @@
 #include "base/output.hh"
 #include "cpu/profile.hh"
 #include "kern/kernel_stats.hh"
+#include "mem/translating_port.hh"
 #include "sim/serialize.hh"
 #include "sim/sim_exit.hh"
 #include "sim/system.hh"
@@ -85,6 +86,7 @@ ExecContext::ExecContext(BaseCPU *_cpu, int _thread_num, System *_system,
       asid(_asid),
       func_exe_inst(0), storeCondFailures(0)
 {
+    port = new TranslatingPort(cpu->memPort, process->pTable);
     memset(&regs, 0, sizeof(RegFile));
 }
 #endif
index c40b00e4ca21d5afa3e19ed0347ca03aa991501e..3d40c06f0f7ed47ee12c7d3e3ad73b4c6a5252c0 100644 (file)
@@ -35,8 +35,8 @@
 #include "sim/host.hh"
 #include "sim/serialize.hh"
 #include "targetarch/byte_swap.hh"
+#include "mem/translating_port.hh"
 
-class Memory;
 class BaseCPU;
 
 #if FULL_SYSTEM
@@ -122,6 +122,9 @@ class ExecContext
     int cpu_id;
 
     System *system;
+
+    /// Port that syscalls can use to access memory (provides translation step).
+    TranslatingPort *port;
 //    Memory *mem;
 
 #if FULL_SYSTEM
diff --git a/mem/translating_port.cc b/mem/translating_port.cc
new file mode 100644 (file)
index 0000000..1100476
--- /dev/null
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2001-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <string>
+#include "mem/port.hh"
+#include "mem/translating_port.hh"
+#include "mem/page_table.hh"
+
+TranslatingPort::TranslatingPort(Port *_port, PageTable *p_table)
+    : port(_port), pTable(p_table)
+{ }
+
+TranslatingPort::~TranslatingPort()
+{ }
+
+Fault
+TranslatingPort::readBlobFunctional(Addr addr, uint8_t *p, int size)
+{
+    Addr paddr;
+
+    //@todo Break up things larger than a page size
+    pTable->page_check(addr, size);
+
+
+    if (!pTable->translate(addr,paddr))
+        return Machine_Check_Fault;
+
+    port->readBlobFunctional(paddr, p, size);
+    return No_Fault;
+}
+
+Fault
+TranslatingPort::writeBlobFunctional(Addr addr, const uint8_t *p, int size)
+{
+    Addr paddr;
+
+    //@todo Break up things larger than a page size
+    pTable->page_check(addr, size);
+
+    if (!pTable->translate(addr,paddr))
+        return Machine_Check_Fault;
+
+    port->writeBlobFunctional(paddr, p, size);
+    return No_Fault;
+}
+
+Fault
+TranslatingPort::memsetBlobFunctional(Addr addr, uint8_t val, int size)
+{
+    Addr paddr;
+
+    //@todo Break up things larger than a page size
+    pTable->page_check(addr, size);
+
+    if (!pTable->translate(addr,paddr))
+        return Machine_Check_Fault;
+
+    port->memsetBlobFunctional(paddr, val, size);
+    return No_Fault;
+}
+
+Fault
+TranslatingPort::writeStringFunctional(Addr addr, const char *str)
+{
+    //@todo Break up things larger than a page size
+    //pTable->page_check(addr, size);
+    //Need to check string length???
+
+    Addr paddr;
+
+    if (!pTable->translate(addr,paddr))
+        return Machine_Check_Fault;
+
+    port->writeStringFunctional(paddr, str);
+    return No_Fault;
+}
+
+Fault
+TranslatingPort::readStringFunctional(std::string &str, Addr addr)
+{
+    //@todo Break up things larger than a page size
+    //pTable->page_check(addr, size);
+    //Need to check string length???
+
+    Addr paddr;
+
+    if (!pTable->translate(addr,paddr))
+        return Machine_Check_Fault;
+
+    //@todo Break this up into readBlobs
+    port->readStringFunctional(str, paddr);
+    return No_Fault;
+}
+
diff --git a/mem/translating_port.hh b/mem/translating_port.hh
new file mode 100644 (file)
index 0000000..20140d2
--- /dev/null
@@ -0,0 +1,59 @@
+/*
+ * Copyright (c) 2001-2005 The Regents of The University of Michigan
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are
+ * met: redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer;
+ * redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution;
+ * neither the name of the copyright holders nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#ifndef __MEM_TRANSLATING_PROT_HH__
+#define __MEM_TRANSLATING_PROT_HH__
+
+#include "mem/memory.hh"
+
+class Port;
+class PageTable;
+
+class TranslatingPort
+{
+  private:
+    Port *port;
+    PageTable *pTable;
+
+    TranslatingPort(const TranslatingPort &specmem);
+    const TranslatingPort &operator=(const TranslatingPort &specmem);
+
+  public:
+    TranslatingPort(Port *_port, PageTable *p_table);
+    virtual ~TranslatingPort();
+
+  public:
+    Fault readBlobFunctional(Addr addr, uint8_t *p, int size);
+    Fault writeBlobFunctional(Addr addr, const uint8_t *p, int size);
+    Fault memsetBlobFunctional(Addr addr, uint8_t val, int size);
+    Fault writeStringFunctional(Addr addr, const char *str);
+    Fault readStringFunctional(std::string &str, Addr addr);
+
+};
+
+#endif
index 26d6bf7087f1dc687c841f80ac12267cbc2d2c5c..2355fdc192b263eeacc621f604a4e4ec704c2341 100644 (file)
@@ -154,7 +154,7 @@ Process::startup()
     if (execContexts.empty())
         fatal("Process %s is not associated with any CPUs!\n", name());
 
-    initVirtMem = new ProxyMemory<Memory>(system->physmem, pTable);
+    initVirtMem = new ProxyMemory(system->physmem, pTable);
 
     // first exec context for this process... initialize & enable
     ExecContext *xc = execContexts[0];
@@ -249,7 +249,7 @@ copyStringArray(vector<string> &strings, Addr array_ptr, Addr data_ptr,
 {
     for (int i = 0; i < strings.size(); ++i) {
         func->prot_write(array_ptr, (uint8_t*)&data_ptr, sizeof(Addr));
-        func->writeString(data_ptr, strings[i].c_str());
+        func->writeStringFunctional(data_ptr, strings[i].c_str());
         array_ptr += sizeof(Addr);
         data_ptr += strings[i].size() + 1;
     }
index 78b4201d4d075963513ddd6ffc6491a1ca87b65d..0cebee0e11bf9eafd18654627a504fe26c0e376e 100644 (file)
@@ -128,7 +128,7 @@ readFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
     int bytes_read = read(fd, bufArg.bufferPtr(), nbytes);
 
     if (bytes_read != -1)
-        bufArg.copyOut(xc->cpu->memPort);
+        bufArg.copyOut(xc->port);
 
     return bytes_read;
 }
@@ -140,7 +140,7 @@ writeFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
     int nbytes = xc->getSyscallArg(2);
     BufferArg bufArg(xc->getSyscallArg(1), nbytes);
 
-    bufArg.copyIn(xc->cpu->memPort);
+    bufArg.copyIn(xc->port);
 
     int bytes_written = write(fd, bufArg.bufferPtr(), nbytes);
 
@@ -181,7 +181,7 @@ gethostnameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 
     strncpy((char *)name.bufferPtr(), hostname, name_len);
 
-    name.copyOut(xc->cpu->memPort);
+    name.copyOut(xc->port);
 
     return 0;
 }
@@ -191,7 +191,7 @@ unlinkFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
         return (TheISA::IntReg)-EFAULT;
 
     int result = unlink(path.c_str());
@@ -203,12 +203,12 @@ renameFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string old_name;
 
-    if (xc->cpu->memPort->readStringFunctional(old_name, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(old_name, xc->getSyscallArg(0)) != No_Fault)
         return -EFAULT;
 
     string new_name;
 
-    if (xc->cpu->memPort->readStringFunctional(new_name, xc->getSyscallArg(1)) != No_Fault)
+    if (xc->port->readStringFunctional(new_name, xc->getSyscallArg(1)) != No_Fault)
         return -EFAULT;
 
     int64_t result = rename(old_name.c_str(), new_name.c_str());
@@ -220,7 +220,7 @@ truncateFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
         return -EFAULT;
 
     off_t length = xc->getSyscallArg(1);
@@ -248,7 +248,7 @@ chownFunc(SyscallDesc *desc, int num, Process *p, ExecContext *xc)
 {
     string path;
 
-    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
         return -EFAULT;
 
     /* XXX endianess */
index 04b7bbe1c164d4a7fc93dbbaee255c4538c010ba..ed3b0fc8ba38474d178b548356528601187b61cd 100644 (file)
@@ -43,7 +43,7 @@
 #include <sys/uio.h>
 
 #include "base/intmath.hh"     // for RoundUp
-#include "mem/port.hh"
+#include "mem/translating_port.hh"
 #include "targetarch/isa_traits.hh"    // for Addr
 
 #include "base/trace.hh"
@@ -104,7 +104,7 @@ class BaseBufferArg {
     //
     // copy data into simulator space (read from target memory)
     //
-    virtual bool copyIn(Port *memport)
+    virtual bool copyIn(TranslatingPort *memport)
     {
         memport->readBlobFunctional(addr, bufPtr, size);
         return true;   // no EFAULT detection for now
@@ -113,7 +113,7 @@ class BaseBufferArg {
     //
     // copy data out of simulator space (write to target memory)
     //
-    virtual bool copyOut(Port *memport)
+    virtual bool copyOut(TranslatingPort *memport)
     {
         memport->writeBlobFunctional(addr, bufPtr, size);
         return true;   // no EFAULT detection for now
@@ -315,11 +315,8 @@ openFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
         return -EFAULT;
-*/
-    //@todo Fix fault condition
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
 
     if (path == "/dev/sysdev0") {
         // This is a memory-mapped high-resolution timer device on Alpha.
@@ -365,11 +362,8 @@ chmodFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*
-    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
         return -EFAULT;
-*/
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
 
     uint32_t mode = xc->getSyscallArg(1);
     mode_t hostMode = 0;
@@ -421,11 +415,8 @@ statFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*
-    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
-    return -EFAULT; */
-
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+    return -EFAULT;
 
     struct stat hostBuf;
     int result = stat(path.c_str(), &hostBuf);
@@ -433,7 +424,7 @@ statFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return errno;
 
-    OS::copyOutStatBuf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStatBuf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -457,7 +448,7 @@ fstat64Func(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return errno;
 
-    OS::copyOutStat64Buf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStat64Buf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -471,10 +462,8 @@ lstatFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
-      return -EFAULT;*/
-
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+      return -EFAULT;
 
     struct stat hostBuf;
     int result = lstat(path.c_str(), &hostBuf);
@@ -482,7 +471,7 @@ lstatFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatBuf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStatBuf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -495,10 +484,8 @@ lstat64Func(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
-      return -EFAULT; */
-
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+      return -EFAULT;
 
     struct stat64 hostBuf;
     int result = lstat64(path.c_str(), &hostBuf);
@@ -506,7 +493,7 @@ lstat64Func(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStat64Buf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStat64Buf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -530,7 +517,7 @@ fstatFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return -errno;
 
-    OS::copyOutStatBuf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStatBuf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -544,10 +531,8 @@ statfsFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
-      return -EFAULT;*/
-
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+      return -EFAULT;
 
     struct statfs hostBuf;
     int result = statfs(path.c_str(), &hostBuf);
@@ -555,7 +540,7 @@ statfsFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return errno;
 
-    OS::copyOutStatfsBuf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStatfsBuf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -578,7 +563,7 @@ fstatfsFunc(SyscallDesc *desc, int callnum, Process *process,
     if (result < 0)
         return errno;
 
-    OS::copyOutStatfsBuf(xc->cpu->memPort, xc->getSyscallArg(1), &hostBuf);
+    OS::copyOutStatfsBuf(xc->port, xc->getSyscallArg(1), &hostBuf);
 
     return 0;
 }
@@ -602,12 +587,12 @@ writevFunc(SyscallDesc *desc, int callnum, Process *process,
     for (int i = 0; i < count; ++i)
     {
         typename OS::tgt_iovec tiov;
-        xc->cpu->memPort->readBlobFunctional(tiov_base + i*sizeof(typename OS::tgt_iovec),
+        xc->port->readBlobFunctional(tiov_base + i*sizeof(typename OS::tgt_iovec),(uint8_t*)
                         &tiov, sizeof(typename OS::tgt_iovec));
         hiov[i].iov_len = tiov.iov_len;
         hiov[i].iov_base = new char [hiov[i].iov_len];
-        xc->cpu->memPort->readBlobFunctional(tiov.iov_base,
-                        hiov[i].iov_base, hiov[i].iov_len);
+        xc->port->readBlobFunctional(tiov.iov_base,
+                        (uint8_t *)hiov[i].iov_base, hiov[i].iov_len);
     }
 
     int result = writev(process->sim_fd(fd), hiov, count);
@@ -687,7 +672,7 @@ getrlimitFunc(SyscallDesc *desc, int callnum, Process *process,
         break;
     }
 
-    rlp.copyOut(xc->cpu->memPort);
+    rlp.copyOut(xc->port);
     return 0;
 }
 
@@ -702,7 +687,7 @@ gettimeofdayFunc(SyscallDesc *desc, int callnum, Process *process,
     getElapsedTime(tp->tv_sec, tp->tv_usec);
     tp->tv_sec += seconds_since_epoch;
 
-    tp.copyOut(xc->cpu->memPort);
+    tp.copyOut(xc->port);
 
     return 0;
 }
@@ -716,13 +701,11 @@ utimesFunc(SyscallDesc *desc, int callnum, Process *process,
 {
     std::string path;
 
-/*    if (xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
-      return -EFAULT;*/
-
-    xc->cpu->memPort->readStringFunctional(path, xc->getSyscallArg(0));
+    if (xc->port->readStringFunctional(path, xc->getSyscallArg(0)) != No_Fault)
+      return -EFAULT;
 
     TypedBufferArg<typename OS::timeval [2]> tp(xc->getSyscallArg(1));
-    tp.copyIn(xc->cpu->memPort);
+    tp.copyIn(xc->port);
 
     struct timeval hostTimeval[2];
     for (int i = 0; i < 2; ++i)
@@ -772,7 +755,7 @@ getrusageFunc(SyscallDesc *desc, int callnum, Process *process,
     rup->ru_nvcsw = 0;
     rup->ru_nivcsw = 0;
 
-    rup.copyOut(xc->cpu->memPort);
+    rup.copyOut(xc->port);
 
     return 0;
 }