42 #ifndef __CPU_SIMPLE_THREAD_HH__ 43 #define __CPU_SIMPLE_THREAD_HH__ 47 #include "arch/decoder.hh" 49 #include "arch/isa.hh" 50 #include "arch/isa_traits.hh" 51 #include "arch/registers.hh" 52 #include "arch/types.hh" 54 #include "config/the_isa.hh" 57 #include "debug/CCRegs.hh" 58 #include "debug/FloatRegs.hh" 59 #include "debug/IntRegs.hh" 60 #include "debug/VecPredRegs.hh" 61 #include "debug/VecRegs.hh" 107 std::array<RegVal, TheISA::NumIntRegs>
intRegs;
108 std::array<VecRegContainer, TheISA::NumVecRegs>
vecRegs;
109 std::array<VecPredRegContainer, TheISA::NumVecPredRegs>
vecPredRegs;
110 std::array<RegVal, TheISA::NumCCRegs>
ccRegs;
124 return csprintf(
"%s.[tid:%i]", baseCpu->name(), threadId());
145 bool use_kernel_stats =
true);
155 void regStats(
const std::string &
name)
override;
190 void dumpFuncProfile()
override;
202 comInstEventQueue.
schedule(event, count);
253 Status
status()
const override {
return _status; }
255 void setStatus(Status newStatus)
override { _status = newStatus; }
258 void activate()
override;
261 void suspend()
override;
264 void halt()
override;
294 for (
auto &vec_reg: vecRegs)
296 for (
auto &pred_reg: vecPredRegs)
308 int flatIndex = isa->flattenIntIndex(reg_idx);
310 uint64_t regVal(readIntRegFlat(flatIndex));
311 DPRINTF(IntRegs,
"Reading int reg %d (%d) as %#x.\n",
312 reg_idx, flatIndex, regVal);
319 int flatIndex = isa->flattenFloatIndex(reg_idx);
321 RegVal regVal(readFloatRegFlat(flatIndex));
322 DPRINTF(FloatRegs,
"Reading float reg %d (%d) bits as %#x.\n",
323 reg_idx, flatIndex, regVal);
330 int flatIndex = isa->flattenVecIndex(reg.
index());
333 DPRINTF(VecRegs,
"Reading vector reg %d (%d) as %s.\n",
341 int flatIndex = isa->flattenVecIndex(reg.
index());
344 DPRINTF(VecRegs,
"Reading vector reg %d (%d) as %s for modify.\n",
352 template <
typename T>
356 int flatIndex = isa->flattenVecIndex(reg.
index());
358 auto regVal = readVecLaneFlat<T>(flatIndex, reg.
elemIndex());
359 DPRINTF(VecRegs,
"Reading vector lane %d (%d)[%d] as %lx.\n",
368 return readVecLane<uint8_t>(
reg);
375 return readVecLane<uint16_t>(
reg);
382 return readVecLane<uint32_t>(
reg);
389 return readVecLane<uint64_t>(
reg);
393 template <
typename LD>
397 int flatIndex = isa->flattenVecIndex(reg.
index());
400 DPRINTF(VecRegs,
"Reading vector lane %d (%d)[%d] to %lx.\n",
406 return setVecLaneT(reg, val);
412 return setVecLaneT(reg, val);
418 return setVecLaneT(reg, val);
424 return setVecLaneT(reg, val);
431 int flatIndex = isa->flattenVecElemIndex(reg.
index());
434 DPRINTF(VecRegs,
"Reading element %d of vector reg %d (%d) as" 442 int flatIndex = isa->flattenVecPredIndex(reg.
index());
445 DPRINTF(VecPredRegs,
"Reading predicate reg %d (%d) as %s.\n",
453 int flatIndex = isa->flattenVecPredIndex(reg.
index());
457 "Reading predicate reg %d (%d) as %s for modify.\n",
465 int flatIndex = isa->flattenCCIndex(reg_idx);
466 assert(0 <= flatIndex);
468 uint64_t regVal(readCCRegFlat(flatIndex));
469 DPRINTF(CCRegs,
"Reading CC reg %d (%d) as %#x.\n",
470 reg_idx, flatIndex, regVal);
477 int flatIndex = isa->flattenIntIndex(reg_idx);
479 DPRINTF(IntRegs,
"Setting int reg %d (%d) to %#x.\n",
480 reg_idx, flatIndex, val);
481 setIntRegFlat(flatIndex, val);
487 int flatIndex = isa->flattenFloatIndex(reg_idx);
492 setFloatRegFlat(flatIndex, val);
493 DPRINTF(FloatRegs,
"Setting float reg %d (%d) bits to %#x.\n",
494 reg_idx, flatIndex, val);
500 int flatIndex = isa->flattenVecIndex(reg.
index());
502 setVecRegFlat(flatIndex, val);
503 DPRINTF(VecRegs,
"Setting vector reg %d (%d) to %s.\n",
510 int flatIndex = isa->flattenVecElemIndex(reg.
index());
513 DPRINTF(VecRegs,
"Setting element %d of vector reg %d (%d) to" 520 int flatIndex = isa->flattenVecPredIndex(reg.
index());
522 setVecPredRegFlat(flatIndex, val);
523 DPRINTF(VecPredRegs,
"Setting predicate reg %d (%d) to %s.\n",
530 int flatIndex = isa->flattenCCIndex(reg_idx);
532 DPRINTF(CCRegs,
"Setting CC reg %d (%d) to %#x.\n",
533 reg_idx, flatIndex, val);
534 setCCRegFlat(flatIndex, val);
555 return isa->readMiscRegNoEffect(misc_reg);
561 return isa->readMiscReg(misc_reg,
this);
567 return isa->setMiscRegNoEffect(misc_reg, val);
573 return isa->setMiscReg(misc_reg, val,
this);
579 return isa->flattenRegId(regId);
587 return memAccPredicate;
593 memAccPredicate =
val;
599 storeCondFailures = sc_failures;
611 process->syscall(
this, fault);
624 return floatRegs[idx];
629 floatRegs[idx] =
val;
650 template <
typename T>
654 return vecRegs[
reg].laneView<T>(lId);
657 template <
typename LD>
661 vecRegs[
reg].laneView<
typename LD::UnderlyingType>(lId) = val;
680 return vecPredRegs[
reg];
686 return vecPredRegs[
reg];
700 #endif // __CPU_CPU_EXEC_CONTEXT_HH__
BaseISA * getIsaPtr() override
void setContextId(ContextID id)
uint32_t socketId() const override
virtual void setVecLane(const RegId ®, const LaneData< LaneSize::Byte > &val) override
Write a lane of the destination vector register.
std::array< VecPredRegContainer, TheISA::NumVecPredRegs > vecPredRegs
Tick readLastActivate() const
void pcStateNoRecord(const TheISA::PCState &val) override
Struct for holding general thread state that is needed across CPU models.
Tick readLastSuspend() const
Process * getProcessPtr() override
Tick getCurrentInstCount() override
Status status() const override
EndQuiesceEvent * getQuiesceEvent()
virtual void setVecLane(const RegId ®, const LaneData< LaneSize::FourByte > &val) override
const std::string & name()
std::array< RegVal, TheISA::NumIntRegs > intRegs
PortProxy & getPhysProxy()
void scheduleInstCountEvent(Event *event, Tick count) override
bool schedule(PCEvent *e) override
Vector Register Abstraction This generic class is the model in a particularization of MVC...
bool readPredicate() const
uint32_t socketId() const
unsigned readStCondFailures() const override
RegVal readCCReg(RegIndex reg_idx) const override
CheckerCPU * getCheckerCpuPtr() override
Counter readFuncExeInst() const
Reads the number of instructions functionally executed and committed.
Declaration of a request, the overall memory request consisting of the parts of the request that are ...
void takeOverFrom(ThreadContext &ntc, ThreadContext &otc)
Copy state between thread contexts in preparation for CPU handover.
void profileClear() override
EndQuiesceEvent * getQuiesceEvent() override
void setThreadId(int id) override
std::array< RegVal, TheISA::NumFloatRegs > floatRegs
ContextID contextId() const override
System * getSystemPtr() override
void clearArchRegs() override
TheISA::PCState pcState() const override
void schedule(Event *event, Tick when, bool global=false)
Schedule the given event on this queue.
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
void setStatus(Status newStatus) override
void deschedule(Event *event)
Deschedule the specified event.
bool remove(PCEvent *event) override
void descheduleInstCountEvent(Event *event) override
void setThreadId(ThreadID id)
void setIntRegFlat(RegIndex idx, RegVal val) override
int cpuId() const override
virtual void setVecLane(const RegId ®, const LaneData< LaneSize::TwoByte > &val) override
void setMemAccPredicate(bool val)
VecLaneT< T, true > readVecLaneFlat(RegIndex reg, int lId) const
void setCCRegFlat(RegIndex idx, RegVal val) override
ThreadContext is the external interface to all thread state for anything outside of the CPU...
void setFloatRegFlat(RegIndex idx, RegVal val) override
VecPredRegContainer & getWritableVecPredReg(const RegId ®) override
RegVal readMiscReg(RegIndex misc_reg) override
Event for timing out quiesce instruction.
VecRegContainer & getWritableVecReg(const RegId ®) override
void setProcessPtr(Process *p) override
VecLaneT< T, true > readVecLane(const RegId ®) const
Vector Register Lane Interfaces.
void setVecElem(const RegId ®, const VecElem &val) override
virtual ConstVecLane32 readVec32BitLaneReg(const RegId ®) const override
Reads source vector 32bit operand.
void setIntReg(RegIndex reg_idx, RegVal val) override
const RegIndex & elemIndex() const
Elem accessor.
TheISA::MachInst MachInst
LaneSize is an abstraction of a LS byte value for the execution and thread contexts to handle values ...
Addr nextInstAddr() const override
virtual ConstVecLane64 readVec64BitLaneReg(const RegId ®) const override
Reads source vector 64bit operand.
virtual ConstVecLane16 readVec16BitLaneReg(const RegId ®) const override
Reads source vector 16bit operand.
bool readMemAccPredicate()
std::string csprintf(const char *format, const Args &...args)
void setCCReg(RegIndex reg_idx, RegVal val) override
RegVal readIntReg(RegIndex reg_idx) const override
ContextID contextId() const
PCEventQueue pcEventQueue
Queue of events sorted in time order.
void setFloatReg(RegIndex reg_idx, RegVal val) override
void setProcessPtr(Process *p)
uint64_t Tick
Tick count type.
VecPredRegContainer & getWritableVecPredRegFlat(RegIndex reg) override
VecPredReg::Container VecPredRegContainer
const VecElem & readVecElemFlat(RegIndex reg, const ElemIndex &elemIndex) const override
void setMiscRegNoEffect(RegIndex misc_reg, RegVal val) override
const VecPredRegContainer & readVecPredReg(const RegId ®) const override
void serialize(const ThreadContext &tc, CheckpointOut &cp)
Thread context serialization helpers.
void initMemProxies(ThreadContext *tc) override
Initialise the physical and virtual port proxies and tie them to the data port of the CPU...
void pcState(const TheISA::PCState &val) override
Kernel::Statistics * getKernelStats()
BaseTLB * getDTBPtr() override
void setMiscReg(RegIndex misc_reg, RegVal val) override
VecRegContainer & getWritableVecRegFlat(RegIndex reg) override
void demapInstPage(Addr vaddr, uint64_t asn)
ThreadID threadId() const
void demapDataPage(Addr vaddr, uint64_t asn)
void demapPage(Addr vaddr, uint64_t asn)
Defines global host-dependent types: Counter, Tick, and (indirectly) {int,uint}{8,16,32,64}_t.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
ThreadContext * getTC()
Returns the pointer to this SimpleThread's ThreadContext.
int64_t Counter
Statistics counter type.
bool schedule(PCEvent *event) override
void setVecRegFlat(RegIndex reg, const VecRegContainer &val) override
Addr instAddr() const override
int threadId() const override
PortProxy & getPhysProxy() override
virtual void setVecLane(const RegId ®, const LaneData< LaneSize::EightByte > &val) override
bool predicate
Did this instruction execute or is it predicated false.
void initMemProxies(ThreadContext *tc)
Initialise the physical and virtual port proxies and tie them to the data port of the CPU...
void setStCondFailures(unsigned sc_failures) override
This object is a proxy for a port or other object which implements the functional response protocol...
BaseCPU * getCpuPtr() override
RegVal readIntRegFlat(RegIndex idx) const override
Flat register interfaces.
bool memAccPredicate
True if the memory access should be skipped for this instruction.
const VecRegContainer & readVecRegFlat(RegIndex reg) const override
void setVecLaneT(const RegId ®, const LD &val)
Write a lane of the destination vector register.
const std::string print() const
Returns a string representation of the register content.
Declarations of a non-full system Page Table.
RegId flattenRegId(const RegId ®Id) const override
Process * getProcessPtr()
void setContextId(ContextID id) override
std::ostream CheckpointOut
VecReg::Container VecRegContainer
uint16_t ElemIndex
Logical vector register elem index type.
void setVecElemFlat(RegIndex reg, const ElemIndex &elemIndex, const VecElem &val) override
const std::string print() const
Counter readFuncExeInst() const override
const VecElem & readVecElem(const RegId ®) const override
void profileSample() override
Generic predicate register container.
PortProxy & getVirtProxy() override
RegVal readFloatReg(RegIndex reg_idx) const override
MicroPC microPC() const override
const RegIndex & index() const
Index accessors.
Kernel::Statistics * getKernelStats() override
void setVecPredReg(const RegId ®, const VecPredRegContainer &val) override
virtual void demapPage(Addr vaddr, uint64_t asn)=0
ThreadContext::Status Status
void unserialize(ThreadContext &tc, CheckpointIn &cp)
Register ID: describe an architectural register with its class and index.
Tick readLastSuspend() override
void setVecReg(const RegId ®, const VecRegContainer &val) override
std::array< VecRegContainer, TheISA::NumVecRegs > vecRegs
std::array< RegVal, TheISA::NumCCRegs > ccRegs
EventQueue comInstEventQueue
An instruction-based event queue.
void setVecLaneFlat(RegIndex reg, int lId, const LD &val)
Vector Lane abstraction Another view of a container.
RegVal readFloatRegFlat(RegIndex idx) const override
GenericISA::DelaySlotPCState< MachInst > PCState
std::shared_ptr< FaultBase > Fault
virtual ConstVecLane8 readVec8BitLaneReg(const RegId ®) const override
Reads source vector 8bit operand.
PortProxy & getVirtProxy()
RegVal readCCRegFlat(RegIndex idx) const override
TheISA::Decoder * getDecoderPtr() override
const VecRegContainer & readVecReg(const RegId ®) const override
int ContextID
Globally unique thread context ID.
BaseTLB * getITBPtr() override
Tick readLastActivate() override
const VecPredRegContainer & readVecPredRegFlat(RegIndex reg) const override
void syscall(Fault *fault) override
RegVal readMiscRegNoEffect(RegIndex misc_reg) const override
void setVecPredRegFlat(RegIndex reg, const VecPredRegContainer &val) override
void setPredicate(bool val)
Tick getCurTick() const
While curTick() is useful for any object assigned to this event queue, if an object that is assigned ...