aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Leach <mike.leach@linaro.org>2022-07-12 15:44:00 +0100
committerMike Leach <mike.leach@linaro.org>2023-01-19 16:50:45 +0000
commitc86f7187fe2ac96f90b45c1c80ae48599ce3217c (patch)
tree92240e517e9be6e4b893ccccdb641cd1e05bdaf3
parentfbfc558e0775a8c3085a4aefa0b6aaf8192749aa (diff)
opencsd: ete: Add support for Arch v9.4 FEAT_ITE.
Adds in support for cores with FEAT_ITE (arch v9.4, ETE p1v3), which allows a PE to inject instumentation data directly into the ETE trace stream. This new packet is decoded and passed through to the decoder. This generates a new generic packet type OCSD_GEN_TRC_ELEM_INSTRUMENTATION containing the instrumentation payload. Signed-off-by: Mike Leach <mike.leach@linaro.org>
-rw-r--r--decoder/docs/prog_guide/prog_guide_generic_pkts.md16
-rw-r--r--decoder/include/common/trc_gen_elem.h4
-rw-r--r--decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h28
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h3
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h11
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h1
-rw-r--r--decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h9
-rw-r--r--decoder/include/opencsd/trc_gen_elem_types.h9
-rw-r--r--decoder/source/etmv4/trc_etmv4_stack_elem.cpp12
-rw-r--r--decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp40
-rw-r--r--decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp20
-rw-r--r--decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp27
-rw-r--r--decoder/source/trc_gen_elem.cpp7
13 files changed, 169 insertions, 18 deletions
diff --git a/decoder/docs/prog_guide/prog_guide_generic_pkts.md b/decoder/docs/prog_guide/prog_guide_generic_pkts.md
index 4a2f5b296c09..aad15b847977 100644
--- a/decoder/docs/prog_guide/prog_guide_generic_pkts.md
+++ b/decoder/docs/prog_guide/prog_guide_generic_pkts.md
@@ -86,6 +86,8 @@ typedef struct _ocsd_generic_trace_elem {
unsync_info_t unsync_eot_info; /* additional information for unsync / end-of-trace packets. */
trace_marker_payload_t sync_marker; /* marker element - sync later element to position in stream */
trace_memtrans_t mem_trans; /* memory transaction packet - transaction event */
+ trace_sw_ite_t sw_ite; /* PE sw instrumentation using FEAT_ITE */
+
};
const void *ptr_extended_data; /* pointer to extended data buffer (data trace, sw trace payload) / custom structure */
@@ -327,6 +329,7 @@ SW trace packets that have a payload will use the extended_data flag and pointer
SW trace packets that include timestamp information will us the `has_ts` flag and fill in the timestamp value.
+These packets are generated by memory writes to STM / ITM trace hardware.
### OCSD_GEN_TRC_ELEM_SYNC_MARKER ###
__packet fields valid__: `sync_marker`
@@ -365,6 +368,19 @@ typedef enum _memtrans_t {
} trace_memtrans_t;
~~~
+### OCSD_GEN_TRC_ELEM_INSTRUMENTATION ###
+__packet fields valid__: `sw_ite`
+
+Software instrumentation packets generated by the PE `TRCIT` instruction (on cores with `FEAT_ITE`).
+
+The `sw_ite` structure has the fields defined below:-
+
+~~~{.c}
+typedef struct _sw_ite_t {
+ uint8_t el; /* exception level for PE sw instrumentation instruction */
+ uint64_t value; /* payload for PE sw instrumentation instruction */
+} trace_sw_ite_t;
+~~~
### OCSD_GEN_TRC_ELEM_CUSTOM ###
__packet fields optional__: `extended_data -> ptr_extended_data`,_any others_
diff --git a/decoder/include/common/trc_gen_elem.h b/decoder/include/common/trc_gen_elem.h
index 25be8079a150..405abfef8341 100644
--- a/decoder/include/common/trc_gen_elem.h
+++ b/decoder/include/common/trc_gen_elem.h
@@ -75,12 +75,14 @@ public:
void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1);
void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size);
- void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
+ void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; };
void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; };
void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; };
void setExtendedDataPtr(const void *data_ptr);
+ void setITEInfo(const trace_sw_ite_t sw_instrumentation) { sw_ite = sw_instrumentation; };
+
void setSyncMarker(const trace_marker_payload_t &marker);
// stringize the element
diff --git a/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h b/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
index c5c609c5be89..21bd7af434de 100644
--- a/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
+++ b/decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h
@@ -65,7 +65,8 @@ typedef enum _p0_elem_t
P0_TRANS_TRACE_INIT,
P0_TRANS_START,
P0_TRANS_COMMIT,
- P0_TRANS_FAIL
+ P0_TRANS_FAIL,
+ P0_ITE,
} p0_elem_t;
@@ -334,6 +335,30 @@ inline TrcStackElemMarker::TrcStackElemMarker(const ocsd_etmv4_i_pkt_type root_p
{
}
+/************************************************************/
+/* Instrumentation element
+ */
+
+class TrcStackElemITE : public TrcStackElem
+{
+protected:
+ TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index);
+ virtual ~TrcStackElemITE() {};
+
+ friend class EtmV4P0Stack;
+
+public:
+ void setITE(const trace_sw_ite_t &ite) { m_ite = ite; };
+ const trace_sw_ite_t &getITE() { return m_ite; };
+
+private:
+ trace_sw_ite_t m_ite;
+};
+
+inline TrcStackElemITE::TrcStackElemITE(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index) :
+ TrcStackElem(P0_ITE, false, root_pkt, root_index)
+{
+}
/************************************************************/
/* P0 element stack that allows push of elements, and deletion of elements when done.
@@ -372,6 +397,7 @@ public:
TrcStackQElem *createQElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const int count);
TrcStackElemMarker *createMarkerElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_marker_payload_t &marker);
TrcStackElemAddr *createSrcAddrElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const etmv4_addr_val_t &addr_val);
+ TrcStackElemITE *createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite);
private:
std::deque<TrcStackElem *> m_P0_stack; //!< P0 decode element stack
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h b/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
index 65230ff836f6..7838ece04e57 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h
@@ -100,6 +100,9 @@ protected:
// process a transaction element
ocsd_err_t processTransElem(TrcStackElem *pElem);
+ // process an Instrumentation element
+ ocsd_err_t processITEElem(TrcStackElem *pElem);
+
// process a bad packet
ocsd_err_t handleBadPacket(const char *reason, ocsd_trc_index_t index = OCSD_BAD_TRC_INDEX);
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h b/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
index 22f39d91ccff..02404749718d 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h
@@ -160,6 +160,7 @@ public:
void setEvent(const uint8_t event_val);
void setQType(const bool has_count, const uint32_t count, const bool has_addr, const bool addr_match, const uint8_t type);
+ void setITE(const uint8_t el, const uint64_t value);
// packet status interface - get packet info.
const ocsd_etmv4_i_pkt_type getType() const { return type; };
@@ -200,6 +201,10 @@ public:
const int getCommitElem() const { return commit_elements; };
const int getCancelElem() const { return cancel_elements; };
+ // ITE
+ const uint8_t getITE_EL() const { return ite_pkt.el; };
+ const uint64_t getITE_value() const { return ite_pkt.value; };
+
// packet type
const bool isBadPacket() const;
@@ -539,6 +544,12 @@ inline void EtmV4ITrcPacket::pop_vaddr_idx(const uint8_t idx)
m_addr_stack.get_idx(idx, v_addr, v_addr_ISA);
}
+inline void EtmV4ITrcPacket::setITE(const uint8_t el, const uint64_t value)
+{
+ ite_pkt.el = el;
+ ite_pkt.value = value;
+}
+
/** @}*/
#endif // ARM_TRC_PKT_ELEM_ETMV4I_H_INCLUDED
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h b/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h
index 19388c38c371..58c0d78806c3 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h
@@ -179,6 +179,7 @@ private:
void iPktQ(const uint8_t lastByte);
void iAtom(const uint8_t lastByte);
void iPktInvalidCfg(const uint8_t lastByte); // packet invalid in current config.
+ void iPktITE(const uint8_t lastByte);
unsigned extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5);
unsigned extractTSField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value);
diff --git a/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h b/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
index 38963d1dd3de..2a03b088c043 100644
--- a/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
+++ b/decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h
@@ -2,7 +2,7 @@
* \file trc_pkt_types_etmv4.h
* \brief OpenCSD : ETMv4 / ETE packet info
*
- * \copyright Copyright (c) 2015,2019 ARM Limited. All Rights Reserved.
+ * \copyright Copyright (c) 2015,2019,2022 ARM Limited. All Rights Reserved.
*/
@@ -73,7 +73,7 @@ typedef enum _ocsd_etmv4_i_pkt_type
ETM4_PKT_I_EXCEPT_RTN = 0x07, /*!< b00000111 (ETE invalid) */
/* unused encoding 0x08 b00001000 */
- ETE_PKT_I_COMMIT_WIN_MV = 0x09, /*! b00001001 (ETE only - unused in current versions) */
+ ETE_PKT_I_ITE = 0x09, /*! b00001001 (ETE only) */
ETE_PKT_I_TRANS_ST = 0x0A, /*! b00001010 (ETE only) */
ETE_PKT_I_TRANS_COMMIT = 0x0B, /*! b00001011 (ETE only) */
@@ -274,6 +274,11 @@ typedef struct _ocsd_etmv4_i_pkt
};
} Q_pkt;
+ struct {
+ uint8_t el;
+ uint64_t value;
+ } ite_pkt;
+
//! valid bits for packet elements (addresses have their own valid bits).
union {
uint32_t val;
diff --git a/decoder/include/opencsd/trc_gen_elem_types.h b/decoder/include/opencsd/trc_gen_elem_types.h
index 6c1fd097fa57..99194d118438 100644
--- a/decoder/include/opencsd/trc_gen_elem_types.h
+++ b/decoder/include/opencsd/trc_gen_elem_types.h
@@ -60,9 +60,10 @@ typedef enum _ocsd_gen_trc_elem_t
OCSD_GEN_TRC_ELEM_TIMESTAMP, /*!< Timestamp - preceding elements happeded before this time. */
OCSD_GEN_TRC_ELEM_CYCLE_COUNT, /*!< Cycle count - cycles since last cycle count value - associated with a preceding instruction range. */
OCSD_GEN_TRC_ELEM_EVENT, /*!< Event - trigger or numbered event */
- OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. */
+ OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. STM / ITM hardware trace with channel protocol */
OCSD_GEN_TRC_ELEM_SYNC_MARKER, /*!< Synchronisation marker - marks position in stream of an element that is output later. */
OCSD_GEN_TRC_ELEM_MEMTRANS, /*!< Trace indication of transactional memory operations. */
+ OCSD_GEN_TRC_ELEM_INSTRUMENTATION, /*!< PE instrumentation trace - PE generated SW trace, application dependent protocol. */
OCSD_GEN_TRC_ELEM_CUSTOM, /*!< Fully custom packet type - used by none-ARM architecture decoders */
} ocsd_gen_trc_elem_t;
@@ -104,6 +105,11 @@ typedef enum _memtrans_t {
OCSD_MEM_TRANS_FAIL, /**< Transactional memory sequence failed - operations since start of transaction have been unwound. */
} trace_memtrans_t;
+typedef struct _sw_ite_t {
+ uint8_t el; /**< exception level for PE sw instrumentation instruction */
+ uint64_t value; /**< payload for PE sw instrumentation instruction */
+} trace_sw_ite_t;
+
typedef struct _ocsd_generic_trace_elem {
ocsd_gen_trc_elem_t elem_type; /**< Element type - remaining data interpreted according to this value */
ocsd_isa isa; /**< instruction set for executed instructions */
@@ -142,6 +148,7 @@ typedef struct _ocsd_generic_trace_elem {
unsync_info_t unsync_eot_info; /**< additional information for unsync / end-of-trace packets. */
trace_marker_payload_t sync_marker; /**< marker element - sync later element to position in stream */
trace_memtrans_t mem_trans; /**< memory transaction packet - transaction event */
+ trace_sw_ite_t sw_ite; /**< PE sw instrumentation using FEAT_ITE */
};
const void *ptr_extended_data; /**< pointer to extended data buffer (data trace, sw trace payload) / custom structure */
diff --git a/decoder/source/etmv4/trc_etmv4_stack_elem.cpp b/decoder/source/etmv4/trc_etmv4_stack_elem.cpp
index 71888f70873d..a5d889413eb2 100644
--- a/decoder/source/etmv4/trc_etmv4_stack_elem.cpp
+++ b/decoder/source/etmv4/trc_etmv4_stack_elem.cpp
@@ -150,6 +150,18 @@ TrcStackElemAddr *EtmV4P0Stack::createSrcAddrElem(const ocsd_etmv4_i_pkt_type ro
return pElem;
}
+TrcStackElemITE *EtmV4P0Stack::createITEElem(const ocsd_etmv4_i_pkt_type root_pkt, const ocsd_trc_index_t root_index, const trace_sw_ite_t &ite)
+{
+ TrcStackElemITE *pElem = new (std::nothrow) TrcStackElemITE(root_pkt, root_index);
+ if (pElem)
+ {
+ pElem->setITE(ite);
+ push_front(pElem);
+ }
+ return pElem;
+}
+
+
// iteration functions
void EtmV4P0Stack::from_front_init()
{
diff --git a/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
index a9b059aa182a..89c45052868c 100644
--- a/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp
@@ -564,12 +564,19 @@ ocsd_err_t TrcPktDecodeEtmV4I::decodePacket()
}
break;
- /*** presently unsupported packets ***/
- /* ETE commit window - not supported in current ETE versions - blocked by packet processor */
- case ETE_PKT_I_COMMIT_WIN_MV:
- err = OCSD_ERR_UNSUPP_DECODE_PKT;
- err = handlePacketSeqErr(err, m_index_curr_pkt, "ETE Commit Window Move, unsupported packet type.");
+ /* PE Instrumentation packet */
+ case ETE_PKT_I_ITE:
+ {
+ trace_sw_ite_t ite_pkt;
+
+ ite_pkt.el = m_curr_packet_in->getITE_EL();
+ ite_pkt.value = m_curr_packet_in->getITE_value();
+ if (m_P0_stack.createITEElem(m_curr_packet_in->getType(), m_index_curr_pkt, ite_pkt) == 0)
+ bAllocErr = true;
+ }
break;
+
+ /*** presently unsupported packets ***/
/* conditional instruction tracing */
case ETM4_PKT_I_COND_FLUSH:
case ETM4_PKT_I_COND_I_F1:
@@ -854,6 +861,10 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElements()
case P0_TRANS_TRACE_INIT:
err = processTransElem(pElem);
break;
+
+ case P0_ITE:
+ err = processITEElem(pElem);
+ break;
}
if(bPopElem)
@@ -957,6 +968,10 @@ ocsd_err_t TrcPktDecodeEtmV4I::commitElemOnEOT()
case P0_MARKER:
err = processMarkerElem(pElem);
break;
+
+ case P0_ITE:
+ err = processITEElem(pElem);
+ break;
}
m_P0_stack.delete_back();
}
@@ -1013,6 +1028,7 @@ ocsd_err_t TrcPktDecodeEtmV4I::cancelElements()
case P0_CC:
case P0_TS_CC:
case P0_MARKER:
+ case P0_ITE:
m_P0_stack.pop_front(false);
temp.push_back(pElem);
break;
@@ -1114,6 +1130,8 @@ ocsd_err_t TrcPktDecodeEtmV4I::discardElements()
pElem = m_P0_stack.back();
if (pElem->getP0Type() == P0_MARKER)
err = processMarkerElem(pElem);
+ else if (pElem->getP0Type() == P0_MARKER)
+ err = processITEElem(pElem);
else
err = processTS_CC_EventElem(pElem);
m_P0_stack.delete_back();
@@ -1206,6 +1224,18 @@ ocsd_err_t TrcPktDecodeEtmV4I::processTransElem(TrcStackElem *pElem)
return err;
}
+ocsd_err_t TrcPktDecodeEtmV4I::processITEElem(TrcStackElem *pElem)
+{
+ ocsd_err_t err = OCSD_OK;
+ TrcStackElemITE *pITEElem = dynamic_cast<TrcStackElemITE *>(pElem);
+
+ err = m_out_elem.addElemType(pElem->getRootIndex(), OCSD_GEN_TRC_ELEM_INSTRUMENTATION);
+ if (!err) {
+ outElem().setITEInfo(pITEElem->getITE());
+ }
+ return err;
+}
+
ocsd_err_t TrcPktDecodeEtmV4I::addElemCC(TrcStackElemParam *pParamElem)
{
ocsd_err_t err = OCSD_OK;
diff --git a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
index b4175409b343..825b5f79e41b 100644
--- a/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp
@@ -275,6 +275,14 @@ void EtmV4ITrcPacket::toString(std::string &str) const
}
}
break;
+
+ case ETE_PKT_I_ITE:
+ {
+ std::ostringstream oss;
+ oss << "; EL" << std::dec << (int)ite_pkt.el << "; Payload=0x" << std::hex << ite_pkt.value;
+ str += oss.str();
+ }
+ break;
}
}
@@ -360,12 +368,7 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
pName = "I_EXCEPT_RTN";
pDesc = "Exception Return.";
break;
-
- case ETE_PKT_I_COMMIT_WIN_MV:
- pName = "I_COMMIT_WIN_MV";
- pDesc = "Commit window move.";
- break;
-
+
case ETE_PKT_I_TRANS_ST:
pName = "I_TRANS_ST";
pDesc = "Transaction Start.";
@@ -642,6 +645,11 @@ const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, co
pDesc = "Transaction Fail.";
break;
+ case ETE_PKT_I_ITE:
+ pName = "I_ITE";
+ pDesc = "Instrumentation";
+ break;
+
default:
break;
}
diff --git a/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp b/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
index d0573d6c29bf..d767bdc85643 100644
--- a/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
+++ b/decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp
@@ -1250,6 +1250,23 @@ void TrcPktProcEtmV4I::iAtom(const uint8_t lastByte)
m_process_state = SEND_PKT;
}
+void TrcPktProcEtmV4I::iPktITE(const uint8_t /* lastByte */)
+{
+ uint64_t value;
+ int shift = 0;
+
+ /* packet is always 10 bytes, Header, EL info byte, 8 bytes payload */
+ if (m_currPacketData.size() == 10) {
+ value = 0;
+ for (int i = 2; i < 10; i++) {
+ value |= ((uint64_t)m_currPacketData[i]) << shift;
+ shift += 8;
+ }
+ m_curr_packet.setITE(m_currPacketData[1], value);
+ m_process_state = SEND_PKT;
+ }
+}
+
// header byte processing is table driven.
void TrcPktProcEtmV4I::BuildIPacketTable()
{
@@ -1306,7 +1323,8 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
else
m_i_table[0x07].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
- // b00001010, b00001011 ETE TRANS packets
+ // b00001010, b00001011 ETE TRANS packets
+ // b00001001 - ETE sw instrumentation packet
if (m_config.MajVersion() >= 0x5)
{
m_i_table[0x0A].pkt_type = ETE_PKT_I_TRANS_ST;
@@ -1314,6 +1332,13 @@ void TrcPktProcEtmV4I::BuildIPacketTable()
m_i_table[0x0B].pkt_type = ETE_PKT_I_TRANS_COMMIT;
m_i_table[0x0B].pptkFn = &TrcPktProcEtmV4I::iPktNoPayload;
+
+ // FEAT_ITE - sw instrumentation packet
+ if (m_config.MinVersion() >= 0x3)
+ {
+ m_i_table[0x09].pkt_type = ETE_PKT_I_ITE;
+ m_i_table[0x09].pptkFn = &TrcPktProcEtmV4I::iPktITE;
+ }
}
// b0000 110x - cycle count f2
diff --git a/decoder/source/trc_gen_elem.cpp b/decoder/source/trc_gen_elem.cpp
index b2e677249002..c94c5a7c6848 100644
--- a/decoder/source/trc_gen_elem.cpp
+++ b/decoder/source/trc_gen_elem.cpp
@@ -54,9 +54,10 @@ static const char *s_elem_descs[][2] =
{"OCSD_GEN_TRC_ELEM_TIMESTAMP","Timestamp - preceding elements happeded before this time."},
{"OCSD_GEN_TRC_ELEM_CYCLE_COUNT","Cycle count - cycles since last cycle count value - associated with a preceding instruction range."},
{"OCSD_GEN_TRC_ELEM_EVENT","Event - numbered event or trigger"},
- {"OCSD_GEN_TRC_ELEM_SWTRACE","Software trace packet - may contain data payload."},
+ {"OCSD_GEN_TRC_ELEM_SWTRACE","Software trace packet - may contain data payload. STM / ITM hardware trace with channel protocol."},
{"OCSD_GEN_TRC_ELEM_SYNC_MARKER","Synchronisation marker - marks position in stream of an element that is output later."},
{"OCSD_GEN_TRC_ELEM_MEMTRANS","Trace indication of transactional memory operations."},
+ {"OCSD_GEN_TRC_ELEM_INSTRUMENTATION", "PE instrumentation trace - PE generated SW trace, application dependent protocol."},
{"OCSD_GEN_TRC_ELEM_CUSTOM","Fully custom packet type."}
};
@@ -219,6 +220,10 @@ void OcsdTraceElement::toString(std::string &str) const
oss << s_transaction_type[mem_trans];
break;
+ case OCSD_GEN_TRC_ELEM_INSTRUMENTATION:
+ oss << "EL" << std::dec << (int)sw_ite.el << "; 0x" << std::setfill('0') << std::setw(16) << std::hex << sw_ite.value;
+ break;
+
default: break;
}
if(has_cc)