xref: /freebsd-src/contrib/opencsd/decoder/source/etmv3/trc_pkt_proc_etmv3_impl.h (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner  * \file       trc_pkt_proc_etmv3_impl.h
3*c120c564SAndrew Turner  * \brief      OpenCSD :
4*c120c564SAndrew Turner  *
5*c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6*c120c564SAndrew Turner  */
7*c120c564SAndrew Turner 
8*c120c564SAndrew Turner 
9*c120c564SAndrew Turner /*
10*c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
11*c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
12*c120c564SAndrew Turner  *
13*c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
14*c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
15*c120c564SAndrew Turner  *
16*c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
17*c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
18*c120c564SAndrew Turner  * and/or other materials provided with the distribution.
19*c120c564SAndrew Turner  *
20*c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
21*c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
22*c120c564SAndrew Turner  * specific prior written permission.
23*c120c564SAndrew Turner  *
24*c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
25*c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
26*c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
27*c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28*c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29*c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
30*c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
31*c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
32*c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
33*c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
34*c120c564SAndrew Turner  */
35*c120c564SAndrew Turner 
36*c120c564SAndrew Turner #ifndef ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
37*c120c564SAndrew Turner #define ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
38*c120c564SAndrew Turner 
39*c120c564SAndrew Turner #include "opencsd/etmv3/trc_pkt_proc_etmv3.h"
40*c120c564SAndrew Turner #include "opencsd/etmv3/trc_cmp_cfg_etmv3.h"
41*c120c564SAndrew Turner #include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
42*c120c564SAndrew Turner 
43*c120c564SAndrew Turner #define MAX_PACKET_SIZE 32
44*c120c564SAndrew Turner #define ASYNC_SIZE 6
45*c120c564SAndrew Turner 
46*c120c564SAndrew Turner class EtmV3PktProcImpl
47*c120c564SAndrew Turner {
48*c120c564SAndrew Turner public:
49*c120c564SAndrew Turner     EtmV3PktProcImpl();
50*c120c564SAndrew Turner     ~EtmV3PktProcImpl();
51*c120c564SAndrew Turner 
52*c120c564SAndrew Turner     void Initialise(TrcPktProcEtmV3 *p_interface);
53*c120c564SAndrew Turner 
54*c120c564SAndrew Turner     ocsd_err_t Configure(const EtmV3Config *p_config);
55*c120c564SAndrew Turner 
56*c120c564SAndrew Turner 
57*c120c564SAndrew Turner     ocsd_datapath_resp_t processData(  const ocsd_trc_index_t index,
58*c120c564SAndrew Turner                                         const uint32_t dataBlockSize,
59*c120c564SAndrew Turner                                         const uint8_t *pDataBlock,
60*c120c564SAndrew Turner                                         uint32_t *numBytesProcessed);
61*c120c564SAndrew Turner     ocsd_datapath_resp_t onEOT();
62*c120c564SAndrew Turner     ocsd_datapath_resp_t onReset();
63*c120c564SAndrew Turner     ocsd_datapath_resp_t onFlush();
64*c120c564SAndrew Turner     const bool isBadPacket() const;
65*c120c564SAndrew Turner 
66*c120c564SAndrew Turner protected:
67*c120c564SAndrew Turner     typedef enum _process_state {
68*c120c564SAndrew Turner         WAIT_SYNC,
69*c120c564SAndrew Turner         PROC_HDR,
70*c120c564SAndrew Turner         PROC_DATA,
71*c120c564SAndrew Turner         SEND_PKT,
72*c120c564SAndrew Turner         PROC_ERR,
73*c120c564SAndrew Turner     } process_state;
74*c120c564SAndrew Turner 
75*c120c564SAndrew Turner     process_state m_process_state;
76*c120c564SAndrew Turner 
77*c120c564SAndrew Turner 
78*c120c564SAndrew Turner     void InitPacketState();      // clear current packet state.
79*c120c564SAndrew Turner     void InitProcessorState();   // clear all previous process state
80*c120c564SAndrew Turner 
81*c120c564SAndrew Turner     // byte processing
82*c120c564SAndrew Turner 
83*c120c564SAndrew Turner     uint32_t waitForSync(const uint32_t dataBlockSize, const uint8_t *pDataBlock);  //!< look for sync, return none-sync bytes processed.
84*c120c564SAndrew Turner     ocsd_err_t processHeaderByte(uint8_t by);
85*c120c564SAndrew Turner     ocsd_err_t processPayloadByte(uint8_t by);
86*c120c564SAndrew Turner 
87*c120c564SAndrew Turner     // packet handling - main routines
88*c120c564SAndrew Turner     void OnBranchAddress();
89*c120c564SAndrew Turner     void OnISyncPacket();
90*c120c564SAndrew Turner     uint32_t extractCtxtID();
91*c120c564SAndrew Turner     uint64_t extractTimestamp(uint8_t &tsBits);
92*c120c564SAndrew Turner     uint32_t extractDataAddress(uint8_t &bits, bool &updateBE, uint8_t &beVal);
93*c120c564SAndrew Turner     uint32_t extractDataValue(const int dataByteSize);
94*c120c564SAndrew Turner     uint32_t extractCycleCount();
95*c120c564SAndrew Turner 
96*c120c564SAndrew Turner     // packet handling - helper routines
97*c120c564SAndrew Turner     uint32_t extractBrAddrPkt(int &nBitsOut);
98*c120c564SAndrew Turner     void extractExceptionData();
99*c120c564SAndrew Turner     void checkPktLimits();
100*c120c564SAndrew Turner     void setBytesPartPkt(const int numBytes, const process_state nextState, const ocsd_etmv3_pkt_type nextType); // set first n bytes from current packet to be sent via alt packet.
101*c120c564SAndrew Turner 
102*c120c564SAndrew Turner     // packet output
103*c120c564SAndrew Turner     void SendPacket();  // mark state for packet output
104*c120c564SAndrew Turner     ocsd_datapath_resp_t outputPacket();   // output a packet
105*c120c564SAndrew Turner 
106*c120c564SAndrew Turner     // bad packets
107*c120c564SAndrew Turner     void throwMalformedPacketErr(const char *pszErrMsg);
108*c120c564SAndrew Turner     void throwPacketHeaderErr(const char *pszErrMsg);
109*c120c564SAndrew Turner     void throwUnsupportedErr(const char *pszErrMsg);
110*c120c564SAndrew Turner 
111*c120c564SAndrew Turner     uint32_t m_bytesProcessed; // bytes processed by the process data routine (index into input buffer)
112*c120c564SAndrew Turner     std::vector<uint8_t> m_currPacketData;  // raw data
113*c120c564SAndrew Turner     uint32_t m_currPktIdx;   // index into packet when expanding
114*c120c564SAndrew Turner     EtmV3TrcPacket m_curr_packet;  // expanded packet
115*c120c564SAndrew Turner 
116*c120c564SAndrew Turner     std::vector<uint8_t> m_partPktData;   // raw data when we need to split a packet.
117*c120c564SAndrew Turner     bool m_bSendPartPkt;                  // mark the part packet as the one we send.
118*c120c564SAndrew Turner     process_state m_post_part_pkt_state;  // state to set after part packet set
119*c120c564SAndrew Turner     ocsd_etmv3_pkt_type m_post_part_pkt_type;  // reset the packet type.
120*c120c564SAndrew Turner 
121*c120c564SAndrew Turner     // process state
122*c120c564SAndrew Turner     bool            m_bStreamSync;          //!< true if we have synced this stream
123*c120c564SAndrew Turner     bool            m_bStartOfSync;         //!< true if we have a start of sync.
124*c120c564SAndrew Turner 
125*c120c564SAndrew Turner     // packet state
126*c120c564SAndrew Turner 	uint32_t m_bytesExpectedThisPkt; // used by some of the variable packet length types.
127*c120c564SAndrew Turner 	bool m_BranchPktNeedsException;
128*c120c564SAndrew Turner 	bool m_bIsync_got_cycle_cnt;
129*c120c564SAndrew Turner 	bool m_bIsync_get_LSiP_addr;
130*c120c564SAndrew Turner 	int m_IsyncInfoIdx;
131*c120c564SAndrew Turner 	bool m_bExpectingDataAddress;
132*c120c564SAndrew Turner 	bool m_bFoundDataAddress;
133*c120c564SAndrew Turner 
134*c120c564SAndrew Turner     ocsd_trc_index_t m_packet_index;   // index of the start of the current packet
135*c120c564SAndrew Turner     ocsd_trc_index_t m_packet_curr_byte_index; // index of the current byte.
136*c120c564SAndrew Turner 
137*c120c564SAndrew Turner     bool m_isInit;
138*c120c564SAndrew Turner     TrcPktProcEtmV3 *m_interface;       /**< The interface to the other decode components */
139*c120c564SAndrew Turner 
140*c120c564SAndrew Turner     EtmV3Config m_config;
141*c120c564SAndrew Turner 
142*c120c564SAndrew Turner     uint8_t m_chanIDCopy;
143*c120c564SAndrew Turner };
144*c120c564SAndrew Turner 
145*c120c564SAndrew Turner 
SendPacket()146*c120c564SAndrew Turner inline void EtmV3PktProcImpl::SendPacket()
147*c120c564SAndrew Turner {
148*c120c564SAndrew Turner     m_process_state = SEND_PKT;
149*c120c564SAndrew Turner }
150*c120c564SAndrew Turner 
throwMalformedPacketErr(const char * pszErrMsg)151*c120c564SAndrew Turner inline void EtmV3PktProcImpl::throwMalformedPacketErr(const char *pszErrMsg)
152*c120c564SAndrew Turner {
153*c120c564SAndrew Turner     throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_packet_index,m_chanIDCopy,pszErrMsg);
154*c120c564SAndrew Turner }
155*c120c564SAndrew Turner 
throwPacketHeaderErr(const char * pszErrMsg)156*c120c564SAndrew Turner inline void EtmV3PktProcImpl::throwPacketHeaderErr(const char *pszErrMsg)
157*c120c564SAndrew Turner {
158*c120c564SAndrew Turner     throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_packet_index,m_chanIDCopy,pszErrMsg);
159*c120c564SAndrew Turner }
160*c120c564SAndrew Turner 
throwUnsupportedErr(const char * pszErrMsg)161*c120c564SAndrew Turner inline void EtmV3PktProcImpl::throwUnsupportedErr(const char *pszErrMsg)
162*c120c564SAndrew Turner {
163*c120c564SAndrew Turner     throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_HW_CFG_UNSUPP,m_packet_index,m_chanIDCopy,pszErrMsg);
164*c120c564SAndrew Turner }
165*c120c564SAndrew Turner 
166*c120c564SAndrew Turner 
isBadPacket()167*c120c564SAndrew Turner inline const bool EtmV3PktProcImpl::isBadPacket() const
168*c120c564SAndrew Turner {
169*c120c564SAndrew Turner     return m_curr_packet.isBadPacket();
170*c120c564SAndrew Turner }
171*c120c564SAndrew Turner 
172*c120c564SAndrew Turner 
173*c120c564SAndrew Turner #endif // ARM_TRC_PKT_PROC_ETMV3_IMPL_H_INCLUDED
174*c120c564SAndrew Turner 
175*c120c564SAndrew Turner /* End of File trc_pkt_proc_etmv3_impl.h */
176