1 /*! 2 * \file trc_gen_elem.h 3 * \brief OpenCSD : Decoder Generic trace element output class. 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 #ifndef ARM_TRC_GEN_ELEM_H_INCLUDED 35 #define ARM_TRC_GEN_ELEM_H_INCLUDED 36 37 #include "opencsd/trc_gen_elem_types.h" 38 #include "trc_printable_elem.h" 39 #include "ocsd_pe_context.h" 40 41 /** @addtogroup gen_trc_elem 42 @{*/ 43 44 /*! 45 * @class OcsdTraceElement 46 * @brief Generic trace element class 47 * 48 */ 49 class OcsdTraceElement : public trcPrintableElem, public ocsd_generic_trace_elem 50 { 51 public: 52 OcsdTraceElement(); 53 OcsdTraceElement(ocsd_gen_trc_elem_t type); 54 virtual ~OcsdTraceElement() {}; 55 56 void init(); 57 58 // set elements API 59 60 void setType(const ocsd_gen_trc_elem_t type); //!< set type and init flags 61 void updateType(const ocsd_gen_trc_elem_t type); //!< change type only - no init 62 63 void setContext(const ocsd_pe_context &new_context) { context = new_context; }; 64 void setISA(const ocsd_isa isa_update); 65 66 void setCycleCount(const uint32_t cycleCount); 67 void setEvent(const event_t ev_type, const uint16_t number); 68 void setTS(const uint64_t ts, const bool freqChange = false); 69 70 void setExcepMarker() { excep_data_marker = 1; }; 71 void setExceptionNum(uint32_t excepNum) { exception_number = excepNum; }; 72 73 74 void setTraceOnReason(const trace_on_reason_t reason); 75 void setUnSyncEOTReason(const unsync_info_t reason); 76 77 void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1); 78 void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size); 79 void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; }; 80 void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; }; 81 82 void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; }; 83 void setExtendedDataPtr(const void *data_ptr); 84 85 // stringize the element 86 87 virtual void toString(std::string &str) const; 88 89 // get elements API 90 91 OcsdTraceElement &operator =(const ocsd_generic_trace_elem* p_elem); 92 93 const ocsd_gen_trc_elem_t getType() const { return elem_type; }; 94 95 // return current context 96 const ocsd_pe_context &getContext() const { return context; }; 97 98 void copyPersistentData(const OcsdTraceElement &src); 99 100 private: 101 void printSWInfoPkt(std::ostringstream &oss) const; 102 void clearPerPktData(); //!< clear flags that indicate validity / have values on a per packet basis 103 104 }; 105 106 inline OcsdTraceElement::OcsdTraceElement(ocsd_gen_trc_elem_t type) 107 { 108 elem_type = type; 109 } 110 111 inline OcsdTraceElement::OcsdTraceElement() 112 { 113 elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN; 114 } 115 116 inline void OcsdTraceElement::setCycleCount(const uint32_t cycleCount) 117 { 118 cycle_count = cycleCount; 119 has_cc = 1; 120 } 121 122 inline void OcsdTraceElement::setEvent(const event_t ev_type, const uint16_t number) 123 { 124 trace_event.ev_type = (uint16_t)ev_type; 125 trace_event.ev_number = ev_type == EVENT_NUMBERED ? number : 0; 126 } 127 128 inline void OcsdTraceElement::setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr /* = 1 */) 129 { 130 this->st_addr = st_addr; 131 this->en_addr = en_addr; 132 this->num_instr_range = num_instr; 133 } 134 135 inline void OcsdTraceElement::setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size) 136 { 137 last_instr_exec = exec ? 1 : 0; 138 last_instr_sz = size & 0x7; 139 this->last_i_type = last_i_type; 140 this->last_i_subtype = last_i_subtype; 141 } 142 143 inline void OcsdTraceElement::setType(const ocsd_gen_trc_elem_t type) 144 { 145 // set the type and clear down the per element flags 146 elem_type = type; 147 148 clearPerPktData(); 149 } 150 151 inline void OcsdTraceElement::updateType(const ocsd_gen_trc_elem_t type) 152 { 153 elem_type = type; 154 } 155 156 inline void OcsdTraceElement::init() 157 { 158 st_addr = en_addr = (ocsd_vaddr_t)-1; 159 isa = ocsd_isa_unknown; 160 161 cycle_count = 0; 162 timestamp = 0; 163 164 context.ctxt_id_valid = 0; 165 context.vmid_valid = 0; 166 context.el_valid = 0; 167 168 last_i_type = OCSD_INSTR_OTHER; 169 last_i_subtype = OCSD_S_INSTR_NONE; 170 171 clearPerPktData(); 172 } 173 174 inline void OcsdTraceElement::clearPerPktData() 175 { 176 flag_bits = 0; // bit-field with various flags. 177 exception_number = 0; // union with trace_on_reason / trace_event 178 ptr_extended_data = 0; // extended data pointer 179 } 180 181 inline void OcsdTraceElement::setTraceOnReason(const trace_on_reason_t reason) 182 { 183 trace_on_reason = reason; 184 } 185 186 inline void OcsdTraceElement::setUnSyncEOTReason(const unsync_info_t reason) 187 { 188 unsync_eot_info = reason; 189 } 190 191 inline void OcsdTraceElement::setISA(const ocsd_isa isa_update) 192 { 193 isa = isa_update; 194 if(isa > ocsd_isa_unknown) 195 isa = ocsd_isa_unknown; 196 } 197 198 inline void OcsdTraceElement::setTS(const uint64_t ts, const bool freqChange /*= false*/) 199 { 200 timestamp = ts; 201 cpu_freq_change = freqChange ? 1 : 0; 202 has_ts = 1; 203 } 204 205 inline void OcsdTraceElement::setExtendedDataPtr(const void *data_ptr) 206 { 207 extended_data = 1; 208 ptr_extended_data = data_ptr; 209 } 210 211 // set persistent data between output packets. 212 inline void OcsdTraceElement::copyPersistentData(const OcsdTraceElement &src) 213 { 214 isa = src.isa; 215 context = src.context; 216 } 217 218 /** @}*/ 219 220 #endif // ARM_TRC_GEN_ELEM_H_INCLUDED 221 222 /* End of File trc_gen_elem.h */ 223