CopyData and CopyString moved from kernel.cc to vtophys.cc
authorNathan Binkert <binkertn@umich.edu>
Mon, 13 Oct 2003 20:09:33 +0000 (16:09 -0400)
committerNathan Binkert <binkertn@umich.edu>
Mon, 13 Oct 2003 20:09:33 +0000 (16:09 -0400)
kernel.cc and kernel.hh moved to kern/tru64

--HG--
extra : convert_revision : 1b9123af03960b602a2d52dfa7b714280f9995aa

arch/alpha/arguments.hh
arch/alpha/vtophys.cc
arch/alpha/vtophys.hh
cpu/pc_event.cc

index 69c69d0d7213b4a7f66aec4d3c13d9b7c5e187a3..9ac744e171d0b095b7d868e6c3ba7bd0eaa066d2 100644 (file)
@@ -32,8 +32,9 @@
 #include <assert.h>
 
 #include "sim/host.hh"
-#include "targetarch/kernel.hh"
+#include "kern/tru64/kernel.hh"
 #include "base/refcnt.hh"
+#include "targetarch/vtophys.hh"
 
 class ExecContext;
 
@@ -129,13 +130,13 @@ class AlphaArguments
     template <class T>
     operator T *() {
         T *buf = (T *)data->alloc(sizeof(T));
-        Kernel::CopyData(xc, buf, getArg(), sizeof(T));
+        CopyData(xc, buf, getArg(), sizeof(T));
         return buf;
     }
 
     operator char *() {
         char *buf = data->alloc(2048);
-        Kernel::CopyString(xc, buf, getArg(), 2048);
+        CopyString(xc, buf, getArg(), 2048);
         return buf;
     }
 };
index 5dc0013fcd5be9d1c36a9eb45b5f8e5c2bc679fb..a1afdb05b56e72868d2e65c273f883c54f870841 100644 (file)
@@ -121,3 +121,103 @@ vtomem(ExecContext *xc, Addr vaddr, size_t len)
     Addr paddr = vtophys(xc, vaddr);
     return xc->physmem->dma_addr(paddr, len);
 }
+
+void
+CopyData(ExecContext *xc, void *dest, Addr vaddr, size_t cplen)
+{
+    Addr paddr;
+    char *dmaaddr;
+    char *dst = (char *)dest;
+    int len;
+
+    paddr = vtophys(xc, vaddr);
+    len = min((int)(ALPHA_PGBYTES - (paddr & PGOFSET)), (int)cplen);
+    dmaaddr = (char *)xc->physmem->dma_addr(paddr, len);
+    assert(dmaaddr);
+
+    memcpy(dst, dmaaddr, len);
+    if (len == cplen)
+        return;
+
+    cplen -= len;
+    dst += len;
+    vaddr += len;
+
+    while (cplen > ALPHA_PGBYTES) {
+        paddr = vtophys(xc, vaddr);
+        dmaaddr = (char *)xc->physmem->dma_addr(paddr, ALPHA_PGBYTES);
+        assert(dmaaddr);
+
+        memcpy(dst, dmaaddr, ALPHA_PGBYTES);
+        cplen -= ALPHA_PGBYTES;
+        dst += ALPHA_PGBYTES;
+        vaddr += ALPHA_PGBYTES;
+    }
+
+    if (cplen > 0) {
+        paddr = vtophys(xc, vaddr);
+        dmaaddr = (char *)xc->physmem->dma_addr(paddr, cplen);
+        assert(dmaaddr);
+
+        memcpy(dst, dmaaddr, cplen);
+    }
+}
+
+void
+CopyString(ExecContext *xc, char *dst, Addr vaddr, size_t maxlen)
+{
+    Addr paddr;
+    char *dmaaddr;
+    int len;
+
+    paddr = vtophys(xc, vaddr);
+    len = min((int)(ALPHA_PGBYTES - (paddr & PGOFSET)), (int)maxlen);
+    dmaaddr = (char *)xc->physmem->dma_addr(paddr, len);
+    assert(dmaaddr);
+
+    char *term = (char *)memchr(dmaaddr, 0, len);
+    if (term)
+        len = term - dmaaddr + 1;
+
+    memcpy(dst, dmaaddr, len);
+
+    if (term || len == maxlen)
+        return;
+
+    maxlen -= len;
+    dst += len;
+    vaddr += len;
+
+    while (maxlen > ALPHA_PGBYTES) {
+        paddr = vtophys(xc, vaddr);
+        dmaaddr = (char *)xc->physmem->dma_addr(paddr, ALPHA_PGBYTES);
+        assert(dmaaddr);
+
+        char *term = (char *)memchr(dmaaddr, 0, ALPHA_PGBYTES);
+        len = term ? (term - dmaaddr + 1) : ALPHA_PGBYTES;
+
+        memcpy(dst, dmaaddr, len);
+        if (term)
+            return;
+
+        maxlen -= ALPHA_PGBYTES;
+        dst += ALPHA_PGBYTES;
+        vaddr += ALPHA_PGBYTES;
+    }
+
+    if (maxlen > 0) {
+        paddr = vtophys(xc, vaddr);
+        dmaaddr = (char *)xc->physmem->dma_addr(paddr, maxlen);
+        assert(dmaaddr);
+
+        char *term = (char *)memchr(dmaaddr, 0, maxlen);
+        len = term ? (term - dmaaddr + 1) : maxlen;
+
+        memcpy(dst, dmaaddr, len);
+
+        maxlen -= len;
+    }
+
+    if (maxlen == 0)
+        dst[maxlen] = '\0';
+}
index 8d121ec5bdc1aa115fc3a2e9f71c59e20983a62f..75a58925943c52899b34eb09da2034644f135bfd 100644 (file)
@@ -42,5 +42,8 @@ Addr vtophys(PhysicalMemory *xc, Addr vaddr);
 Addr vtophys(ExecContext *xc, Addr vaddr);
 uint8_t *vtomem(ExecContext *xc, Addr vaddr, size_t len);
 
+void CopyData(ExecContext *xc, void *dst, Addr vaddr, size_t len);
+void CopyString(ExecContext *xc, char *dst, Addr vaddr, size_t maxlen);
+
 #endif // __VTOPHYS_H__
 
index d2490edf64c85454442d57a20ef5351eb291e256..a275c2c41bba12d552db4c8137fbb5a0875dedc2 100644 (file)
@@ -40,7 +40,7 @@
 #ifdef FULL_SYSTEM
 #include "targetarch/arguments.hh"
 #include "targetarch/pmap.h"
-#include "targetarch/kernel.hh"
+#include "kern/tru64/kernel.hh"
 #include "mem/functional_mem/memory_control.hh"
 #include "cpu/full_cpu/cpu.hh"
 #include "sim/system.hh"