diff --git a/arch/alpha/ev5.cc b/arch/alpha/ev5.cc index 019e83dd4..6d45edbff 100644 --- a/arch/alpha/ev5.cc +++ b/arch/alpha/ev5.cc @@ -542,10 +542,10 @@ AlphaISA::MiscRegFile::setIpr(int idx, uint64_t val, ExecContext *xc) } void -AlphaISA::MiscRegFile::copyIprs(ExecContext *xc) +AlphaISA::copyIprs(ExecContext *src, ExecContext *dest) { for (int i = IPR_Base_DepTag; i < NumInternalProcRegs; ++i) { - ipr[i] = xc->readMiscReg(i); + dest->setMiscReg(i, src->readMiscReg(i)); } } diff --git a/arch/alpha/registerfile.hh b/arch/alpha/registerfile.hh index c2fb56ec1..6bdab78f5 100644 --- a/arch/alpha/registerfile.hh +++ b/arch/alpha/registerfile.hh @@ -34,6 +34,7 @@ #include "sim/faults.hh" class Checkpoint; +class ExecContext; namespace AlphaISA { @@ -67,8 +68,6 @@ namespace AlphaISA Fault setRegWithEffect(int misc_reg, const MiscReg &val, ExecContext *xc); - void copyMiscRegs(ExecContext *xc); - #if FULL_SYSTEM protected: typedef uint64_t InternalProcReg; @@ -79,8 +78,6 @@ namespace AlphaISA InternalProcReg readIpr(int idx, Fault &fault, ExecContext *xc); Fault setIpr(int idx, InternalProcReg val, ExecContext *xc); - - void copyIprs(ExecContext *xc); #endif friend class RegFile; }; @@ -105,6 +102,13 @@ namespace AlphaISA void unserialize(Checkpoint *cp, const std::string §ion); }; + void copyRegs(ExecContext *src, ExecContext *dest); + + void copyMiscRegs(ExecContext *src, ExecContext *dest); + +#if FULL_SYSTEM + void copyIprs(ExecContext *src, ExecContext *dest); +#endif } // namespace AlphaISA #endif diff --git a/cpu/cpu_exec_context.cc b/cpu/cpu_exec_context.cc index 2ad9571ce..0a3dc5675 100644 --- a/cpu/cpu_exec_context.cc +++ b/cpu/cpu_exec_context.cc @@ -28,6 +28,7 @@ #include +#include "arch/isa_traits.hh" #include "cpu/base.hh" #include "cpu/cpu_exec_context.hh" #include "cpu/exec_context.hh" @@ -269,23 +270,6 @@ CPUExecContext::regStats(const string &name) void CPUExecContext::copyArchRegs(ExecContext *xc) { - // First loop through the integer registers. - for (int i = 0; i < TheISA::NumIntRegs; ++i) { - setIntReg(i, xc->readIntReg(i)); - } - - // Then loop through the floating point registers. - for (int i = 0; i < TheISA::NumFloatRegs; ++i) { - setFloatRegDouble(i, xc->readFloatRegDouble(i)); - setFloatRegInt(i, xc->readFloatRegInt(i)); - } - - // Copy misc. registers - regs.miscRegs.copyMiscRegs(xc); - - // Lastly copy PC/NPC - setPC(xc->readPC()); - setNextPC(xc->readNextPC()); - setNextNPC(xc->readNextNPC()); + TheISA::copyRegs(xc, proxy); }