Copy implementations
authorErik Hallnor <ehallnor@umich.edu>
Thu, 4 Mar 2004 19:57:57 +0000 (14:57 -0500)
committerErik Hallnor <ehallnor@umich.edu>
Thu, 4 Mar 2004 19:57:57 +0000 (14:57 -0500)
arch/alpha/isa_desc:
    Need to return fault for copy operations.
cpu/exec_context.hh:
    Add temporary storage to pass source address from copy load to copy store
cpu/simple_cpu/simple_cpu.cc:
    Implement copy functions.
cpu/simple_cpu/simple_cpu.hh:
    Return fault

--HG--
extra : convert_revision : 98e5ce563449d6057ba45c70eece9235f1649a90

arch/alpha/isa_desc
cpu/exec_context.hh
cpu/simple_cpu/simple_cpu.cc
cpu/simple_cpu/simple_cpu.hh

index 46fb306a4f095db65eee6c6877ab799860a502c7..41f7388e08bab8006e1c8a0f2f009431c3691156 100644 (file)
@@ -1855,7 +1855,7 @@ decode OPCODE default Unknown::unknown() {
        0x2a: ldl_l({{ EA = Rb + disp; }}, {{ Ra.sl = Mem.sl; }}, LOCKED);
        0x2b: ldq_l({{ EA = Rb + disp; }}, {{ Ra.uq = Mem.uq; }}, LOCKED);
        0x20: copy_load({{EA = Ra;}}, 
-                       {{memAccessObj->copySrcTranslate(EA);}},
+                       {{fault = memAccessObj->copySrcTranslate(EA);}},
                        IsMemRef, IsLoad, IsCopy);
     }
 
@@ -1877,7 +1877,7 @@ decode OPCODE default Unknown::unknown() {
        0x26: sts({{ EA = Rb + disp; }}, {{ Mem.ul = t_to_s(Fa.uq); }});
        0x27: stt({{ EA = Rb + disp; }}, {{ Mem.df = Fa; }});
        0x24: copy_store({{EA = Rb;}},
-                        {{memAccessObj->copy(EA);}},
+                        {{fault =memAccessObj->copy(EA);}},
                         IsMemRef, IsStore, IsCopy);
     }
 
index e9dc5efecccbcc5dc616c653a391db9815cec01e..ccb01f486a85971e800082e09b4eead912a9a9eb 100644 (file)
@@ -153,6 +153,18 @@ class ExecContext
 
 #endif
 
+    /**
+     * Temporary storage to pass the source address from copy_load to
+     * copy_store.
+     * @todo Remove this temporary when we have a better way to do it.
+     */
+    Addr copySrcAddr;
+    /**
+     * Temp storage for the physical source address of a copy.
+     * @todo Remove this temporary when we have a better way to do it.
+     */
+    Addr copySrcPhysAddr;
+
 
     /*
      * number of executed instructions, for matching with syscall trace
index 721861dd5e881b6d2b09a5546613a85acca3e9c2..2553bd22a698692a350d8941d08fa1266f7b0862 100644 (file)
@@ -327,6 +327,46 @@ change_thread_state(int thread_number, int activate, int priority)
 {
 }
 
+Fault
+SimpleCPU::copySrcTranslate(Addr src)
+{
+    memReq->reset(src, (dcacheInterface) ?
+                  dcacheInterface->getBlockSize()
+                  : 64);
+
+    // translate to physical address
+    Fault fault = xc->translateDataReadReq(memReq);
+
+    if (fault == No_Fault) {
+        xc->copySrcAddr = src;
+        xc->copySrcPhysAddr = memReq->paddr;
+    } else {
+        xc->copySrcAddr = 0;
+        xc->copySrcPhysAddr = 0;
+    }
+    return fault;
+}
+
+Fault
+SimpleCPU::copy(Addr dest)
+{
+    int blk_size = (dcacheInterface) ? dcacheInterface->getBlockSize() : 64;
+    uint8_t data[blk_size];
+    assert(xc->copySrcPhysAddr);
+    memReq->reset(dest, blk_size);
+    // translate to physical address
+    Fault fault = xc->translateDataWriteReq(memReq);
+    if (fault == No_Fault) {
+        Addr dest_addr = memReq->paddr;
+        // Need to read straight from memory since we have more than 8 bytes.
+        memReq->paddr = xc->copySrcPhysAddr;
+        xc->mem->read(memReq, data);
+        memReq->paddr = dest_addr;
+        xc->mem->write(memReq, data);
+    }
+    return fault;
+}
+
 // precise architected memory state accessor macros
 template <class T>
 Fault
index 4bdc69ad13b40c4a929b0e43932b6bb6469630dc..9edd66ab41cec0b8ceabbc524a33a9c9031119f0 100644 (file)
@@ -247,16 +247,9 @@ class SimpleCPU : public BaseCPU
         // need to do this...
     }
 
-    void copySrcTranslate(Addr src)
-    {
-        panic("Haven't implemented Copy Src translate yet in SimpleCPU\n");
-    }
-
-    void copy(Addr dest)
-    {
-        panic("Haven't implemented Copy yet in SimpleCPU\n");
-    }
+    Fault copySrcTranslate(Addr src);
 
+    Fault copy(Addr dest);
 };
 
 #endif // __SIMPLE_CPU_HH__