Go to the documentation of this file.
49 #include "config/the_isa.hh"
51 #include "debug/Context.hh"
52 #include "debug/Quiesce.hh"
54 #include "params/BaseCPU.hh"
63 const auto ®Classes =
one->getIsaPtr()->regClasses();
65 DPRINTF(Context,
"Comparing thread contexts\n");
72 panic(
"Int reg idx %d doesn't match, one: %#x, two: %#x",
81 panic(
"Float reg idx %d doesn't match, one: %#x, two: %#x",
89 for (
int i = 0;
i < vec_class.numRegs(); ++
i) {
92 one->getReg(rid, vec1.data());
93 two->
getReg(rid, vec2.data());
95 panic(
"Vec reg idx %d doesn't match, one: %#x, two: %#x",
96 i, vec_class.valString(vec1.data()),
97 vec_class.valString(vec2.data()));
105 for (
int i = 0;
i < vec_pred_class.numRegs(); ++
i) {
108 one->getReg(rid, pred1.data());
109 two->
getReg(rid, pred2.data());
110 if (pred1 != pred2) {
111 panic(
"Pred reg idx %d doesn't match, one: %s, two: %s",
112 i, vec_pred_class.valString(pred1.data()),
113 vec_pred_class.valString(pred2.data()));
121 panic(
"Misc reg idx %d doesn't match, one: %#x, two: %#x",
126 for (
int i = 0;
i < regClasses.at(
CCRegClass).numRegs(); ++
i) {
130 panic(
"CC reg idx %d doesn't match, one: %#x, two: %#x",
134 panic(
"PC state doesn't match.");
135 int id1 =
one->cpuId();
136 int id2 = two->
cpuId();
138 panic(
"CPU ids don't match, one: %d, two: %d", id1, id2);
143 panic(
"Context ids don't match, one: %d, two: %d", id1, id2);
154 port->sendFunctional(pkt);
222 const size_t numFloats = regClasses.at(
FloatRegClass).numRegs();
223 RegVal floatRegs[numFloats];
224 for (
int i = 0;
i < numFloats; ++
i)
230 const size_t numVecs = regClasses.at(
VecRegClass).numRegs();
232 for (
int i = 0;
i < numVecs; ++
i) {
239 for (
int i = 0;
i < numPreds; ++
i) {
244 const size_t numInts = regClasses.at(
IntRegClass).numRegs();
246 for (
int i = 0;
i < numInts; ++
i)
250 const size_t numCcs = regClasses.at(
CCRegClass).numRegs();
253 for (
int i = 0;
i < numCcs; ++
i)
268 const size_t numFloats = regClasses.at(
FloatRegClass).numRegs();
269 RegVal floatRegs[numFloats];
273 for (
int i = 0;
i < numFloats; ++
i)
276 const size_t numVecs = regClasses.at(
VecRegClass).numRegs();
279 for (
int i = 0;
i < numVecs; ++
i) {
286 for (
int i = 0;
i < numPreds; ++
i) {
290 const size_t numInts = regClasses.at(
IntRegClass).numRegs();
293 for (
int i = 0;
i < numInts; ++
i)
296 const size_t numCcs = regClasses.at(
CCRegClass).numRegs();
300 for (
int i = 0;
i < numCcs; ++
i)
304 std::unique_ptr<PCStateBase> pc_state(tc.
pcState().
clone());
305 pc_state->unserialize(cp);
void unserialize(ThreadContext &tc, CheckpointIn &cp)
void setIntRegFlat(RegIndex idx, RegVal val)
static void compare(ThreadContext *one, ThreadContext *two)
function to compare two thread contexts (for debugging)
virtual System * getSystemPtr()=0
RegVal readFloatReg(RegIndex reg_idx) const
TheISA::VecRegContainer readVecRegFlat(RegIndex idx) const
@ Halted
Permanently shut down.
virtual RegVal getReg(const RegId ®) const
#define UNSERIALIZE_CONTAINER(member)
RegVal readIntRegFlat(RegIndex idx) const
@ CCRegClass
Condition-code register.
void quiesce(ContextID id)
virtual const PCStateBase & pcState() const =0
virtual void setStatus(Status new_status)=0
virtual ContextID contextId() const =0
virtual RegVal getRegFlat(const RegId ®) const
Flat register interfaces.
virtual void * getWritableReg(const RegId ®)
virtual int cpuId() const =0
virtual void * getWritableRegFlat(const RegId ®)=0
void takeOverFrom(ThreadContext &ntc, ThreadContext &otc)
Copy state between thread contexts in preparation for CPU handover.
virtual Status status() const =0
A RequestPort is a specialisation of a Port, which implements the default protocol for the three diff...
void quiesceTick(ContextID id, Tick when)
virtual void setThreadId(int id)=0
@ FloatRegClass
Floating-point register.
virtual void copyArchRegs(ThreadContext *tc)=0
void quiesceTick(Tick resume)
Quiesce, suspend, and schedule activate at resume.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
void quiesce()
Quiesce thread context.
virtual RegId flattenRegId(const RegId ®_id) const =0
RegVal readIntReg(RegIndex reg_idx) const
A Packet is used to encapsulate a transfer between two objects in the memory system (e....
uint64_t Tick
Tick count type.
RegVal readCCRegFlat(RegIndex idx) const
void setCCRegFlat(RegIndex idx, RegVal val)
const RegClasses & regClasses() const
#define SERIALIZE_ARRAY(member, size)
void serialize(const ThreadContext &tc, CheckpointOut &cp)
Thread context serialization helpers.
virtual void sendFunctional(PacketPtr pkt)
virtual RegVal readMiscRegNoEffect(RegIndex misc_reg) const =0
virtual void setRegFlat(const RegId ®, RegVal val)
virtual void setContextId(ContextID id)=0
RegVal readFloatRegFlat(RegIndex idx) const
decltype(std::begin(std::declval< const T & >()), std::end(std::declval< const T & >()), void()) arrayParamOut(CheckpointOut &os, const std::string &name, const T ¶m)
void serialize(CheckpointOut &cp) const override
Serialize an object.
virtual Process * getProcessPtr()=0
bool FullSystem
The FullSystem variable can be used to determine the current mode of simulation.
@ IntRegClass
Integer register.
@ MiscRegClass
Control (misc) register.
#define UNSERIALIZE_ARRAY(member, size)
#define SERIALIZE_CONTAINER(member)
int ContextID
Globally unique thread context ID.
std::ostream CheckpointOut
virtual BaseCPU * getCpuPtr()=0
virtual int threadId() const =0
@ VecRegClass
Vector Register.
virtual BaseISA * getIsaPtr() const =0
void arrayParamIn(CheckpointIn &cp, const std::string &name, CircleBuf< T > ¶m)
RegVal readCCReg(RegIndex reg_idx) const
Reference material can be found at the JEDEC website: UFS standard http://www.jedec....
void setVecRegFlat(RegIndex idx, const TheISA::VecRegContainer &val)
virtual PCStateBase * clone() const =0
Register ID: describe an architectural register with its class and index.
#define panic(...)
This implements a cprintf based panic() function.
virtual void setReg(const RegId ®, RegVal val)
void setFloatRegFlat(RegIndex idx, RegVal val)
Generated on Wed Jul 13 2022 10:39:08 for gem5 by doxygen 1.8.17