45 #ifndef __CPU_SIMPLE_THREAD_HH__ 46 #define __CPU_SIMPLE_THREAD_HH__ 50 #include "arch/decoder.hh" 52 #include "arch/isa.hh" 53 #include "arch/isa_traits.hh" 54 #include "arch/registers.hh" 55 #include "arch/types.hh" 57 #include "config/the_isa.hh" 60 #include "debug/CCRegs.hh" 61 #include "debug/FloatRegs.hh" 62 #include "debug/IntRegs.hh" 63 #include "debug/VecPredRegs.hh" 64 #include "debug/VecRegs.hh" 110 std::array<RegVal, TheISA::NumIntRegs>
intRegs;
111 std::array<VecRegContainer, TheISA::NumVecRegs>
vecRegs;
112 std::array<VecPredRegContainer, TheISA::NumVecPredRegs>
vecPredRegs;
113 std::array<RegVal, TheISA::NumCCRegs>
ccRegs;
127 return csprintf(
"%s.[tid:%i]", baseCpu->name(), threadId());
148 bool use_kernel_stats =
true);
158 void regStats(
const std::string &
name)
override;
193 void dumpFuncProfile()
override;
205 comInstEventQueue.
schedule(event, count);
256 Status
status()
const override {
return _status; }
258 void setStatus(Status newStatus)
override { _status = newStatus; }
261 void activate()
override;
264 void suspend()
override;
267 void halt()
override;
297 for (
auto &vec_reg: vecRegs)
299 for (
auto &pred_reg: vecPredRegs)
311 int flatIndex = isa->flattenIntIndex(reg_idx);
313 uint64_t regVal(readIntRegFlat(flatIndex));
314 DPRINTF(IntRegs,
"Reading int reg %d (%d) as %#x.\n",
315 reg_idx, flatIndex, regVal);
322 int flatIndex = isa->flattenFloatIndex(reg_idx);
324 RegVal regVal(readFloatRegFlat(flatIndex));
325 DPRINTF(FloatRegs,
"Reading float reg %d (%d) bits as %#x.\n",
326 reg_idx, flatIndex, regVal);
333 int flatIndex = isa->flattenVecIndex(reg.
index());
336 DPRINTF(VecRegs,
"Reading vector reg %d (%d) as %s.\n",
344 int flatIndex = isa->flattenVecIndex(reg.
index());
347 DPRINTF(VecRegs,
"Reading vector reg %d (%d) as %s for modify.\n",
355 template <
typename T>
359 int flatIndex = isa->flattenVecIndex(reg.
index());
361 auto regVal = readVecLaneFlat<T>(flatIndex, reg.
elemIndex());
362 DPRINTF(VecRegs,
"Reading vector lane %d (%d)[%d] as %lx.\n",
371 return readVecLane<uint8_t>(
reg);
378 return readVecLane<uint16_t>(
reg);
385 return readVecLane<uint32_t>(
reg);
392 return readVecLane<uint64_t>(
reg);
396 template <
typename LD>
400 int flatIndex = isa->flattenVecIndex(reg.
index());
403 DPRINTF(VecRegs,
"Reading vector lane %d (%d)[%d] to %lx.\n",
409 return setVecLaneT(reg, val);
415 return setVecLaneT(reg, val);
421 return setVecLaneT(reg, val);
427 return setVecLaneT(reg, val);
434 int flatIndex = isa->flattenVecElemIndex(reg.
index());
437 DPRINTF(VecRegs,
"Reading element %d of vector reg %d (%d) as" 445 int flatIndex = isa->flattenVecPredIndex(reg.
index());
448 DPRINTF(VecPredRegs,
"Reading predicate reg %d (%d) as %s.\n",
456 int flatIndex = isa->flattenVecPredIndex(reg.
index());
460 "Reading predicate reg %d (%d) as %s for modify.\n",
468 int flatIndex = isa->flattenCCIndex(reg_idx);
469 assert(0 <= flatIndex);
471 uint64_t regVal(readCCRegFlat(flatIndex));
472 DPRINTF(CCRegs,
"Reading CC reg %d (%d) as %#x.\n",
473 reg_idx, flatIndex, regVal);
480 int flatIndex = isa->flattenIntIndex(reg_idx);
482 DPRINTF(IntRegs,
"Setting int reg %d (%d) to %#x.\n",
483 reg_idx, flatIndex, val);
484 setIntRegFlat(flatIndex, val);
490 int flatIndex = isa->flattenFloatIndex(reg_idx);
495 setFloatRegFlat(flatIndex, val);
496 DPRINTF(FloatRegs,
"Setting float reg %d (%d) bits to %#x.\n",
497 reg_idx, flatIndex, val);
503 int flatIndex = isa->flattenVecIndex(reg.
index());
505 setVecRegFlat(flatIndex, val);
506 DPRINTF(VecRegs,
"Setting vector reg %d (%d) to %s.\n",
513 int flatIndex = isa->flattenVecElemIndex(reg.
index());
516 DPRINTF(VecRegs,
"Setting element %d of vector reg %d (%d) to" 523 int flatIndex = isa->flattenVecPredIndex(reg.
index());
525 setVecPredRegFlat(flatIndex, val);
526 DPRINTF(VecPredRegs,
"Setting predicate reg %d (%d) to %s.\n",
533 int flatIndex = isa->flattenCCIndex(reg_idx);
535 DPRINTF(CCRegs,
"Setting CC reg %d (%d) to %#x.\n",
536 reg_idx, flatIndex, val);
537 setCCRegFlat(flatIndex, val);
558 return isa->readMiscRegNoEffect(misc_reg);
564 return isa->readMiscReg(misc_reg,
this);
570 return isa->setMiscRegNoEffect(misc_reg, val);
576 return isa->setMiscReg(misc_reg, val,
this);
582 return isa->flattenRegId(regId);
590 return memAccPredicate;
596 memAccPredicate =
val;
602 storeCondFailures = sc_failures;
614 process->syscall(
this, fault);
627 return floatRegs[idx];
632 floatRegs[idx] =
val;
653 template <
typename T>
657 return vecRegs[
reg].laneView<T>(lId);
660 template <
typename LD>
664 vecRegs[
reg].laneView<
typename LD::UnderlyingType>(lId) = val;
683 return vecPredRegs[
reg];
689 return vecPredRegs[
reg];
703 #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
void deschedule(Event *event)
Deschedule the specified event.
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
The SimpleThread object provides a combination of the ThreadState object and the ThreadContext interf...
void setStatus(Status newStatus) override
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)
::DummyVecPredRegContainer VecPredRegContainer
uint64_t Tick
Tick count type.
VecPredRegContainer & getWritableVecPredRegFlat(RegIndex reg) override
::DummyVecRegContainer VecRegContainer
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
uint16_t ElemIndex
Logical vector register elem index type.
void setVecElemFlat(RegIndex reg, const ElemIndex &elemIndex, const VecElem &val) override
Counter readFuncExeInst() const override
GenericISA::SimplePCState< MachInst > PCState
const VecElem & readVecElem(const RegId ®) const override
void profileSample() override
Generic predicate register container.
PortProxy & getVirtProxy() override
void schedule(Event *event, Tick when, bool global=false)
Schedule the given event on this queue.
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
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)
const std::string print() const