1 /*! 2 * \file opencsd/trc_gen_elem_types.h 3 * \brief OpenCSD : Decoder Output Generic Element types. 4 * 5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 6 */ 7 8 /* 9 * Redistribution and use in source and binary forms, with or without modification, 10 * are permitted provided that the following conditions are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 15 * 2. Redistributions in binary form must reproduce the above copyright notice, 16 * this list of conditions and the following disclaimer in the documentation 17 * and/or other materials provided with the distribution. 18 * 19 * 3. Neither the name of the copyright holder nor the names of its contributors 20 * may be used to endorse or promote products derived from this software without 21 * specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 26 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, 27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #ifndef ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED 36 #define ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED 37 38 /** @defgroup gen_trc_elem OpenCSD Library : Generic Trace Elements 39 * @brief Generic trace elements output by the PE trace decode and SW stim decode stages. 40 * 41 * 42 @{*/ 43 44 #include "opencsd/ocsd_if_types.h" 45 46 /** Enum for generic element types */ 47 typedef enum _ocsd_gen_trc_elem_t 48 { 49 OCSD_GEN_TRC_ELEM_UNKNOWN = 0, /*!< Unknown trace element - default value or indicate error in stream to client */ 50 OCSD_GEN_TRC_ELEM_NO_SYNC, /*!< Waiting for sync - either at start of decode, or after overflow / bad packet */ 51 OCSD_GEN_TRC_ELEM_TRACE_ON, /*!< Start of trace - beginning of elements or restart after discontinuity (overflow, trace filtering). */ 52 OCSD_GEN_TRC_ELEM_EO_TRACE, /*!< end of the available trace in the buffer. */ 53 OCSD_GEN_TRC_ELEM_PE_CONTEXT, /*!< PE status update / change (arch, ctxtid, vmid etc). */ 54 OCSD_GEN_TRC_ELEM_INSTR_RANGE, /*!< traced N consecutive instructions from addr (no intervening events or data elements), may have data assoc key */ 55 OCSD_GEN_TRC_ELEM_I_RANGE_NOPATH, /*!< traced N instructions in a range, but incomplete information as to program execution path from start to end of range */ 56 OCSD_GEN_TRC_ELEM_ADDR_NACC, /*!< tracing in inaccessible memory area */ 57 OCSD_GEN_TRC_ELEM_ADDR_UNKNOWN, /*!< address currently unknown - need address packet update */ 58 OCSD_GEN_TRC_ELEM_EXCEPTION, /*!< exception - start address may be exception target, end address may be preferred ret addr. */ 59 OCSD_GEN_TRC_ELEM_EXCEPTION_RET, /*!< expection return */ 60 OCSD_GEN_TRC_ELEM_TIMESTAMP, /*!< Timestamp - preceding elements happeded before this time. */ 61 OCSD_GEN_TRC_ELEM_CYCLE_COUNT, /*!< Cycle count - cycles since last cycle count value - associated with a preceding instruction range. */ 62 OCSD_GEN_TRC_ELEM_EVENT, /*!< Event - trigger or numbered event */ 63 OCSD_GEN_TRC_ELEM_SWTRACE, /*!< Software trace packet - may contain data payload. STM / ITM hardware trace with channel protocol */ 64 OCSD_GEN_TRC_ELEM_SYNC_MARKER, /*!< Synchronisation marker - marks position in stream of an element that is output later. */ 65 OCSD_GEN_TRC_ELEM_MEMTRANS, /*!< Trace indication of transactional memory operations. */ 66 OCSD_GEN_TRC_ELEM_INSTRUMENTATION, /*!< PE instrumentation trace - PE generated SW trace, application dependent protocol. */ 67 OCSD_GEN_TRC_ELEM_CUSTOM, /*!< Fully custom packet type - used by none-ARM architecture decoders */ 68 } ocsd_gen_trc_elem_t; 69 70 71 typedef enum _trace_on_reason_t { 72 TRACE_ON_NORMAL = 0, /**< Trace on at start of trace or filtering discontinuity */ 73 TRACE_ON_OVERFLOW, /**< Trace on due to prior trace overflow discontinuity */ 74 TRACE_ON_EX_DEBUG, /**< Trace restarted due to debug exit */ 75 } trace_on_reason_t; 76 77 typedef struct _trace_event_t { 78 uint16_t ev_type; /**< event type - unknown (0) trigger (1), numbered event (2)*/ 79 uint16_t ev_number; /**< event number if numbered event type */ 80 } trace_event_t; 81 82 typedef enum _unsync_info_t { 83 UNSYNC_UNKNOWN, /**< unknown /undefined */ 84 UNSYNC_INIT_DECODER, /**< decoder intialisation - start of trace. */ 85 UNSYNC_RESET_DECODER, /**< decoder reset. */ 86 UNSYNC_OVERFLOW, /**< overflow packet - need to re-sync / end of trace after overflow. */ 87 UNSYNC_DISCARD, /**< specl trace discard - need to re-sync. */ 88 UNSYNC_BAD_PACKET, /**< bad packet at input - resync to restart. */ 89 UNSYNC_EOT, /**< end of trace - no additional info */ 90 } unsync_info_t; 91 92 typedef enum _trace_sync_marker_t { 93 ELEM_MARKER_TS, /**< Marker for timestamp element */ 94 } trace_sync_marker_t; 95 96 typedef struct _trace_marker_payload_t { 97 trace_sync_marker_t type; /**< type of sync marker */ 98 uint32_t value; /**< sync marker value - usage depends on type */ 99 } trace_marker_payload_t; 100 101 typedef enum _memtrans_t { 102 OCSD_MEM_TRANS_TRACE_INIT,/**< Trace started while PE in transactional state */ 103 OCSD_MEM_TRANS_START, /**< Trace after this packet is part of a transactional memory sequence */ 104 OCSD_MEM_TRANS_COMMIT, /**< Transactional memory sequence valid. */ 105 OCSD_MEM_TRANS_FAIL, /**< Transactional memory sequence failed - operations since start of transaction have been unwound. */ 106 } trace_memtrans_t; 107 108 typedef struct _sw_ite_t { 109 uint8_t el; /**< exception level for PE sw instrumentation instruction */ 110 uint64_t value; /**< payload for PE sw instrumentation instruction */ 111 } trace_sw_ite_t; 112 113 typedef struct _ocsd_generic_trace_elem { 114 ocsd_gen_trc_elem_t elem_type; /**< Element type - remaining data interpreted according to this value */ 115 ocsd_isa isa; /**< instruction set for executed instructions */ 116 ocsd_vaddr_t st_addr; /**< start address for instruction execution range / inaccessible code address / data address */ 117 ocsd_vaddr_t en_addr; /**< end address (exclusive) for instruction execution range. */ 118 ocsd_pe_context context; /**< PE Context */ 119 uint64_t timestamp; /**< timestamp value for TS element type */ 120 uint32_t cycle_count; /**< cycle count for explicit cycle count element, or count for element with associated cycle count */ 121 ocsd_instr_type last_i_type; /**< Last instruction type if instruction execution range */ 122 ocsd_instr_subtype last_i_subtype; /**< sub type for last instruction in range */ 123 124 //! per element flags 125 union { 126 struct { 127 uint32_t last_instr_exec:1; /**< 1 if last instruction in range was executed; */ 128 uint32_t last_instr_sz:3; /**< size of last instruction in bytes (2/4) */ 129 uint32_t has_cc:1; /**< 1 if this packet has a valid cycle count included (e.g. cycle count included as part of instruction range packet, always 1 for pure cycle count packet.*/ 130 uint32_t cpu_freq_change:1; /**< 1 if this packet indicates a change in CPU frequency */ 131 uint32_t excep_ret_addr:1; /**< 1 if en_addr is the preferred exception return address on exception packet type */ 132 uint32_t excep_data_marker:1; /**< 1 if the exception entry packet is a data push marker only, with no address information (used typically in v7M trace for marking data pushed onto stack) */ 133 uint32_t extended_data:1; /**< 1 if the packet extended data pointer is valid. Allows packet extensions for custom decoders, or additional data payloads for data trace. */ 134 uint32_t has_ts:1; /**< 1 if the packet has an associated timestamp - e.g. SW/STM trace TS+Payload as a single packet */ 135 uint32_t last_instr_cond:1; /**< 1 if the last instruction was conditional */ 136 uint32_t excep_ret_addr_br_tgt:1; /**< 1 if exception return address (en_addr) is also the target of a taken branch addr from the previous range. */ 137 }; 138 uint32_t flag_bits; 139 }; 140 141 //! packet specific payloads 142 union { 143 uint32_t exception_number; /**< exception number for exception type packets */ 144 trace_event_t trace_event; /**< Trace event - trigger etc */ 145 trace_on_reason_t trace_on_reason; /**< reason for the trace on packet */ 146 ocsd_swt_info_t sw_trace_info; /**< software trace packet info */ 147 uint32_t num_instr_range; /**< number of instructions covered by range packet (for T32 this cannot be calculated from en-st/i_size) */ 148 unsync_info_t unsync_eot_info; /**< additional information for unsync / end-of-trace packets. */ 149 trace_marker_payload_t sync_marker; /**< marker element - sync later element to position in stream */ 150 trace_memtrans_t mem_trans; /**< memory transaction packet - transaction event */ 151 trace_sw_ite_t sw_ite; /**< PE sw instrumentation using FEAT_ITE */ 152 }; 153 154 const void *ptr_extended_data; /**< pointer to extended data buffer (data trace, sw trace payload) / custom structure */ 155 156 } ocsd_generic_trace_elem; 157 158 159 typedef enum _event_t { 160 EVENT_UNKNOWN = 0, 161 EVENT_TRIGGER, 162 EVENT_NUMBERED 163 } event_t; 164 165 166 /** @}*/ 167 #endif // ARM_TRC_GEN_ELEM_TYPES_H_INCLUDED 168 169 /* End of File opencsd/trc_gen_elem_types.h */ 170