1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner * \file trc_pkt_proc_ptm.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_PTM_H_INCLUDED
37*c120c564SAndrew Turner #define ARM_TRC_PKT_PROC_PTM_H_INCLUDED
38*c120c564SAndrew Turner
39*c120c564SAndrew Turner #include "trc_pkt_types_ptm.h"
40*c120c564SAndrew Turner #include "common/trc_pkt_proc_base.h"
41*c120c564SAndrew Turner #include "trc_pkt_elem_ptm.h"
42*c120c564SAndrew Turner #include "trc_cmp_cfg_ptm.h"
43*c120c564SAndrew Turner
44*c120c564SAndrew Turner class PtmTrcPacket;
45*c120c564SAndrew Turner class PtmConfig;
46*c120c564SAndrew Turner
47*c120c564SAndrew Turner /** @addtogroup ocsd_pkt_proc
48*c120c564SAndrew Turner @{*/
49*c120c564SAndrew Turner
50*c120c564SAndrew Turner
51*c120c564SAndrew Turner
52*c120c564SAndrew Turner class TrcPktProcPtm : public TrcPktProcBase< PtmTrcPacket, ocsd_ptm_pkt_type, PtmConfig>
53*c120c564SAndrew Turner {
54*c120c564SAndrew Turner public:
55*c120c564SAndrew Turner TrcPktProcPtm();
56*c120c564SAndrew Turner TrcPktProcPtm(int instIDNum);
57*c120c564SAndrew Turner virtual ~TrcPktProcPtm();
58*c120c564SAndrew Turner
59*c120c564SAndrew Turner protected:
60*c120c564SAndrew Turner /* implementation packet processing interface */
61*c120c564SAndrew Turner virtual ocsd_datapath_resp_t processData( const ocsd_trc_index_t index,
62*c120c564SAndrew Turner const uint32_t dataBlockSize,
63*c120c564SAndrew Turner const uint8_t *pDataBlock,
64*c120c564SAndrew Turner uint32_t *numBytesProcessed);
65*c120c564SAndrew Turner virtual ocsd_datapath_resp_t onEOT();
66*c120c564SAndrew Turner virtual ocsd_datapath_resp_t onReset();
67*c120c564SAndrew Turner virtual ocsd_datapath_resp_t onFlush();
68*c120c564SAndrew Turner virtual ocsd_err_t onProtocolConfig();
69*c120c564SAndrew Turner virtual const bool isBadPacket() const;
70*c120c564SAndrew Turner
71*c120c564SAndrew Turner void InitPacketState(); // clear current packet state.
72*c120c564SAndrew Turner void InitProcessorState(); // clear all previous process state
73*c120c564SAndrew Turner
74*c120c564SAndrew Turner ocsd_datapath_resp_t outputPacket();
75*c120c564SAndrew Turner
76*c120c564SAndrew Turner typedef enum _process_state {
77*c120c564SAndrew Turner WAIT_SYNC,
78*c120c564SAndrew Turner PROC_HDR,
79*c120c564SAndrew Turner PROC_DATA,
80*c120c564SAndrew Turner SEND_PKT,
81*c120c564SAndrew Turner } process_state;
82*c120c564SAndrew Turner
83*c120c564SAndrew Turner process_state m_process_state; // process algorithm state.
84*c120c564SAndrew Turner
85*c120c564SAndrew Turner std::vector<uint8_t> m_currPacketData; // raw data
86*c120c564SAndrew Turner uint32_t m_currPktIdx; // index into packet when expanding
87*c120c564SAndrew Turner PtmTrcPacket m_curr_packet; // expanded packet
88*c120c564SAndrew Turner ocsd_trc_index_t m_curr_pkt_index; // trace index at start of packet.
89*c120c564SAndrew Turner
90*c120c564SAndrew Turner const bool readByte(uint8_t &currByte);
91*c120c564SAndrew Turner const bool readByte(); // just read into buffer, don't need the value
92*c120c564SAndrew Turner void unReadByte(); // remove last byte from the buffer.
93*c120c564SAndrew Turner
94*c120c564SAndrew Turner uint8_t m_chanIDCopy;
95*c120c564SAndrew Turner
96*c120c564SAndrew Turner // current data block being processed.
97*c120c564SAndrew Turner const uint8_t *m_pDataIn;
98*c120c564SAndrew Turner uint32_t m_dataInLen;
99*c120c564SAndrew Turner uint32_t m_dataInProcessed;
100*c120c564SAndrew Turner ocsd_trc_index_t m_block_idx; // index start for current block
101*c120c564SAndrew Turner
102*c120c564SAndrew Turner // processor synchronisation
103*c120c564SAndrew Turner const bool isSync() const;
104*c120c564SAndrew Turner ocsd_datapath_resp_t waitASync(); //!< look for first synchronisation point in the packet stream
105*c120c564SAndrew Turner bool m_waitASyncSOPkt;
106*c120c564SAndrew Turner bool m_bAsyncRawOp;
107*c120c564SAndrew Turner bool m_bOPNotSyncPkt; //!< true if output not sync packet when waiting for ASYNC
108*c120c564SAndrew Turner
109*c120c564SAndrew Turner // ** packet processing functions.
110*c120c564SAndrew Turner void pktASync();
111*c120c564SAndrew Turner void pktISync();
112*c120c564SAndrew Turner void pktTrigger();
113*c120c564SAndrew Turner void pktWPointUpdate();
114*c120c564SAndrew Turner void pktIgnore();
115*c120c564SAndrew Turner void pktCtxtID();
116*c120c564SAndrew Turner void pktVMID();
117*c120c564SAndrew Turner void pktAtom();
118*c120c564SAndrew Turner void pktTimeStamp();
119*c120c564SAndrew Turner void pktExceptionRet();
120*c120c564SAndrew Turner void pktBranchAddr();
121*c120c564SAndrew Turner void pktReserved();
122*c120c564SAndrew Turner
123*c120c564SAndrew Turner // async finder
124*c120c564SAndrew Turner typedef enum _async_result {
125*c120c564SAndrew Turner ASYNC, //!< pattern confirmed async 0x00 x 5, 0x80
126*c120c564SAndrew Turner NOT_ASYNC, //!< pattern confirmed not async
127*c120c564SAndrew Turner ASYNC_EXTRA_0, //!< pattern confirmed 0x00 x N + ASYNC
128*c120c564SAndrew Turner THROW_0, //!< long pattern of 0x00 - throw some away.
129*c120c564SAndrew Turner ASYNC_INCOMPLETE, //!< not enough input data.
130*c120c564SAndrew Turner } async_result_t;
131*c120c564SAndrew Turner
132*c120c564SAndrew Turner async_result_t findAsync();
133*c120c564SAndrew Turner
134*c120c564SAndrew Turner int m_async_0; // number of current consecutive async 0s
135*c120c564SAndrew Turner
136*c120c564SAndrew Turner bool m_part_async;
137*c120c564SAndrew Turner
138*c120c564SAndrew Turner // number of extra 0s before we throw 0 on async detect.
139*c120c564SAndrew Turner #define ASYNC_PAD_0_LIMIT 11
140*c120c564SAndrew Turner // number of 0s minimum to form an async
141*c120c564SAndrew Turner #define ASYNC_REQ_0 5
142*c120c564SAndrew Turner
143*c120c564SAndrew Turner // extraction sub-routines
144*c120c564SAndrew Turner void extractCtxtID(int idx, uint32_t &ctxtID);
145*c120c564SAndrew Turner void extractCycleCount(int idx, uint32_t &cycleCount);
146*c120c564SAndrew Turner int extractTS(uint64_t &tsVal, uint8_t &tsUpdateBits);
147*c120c564SAndrew Turner uint32_t extractAddress(const int offset,uint8_t &total_bits);
148*c120c564SAndrew Turner
149*c120c564SAndrew Turner // number of bytes required for a complete packet - used in some multi byte packets
150*c120c564SAndrew Turner int m_numPktBytesReq;
151*c120c564SAndrew Turner
152*c120c564SAndrew Turner // packet processing state
153*c120c564SAndrew Turner bool m_needCycleCount;
154*c120c564SAndrew Turner bool m_gotCycleCount;
155*c120c564SAndrew Turner int m_gotCCBytes; // number of CC bytes read so far
156*c120c564SAndrew Turner
157*c120c564SAndrew Turner int m_numCtxtIDBytes;
158*c120c564SAndrew Turner int m_gotCtxtIDBytes;
159*c120c564SAndrew Turner
160*c120c564SAndrew Turner bool m_gotTSBytes; //!< got all TS bytes
161*c120c564SAndrew Turner int m_tsByteMax; //!< max size for TS portion of TS packet.
162*c120c564SAndrew Turner
163*c120c564SAndrew Turner // branch address state
164*c120c564SAndrew Turner bool m_gotAddrBytes; //!< got all Addr bytes in branch packet
165*c120c564SAndrew Turner int m_numAddrBytes; //!< number of address bytes
166*c120c564SAndrew Turner bool m_gotExcepBytes; //!< got all needed exception bytes
167*c120c564SAndrew Turner int m_numExcepBytes; //!< got 1st exception byte
168*c120c564SAndrew Turner ocsd_isa m_addrPktIsa; //!< ISA of the branch address packet
169*c120c564SAndrew Turner int m_excepAltISA; //!< Alt ISA bit iff exception bytes
170*c120c564SAndrew Turner
171*c120c564SAndrew Turner // bad packets
172*c120c564SAndrew Turner void throwMalformedPacketErr(const char *pszErrMsg);
173*c120c564SAndrew Turner void throwPacketHeaderErr(const char *pszErrMsg);
174*c120c564SAndrew Turner
175*c120c564SAndrew Turner
176*c120c564SAndrew Turner // packet processing function table
177*c120c564SAndrew Turner typedef void (TrcPktProcPtm::*PPKTFN)(void);
178*c120c564SAndrew Turner PPKTFN m_pIPktFn;
179*c120c564SAndrew Turner
180*c120c564SAndrew Turner struct _pkt_i_table_t {
181*c120c564SAndrew Turner ocsd_ptm_pkt_type pkt_type;
182*c120c564SAndrew Turner PPKTFN pptkFn;
183*c120c564SAndrew Turner } m_i_table[256];
184*c120c564SAndrew Turner
185*c120c564SAndrew Turner void BuildIPacketTable();
186*c120c564SAndrew Turner
187*c120c564SAndrew Turner };
188*c120c564SAndrew Turner
isSync()189*c120c564SAndrew Turner inline const bool TrcPktProcPtm::isSync() const
190*c120c564SAndrew Turner {
191*c120c564SAndrew Turner return (bool)(m_curr_packet.getType() == PTM_PKT_NOTSYNC);
192*c120c564SAndrew Turner }
193*c120c564SAndrew Turner
throwMalformedPacketErr(const char * pszErrMsg)194*c120c564SAndrew Turner inline void TrcPktProcPtm::throwMalformedPacketErr(const char *pszErrMsg)
195*c120c564SAndrew Turner {
196*c120c564SAndrew Turner m_curr_packet.SetErrType(PTM_PKT_BAD_SEQUENCE);
197*c120c564SAndrew Turner throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_BAD_PACKET_SEQ,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
198*c120c564SAndrew Turner }
199*c120c564SAndrew Turner
throwPacketHeaderErr(const char * pszErrMsg)200*c120c564SAndrew Turner inline void TrcPktProcPtm::throwPacketHeaderErr(const char *pszErrMsg)
201*c120c564SAndrew Turner {
202*c120c564SAndrew Turner throw ocsdError(OCSD_ERR_SEV_ERROR,OCSD_ERR_INVALID_PCKT_HDR,m_curr_pkt_index,m_chanIDCopy,pszErrMsg);
203*c120c564SAndrew Turner }
204*c120c564SAndrew Turner
readByte()205*c120c564SAndrew Turner inline const bool TrcPktProcPtm::readByte()
206*c120c564SAndrew Turner {
207*c120c564SAndrew Turner uint8_t currByte;
208*c120c564SAndrew Turner return readByte(currByte);
209*c120c564SAndrew Turner }
210*c120c564SAndrew Turner
211*c120c564SAndrew Turner /** @}*/
212*c120c564SAndrew Turner
213*c120c564SAndrew Turner #endif // ARM_TRC_PKT_PROC_PTM_H_INCLUDED
214*c120c564SAndrew Turner
215*c120c564SAndrew Turner /* End of File trc_pkt_proc_ptm.h */
216