diff options
author | Mike Leach <mike.leach@linaro.org> | 2022-07-12 15:44:00 +0100 |
---|---|---|
committer | Mike Leach <mike.leach@linaro.org> | 2023-01-19 16:50:45 +0000 |
commit | c86f7187fe2ac96f90b45c1c80ae48599ce3217c (patch) | |
tree | 92240e517e9be6e4b893ccccdb641cd1e05bdaf3 | |
parent | fbfc558e0775a8c3085a4aefa0b6aaf8192749aa (diff) | |
download | OpenCSD-c86f7187fe2ac96f90b45c1c80ae48599ce3217c.tar.gz |
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.md | 16 | ||||
-rw-r--r-- | decoder/include/common/trc_gen_elem.h | 4 | ||||
-rw-r--r-- | decoder/include/opencsd/etmv4/trc_etmv4_stack_elem.h | 28 | ||||
-rw-r--r-- | decoder/include/opencsd/etmv4/trc_pkt_decode_etmv4i.h | 3 | ||||
-rw-r--r-- | decoder/include/opencsd/etmv4/trc_pkt_elem_etmv4i.h | 11 | ||||
-rw-r--r-- | decoder/include/opencsd/etmv4/trc_pkt_proc_etmv4i.h | 1 | ||||
-rw-r--r-- | decoder/include/opencsd/etmv4/trc_pkt_types_etmv4.h | 9 | ||||
-rw-r--r-- | decoder/include/opencsd/trc_gen_elem_types.h | 9 | ||||
-rw-r--r-- | decoder/source/etmv4/trc_etmv4_stack_elem.cpp | 12 | ||||
-rw-r--r-- | decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp | 40 | ||||
-rw-r--r-- | decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp | 20 | ||||
-rw-r--r-- | decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp | 27 | ||||
-rw-r--r-- | decoder/source/trc_gen_elem.cpp | 7 |
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 4a2f5b2..aad15b8 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 25be807..405abfe 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 c5c609c..21bd7af 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 65230ff..7838ece 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 22f39d9..0240474 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 19388c3..58c0d78 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 38963d1..2a03b08 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 6c1fd09..99194d1 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 71888f7..a5d8894 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 a9b059a..89c4505 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 b417540..825b5f7 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 d0573d6..d767bdc 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 b2e6772..c94c5a7 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) |