1 /* 2 * \file trc_pkt_decode_ptm.h 3 * \brief OpenCSD : PTM packet decoder. 4 * 5 * \copyright Copyright (c) 2016, 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_PKT_DECODE_PTM_H_INCLUDED 35 #define ARM_TRC_PKT_DECODE_PTM_H_INCLUDED 36 37 #include "common/trc_pkt_decode_base.h" 38 #include "opencsd/ptm/trc_pkt_elem_ptm.h" 39 #include "opencsd/ptm/trc_cmp_cfg_ptm.h" 40 #include "common/trc_gen_elem.h" 41 #include "common/trc_ret_stack.h" 42 43 /**************** Atom handling class **************************************/ 44 class PtmAtoms 45 { 46 public: 47 PtmAtoms() {}; 48 ~PtmAtoms() {}; 49 50 //! initialise the atom and index values 51 void initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index); 52 53 const ocsd_atm_val getCurrAtomVal() const; 54 const int numAtoms() const; //!< number of atoms 55 const ocsd_trc_index_t pktIndex() const; //!< originating packet index 56 57 void clearAtom(); //!< clear the current atom, set the next. 58 void clearAll(); //!< clear all 59 60 private: 61 ocsd_pkt_atom m_atom; 62 ocsd_trc_index_t m_root_index; //!< root index for the atom packet 63 }; 64 65 inline void PtmAtoms::initAtomPkt(const ocsd_pkt_atom &atom, const ocsd_trc_index_t &root_index) 66 { 67 m_atom = atom; 68 m_root_index = root_index; 69 } 70 71 inline const ocsd_atm_val PtmAtoms::getCurrAtomVal() const 72 { 73 return (m_atom.En_bits & 0x1) ? ATOM_E : ATOM_N; 74 } 75 76 inline const int PtmAtoms::numAtoms() const 77 { 78 return m_atom.num; 79 } 80 81 inline const ocsd_trc_index_t PtmAtoms::pktIndex() const 82 { 83 return m_root_index; 84 } 85 86 inline void PtmAtoms::clearAtom() 87 { 88 if(m_atom.num) 89 { 90 m_atom.num--; 91 m_atom.En_bits >>=1; 92 } 93 } 94 95 inline void PtmAtoms::clearAll() 96 { 97 m_atom.num = 0; 98 } 99 100 /********** Main decode class ****************************************************/ 101 class TrcPktDecodePtm : public TrcPktDecodeBase<PtmTrcPacket, PtmConfig> 102 { 103 public: 104 TrcPktDecodePtm(); 105 TrcPktDecodePtm(int instIDNum); 106 virtual ~TrcPktDecodePtm(); 107 108 protected: 109 /* implementation packet decoding interface */ 110 virtual ocsd_datapath_resp_t processPacket(); 111 virtual ocsd_datapath_resp_t onEOT(); 112 virtual ocsd_datapath_resp_t onReset(); 113 virtual ocsd_datapath_resp_t onFlush(); 114 virtual ocsd_err_t onProtocolConfig(); 115 virtual const uint8_t getCoreSightTraceID() { return m_CSID; }; 116 117 /* local decode methods */ 118 119 private: 120 /** operation for the trace instruction follower */ 121 typedef enum { 122 TRACE_WAYPOINT, //!< standard operation - trace to waypoint - default op 123 TRACE_TO_ADDR_EXCL, //!< trace to supplied address - address is 1st instuction not executed. 124 TRACE_TO_ADDR_INCL //!< trace to supplied address - address is last instruction executed. 125 } waypoint_trace_t; 126 127 void initDecoder(); 128 void resetDecoder(); 129 130 ocsd_datapath_resp_t decodePacket(); 131 ocsd_datapath_resp_t contProcess(); 132 ocsd_datapath_resp_t processIsync(); 133 ocsd_datapath_resp_t processBranch(); 134 ocsd_datapath_resp_t processWPUpdate(); 135 ocsd_datapath_resp_t processAtom(); 136 ocsd_err_t traceInstrToWP(bool &bWPFound, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0); //!< follow instructions from the current address to a WP. true if good, false if memory cannot be accessed. 137 ocsd_datapath_resp_t processAtomRange(const ocsd_atm_val A, const char *pkt_msg, const waypoint_trace_t traceWPOp = TRACE_WAYPOINT, const ocsd_vaddr_t nextAddrMatch = 0); 138 void checkPendingNacc(ocsd_datapath_resp_t &resp); 139 140 uint8_t m_CSID; //!< Coresight trace ID for this decoder. 141 142 //** Other processor state; 143 144 // trace decode FSM 145 typedef enum { 146 NO_SYNC, //!< pre start trace - init state or after reset or overflow, loss of sync. 147 WAIT_SYNC, //!< waiting for sync packet. 148 WAIT_ISYNC, //!< waiting for isync packet after 1st ASYNC. 149 DECODE_PKTS, //!< processing input packet 150 CONT_ISYNC, //!< continue processing isync packet after WAIT. 151 CONT_ATOM, //!< continue processing atom packet after WAIT. 152 CONT_WPUP, //!< continue processing WP update packet after WAIT. 153 CONT_BRANCH, //!< continue processing Branch packet after WAIT. 154 } processor_state_t; 155 156 processor_state_t m_curr_state; 157 158 const bool processStateIsCont() const; 159 160 // PE decode state - address and isa 161 162 //! Structure to contain the PE addr and ISA state. 163 typedef struct _ptm_pe_addr_state { 164 ocsd_isa isa; //!< current isa. 165 ocsd_vaddr_t instr_addr; //!< current address. 166 bool valid; //!< address valid - false if we need an address to continue decode. 167 } ptm_pe_addr_state; 168 169 ptm_pe_addr_state m_curr_pe_state; //!< current instruction state for PTM decode. 170 ocsd_pe_context m_pe_context; //!< current context information 171 172 // packet decode state 173 bool m_need_isync; //!< need context to continue 174 175 ocsd_instr_info m_instr_info; //!< instruction info for code follower - in address is the next to be decoded. 176 177 bool m_mem_nacc_pending; //!< need to output a memory access failure packet 178 ocsd_vaddr_t m_nacc_addr; //!< address of memory access failure 179 180 bool m_i_sync_pe_ctxt; //!< isync has pe context. 181 182 PtmAtoms m_atoms; //!< atoms to process in an atom packet 183 184 TrcAddrReturnStack m_return_stack; //!< trace return stack. 185 186 //** output element 187 OcsdTraceElement m_output_elem; 188 }; 189 190 inline const bool TrcPktDecodePtm::processStateIsCont() const 191 { 192 return (bool)(m_curr_state >= CONT_ISYNC); 193 } 194 195 #endif // ARM_TRC_PKT_DECODE_PTM_H_INCLUDED 196 197 /* End of File trc_pkt_decode_ptm.h */ 198