Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/49107 )
Change subject: cpu: Add generalized register accessors setReg and getReg.
......................................................................
cpu: Add generalized register accessors setReg and getReg.
These will read registers of any type, as described by a RegId. These
currently have default implementations which just delegate to the
existing, register type specific accessors.
Change-Id: I980ca15b3acd9a5a796c977276201d64c69398b8
---
M src/cpu/thread_context.cc
M src/cpu/thread_context.hh
2 files changed, 112 insertions(+), 0 deletions(-)
diff --git a/src/cpu/thread_context.cc b/src/cpu/thread_context.cc
index 4852111..6b3c4f9 100644
--- a/src/cpu/thread_context.cc
+++ b/src/cpu/thread_context.cc
@@ -153,6 +153,106 @@
getSystemPtr()->threads.quiesceTick(contextId(), resume);
}
+RegVal
+ThreadContext::getReg(const RegId ®) const
+{
+ return getRegFlat(flattenRegId(reg));
+}
+
+void
+ThreadContext::setReg(const RegId ®, RegVal val)
+{
+ setRegFlat(flattenRegId(reg), val);
+}
+
+void
+ThreadContext::getReg(const RegId ®, void *val) const
+{
+ getRegFlat(flattenRegId(reg), val);
+}
+
+void
+ThreadContext::setReg(const RegId ®, const void *val)
+{
+ setRegFlat(flattenRegId(reg), val);
+}
+
+RegVal
+ThreadContext::getRegFlat(const RegId ®) const
+{
+ RegVal val;
+ getRegFlat(reg, &val);
+ return val;
+}
+
+void
+ThreadContext::setRegFlat(const RegId ®, RegVal val)
+{
+ setRegFlat(reg, &val);
+}
+
+void
+ThreadContext::getRegFlat(const RegId ®, void *val) const
+{
+ const RegIndex idx = reg.index();
+ const RegClassType type = reg.classValue();
+ switch (type) {
+ case IntRegClass:
+ *(RegVal *)val = readIntRegFlat(idx);
+ break;
+ case FloatRegClass:
+ *(RegVal *)val = readFloatRegFlat(idx);
+ break;
+ case VecRegClass:
+ *(TheISA::VecRegContainer *)val = readVecRegFlat(idx);
+ break;
+ case VecPredRegClass:
+ *(TheISA::VecPredRegContainer *)val = readVecPredRegFlat(idx);
+ break;
+ case CCRegClass:
+ *(RegVal *)val = readCCRegFlat(idx);
+ break;
+ case MiscRegClass:
+ panic("MiscRegs should not be read with getReg.");
+ case VecElemClass:
+ *(TheISA::VecElem *)val = readVecElemFlat(idx, reg.elemIndex());
+ break;
+ default:
+ panic("Unrecognized register class type %d.", type);
+ }
+}
+
+void
+ThreadContext::setRegFlat(const RegId ®, const void *val)
+{
+ const RegIndex idx = reg.index();
+ const RegClassType type = reg.classValue();
+ switch (type) {
+ case IntRegClass:
+ setIntRegFlat(idx, *(RegVal *)val);
+ break;
+ case FloatRegClass:
+ setFloatRegFlat(idx, *(RegVal *)val);
+ break;
+ case VecRegClass:
+ setVecRegFlat(idx, *(TheISA::VecRegContainer *)val);
+ break;
+ case VecPredRegClass:
+ setVecPredRegFlat(idx, *(TheISA::VecPredRegContainer *)val);
+ break;
+ case CCRegClass:
+ setCCRegFlat(idx, *(RegVal *)val);
+ break;
+ case MiscRegClass:
+ panic("MiscRegs should not be read with getReg.");
+ case VecElemClass:
+ setVecElemFlat(idx, reg.elemIndex(), *(TheISA::VecElem *)val);
+ break;
+ default:
+ panic("Unrecognized register class type %d.", type);
+ }
+}
+
void
serialize(const ThreadContext &tc, CheckpointOut &cp)
{
diff --git a/src/cpu/thread_context.hh b/src/cpu/thread_context.hh
index bbe084a..e0ecd16 100644
--- a/src/cpu/thread_context.hh
+++ b/src/cpu/thread_context.hh
@@ -192,6 +192,12 @@
//
// New accessors for new decoder.
//
+ virtual RegVal getReg(const RegId ®) const;
+ virtual void getReg(const RegId ®, void *val) const;
+
+ virtual void setReg(const RegId ®, RegVal val);
+ virtual void setReg(const RegId ®, const void *val);
+
virtual RegVal readIntReg(RegIndex reg_idx) const = 0;
virtual RegVal readFloatReg(RegIndex reg_idx) const = 0;
@@ -279,6 +285,12 @@
* serialization code to access all registers.
*/
+ virtual RegVal getRegFlat(const RegId ®) const;
+ virtual void getRegFlat(const RegId ®, void *val) const;
+
+ virtual void setRegFlat(const RegId ®, RegVal val);
+ virtual void setRegFlat(const RegId ®, const void *val);
+
virtual RegVal readIntRegFlat(RegIndex idx) const = 0;
virtual void setIntRegFlat(RegIndex idx, RegVal val) = 0;
--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/49107
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I980ca15b3acd9a5a796c977276201d64c69398b8
Gerrit-Change-Number: 49107
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <[email protected]>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- [email protected]
To unsubscribe send an email to [email protected]
%(web_page_url)slistinfo%(cgiext)s/%(_internal_name)s