xref: /freebsd/contrib/opencsd/decoder/include/opencsd/trc_gen_elem_types.h (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
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