add write/read functions that have endian conversions in them
authorAli Saidi <saidi@eecs.umich.edu>
Thu, 8 Jun 2006 23:03:58 +0000 (19:03 -0400)
committerAli Saidi <saidi@eecs.umich.edu>
Thu, 8 Jun 2006 23:03:58 +0000 (19:03 -0400)
when we get a virtual port delete it (even though delete does nothing in these cases)

src/arch/alpha/linux/system.cc:
src/arch/alpha/stacktrace.cc:
src/base/remote_gdb.cc:
src/cpu/simple_thread.cc:
    when we get a virtual port delete it (even though delete does nothing in this case)
src/mem/port.hh:
src/mem/vport.hh:
    add write/read functions that have endian conversions in them

--HG--
extra : convert_revision : 163e05cc038c461f95c92f8ce55422033f9ea513

src/arch/alpha/linux/system.cc
src/arch/alpha/stacktrace.cc
src/base/remote_gdb.cc
src/cpu/simple_thread.cc
src/mem/port.hh
src/mem/port_impl.hh [new file with mode: 0644]
src/mem/vport.hh

index e6c6f42e9f71ea428ce5dc4cd7d3dae9bdeb45d3..3e061bba8a84fab6e6d5b2437a0d7928493ed17a 100644 (file)
@@ -181,8 +181,11 @@ LinuxAlphaSystem::setDelayLoop(ThreadContext *tc)
     if (kernelSymtab->findAddress("loops_per_jiffy", addr)) {
         Tick cpuFreq = tc->getCpuPtr()->frequency();
         Tick intrFreq = platform->intrFrequency();
-        tc->getVirtPort(tc)->write(addr,
-                (uint32_t)((cpuFreq / intrFreq) * 0.9988));
+        VirtualPort *vp;
+
+        vp = tc->getVirtPort();
+        vp->writeHtoG(addr, (uint32_t)((cpuFreq / intrFreq) * 0.9988));
+        tc->delVirtPort(vp);
     }
 }
 
index 3519fd9406664d0997f2dd08d2884ed550aa7a31..d70a4d6dd8b753a904236ef3f1f7d21afe3eb2c5 100644 (file)
@@ -47,25 +47,31 @@ ProcessInfo::ProcessInfo(ThreadContext *_tc)
 {
     Addr addr = 0;
 
+    VirtualPort *vp;
+
+    vp = tc->getVirtPort();
+
     if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_size", addr))
         panic("thread info not compiled into kernel\n");
-    thread_info_size = gtoh(tc->getVirtPort()->read<int32_t>(addr));
+    thread_info_size = vp->readGtoH<int32_t>(addr);
 
     if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_size", addr))
         panic("thread info not compiled into kernel\n");
-    task_struct_size = gtoh(tc->getVirtPort()->read<int32_t>(addr));
+    task_struct_size = vp->readGtoH<int32_t>(addr);
 
     if (!tc->getSystemPtr()->kernelSymtab->findAddress("thread_info_task", addr))
         panic("thread info not compiled into kernel\n");
-    task_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
+    task_off = vp->readGtoH<int32_t>(addr);
 
     if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_pid", addr))
         panic("thread info not compiled into kernel\n");
-    pid_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
+    pid_off = vp->readGtoH<int32_t>(addr);
 
     if (!tc->getSystemPtr()->kernelSymtab->findAddress("task_struct_comm", addr))
         panic("thread info not compiled into kernel\n");
-    name_off = gtoh(tc->getVirtPort()->read<int32_t>(addr));
+    name_off = vp->readGtoH<int32_t>(addr);
+
+    tc->delVirtPort(vp);
 }
 
 Addr
@@ -75,7 +81,15 @@ ProcessInfo::task(Addr ksp) const
     if (base == ULL(0xfffffc0000000000))
         return 0;
 
-    return gtoh(tc->getVirtPort()->read<Addr>(base + task_off));
+    Addr tsk;
+
+    VirtualPort *vp;
+
+    vp = tc->getVirtPort();
+    tsk = vp->readGtoH<Addr>(base + task_off);
+    tc->delVirtPort(vp);
+
+    return tsk;
 }
 
 int
@@ -85,7 +99,15 @@ ProcessInfo::pid(Addr ksp) const
     if (!task)
         return -1;
 
-    return gtoh(tc->getVirtPort()->read<uint16_t>(task + pid_off));
+    uint16_t pd;
+
+    VirtualPort *vp;
+
+    vp = tc->getVirtPort();
+    pd = vp->readGtoH<uint16_t>(task + pid_off);
+    tc->delVirtPort(vp);
+
+    return pd;
 }
 
 string
index 2b545d13cf944105b79cc277a464afd78e6d7cf8..0d3b73b1eeb091e1a1f89ebb9c00d95a06b8ffb4 100644 (file)
@@ -642,7 +642,9 @@ RemoteGDB::read(Addr vaddr, size_t size, char *data)
 
     DPRINTF(GDBRead, "read:  addr=%#x, size=%d", vaddr, size);
 
-    context->getVirtPort(context)->readBlob(vaddr, (uint8_t*)data, size);
+    VirtualPort *vp = context->getVirtPort(context);
+    vp->readBlob(vaddr, (uint8_t*)data, size);
+    context->delVirtPort(vp);
 
 #if TRACING_ON
     if (DTRACE(GDBRead)) {
@@ -679,8 +681,9 @@ RemoteGDB::write(Addr vaddr, size_t size, const char *data)
         } else
             DPRINTFNR("\n");
     }
-
-    context->getVirtPort(context)->writeBlob(vaddr, (uint8_t*)data, size);
+    VirtualPort *vp = context->getVirtPort(context);
+    vp->writeBlob(vaddr, (uint8_t*)data, size);
+    context->delVirtPort(vp);
 
 #ifdef IMB
     alpha_pal_imb();
index 219167e4edd13be9a680761cc049c35802e7a10f..48383ca9308dd68922ecf6006227f04e9b6eda75 100644 (file)
@@ -314,9 +314,10 @@ SimpleThread::getVirtPort(ThreadContext *src_tc)
 void
 SimpleThread::delVirtPort(VirtualPort *vp)
 {
-//    assert(!vp->nullThreadContext());
-    delete vp->getPeer();
-    delete vp;
+    if (vp != virtPort) {
+        delete vp->getPeer();
+        delete vp;
+    }
 }
 
 
index b89c7dbd39986fd37290635cb9112050e3257ab0..2edad095e419f89d67efbccc51e8a2bd1307bc4b 100644 (file)
@@ -249,6 +249,14 @@ class FunctionalPort : public Port
     virtual void recvFunctional(Packet *pkt) { panic("FuncPort is UniDir"); }
     virtual void recvStatusChange(Status status) {}
 
+    /** a write function that also does an endian conversion. */
+    template <typename T>
+    inline void writeHtoG(Addr addr, T d);
+
+    /** a read function that also does an endian conversion. */
+    template <typename T>
+    inline T readGtoH(Addr addr);
+
     template <typename T>
     inline void write(Addr addr, T d)
     {
diff --git a/src/mem/port_impl.hh b/src/mem/port_impl.hh
new file mode 100644 (file)
index 0000000..e9a1592
--- /dev/null
@@ -0,0 +1,53 @@
+/*
+ * Copyright (c) 2006 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.
+ *
+ * Authors: Ali Saidi
+ */
+
+#include "arch/isa_specific.hh"
+#include "arch/isa_traits.hh"
+#include "mem/port.hh"
+#include "sim/byteswap.hh"
+
+template <typename T>
+void
+FunctionalPort::writeHtoG(Addr addr, T d)
+{
+    d = TheISA::htog(d);
+    writeBlob(addr, (uint8_t*)&d, sizeof(T));
+}
+
+
+template <typename T>
+T
+FunctionalPort::readGtoH(Addr addr)
+{
+    T d;
+    readBlob(addr, (uint8_t*)&d, sizeof(T));
+    return TheISA::gtoh(d);
+}
+
index 56f2ff29efe9a4e5cddd39da23dc9b44e8afc3e4..697c8e5f3db917659d5b4b9bbbcc950c2d6c7614 100644 (file)
@@ -38,7 +38,7 @@
 #ifndef __MEM_VPORT_HH__
 #define __MEM_VPORT_HH__
 
-#include "mem/port.hh"
+#include "mem/port_impl.hh"
 #include "config/full_system.hh"
 #include "arch/vtophys.hh"