summaryrefslogtreecommitdiff
path: root/cpu
diff options
context:
space:
mode:
authorErik Hallnor <ehallnor@umich.edu>2004-03-04 15:06:34 -0500
committerErik Hallnor <ehallnor@umich.edu>2004-03-04 15:06:34 -0500
commit8ad803058f5d1ba5653325b7f66df5e54d070a1e (patch)
tree5a742f77b1d8362eeb2a72775a189fe9dac20452 /cpu
parentb91ea433b9921e07c39d53cec3d37a5fdc9353a9 (diff)
parent7c089b2001afb93fe51b1a89456b15fd0d00c794 (diff)
downloadgem5-8ad803058f5d1ba5653325b7f66df5e54d070a1e.tar.xz
Automerged
--HG-- extra : convert_revision : 7b56535ee32551f27db8d98172159f63e5099835
Diffstat (limited to 'cpu')
-rw-r--r--cpu/exec_context.hh12
-rw-r--r--cpu/simple_cpu/simple_cpu.cc40
-rw-r--r--cpu/simple_cpu/simple_cpu.hh11
3 files changed, 54 insertions, 9 deletions
diff --git a/cpu/exec_context.hh b/cpu/exec_context.hh
index a4bbdd484..a72516ac7 100644
--- a/cpu/exec_context.hh
+++ b/cpu/exec_context.hh
@@ -147,6 +147,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
diff --git a/cpu/simple_cpu/simple_cpu.cc b/cpu/simple_cpu/simple_cpu.cc
index c25a95775..c2796efd0 100644
--- a/cpu/simple_cpu/simple_cpu.cc
+++ b/cpu/simple_cpu/simple_cpu.cc
@@ -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
diff --git a/cpu/simple_cpu/simple_cpu.hh b/cpu/simple_cpu/simple_cpu.hh
index 4bdc69ad1..9edd66ab4 100644
--- a/cpu/simple_cpu/simple_cpu.hh
+++ b/cpu/simple_cpu/simple_cpu.hh
@@ -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__