107 return "Unsupported";
118 _pc, _macroStaticInst),
137 instSize = (arm_inst->instSize() << 3);
142 opcode = arm_inst->encoding();
147 [](
char&
c) { c = toupper(c); });
156 uint8_t _size,
Addr _addr, uint64_t _data)
176 switch (
regId.classValue()) {
241 panic(
"ARM doesn't support float registers.");
255 std::string reg_suffix;
261 switch (
regId.index()) {
288 std::make_unique<TraceInstEntry>(tarmCtx,
predicate)
301 std::make_unique<TraceMemEntry>(tarmCtx,
302 static_cast<uint8_t
>(
getSize()),
323 queue.push_back(std::make_unique<TraceRegEntry>(single_reg));
336 auto &instQueue =
tracer.instQueue;
337 auto &memQueue =
tracer.memQueue;
338 auto ®Queue =
tracer.regQueue;
380template<
typename Queue>
384 std::ostream &outs =
tracer.output();
386 for (
const auto &single_entry : queue) {
387 single_entry->print(outs);
393template<
typename Queue,
typename... Args>
405 const std::string &prefix)
const
412 ccprintf(outs,
"%s clk %s (%u) %08x %s %s %s_%s : %s\n",
428 const std::string &prefix)
const
432 ccprintf(outs,
"%s clk M%s%d %08x %0*x\n",
445 const std::string &prefix)
const
450 ccprintf(outs,
"%s clk R %s %08x\n",
A high-level queue interface, to be used by both the MSHR queue and the write buffer.
T * get() const
Directly access the pointer itself without taking a reference.
Register ID: describe an architectural register with its class and index.
ThreadContext is the external interface to all thread state for anything outside of the CPU.
StaticInstPtr macroStaticInst
std::unique_ptr< PCStateBase > pc
uint64_t getIntData() const
bool predicate
is the predicate for execution this inst true or false (not execed)?
ISetState
ARM instruction set state.
TarmacBaseRecord(Tick _when, ThreadContext *_thread, const StaticInstPtr _staticInst, const PCStateBase &_pc, const StaticInstPtr _macroStaticInst=nullptr)
This object type is encapsulating the informations needed by a Tarmac record to generate it's own ent...
const StaticInstPtr staticInst
virtual void addInstEntry(std::vector< InstPtr > &queue, const TarmacContext &ptr)
Generates an Entry for the executed instruction.
void mergeCCEntry(std::vector< RegPtr > &queue, const TarmacContext &tarmCtx)
RegEntry genRegister(const TarmacContext &tarmCtx, const RegId ®)
Generate and update a register entry.
virtual void addRegEntry(std::vector< RegPtr > &queue, const TarmacContext &ptr)
Generate an Entry for every register being written.
virtual void dump() override
TarmacTracerRecord(Tick _when, ThreadContext *_thread, const StaticInstPtr _staticInst, const PCStateBase &_pc, TarmacTracer &_tracer, const StaticInstPtr _macroStaticInst=NULL)
void flushQueues(Queue &queue)
Flush queues to the trace output.
virtual void addMemEntry(std::vector< MemPtr > &queue, const TarmacContext &ptr)
Generates an Entry for every triggered memory access.
TarmacTracer & tracer
Reference to tracer.
Tarmac Tracer: this tracer generates a new Tarmac Record for every instruction being executed in gem5...
#define panic(...)
This implements a cprintf based panic() function.
const char *const RegName[NumRegs]
bool isSecure(ThreadContext *tc)
constexpr auto & StackPointerReg
constexpr auto & ReturnAddressReg
const char *const miscRegName[]
constexpr auto & FramePointerReg
std::string iSetStateToStr(TarmacBaseRecord::ISetState isetstate)
Returns the string representation of the instruction set being currently run according to the Tarmac ...
std::string opModeToStr(OperatingMode opMode)
Returns the string representation of the ARM Operating Mode (CPSR.M[3:0] field) according to the Tarm...
Copyright (c) 2024 Arm Limited All rights reserved.
Tick curTick()
The universal simulation clock.
uint64_t Addr
Address type This will probably be moved somewhere else in the near future.
uint64_t Tick
Tick count type.
RefCountingPtr< StaticInst > StaticInstPtr
std::string csprintf(const char *format, const Args &...args)
@ FloatRegClass
Floating-point register.
@ CCRegClass
Condition-code register.
@ VecRegClass
Vector Register.
@ IntRegClass
Integer register.
@ MiscRegClass
Control (misc) register.
void ccprintf(cp::Print &print)
ArmISA::OperatingMode mode
std::vector< uint64_t > values
bool secureMode
True if instruction is executed in secure mode.
virtual void print(std::ostream &outs, int verbosity=0, const std::string &prefix="") const override
std::string disassemble
Instruction disassembly.
static uint64_t instCount
Number of instructions being traced.
uint8_t instSize
Instruction size: 16 for 16-bit Thumb Instruction 32 otherwise (ARM and BigThumb)
TraceInstEntry(const TarmacContext &tarmCtx, bool predicate)
TraceMemEntry(const TarmacContext &tarmCtx, uint8_t _size, Addr _addr, uint64_t _data)
virtual void print(std::ostream &outs, int verbosity=0, const std::string &prefix="") const override
bool loadAccess
True if memory access is a load.
void update(const TarmacContext &tarmCtx)
This updates the register entry using the update table.
bool regValid
True if register entry is valid.
virtual void updateCC(const TarmacContext &tarmCtx)
virtual void updatePred(const TarmacContext &tarmCtx)
virtual void updateFloat(const TarmacContext &tarmCtx)
virtual void print(std::ostream &outs, int verbosity=0, const std::string &prefix="") const override
virtual void updateMisc(const TarmacContext &tarmCtx)
Register update functions.
virtual void updateVec(const TarmacContext &tarmCtx)
TraceRegEntry(const TarmacContext &tarmCtx, const RegId ®)
std::string regName
Register name to be printed.
virtual void updateInt(const TarmacContext &tarmCtx)