diff --git a/src/core/sal/Register.hpp b/src/core/sal/Register.hpp index 96ff6505..66f5ec9b 100644 --- a/src/core/sal/Register.hpp +++ b/src/core/sal/Register.hpp @@ -23,7 +23,9 @@ enum RegisterType { RT_GP, //!< general purpose RT_FP, //!< floating point register RT_IP, //!< program counter / instruction pointer - RT_ST //!< status register + RT_ST, //!< status register + + RT_TRACE //!< registers to be recorded in an extended trace }; /** diff --git a/src/core/sal/arm/ArmArchitecture.cc b/src/core/sal/arm/ArmArchitecture.cc index a17f28a4..611d3d67 100644 --- a/src/core/sal/arm/ArmArchitecture.cc +++ b/src/core/sal/arm/ArmArchitecture.cc @@ -23,6 +23,13 @@ ArmArchitecture::ArmArchitecture() Register *reg = new Register(RI_IP, 32); reg->setName("IP"); m_addRegister(reg, RT_IP); + + // Registers used for extended tracing: + size_t ids[] = {RI_R0, RI_R1, RI_R2, RI_R3, RI_R4, RI_R5, RI_R6, RI_R7, + RI_R8, RI_R9, RI_R10, RI_R11, RI_R12, RI_R13, RI_R14}; + for (size_t i = 0; i < sizeof(ids)/sizeof(*ids); ++i) { + m_addRegister(getRegister(ids[i]), RT_TRACE); + } } ArmArchitecture::~ArmArchitecture() diff --git a/src/core/sal/x86/X86Architecture.cc b/src/core/sal/x86/X86Architecture.cc index 97ff6e2d..10fd45bf 100644 --- a/src/core/sal/x86/X86Architecture.cc +++ b/src/core/sal/x86/X86Architecture.cc @@ -41,6 +41,12 @@ X86Architecture::X86Architecture() Register* pFlagReg = new Register(RID_FLAGS, 32); pFlagReg->setName("EFLAGS"); m_addRegister(pFlagReg, RT_ST); + + // Registers used for extended tracing: + size_t ids[] = {RID_CAX, RID_CBX, RID_CCX, RID_CDX, RID_CSI, RID_CDI, RID_CSP, RID_CBP, RID_FLAGS}; + for (size_t i = 0; i < sizeof(ids)/sizeof(*ids); ++i) { + m_addRegister(getRegister(ids[i]), RT_TRACE); + } } X86Architecture::~X86Architecture() diff --git a/src/plugins/tracing/TracingPlugin.cc b/src/plugins/tracing/TracingPlugin.cc index 8d8eb5f2..482413f8 100644 --- a/src/plugins/tracing/TracingPlugin.cc +++ b/src/plugins/tracing/TracingPlugin.cc @@ -28,15 +28,8 @@ bool TracingPlugin::run() ps = new ProtoOStream(m_protoStreamFile); } -#ifdef BUILD_X86 - size_t ids[] = {RID_CSP, RID_CBP, RID_FLAGS}; -#else - size_t ids[] = {}; -#endif - - Register *regs[sizeof(ids)/sizeof(*ids)]; - for (unsigned i = 0; i < sizeof(ids)/sizeof(*ids); ++i) - regs[i] = simulator.getCPU(0).getRegister(ids[i]); + UniformRegisterSet *extended_trace_regs = + simulator.getCPU(0).getRegisterSetOfType(RT_TRACE); // the first event gets an absolute time stamp, all others a delta to their // predecessor @@ -107,10 +100,11 @@ bool TracingPlugin::run() mm.getBytes(addr, width, &data); ext.set_data(data); - for (unsigned i = 0; i < sizeof(ids)/sizeof(*ids); ++i) { + for (UniformRegisterSet::iterator it = extended_trace_regs->begin(); + it != extended_trace_regs->end(); ++it) { Trace_Event_Extended_Registers *er = ext.add_registers(); - er->set_id(ids[i]); - er->set_value(simulator.getCPU(0).getRegisterContent(regs[i])); + er->set_id((*it)->getId()); + er->set_value(simulator.getCPU(0).getRegisterContent(*it)); if (er->value() <= mm.getPoolSize() - 4) { uint32_t value_deref; mm.getBytes(er->value(), 4, &value_deref);