Changes to add tracing and replaying command-line options
[gem5.git] / src / mem / vport.cc
index 0d53e4609985156503d1769c0d8abd37129bb9e3..15be45c2a484e10d4a00494c6ebc8a8dc8384b7e 100644 (file)
  */
 
 /**
- * @file Port object definitions.
+ * @file
+ * Port object definitions.
  */
 
 #include "base/chunk_generator.hh"
+#include "cpu/thread_context.hh"
 #include "mem/vport.hh"
 
 void
@@ -42,8 +44,8 @@ VirtualPort::readBlob(Addr addr, uint8_t *p, int size)
     for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done();
             gen.next())
     {
-        if (xc)
-            paddr = TheISA::vtophys(xc,gen.addr());
+        if (tc)
+            paddr = TheISA::vtophys(tc,gen.addr());
         else
             paddr = TheISA::vtophys(gen.addr());
 
@@ -59,8 +61,8 @@ VirtualPort::writeBlob(Addr addr, uint8_t *p, int size)
     for (ChunkGenerator gen(addr, size, TheISA::PageBytes); !gen.done();
             gen.next())
     {
-        if (xc)
-            paddr = TheISA::vtophys(xc,gen.addr());
+        if (tc)
+            paddr = TheISA::vtophys(tc,gen.addr());
         else
             paddr = TheISA::vtophys(gen.addr());
 
@@ -69,3 +71,46 @@ VirtualPort::writeBlob(Addr addr, uint8_t *p, int size)
     }
 }
 
+void
+CopyOut(ThreadContext *tc, void *dest, Addr src, size_t cplen)
+{
+    uint8_t *dst = (uint8_t *)dest;
+    VirtualPort *vp = tc->getVirtPort();
+
+    vp->readBlob(src, dst, cplen);
+}
+
+void
+CopyIn(ThreadContext *tc, Addr dest, void *source, size_t cplen)
+{
+    uint8_t *src = (uint8_t *)source;
+    VirtualPort *vp = tc->getVirtPort();
+
+    vp->writeBlob(dest, src, cplen);
+}
+
+void
+CopyStringOut(ThreadContext *tc, char *dst, Addr vaddr, size_t maxlen)
+{
+    int len = 0;
+    char *start = dst;
+    VirtualPort *vp = tc->getVirtPort();
+
+    do {
+        vp->readBlob(vaddr++, (uint8_t*)dst++, 1);
+    } while (len < maxlen && start[len++] != 0 );
+
+    dst[len] = 0;
+}
+
+void
+CopyStringIn(ThreadContext *tc, char *src, Addr vaddr)
+{
+    VirtualPort *vp = tc->getVirtPort();
+    for (ChunkGenerator gen(vaddr, strlen(src), TheISA::PageBytes); !gen.done();
+            gen.next())
+    {
+        vp->writeBlob(gen.addr(), (uint8_t*)src, gen.size());
+        src += gen.size();
+    }
+}