These no longer use the C-API data struct as a base class, but use the struct as a private member and provide = and () operator overrides for conversion.
Signed-off-by: Mike Leach mike.leach@linaro.org --- decoder/include/common/ocsd_pe_context.h | 10 +- decoder/include/etmv3/etmv3_decoder.h | 1 + decoder/include/etmv3/trc_cmp_cfg_etmv3.h | 45 ++-- decoder/include/etmv3/trc_pkt_elem_etmv3.h | 84 ++++--- decoder/source/c_api/ocsd_c_api.cpp | 4 +- decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp | 17 +- decoder/source/etmv3/trc_pkt_elem_etmv3.cpp | 267 +++++++++++---------- decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp | 7 +- .../snapshot_parser_lib/source/ss_to_dcdtree.cpp | 13 +- 9 files changed, 241 insertions(+), 207 deletions(-)
diff --git a/decoder/include/common/ocsd_pe_context.h b/decoder/include/common/ocsd_pe_context.h index 5ec17e2..37764d9 100644 --- a/decoder/include/common/ocsd_pe_context.h +++ b/decoder/include/common/ocsd_pe_context.h @@ -36,7 +36,11 @@
#include "ocsd_if_types.h"
-/*! Handler for the ocsd_pe_context structure +/*! @class OcsdPeContext + * @brief Handler for the ocsd_pe_context structure. + * + * Reads and writes structure values, enforcing interaction rules between values + * and flags. */ class OcsdPeContext { @@ -67,12 +71,12 @@ private: ocsd_pe_context m_context; };
-OcsdPeContext::OcsdPeContext() +inline OcsdPeContext::OcsdPeContext() { resetCtxt(); }
-void OcsdPeContext::resetCtxt() +inline void OcsdPeContext::resetCtxt() { // initialise the context m_context.bits64 = 0; diff --git a/decoder/include/etmv3/etmv3_decoder.h b/decoder/include/etmv3/etmv3_decoder.h index bad57df..48c9fc7 100644 --- a/decoder/include/etmv3/etmv3_decoder.h +++ b/decoder/include/etmv3/etmv3_decoder.h @@ -40,6 +40,7 @@ #include "etmv3/trc_pkt_elem_etmv3.h" #include "etmv3/trc_pkt_proc_etmv3.h" #include "etmv3/trc_pkt_types_etmv3.h" +#include "etmv3/trc_pkt_decode_etmv3.h"
#endif // ARM_ETMV3_DECODER_H_INCLUDED
diff --git a/decoder/include/etmv3/trc_cmp_cfg_etmv3.h b/decoder/include/etmv3/trc_cmp_cfg_etmv3.h index 016ac71..e9df5e8 100644 --- a/decoder/include/etmv3/trc_cmp_cfg_etmv3.h +++ b/decoder/include/etmv3/trc_cmp_cfg_etmv3.h @@ -53,10 +53,11 @@ * Primarily inlined for efficient code. * */ -class EtmV3Config : public ocsd_etmv3_cfg +class EtmV3Config //: public ocsd_etmv3_cfg { public: EtmV3Config(); /**< Default constructor */ + EtmV3Config(const ocsd_etmv3_cfg *cfg_regs); ~EtmV3Config() {}; /**< Default destructor */
/* register bit constants. */ @@ -73,9 +74,16 @@ public:
static const uint32_t IDR_ALTBRANCH = 0x100000;
- //! copy assignment operator for base structure into class. +// operations to convert to and from C-API structure + + //! copy assignment operator for C-API base structure into class. EtmV3Config & operator=(const ocsd_etmv3_cfg *p_cfg);
+ //! cast operator returning struct const reference + operator const ocsd_etmv3_cfg &() const { return m_cfg; }; + //! cast operator returning struct const pointer + operator const ocsd_etmv3_cfg *() const { return &m_cfg; }; + //! combination enum to describe trace mode. enum EtmTraceMode { TM_INSTR_ONLY, //!< instruction only trace @@ -111,6 +119,9 @@ public:
const uint8_t getTraceID() const; //!< CoreSight Trace ID for this device.
+private: + ocsd_etmv3_cfg m_cfg; + };
@@ -118,86 +129,86 @@ public:
inline EtmV3Config & EtmV3Config::operator=(const ocsd_etmv3_cfg *p_cfg) { - *dynamic_cast<ocsd_etmv3_cfg *>(this) = *p_cfg; + m_cfg = *p_cfg; return *this; }
inline const bool EtmV3Config::isCycleAcc() const { - return (bool)((reg_ctrl & CTRL_CYCLEACC) != 0); + return (bool)((m_cfg.reg_ctrl & CTRL_CYCLEACC) != 0); }
//! return X revision in 3.X inline const int EtmV3Config::MinorRev() const { - return ((int)reg_idr & 0xF0) >> 4; + return ((int)m_cfg.reg_idr & 0xF0) >> 4; }
inline const bool EtmV3Config::isInstrTrace() const { - return (bool)((reg_ctrl & CTRL_DATAONLY) == 0); + return (bool)((m_cfg.reg_ctrl & CTRL_DATAONLY) == 0); }
inline const bool EtmV3Config::isDataValTrace() const { - return (bool)((reg_ctrl & CTRL_DATAVAL) != 0); + return (bool)((m_cfg.reg_ctrl & CTRL_DATAVAL) != 0); }
inline const bool EtmV3Config::isDataAddrTrace() const { - return (bool)((reg_ctrl & CTRL_DATAADDR) != 0); + return (bool)((m_cfg.reg_ctrl & CTRL_DATAADDR) != 0); }
//! either or both data trace present inline const bool EtmV3Config::isDataTrace() const { - return (bool)((reg_ctrl & (CTRL_DATAADDR | CTRL_DATAVAL)) != 0); + return (bool)((m_cfg.reg_ctrl & (CTRL_DATAADDR | CTRL_DATAVAL)) != 0); }
inline const bool EtmV3Config::isV7MArch() const { - return (bool)((arch_ver == ARCH_V7) && (core_prof == profile_CortexM)); + return (bool)((m_cfg.arch_ver == ARCH_V7) && (m_cfg.core_prof == profile_CortexM)); }
//! has alternate branch encoding inline const bool EtmV3Config::isAltBranch() const { - return (bool)(((reg_idr & IDR_ALTBRANCH) != 0) && (MinorRev() >= 4)); + return (bool)(((m_cfg.reg_idr & IDR_ALTBRANCH) != 0) && (MinorRev() >= 4)); }
//! processor implements virtualisation extensions. inline const bool EtmV3Config::hasVirtExt() const { - return (bool)((reg_ccer & CCER_VIRTEXT) != 0); + return (bool)((m_cfg.reg_ccer & CCER_VIRTEXT) != 0); }
//! TS packet is 64 bit. inline const bool EtmV3Config::TSPkt64() const { - return (bool)((reg_ccer & CCER_TS64BIT) != 0); + return (bool)((m_cfg.reg_ccer & CCER_TS64BIT) != 0); }
//! TS implemented. inline const bool EtmV3Config::hasTS() const { - return (bool)((reg_ccer & CCER_HAS_TS) != 0); + return (bool)((m_cfg.reg_ccer & CCER_HAS_TS) != 0); }
//! TS is enabled in the trace inline const bool EtmV3Config::isTSEnabled() const { - return (bool)((reg_ctrl & CTRL_TS_ENA) != 0); + return (bool)((m_cfg.reg_ctrl & CTRL_TS_ENA) != 0); }
//! tracing VMID inline const bool EtmV3Config::isVMIDTrace() const { - return (bool)((reg_ctrl & CTRL_VMID_ENA) != 0); + return (bool)((m_cfg.reg_ctrl & CTRL_VMID_ENA) != 0); }
inline const uint8_t EtmV3Config::getTraceID() const { - return (uint8_t)(reg_trc_id & 0x7F); + return (uint8_t)(m_cfg.reg_trc_id & 0x7F); }
/** @}*/ diff --git a/decoder/include/etmv3/trc_pkt_elem_etmv3.h b/decoder/include/etmv3/trc_pkt_elem_etmv3.h index 5d04719..bade8cc 100644 --- a/decoder/include/etmv3/trc_pkt_elem_etmv3.h +++ b/decoder/include/etmv3/trc_pkt_elem_etmv3.h @@ -49,16 +49,20 @@ * This class represents a single ETMv3 trace packet, along with intra packet state. * */ -class EtmV3TrcPacket : public ocsd_etmv3_pkt, trcPrintableElem +class EtmV3TrcPacket : public trcPrintableElem { public: EtmV3TrcPacket(); ~EtmV3TrcPacket();
+// conversions between C-API struct and C++ object types + // assign from C-API struct EtmV3TrcPacket &operator =(const ocsd_etmv3_pkt* p_pkt); + // allow const cast to C-API struct to pass C++ object + operator const ocsd_etmv3_pkt*() const { return &m_pkt_data; }; + operator const ocsd_etmv3_pkt&() const { return m_pkt_data; };
- // update interface - set packet values - +// update interface - set packet values void Clear(); //!< clear update data in packet ready for new one. void ResetState(); //!< reset intra packet state data -on full decoder reset.
@@ -91,21 +95,21 @@ public: void SetISyncIsLSiP(); void SetISyncNoAddr();
- // packet status interface - get packet info. - const ocsd_etmv3_pkt_type getType() const { return type; }; +// packet status interface - get packet info. + const ocsd_etmv3_pkt_type getType() const { return m_pkt_data.type; };
- const int AltISA() const { return context.curr_alt_isa; }; - const ocsd_isa ISA() const { return curr_isa; }; + const int AltISA() const { return m_pkt_data.context.curr_alt_isa; }; + const ocsd_isa ISA() const { return m_pkt_data.curr_isa; }; const bool isBadPacket() const;
- const uint32_t getCycleCount() const { return cycle_count; }; - const uint32_t getCtxtID() const { return context.ctxtID; }; - const uint32_t getVMID() const { return context.VMID; }; - const uint64_t getTS() const { return timestamp; }; + const uint32_t getCycleCount() const { return m_pkt_data.cycle_count; }; + const uint32_t getCtxtID() const { return m_pkt_data.context.ctxtID; }; + const uint32_t getVMID() const { return m_pkt_data.context.VMID; }; + const uint64_t getTS() const { return m_pkt_data.timestamp; };
- const bool isExcepCancel() const { return (exception.bits.present == 1) && (exception.bits.cancel == 1); }; + const bool isExcepCancel() const { return (m_pkt_data.exception.bits.present == 1) && (m_pkt_data.exception.bits.cancel == 1); };
- // printing +// printing virtual void toString(std::string &str) const; virtual void toStringFmt(const uint32_t fmtFlags, std::string &str) const;
@@ -116,100 +120,102 @@ private: void getISyncStr(std::string &valStr) const; void getISAStr(std::string &isaStr) const; void getExcepStr(std::string &excepStr) const; + + ocsd_etmv3_pkt m_pkt_data; };
inline void EtmV3TrcPacket::UpdateNS(const int NS) { - context.curr_NS = NS; - context.updated = 1; + m_pkt_data.context.curr_NS = NS; + m_pkt_data.context.updated = 1; };
inline void EtmV3TrcPacket::UpdateAltISA(const int AltISA) { - context.curr_alt_isa = AltISA; - context.updated = 1; + m_pkt_data.context.curr_alt_isa = AltISA; + m_pkt_data.context.updated = 1; }
inline void EtmV3TrcPacket::UpdateHyp(const int Hyp) { - context.curr_Hyp = Hyp; - context.updated = 1; + m_pkt_data.context.curr_Hyp = Hyp; + m_pkt_data.context.updated = 1; }
inline void EtmV3TrcPacket::UpdateISA(const ocsd_isa isa) { - prev_isa = curr_isa; - curr_isa = isa; + m_pkt_data.prev_isa = m_pkt_data.curr_isa; + m_pkt_data.curr_isa = isa; }
inline void EtmV3TrcPacket::SetType(const ocsd_etmv3_pkt_type p_type) { - type = p_type; + m_pkt_data.type = p_type; }
inline void EtmV3TrcPacket::SetErrType(const ocsd_etmv3_pkt_type e_type) { - err_type = type; - type = e_type; + m_pkt_data.err_type = m_pkt_data.type; + m_pkt_data.type = e_type; }
inline const bool EtmV3TrcPacket::isBadPacket() const { - return (type >= ETM3_PKT_BAD_SEQUENCE); + return (m_pkt_data.type >= ETM3_PKT_BAD_SEQUENCE); }
inline void EtmV3TrcPacket::SetDataOOOTag(const uint8_t tag) { - data.ooo_tag = tag; + m_pkt_data.data.ooo_tag = tag; }
inline void EtmV3TrcPacket::SetDataValue(const uint32_t value) { - data.value = value; - data.update_dval = 1; + m_pkt_data.data.value = value; + m_pkt_data.data.update_dval = 1; }
inline void EtmV3TrcPacket::UpdateContextID(const uint32_t contextID) { - context.updated_c = 1; - context.ctxtID = contextID; + m_pkt_data.context.updated_c = 1; + m_pkt_data.context.ctxtID = contextID; }
inline void EtmV3TrcPacket::UpdateVMID(const uint8_t VMID) { - context.updated_v = 1; - context.VMID = VMID; + m_pkt_data.context.updated_v = 1; + m_pkt_data.context.VMID = VMID; }
inline void EtmV3TrcPacket::UpdateDataEndian(const uint8_t BE_Val) { - data.be = BE_Val; - data.update_be = 1; + m_pkt_data.data.be = BE_Val; + m_pkt_data.data.update_be = 1; }
inline void EtmV3TrcPacket::SetCycleCount(const uint32_t cycleCount) { - cycle_count = cycleCount; + m_pkt_data.cycle_count = cycleCount; }
inline void EtmV3TrcPacket::SetISyncReason(const ocsd_iSync_reason reason) { - isync_info.reason = reason; + m_pkt_data.isync_info.reason = reason; }
inline void EtmV3TrcPacket::SetISyncHasCC() { - isync_info.has_cycle_count = 1; + m_pkt_data.isync_info.has_cycle_count = 1; }
inline void EtmV3TrcPacket::SetISyncIsLSiP() { - isync_info.has_LSipAddress = 1; + m_pkt_data.isync_info.has_LSipAddress = 1; }
inline void EtmV3TrcPacket::SetISyncNoAddr() { - isync_info.no_address = 1; + m_pkt_data.isync_info.no_address = 1; }
/** @}*/ diff --git a/decoder/source/c_api/ocsd_c_api.cpp b/decoder/source/c_api/ocsd_c_api.cpp index 28f6145..1dae2d3 100644 --- a/decoder/source/c_api/ocsd_c_api.cpp +++ b/decoder/source/c_api/ocsd_c_api.cpp @@ -725,7 +725,7 @@ ocsd_datapath_resp_t EtmV3CBObj::PacketDataIn( const ocsd_datapath_op_t op, const ocsd_trc_index_t index_sop, const EtmV3TrcPacket *p_packet_in) { - return m_c_api_cb_fn(m_p_cb_context, op,index_sop,p_packet_in); + return m_c_api_cb_fn(m_p_cb_context, op,index_sop,*p_packet_in); }
/****************** Etmv3 packet processor monitor callback function ***********/ @@ -741,7 +741,7 @@ void EtmV3PktMonCBObj::RawPacketDataMon( const ocsd_datapath_op_t op, const uint32_t size, const uint8_t *p_data) { - return m_c_api_cb_fn(m_p_cb_context, op, index_sop, p_packet_in, size, p_data); + return m_c_api_cb_fn(m_p_cb_context, op, index_sop, *p_packet_in, size, p_data); }
diff --git a/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp b/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp index 1e90cc1..f374052 100644 --- a/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp +++ b/decoder/source/etmv3/trc_cmp_cfg_etmv3.cpp @@ -38,11 +38,16 @@ EtmV3Config::EtmV3Config() { // defaults set ETMv3.4, V7A, instruction only. - arch_ver = ARCH_V7; - core_prof = profile_CortexA; - reg_ccer = 0; - reg_idr = 0x4100F240; - reg_ctrl = 0; + m_cfg.arch_ver = ARCH_V7; + m_cfg.core_prof = profile_CortexA; + m_cfg.reg_ccer = 0; + m_cfg.reg_idr = 0x4100F240; + m_cfg.reg_ctrl = 0; +} + +EtmV3Config::EtmV3Config(const ocsd_etmv3_cfg *cfg_regs) +{ + m_cfg = *cfg_regs; }
EtmV3Config::EtmTraceMode const EtmV3Config::GetTraceMode() const @@ -54,7 +59,7 @@ EtmV3Config::EtmTraceMode const EtmV3Config::GetTraceMode() const const int EtmV3Config::CtxtIDBytes() const { int ctxtIdsizes[] = { 0, 1, 2, 4 }; - return ctxtIdsizes[(reg_ctrl >> 14) & 0x3]; + return ctxtIdsizes[(m_cfg.reg_ctrl >> 14) & 0x3]; }
/* End of File trc_cmp_cfg_etmv3.cpp */ diff --git a/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp b/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp index 332ff63..16c3a2e 100644 --- a/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp +++ b/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp @@ -39,7 +39,7 @@
EtmV3TrcPacket::EtmV3TrcPacket() { - addr.size = VA_32BIT; // etm v3 only handles 32 bit addresses. + m_pkt_data.addr.size = VA_32BIT; // etm v3 only handles 32 bit addresses. }
EtmV3TrcPacket::~EtmV3TrcPacket() @@ -51,40 +51,40 @@ EtmV3TrcPacket::~EtmV3TrcPacket() // clear this packet info void EtmV3TrcPacket::Clear() { - addr.pkt_bits = 0; - prev_isa = curr_isa; // mark ISA as not changed - exception.bits.present = 0; - atom.num = 0; - cycle_count = 0; - context.updated = 0; - context.updated_c = 0; - context.updated_v = 0; - data.ooo_tag = 0; - data.value = 0; - data.update_addr = 0; - data.update_be = 0; - data.update_dval = 0; - ts_update_bits = 0; - isync_info.has_cycle_count = 0; - isync_info.has_LSipAddress = 0; - isync_info.no_address = 0; + m_pkt_data.addr.pkt_bits = 0; + m_pkt_data.prev_isa = m_pkt_data.curr_isa; // mark ISA as not changed + m_pkt_data.exception.bits.present = 0; + m_pkt_data.atom.num = 0; + m_pkt_data.cycle_count = 0; + m_pkt_data.context.updated = 0; + m_pkt_data.context.updated_c = 0; + m_pkt_data.context.updated_v = 0; + m_pkt_data.data.ooo_tag = 0; + m_pkt_data.data.value = 0; + m_pkt_data.data.update_addr = 0; + m_pkt_data.data.update_be = 0; + m_pkt_data.data.update_dval = 0; + m_pkt_data.ts_update_bits = 0; + m_pkt_data.isync_info.has_cycle_count = 0; + m_pkt_data.isync_info.has_LSipAddress = 0; + m_pkt_data.isync_info.no_address = 0; }
// reset all state including intra packet void EtmV3TrcPacket::ResetState() { - addr.val = 0; - addr.valid_bits = 0; - curr_isa = prev_isa = ocsd_isa_unknown; - context.curr_alt_isa = 0; - context.curr_NS = 0; - context.curr_Hyp = 0; - context.VMID = 0; - context.ctxtID = 0; - timestamp = 0; - data.addr.valid_bits = 0; - data.addr.val = 0; - data.be = 0; + m_pkt_data.addr.val = 0; + m_pkt_data.addr.valid_bits = 0; + m_pkt_data.curr_isa = m_pkt_data.prev_isa = ocsd_isa_unknown; + m_pkt_data.context.curr_alt_isa = 0; + m_pkt_data.context.curr_NS = 0; + m_pkt_data.context.curr_Hyp = 0; + m_pkt_data.context.VMID = 0; + m_pkt_data.context.ctxtID = 0; + m_pkt_data.timestamp = 0; + m_pkt_data.data.addr.valid_bits = 0; + m_pkt_data.data.addr.val = 0; + m_pkt_data.data.be = 0; Clear(); }
@@ -92,11 +92,11 @@ void EtmV3TrcPacket::UpdateAddress(const ocsd_vaddr_t partAddrVal, const int upd { ocsd_vaddr_t validMask = OCSD_VA_MASK; validMask >>= OCSD_MAX_VA_BITSIZE-updateBits; - addr.pkt_bits = updateBits; - addr.val &= ~validMask; - addr.val |= (partAddrVal & validMask); - if(updateBits > addr.valid_bits) - addr.valid_bits = updateBits; + m_pkt_data.addr.pkt_bits = updateBits; + m_pkt_data.addr.val &= ~validMask; + m_pkt_data.addr.val |= (partAddrVal & validMask); + if(updateBits > m_pkt_data.addr.valid_bits) + m_pkt_data.addr.valid_bits = updateBits; }
void EtmV3TrcPacket::UpdateDataAddress(const uint32_t value, const uint8_t valid_bits) @@ -104,21 +104,21 @@ void EtmV3TrcPacket::UpdateDataAddress(const uint32_t value, const uint8_t valid // ETMv3 data addresses 32 bits. uint32_t validMask = 0xFFFFFFFF; validMask >>= 32-valid_bits; - addr.pkt_bits = valid_bits; - addr.val &= ~validMask; - addr.val |= (value & validMask); - if(valid_bits > addr.valid_bits) - addr.valid_bits = valid_bits; - data.update_addr = 1; + m_pkt_data.addr.pkt_bits = valid_bits; + m_pkt_data.addr.val &= ~validMask; + m_pkt_data.addr.val |= (value & validMask); + if(valid_bits > m_pkt_data.addr.valid_bits) + m_pkt_data.addr.valid_bits = valid_bits; + m_pkt_data.data.update_addr = 1; }
void EtmV3TrcPacket::UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits) { uint64_t validMask = ~0ULL; validMask >>= 64-updateBits; - timestamp &= ~validMask; - timestamp |= (tsVal & validMask); - ts_update_bits = updateBits; + m_pkt_data.timestamp &= ~validMask; + m_pkt_data.timestamp |= (tsVal & validMask); + m_pkt_data.ts_update_bits = updateBits; }
@@ -131,15 +131,15 @@ void EtmV3TrcPacket::SetException( const ocsd_armv7_exception type, const int resume /* = 0*/) { // initial data - exception.bits.cancel = cancel ? 1 : 0; - exception.bits.cm_irq_n = irq_n; - exception.bits.cm_resume = resume; - exception.bits.cm_type = cm_type ? 1 : 0; - exception.number = number; - exception.type = type; + m_pkt_data.exception.bits.cancel = cancel ? 1 : 0; + m_pkt_data.exception.bits.cm_irq_n = irq_n; + m_pkt_data.exception.bits.cm_resume = resume; + m_pkt_data.exception.bits.cm_type = cm_type ? 1 : 0; + m_pkt_data.exception.number = number; + m_pkt_data.exception.type = type;
// mark as valid in this packet - exception.bits.present = 1; + m_pkt_data.exception.bits.present = 1; }
bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccurate) @@ -152,15 +152,15 @@ bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccu { E = ((pHdr >> 2) & 0xF); N = (pHdr & 0x40) ? 1 : 0; - atom.num = E+N; - atom.En_bits = (((uint32_t)0x1) << E) - 1; - p_hdr_fmt = 1; + m_pkt_data.atom.num = E+N; + m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1; + m_pkt_data.p_hdr_fmt = 1; } else if((pHdr & 0x3) == 0x2) { - atom.num = 2; - p_hdr_fmt = 2; - atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2); + m_pkt_data.atom.num = 2; + m_pkt_data.p_hdr_fmt = 2; + m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2); } else bValid = false; @@ -171,14 +171,14 @@ bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccu switch(pHdr_code) { case 0x80: - p_hdr_fmt = 1; + m_pkt_data.p_hdr_fmt = 1; E = ((pHdr >> 2) & 0x7); N = (pHdr & 0x40) ? 1 : 0; - atom.num = E+N; - if(atom.num) + m_pkt_data.atom.num = E+N; + if(m_pkt_data.atom.num) { - atom.En_bits = (((uint32_t)0x1) << E) - 1; - cycle_count = E+N; + m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1; + m_pkt_data.cycle_count = E+N; } else bValid = false; // deprecated 8b'10000000 code @@ -186,28 +186,28 @@ bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccu break;
case 0x82: - p_hdr_fmt = 2; + m_pkt_data.p_hdr_fmt = 2; if(pHdr & 0x10) { - p_hdr_fmt = 4; - atom.num = 1; - cycle_count = 0; - atom.En_bits = pHdr & 0x04 ? 0 : 1; + m_pkt_data.p_hdr_fmt = 4; + m_pkt_data.atom.num = 1; + m_pkt_data.cycle_count = 0; + m_pkt_data.atom.En_bits = pHdr & 0x04 ? 0 : 1; } else { - atom.num = 2; - cycle_count = 1; - atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2); + m_pkt_data.atom.num = 2; + m_pkt_data.cycle_count = 1; + m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) | (pHdr & 0x4 ? 0 : 0x2); } break;
case 0xA0: - p_hdr_fmt = 3; - cycle_count = ((pHdr >> 2) & 7) + 1; + m_pkt_data.p_hdr_fmt = 3; + m_pkt_data.cycle_count = ((pHdr >> 2) & 7) + 1; E = pHdr & 0x40 ? 1 : 0; - atom.num = E; - atom.En_bits = E; + m_pkt_data.atom.num = E; + m_pkt_data.atom.En_bits = E; break;
default: @@ -221,7 +221,7 @@ bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccu
EtmV3TrcPacket &EtmV3TrcPacket::operator =(const ocsd_etmv3_pkt* p_pkt) { - *dynamic_cast<ocsd_etmv3_pkt *>(this) = *p_pkt; + m_pkt_data = *p_pkt; return *this; }
@@ -232,15 +232,15 @@ void EtmV3TrcPacket::toString(std::string &str) const const char *desc; std::string valStr, ctxtStr = "";
- name = packetTypeName(type, &desc); + name = packetTypeName(m_pkt_data.type, &desc); str = name + (std::string)" : " + desc;
- switch(type) + switch(m_pkt_data.type) { // print the original header type for the bad sequences. case ETM3_PKT_BAD_SEQUENCE: case ETM3_PKT_BAD_TRACEMODE: - name = packetTypeName(err_type,0); + name = packetTypeName(m_pkt_data.err_type,0); str += "[" + (std::string)name + "]"; break;
@@ -263,7 +263,7 @@ void EtmV3TrcPacket::toString(std::string &str) const case ETM3_PKT_CYCLE_COUNT: { std::ostringstream oss; - oss << "; Cycles=" << cycle_count; + oss << "; Cycles=" << m_pkt_data.cycle_count; str += oss.str(); } break; @@ -271,7 +271,7 @@ void EtmV3TrcPacket::toString(std::string &str) const case ETM3_PKT_CONTEXT_ID: { std::ostringstream oss; - oss << "; CtxtID=" << std::hex << "0x" << context.ctxtID; + oss << "; CtxtID=" << std::hex << "0x" << m_pkt_data.context.ctxtID; str += oss.str(); } break; @@ -279,7 +279,7 @@ void EtmV3TrcPacket::toString(std::string &str) const case ETM3_PKT_VMID: { std::ostringstream oss; - oss << "; VMID=" << std::hex << "0x" << context.VMID; + oss << "; VMID=" << std::hex << "0x" << m_pkt_data.context.VMID; str += oss.str(); } break; @@ -287,7 +287,7 @@ void EtmV3TrcPacket::toString(std::string &str) const case ETM3_PKT_TIMESTAMP: { std::ostringstream oss; - oss << "; TS=" << std::hex << "0x" << timestamp << " (" << std::dec << timestamp << ") "; + oss << "; TS=" << std::hex << "0x" << m_pkt_data.timestamp << " (" << std::dec << m_pkt_data.timestamp << ") "; str += oss.str(); } break; @@ -295,43 +295,46 @@ void EtmV3TrcPacket::toString(std::string &str) const case ETM3_PKT_OOO_DATA: { std::ostringstream oss; - oss << "; Val=" << std::hex << "0x" << data.value; - oss << "; OO_Tag=" << std::hex << "0x" << data.ooo_tag; + oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value; + oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag; str += oss.str(); } break;
case ETM3_PKT_VAL_NOT_TRACED: - if(data.update_addr) + if(m_pkt_data.data.update_addr) { - trcPrintableElem::getValStr(valStr,32, data.addr.valid_bits, data.addr.val,true,data.addr.pkt_bits); + trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits, + m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits); str += "; Addr=" + valStr; } break;
case ETM3_PKT_OOO_ADDR_PLC: - if(data.update_addr) + if(m_pkt_data.data.update_addr) { - trcPrintableElem::getValStr(valStr,32, data.addr.valid_bits, data.addr.val,true,data.addr.pkt_bits); + trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits, + m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits); str += "; Addr=" + valStr; } { std::ostringstream oss; - oss << "; OO_Tag=" << std::hex << "0x" << data.ooo_tag; + oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag; str += oss.str(); } break;
case ETM3_PKT_NORM_DATA: - if(data.update_addr) + if(m_pkt_data.data.update_addr) { - trcPrintableElem::getValStr(valStr,32, data.addr.valid_bits, data.addr.val,true,data.addr.pkt_bits); + trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits, + m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits); str += "; Addr=" + valStr; } - if(data.update_dval) + if(m_pkt_data.data.update_dval) { std::ostringstream oss; - oss << "; Val=" << std::hex << "0x" << data.value; + oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value; str += oss.str(); } break; @@ -490,25 +493,26 @@ void EtmV3TrcPacket::getBranchAddressStr(std::string &valStr) const std::string subStr;
// print address. - trcPrintableElem::getValStr(subStr,32,addr.valid_bits,addr.val,true,addr.pkt_bits); + trcPrintableElem::getValStr(subStr,32,m_pkt_data.addr.valid_bits, + m_pkt_data.addr.val,true,m_pkt_data.addr.pkt_bits); oss << "Addr=" << subStr << "; ";
// current ISA if changed. - if(curr_isa != prev_isa) + if(m_pkt_data.curr_isa != m_pkt_data.prev_isa) { getISAStr(subStr); oss << subStr; }
// S / NS etc if changed. - if(context.updated) + if(m_pkt_data.context.updated) { - oss << (context.curr_NS ? "NS; " : "S; "); - oss << (context.curr_Hyp ? "Hyp; " : ""); + oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; "); + oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : ""); }
// exception? - if(exception.bits.present) + if(m_pkt_data.exception.bits.present) { getExcepStr(subStr); oss << subStr; @@ -519,11 +523,11 @@ void EtmV3TrcPacket::getBranchAddressStr(std::string &valStr) const void EtmV3TrcPacket::getAtomStr(std::string &valStr) const { std::ostringstream oss; - uint32_t bitpattern = atom.En_bits; // arranged LSBit oldest, MSbit newest + uint32_t bitpattern = m_pkt_data.atom.En_bits; // arranged LSBit oldest, MSbit newest
- if(!cycle_count) + if(!m_pkt_data.cycle_count) { - for(int i = 0; i < atom.num; i++) + for(int i = 0; i < m_pkt_data.atom.num; i++) { oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest bitpattern >>= 1; @@ -531,10 +535,10 @@ void EtmV3TrcPacket::getAtomStr(std::string &valStr) const } else { - switch(p_hdr_fmt) + switch(m_pkt_data.p_hdr_fmt) { case 1: - for(int i = 0; i < atom.num; i++) + for(int i = 0; i < m_pkt_data.atom.num; i++) { oss << ((bitpattern & 0x1) ? "WE" : "WN"); // in spec read L->R, oldest->newest bitpattern >>= 1; @@ -543,7 +547,7 @@ void EtmV3TrcPacket::getAtomStr(std::string &valStr) const
case 2: oss << "W"; - for(int i = 0; i < atom.num; i++) + for(int i = 0; i < m_pkt_data.atom.num; i++) { oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest bitpattern >>= 1; @@ -551,13 +555,13 @@ void EtmV3TrcPacket::getAtomStr(std::string &valStr) const break;
case 3: - for(uint32_t i = 0; i < cycle_count; i++) + for(uint32_t i = 0; i < m_pkt_data.cycle_count; i++) oss << "W"; - if(atom.num) + if(m_pkt_data.atom.num) oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest break; } - oss << "; Cycles=" << cycle_count; + oss << "; Cycles=" << m_pkt_data.cycle_count; } valStr = oss.str(); } @@ -568,27 +572,27 @@ void EtmV3TrcPacket::getISyncStr(std::string &valStr) const static const char *reason[] = { "Periodic", "Trace Enable", "Restart Overflow", "Debug Exit" };
// reason. - oss << "(" << reason[(int)isync_info.reason] << "); "; + oss << "(" << reason[(int)m_pkt_data.isync_info.reason] << "); ";
// full address. - if(!isync_info.no_address) + if(!m_pkt_data.isync_info.no_address) { - if(isync_info.has_LSipAddress) + if(m_pkt_data.isync_info.has_LSipAddress) oss << "Data Instr Addr=0x"; else oss << "Addr=0x"; - oss << std::hex << std::setfill('0') << std::setw(8) << addr.val << "; "; + oss << std::hex << std::setfill('0') << std::setw(8) << m_pkt_data.addr.val << "; "; }
- oss << (context.curr_NS ? "NS; " : "S; "); - oss << (context.curr_Hyp ? "Hyp; " : " "); + oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; "); + oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : " ");
- if(context.updated_c) + if(m_pkt_data.context.updated_c) { - oss << "CtxtID=" << std::hex << context.ctxtID << "; "; + oss << "CtxtID=" << std::hex << m_pkt_data.context.ctxtID << "; "; }
- if(isync_info.no_address) + if(m_pkt_data.isync_info.no_address) { valStr = oss.str(); return; // bail out at this point if a data only ISYNC @@ -598,17 +602,18 @@ void EtmV3TrcPacket::getISyncStr(std::string &valStr) const getISAStr(isaStr); oss << isaStr;
- if(isync_info.has_cycle_count) + if(m_pkt_data.isync_info.has_cycle_count) { - oss << "Cycles=" << std::dec << cycle_count << "; "; + oss << "Cycles=" << std::dec << m_pkt_data.cycle_count << "; "; }
- if(isync_info.has_LSipAddress) + if(m_pkt_data.isync_info.has_LSipAddress) { std::string addrStr;
// extract address updata. - trcPrintableElem::getValStr(addrStr,32,data.addr.valid_bits,data.addr.val,true,data.addr.pkt_bits); + trcPrintableElem::getValStr(addrStr,32,m_pkt_data.data.addr.valid_bits, + m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits); oss << "Curr Instr Addr=" << addrStr << ";"; } valStr = oss.str(); @@ -618,7 +623,7 @@ void EtmV3TrcPacket::getISAStr(std::string &isaStr) const { std::ostringstream oss; oss << "ISA="; - switch(curr_isa) + switch(m_pkt_data.curr_isa) { case ocsd_isa_arm: oss << "ARM(32); "; @@ -669,21 +674,21 @@ void EtmV3TrcPacket::getExcepStr(std::string &excepStr) const std::ostringstream oss; oss << "Exception=";
- if(exception.bits.cm_type) + if(m_pkt_data.exception.bits.cm_type) { - if(exception.number < 0x18) - oss << MExcep[exception.number]; + if(m_pkt_data.exception.number < 0x18) + oss << MExcep[m_pkt_data.exception.number]; else - oss << "IRQ" << std::dec << (exception.number - 0x10); - if(exception.bits.cm_resume) - oss << "; Resume=" << exception.bits.cm_resume; - if(exception.bits.cancel) + oss << "IRQ" << std::dec << (m_pkt_data.exception.number - 0x10); + if(m_pkt_data.exception.bits.cm_resume) + oss << "; Resume=" << m_pkt_data.exception.bits.cm_resume; + if(m_pkt_data.exception.bits.cancel) oss << "; Cancel prev instr"; } else { - oss << ARv7Excep[exception.number] << "; "; - if(exception.bits.cancel) + oss << ARv7Excep[m_pkt_data.exception.number] << "; "; + if(m_pkt_data.exception.bits.cancel) oss << "; Cancel prev instr"; } excepStr = oss.str(); diff --git a/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp b/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp index 93111ff..331a797 100644 --- a/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp +++ b/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.cpp @@ -196,16 +196,17 @@ ocsd_datapath_resp_t EtmV3PktProcImpl::outputPacket() ocsd_datapath_resp_t dp_resp = OCSD_RESP_FATAL_NOT_INIT; if(m_isInit) { + ocsd_etmv3_pkt_type type = m_curr_packet.getType(); if(!m_bSendPartPkt) { - dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&m_curr_packet.type,m_currPacketData); + dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&type,m_currPacketData); m_process_state = m_bStreamSync ? PROC_HDR : WAIT_SYNC; // need a header next time, or still waiting to sync. m_currPacketData.clear(); } else { // sending part packet, still some data in the main packet - dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&m_curr_packet.type,m_partPktData); + dp_resp = m_interface->outputOnAllInterfaces(m_packet_index,&m_curr_packet,&type,m_partPktData); m_process_state = m_post_part_pkt_state; m_packet_index += m_partPktData.size(); m_bSendPartPkt = false; @@ -514,7 +515,7 @@ ocsd_err_t EtmV3PktProcImpl::processPayloadByte(uint8_t by) // pop byte into buffer m_currPacketData.push_back(by); - switch(m_curr_packet.type) { + switch(m_curr_packet.getType()) { default: throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_PKT_INTERP_FAIL,m_packet_index,m_chanIDCopy,"Interpreter failed - cannot process payload for unexpected or unsupported packet."); break; diff --git a/decoder/tests/snapshot_parser_lib/source/ss_to_dcdtree.cpp b/decoder/tests/snapshot_parser_lib/source/ss_to_dcdtree.cpp index 7cd78c6..271b83b 100644 --- a/decoder/tests/snapshot_parser_lib/source/ss_to_dcdtree.cpp +++ b/decoder/tests/snapshot_parser_lib/source/ss_to_dcdtree.cpp @@ -297,13 +297,13 @@ bool CreateDcdTreeFromSnapShot::createETMv3Decoder(const std::string &coreName, bool configOK = true;
// generate the config data from the device data. - EtmV3Config config; + ocsd_etmv3_cfg cfg_regs;
regs_to_access_t regs_to_access[] = { - { ETMv3PTMRegIDR, true, &config.reg_idr, 0 }, - { ETMv3PTMRegCR, true, &config.reg_ctrl, 0 }, - { ETMv3PTMRegCCER, true, &config.reg_ccer, 0 }, - { ETMv3PTMRegTraceIDR, true, &config.reg_trc_id, 0} + { ETMv3PTMRegIDR, true, &cfg_regs.reg_idr, 0 }, + { ETMv3PTMRegCR, true, &cfg_regs.reg_ctrl, 0 }, + { ETMv3PTMRegCCER, true, &cfg_regs.reg_ccer, 0 }, + { ETMv3PTMRegTraceIDR, true, &cfg_regs.reg_trc_id, 0} };
// extract registers @@ -311,11 +311,12 @@ bool CreateDcdTreeFromSnapShot::createETMv3Decoder(const std::string &coreName,
// extract core profile if(configOK) - configOK = getCoreProfile(coreName,config.arch_ver,config.core_prof); + configOK = getCoreProfile(coreName,cfg_regs.arch_ver,cfg_regs.core_prof);
// good config - generate the decoder on the tree. if(configOK) { + EtmV3Config config(&cfg_regs); ocsd_err_t err = OCSD_OK; if(m_bPacketProcOnly) err = m_pDecodeTree->createETMv3PktProcessor(&config);