From f1afa1152da9bbcb201181f4ef53e4eba06c8215 Mon Sep 17 00:00:00 2001 From: Mike Leach Date: Thu, 19 Jan 2023 16:24:54 +0000 Subject: build: win32: debug: Enable ASAN for debug build ocsdlib has ASAN enabled for this build - follow suit with test progs to allow use of ASAN checks in debug. Signed-off-by: Mike Leach --- .../build/win-vs2022/c_api_pkt_print_test/c_api_pkt_print_test.vcxproj | 1 + decoder/tests/build/win-vs2022/trc_pkt_lister/trc_pkt_lister.vcxproj | 1 + 2 files changed, 2 insertions(+) diff --git a/decoder/tests/build/win-vs2022/c_api_pkt_print_test/c_api_pkt_print_test.vcxproj b/decoder/tests/build/win-vs2022/c_api_pkt_print_test/c_api_pkt_print_test.vcxproj index 05ff8b6..985a84e 100644 --- a/decoder/tests/build/win-vs2022/c_api_pkt_print_test/c_api_pkt_print_test.vcxproj +++ b/decoder/tests/build/win-vs2022/c_api_pkt_print_test/c_api_pkt_print_test.vcxproj @@ -55,6 +55,7 @@ true MultiByte v143 + true Application diff --git a/decoder/tests/build/win-vs2022/trc_pkt_lister/trc_pkt_lister.vcxproj b/decoder/tests/build/win-vs2022/trc_pkt_lister/trc_pkt_lister.vcxproj index a6f43d2..e1daff7 100644 --- a/decoder/tests/build/win-vs2022/trc_pkt_lister/trc_pkt_lister.vcxproj +++ b/decoder/tests/build/win-vs2022/trc_pkt_lister/trc_pkt_lister.vcxproj @@ -46,6 +46,7 @@ true MultiByte v143 + false Application -- cgit v1.2.3 From fbfc558e0775a8c3085a4aefa0b6aaf8192749aa Mon Sep 17 00:00:00 2001 From: Mike Leach Date: Thu, 19 Jan 2023 16:36:55 +0000 Subject: opencsd: etm4: Fix memory leak in mispredict handling. (github #52) Mispredict handler was removing unneeded addresses between the mispredict packet and the atom packet, without deleting the item afterwards. Erase now also deletes the unwanted item. Fixes issue #52 from github Signed-off-by: Mike Leach --- decoder/source/etmv4/trc_etmv4_stack_elem.cpp | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/decoder/source/etmv4/trc_etmv4_stack_elem.cpp b/decoder/source/etmv4/trc_etmv4_stack_elem.cpp index 1207444..71888f7 100644 --- a/decoder/source/etmv4/trc_etmv4_stack_elem.cpp +++ b/decoder/source/etmv4/trc_etmv4_stack_elem.cpp @@ -172,6 +172,10 @@ void EtmV4P0Stack::erase_curr_from_front() erase_iter = m_iter; erase_iter--; m_P0_stack.erase(erase_iter); + + // explicitly delete the item here as the caller can no longer reference it. + // fixes memory leak from github issue #52 + delete *erase_iter; } -- cgit v1.2.3 From c86f7187fe2ac96f90b45c1c80ae48599ce3217c Mon Sep 17 00:00:00 2001 From: Mike Leach Date: Tue, 12 Jul 2022 15:44:00 +0100 Subject: 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 --- decoder/docs/prog_guide/prog_guide_generic_pkts.md | 16 +++++++++ decoder/include/common/trc_gen_elem.h | 4 ++- .../include/opencsd/etmv4/trc_etmv4_stack_elem.h | 28 ++++++++++++++- .../include/opencsd/etmv4/trc_pkt_decode_etmv4i.h | 3 ++ .../include/opencsd/etmv4/trc_pkt_elem_etmv4i.h | 11 ++++++ .../include/opencsd/etmv4/trc_pkt_proc_etmv4i.h | 1 + .../include/opencsd/etmv4/trc_pkt_types_etmv4.h | 9 +++-- decoder/include/opencsd/trc_gen_elem_types.h | 9 ++++- decoder/source/etmv4/trc_etmv4_stack_elem.cpp | 12 +++++++ decoder/source/etmv4/trc_pkt_decode_etmv4i.cpp | 40 +++++++++++++++++++--- decoder/source/etmv4/trc_pkt_elem_etmv4i.cpp | 20 +++++++---- decoder/source/etmv4/trc_pkt_proc_etmv4i.cpp | 27 ++++++++++++++- 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 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 &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5); unsigned extractTSField64(const std::vector &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(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) -- cgit v1.2.3 From 3625951cb2992827b4b57ce54dc9b97ce1cf9ede Mon Sep 17 00:00:00 2001 From: Mike Leach Date: Tue, 12 Jul 2022 16:08:29 +0100 Subject: tests: ete: Add ETE test for FEAT_ITE support Signed-off-by: Mike Leach --- decoder/tests/run_pkt_decode_tests-ete.bash | 1 + .../tests/snapshots-ete/ete-ite-instr/ETE_0_s1.ini | 15 ++++++++++ .../tests/snapshots-ete/ete-ite-instr/ETE_0_s2.ini | 15 ++++++++++ .../ete-ite-instr/bindir_64/OTHERS_exec | Bin 0 -> 114536 bytes .../ete-ite-instr/bindir_64/TEST_NON_DET_CODE_exec | Bin 0 -> 332 bytes .../ete-ite-instr/bindir_64/VAL_NON_DET_CODE_exec | Bin 0 -> 133140 bytes .../ete-ite-instr/bindir_64/VAL_TEST_CODE_exec | Bin 0 -> 183136 bytes .../tests/snapshots-ete/ete-ite-instr/cpu_0.ini | 32 +++++++++++++++++++++ .../tests/snapshots-ete/ete-ite-instr/session1.bin | Bin 0 -> 67 bytes .../tests/snapshots-ete/ete-ite-instr/session2.bin | Bin 0 -> 53 bytes .../tests/snapshots-ete/ete-ite-instr/snapshot.ini | 12 ++++++++ .../tests/snapshots-ete/ete-ite-instr/trace.ini | 22 ++++++++++++++ 12 files changed, 97 insertions(+) create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s1.ini create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s2.ini create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/OTHERS_exec create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/TEST_NON_DET_CODE_exec create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_NON_DET_CODE_exec create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_TEST_CODE_exec create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/cpu_0.ini create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/session1.bin create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/session2.bin create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/snapshot.ini create mode 100644 decoder/tests/snapshots-ete/ete-ite-instr/trace.ini diff --git a/decoder/tests/run_pkt_decode_tests-ete.bash b/decoder/tests/run_pkt_decode_tests-ete.bash index 1bf60a5..a9fe0cc 100755 --- a/decoder/tests/run_pkt_decode_tests-ete.bash +++ b/decoder/tests/run_pkt_decode_tests-ete.bash @@ -55,6 +55,7 @@ declare -a test_dirs_decode=( "001-ack_test" "002-ack_test_scr" "ete-bc-instr" "ete_ip" + "ete-ite-instr" "ete_mem" "ete_spec_1" "ete_spec_2" diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s1.ini b/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s1.ini new file mode 100644 index 0000000..23947f3 --- /dev/null +++ b/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s1.ini @@ -0,0 +1,15 @@ +[device] +name=ETE_0_s1 +class=trace_source +type=ETE + + +[regs] +TRCCONFIGR=0x8001 +TRCTRACEIDR=0x1 +TRCDEVARCH=0x47735a13 +TRCIDR0=0x28c1cea1 +TRCIDR1=0x4100fff0 +TRCIDR2=0xd0001088 +TRCIDR8=0x0 + diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s2.ini b/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s2.ini new file mode 100644 index 0000000..063b076 --- /dev/null +++ b/decoder/tests/snapshots-ete/ete-ite-instr/ETE_0_s2.ini @@ -0,0 +1,15 @@ +[device] +name=ETE_0_s2 +class=trace_source +type=ETE + + +[regs] +TRCCONFIGR=0x8001 +TRCTRACEIDR=0x1 +TRCDEVARCH=0x47735a13 +TRCIDR0=0x28c1cea1 +TRCIDR1=0x4100fff0 +TRCIDR2=0xd0001088 +TRCIDR8=0x0 + diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/OTHERS_exec b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/OTHERS_exec new file mode 100644 index 0000000..502b47e Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/OTHERS_exec differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/TEST_NON_DET_CODE_exec b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/TEST_NON_DET_CODE_exec new file mode 100644 index 0000000..047e0a9 Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/TEST_NON_DET_CODE_exec differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_NON_DET_CODE_exec b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_NON_DET_CODE_exec new file mode 100644 index 0000000..c31090b Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_NON_DET_CODE_exec differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_TEST_CODE_exec b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_TEST_CODE_exec new file mode 100644 index 0000000..d5741ab Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/bindir_64/VAL_TEST_CODE_exec differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/cpu_0.ini b/decoder/tests/snapshots-ete/ete-ite-instr/cpu_0.ini new file mode 100644 index 0000000..8283585 --- /dev/null +++ b/decoder/tests/snapshots-ete/ete-ite-instr/cpu_0.ini @@ -0,0 +1,32 @@ +[device] +name=cpu_0 +class=core +type=ARM-AA64 + +[regs] +PC(size:64)=0x0 +SP(size:64)=0 +SCTLR_EL1=0x0 +CPSR=0x0 + + +[dump1] +file=bindir_64/OTHERS_exec +address=0x00060000 +length=0x1bf68 + +[dump2] +file=bindir_64/VAL_TEST_CODE_exec +address=0x01000000 +length=0x2cb60 + +[dump3] +file=bindir_64/VAL_NON_DET_CODE_exec +address=0x00010000 +length=0x20814 + +[dump4] +file=bindir_64/TEST_NON_DET_CODE_exec +address=0x00050000 +length=0x14c + diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/session1.bin b/decoder/tests/snapshots-ete/ete-ite-instr/session1.bin new file mode 100644 index 0000000..489ae58 Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/session1.bin differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/session2.bin b/decoder/tests/snapshots-ete/ete-ite-instr/session2.bin new file mode 100644 index 0000000..e5c164e Binary files /dev/null and b/decoder/tests/snapshots-ete/ete-ite-instr/session2.bin differ diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/snapshot.ini b/decoder/tests/snapshots-ete/ete-ite-instr/snapshot.ini new file mode 100644 index 0000000..299b376 --- /dev/null +++ b/decoder/tests/snapshots-ete/ete-ite-instr/snapshot.ini @@ -0,0 +1,12 @@ +[snapshot] +version=1.0 +description=checker_metadata.ini + +[device_list] +device0=cpu_0.ini +device1=ETE_0_s1.ini +device2=ETE_0_s2.ini + +[trace] +metadata=trace.ini + diff --git a/decoder/tests/snapshots-ete/ete-ite-instr/trace.ini b/decoder/tests/snapshots-ete/ete-ite-instr/trace.ini new file mode 100644 index 0000000..1880b66 --- /dev/null +++ b/decoder/tests/snapshots-ete/ete-ite-instr/trace.ini @@ -0,0 +1,22 @@ +[trace_buffers] +buffers=buffer2 + +[buffer1] +name=ETB_1 +file=session1.bin +format=source_data + +[buffer2] +name=ETB_2 +file=session2.bin +format=source_data + + +[source_buffers] +ETE_0_s1=ETB_1 +ETE_0_s2=ETB_2 + +[core_trace_sources] +cpu_0=ETE_0_s1 +cpu_0=ETE_0_s2 + -- cgit v1.2.3 From 78ce8ef47c55a489b0ca575b981cd4856d03f44b Mon Sep 17 00:00:00 2001 From: Mike Leach Date: Thu, 19 Jan 2023 17:03:16 +0000 Subject: opencsd: Update version info and README for 1.4.0 Signed-off-by: Mike Leach --- README.md | 9 +++++++-- decoder/docs/doxygen_config.dox | 2 +- decoder/include/opencsd/ocsd_if_version.h | 6 +++--- 3 files changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 85fa4d4..450c8e3 100644 --- a/README.md +++ b/README.md @@ -27,11 +27,11 @@ Releases will appear on the master branch in the git repository with an appropri CoreSight Trace Component Support. ---------------------------------- -_Current Version 1.3.3_ +_Current Version 1.4.0_ ### Current support: -- ETE (v1.2) instruction trace - packet processing and packet decode. +- ETE (v1.3) instruction trace - packet processing and packet decode. - ETMv4 (v4.6 [A/R profile] v4.4 [M profile]) instruction trace - packet processing and packet decode. - PTM (v1.1) instruction trace - packet processing and packet decode. - ETMv3 (v3.5) instruction trace - packet processing and packet decode. @@ -286,6 +286,11 @@ Version and Modification Information and allowing fun with mis-aligned input data. - __Bugfix__: Fix silent failure if incorrect config flags set when setting up frame demux modes. +- _Version 1.4.0_: + - __Update__: ETE: Add support for Arch v9.4 FEAT_ITE. ETE v1p3, sw trace instrumentation. + Adds in new generic output packet type: OCSD_GEN_TRC_ELEM_INSTRUMENTATION. + - __Bugfix__: Fix memory leak in mispredict handling (github issue #52 from yabinc) + Licence Information =================== diff --git a/decoder/docs/doxygen_config.dox b/decoder/docs/doxygen_config.dox index d8e80cd..7590e47 100644 --- a/decoder/docs/doxygen_config.dox +++ b/decoder/docs/doxygen_config.dox @@ -38,7 +38,7 @@ PROJECT_NAME = "OpenCSD - CoreSight Trace Decode Library" # could be handy for archiving the generated documentation or if some version # control system is used. -PROJECT_NUMBER = 1.3.3 +PROJECT_NUMBER = 1.4.0 # Using the PROJECT_BRIEF tag one can provide an optional one line description # for a project that appears at the top of each page and should give viewer a diff --git a/decoder/include/opencsd/ocsd_if_version.h b/decoder/include/opencsd/ocsd_if_version.h index 355204c..41033f0 100644 --- a/decoder/include/opencsd/ocsd_if_version.h +++ b/decoder/include/opencsd/ocsd_if_version.h @@ -43,8 +43,8 @@ /** @name Library Versioning @{*/ #define OCSD_VER_MAJOR 0x1 /**< Library Major Version */ -#define OCSD_VER_MINOR 0x3 /**< Library Minor Version */ -#define OCSD_VER_PATCH 0x3 /**< Library Patch Version */ +#define OCSD_VER_MINOR 0x4 /**< Library Minor Version */ +#define OCSD_VER_PATCH 0x0 /**< Library Patch Version */ /** Library version number - MMMMnnpp format. MMMM = major version, @@ -53,7 +53,7 @@ */ #define OCSD_VER_NUM ((OCSD_VER_MAJOR << 16) | (OCSD_VER_MINOR << 8) | OCSD_VER_PATCH) -#define OCSD_VER_STRING "1.3.3" /**< Library Version string */ +#define OCSD_VER_STRING "1.4.0" /**< Library Version string */ #define OCSD_LIB_NAME "OpenCSD Library" /**< Library name string */ #define OCSD_LIB_SHORT_NAME "OCSD" /**< Library Short name string */ /** @}*/ -- cgit v1.2.3