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 76 void setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr = 1); 77 void setLastInstrInfo(const bool exec, const ocsd_instr_type last_i_type, const ocsd_instr_subtype last_i_subtype, const uint8_t size); 78 void setAddrStart(const ocsd_vaddr_t st_addr) { this->st_addr = st_addr; }; 79 void setLastInstrCond(const int is_cond) { this->last_instr_cond = is_cond; }; 80 81 void setSWTInfo(const ocsd_swt_info_t swt_info) { sw_trace_info = swt_info; }; 82 void setExtendedDataPtr(const void *data_ptr); 83 84 // stringize the element 85 86 virtual void toString(std::string &str) const; 87 88 // get elements API 89 90 OcsdTraceElement &operator =(const ocsd_generic_trace_elem* p_elem); 91 92 const ocsd_gen_trc_elem_t getType() const { return elem_type; }; 93 94 // return current context 95 const ocsd_pe_context &getContext() const { return context; }; 96 97 98 private: 99 void printSWInfoPkt(std::ostringstream &oss) const; 100 void clearPerPktData(); //!< clear flags that indicate validity / have values on a per packet basis 101 102 }; 103 104 inline OcsdTraceElement::OcsdTraceElement(ocsd_gen_trc_elem_t type) 105 { 106 elem_type = type; 107 } 108 109 inline OcsdTraceElement::OcsdTraceElement() 110 { 111 elem_type = OCSD_GEN_TRC_ELEM_UNKNOWN; 112 } 113 114 inline void OcsdTraceElement::setCycleCount(const uint32_t cycleCount) 115 { 116 cycle_count = cycleCount; 117 has_cc = 1; 118 } 119 120 inline void OcsdTraceElement::setEvent(const event_t ev_type, const uint16_t number) 121 { 122 trace_event.ev_type = (uint16_t)ev_type; 123 trace_event.ev_number = ev_type == EVENT_NUMBERED ? number : 0; 124 } 125 126 inline void OcsdTraceElement::setAddrRange(const ocsd_vaddr_t st_addr, const ocsd_vaddr_t en_addr, const int num_instr /* = 1 */) 127 { 128 this->st_addr = st_addr; 129 this->en_addr = en_addr; 130 this->num_instr_range = num_instr; 131 } 132 133 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) 134 { 135 last_instr_exec = exec ? 1 : 0; 136 last_instr_sz = size & 0x7; 137 this->last_i_type = last_i_type; 138 this->last_i_subtype = last_i_subtype; 139 } 140 141 inline void OcsdTraceElement::setType(const ocsd_gen_trc_elem_t type) 142 { 143 // set the type and clear down the per element flags 144 elem_type = type; 145 146 clearPerPktData(); 147 } 148 149 inline void OcsdTraceElement::updateType(const ocsd_gen_trc_elem_t type) 150 { 151 elem_type = type; 152 } 153 154 inline void OcsdTraceElement::init() 155 { 156 st_addr = en_addr = (ocsd_vaddr_t)-1; 157 isa = ocsd_isa_unknown; 158 159 cycle_count = 0; 160 timestamp = 0; 161 162 context.ctxt_id_valid = 0; 163 context.vmid_valid = 0; 164 context.el_valid = 0; 165 166 last_i_type = OCSD_INSTR_OTHER; 167 last_i_subtype = OCSD_S_INSTR_NONE; 168 169 clearPerPktData(); 170 } 171 172 inline void OcsdTraceElement::clearPerPktData() 173 { 174 flag_bits = 0; // union with trace_on_reason / trace_event 175 176 ptr_extended_data = 0; // extended data pointer 177 } 178 179 inline void OcsdTraceElement::setTraceOnReason(const trace_on_reason_t reason) 180 { 181 trace_on_reason = reason; 182 } 183 184 inline void OcsdTraceElement::setISA(const ocsd_isa isa_update) 185 { 186 isa = isa_update; 187 if(isa > ocsd_isa_unknown) 188 isa = ocsd_isa_unknown; 189 } 190 191 inline void OcsdTraceElement::setTS(const uint64_t ts, const bool freqChange /*= false*/) 192 { 193 timestamp = ts; 194 cpu_freq_change = freqChange ? 1 : 0; 195 has_ts = 1; 196 } 197 198 inline void OcsdTraceElement::setExtendedDataPtr(const void *data_ptr) 199 { 200 extended_data = 1; 201 ptr_extended_data = data_ptr; 202 } 203 204 205 /** @}*/ 206 207 #endif // ARM_TRC_GEN_ELEM_H_INCLUDED 208 209 /* End of File trc_gen_elem.h */ 210