]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - contrib/opencsd/decoder/source/etmv4/trc_pkt_proc_etmv4i_impl.h
Merge OpenSSL 1.0.2p.
[FreeBSD/FreeBSD.git] / contrib / opencsd / decoder / source / etmv4 / trc_pkt_proc_etmv4i_impl.h
1 /*
2  * \file       trc_pkt_proc_etmv4i_impl.h
3  * \brief      OpenCSD : Implementation of ETMv4 packet processing
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
35 #ifndef ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
36 #define ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
37
38 #include "opencsd/etmv4/trc_pkt_proc_etmv4.h"
39 #include "opencsd/etmv4/trc_cmp_cfg_etmv4.h"
40 #include "opencsd/etmv4/trc_pkt_elem_etmv4i.h"
41
42 class EtmV4IPktProcImpl
43 {
44 public:
45     EtmV4IPktProcImpl();
46     ~EtmV4IPktProcImpl();
47
48     void Initialise(TrcPktProcEtmV4I *p_interface);
49
50     ocsd_err_t Configure(const EtmV4Config *p_config);
51
52
53     ocsd_datapath_resp_t processData(  const ocsd_trc_index_t index,
54                                         const uint32_t dataBlockSize,
55                                         const uint8_t *pDataBlock,
56                                         uint32_t *numBytesProcessed);
57     ocsd_datapath_resp_t onEOT();
58     ocsd_datapath_resp_t onReset();
59     ocsd_datapath_resp_t onFlush();
60     const bool isBadPacket() const;
61
62 protected:
63     typedef enum _process_state {
64         PROC_HDR,
65         PROC_DATA,
66         SEND_PKT,
67         SEND_UNSYNCED,
68         PROC_ERR,
69     } process_state;
70     
71     process_state m_process_state;
72
73     void InitPacketState();      // clear current packet state.
74     void InitProcessorState();   // clear all previous process state
75
76     /** packet processor configuration **/
77     bool m_isInit;
78     TrcPktProcEtmV4I *m_interface;       /**< The interface to the other decode components */
79
80     // etmv4 hardware configuration
81     EtmV4Config m_config;
82
83     /** packet data **/
84     std::vector<uint8_t> m_currPacketData;  // raw data
85     int m_currPktIdx;   // index into raw packet when expanding
86     EtmV4ITrcPacket m_curr_packet;  // expanded packet
87     ocsd_trc_index_t m_packet_index;   // index of the start of the current packet
88     uint32_t m_blockBytesProcessed;     // number of bytes processed in the current data block
89     ocsd_trc_index_t m_blockIndex;     // index at the start of the current data block being processed
90
91     // searching for sync
92     bool m_is_sync;             //!< seen first sync packet
93     bool m_first_trace_info;    //!< seen first trace info packet after sync
94     bool m_sent_notsync_packet; //!< send one not sync packet if we see any unsynced data on the channel 
95     unsigned m_dump_unsynced_bytes;  //!< number of unsynced bytes to send
96     ocsd_trc_index_t m_update_on_unsync_packet_index;
97
98
99 private:
100     // current processing state data - counts and flags to determine if a packet is complete.
101
102     // TraceInfo Packet
103     // flags to indicate processing progress for these sections is complete.
104     struct _t_info_pkt_prog {
105         uint8_t sectFlags;
106         uint8_t ctrlBytes;                 
107     }  m_tinfo_sections;
108
109     #define TINFO_INFO_SECT 0x01
110     #define TINFO_KEY_SECT  0x02 
111     #define TINFO_SPEC_SECT 0x04
112     #define TINFO_CYCT_SECT 0x08
113     #define TINFO_CTRL      0x10
114     #define TINFO_ALL_SECT  0x0F
115     #define TINFO_ALL       0x1F
116
117
118     // address and context packets 
119     int m_addrBytes;
120     uint8_t m_addrIS;
121     bool m_bAddr64bit;
122     int m_vmidBytes;    // bytes still to find
123     int m_ctxtidBytes;  // bytes still to find
124     bool m_bCtxtInfoDone;
125     bool m_addr_done;
126
127     // timestamp
128     bool m_ccount_done; // done or not needed 
129     bool m_ts_done;
130     int m_ts_bytes;
131
132     // exception
133     int m_excep_size;
134
135     // cycle count
136     bool m_has_count;
137     bool m_count_done;
138     bool m_commit_done;
139
140     // cond result
141     bool m_F1P1_done;  // F1 payload 1 done
142     bool m_F1P2_done;  // F1 payload 2 done
143     bool m_F1has_P2;   // F1 has a payload 2
144
145     // Q packets (use some from above too)
146     bool m_has_addr;
147     bool m_addr_short;
148     bool m_addr_match;
149     uint8_t m_Q_type;
150     uint8_t m_QE;
151
152     ocsd_datapath_resp_t outputPacket();
153     ocsd_datapath_resp_t outputUnsyncedRawPacket(); 
154
155     void iNotSync();      // not synced yet
156     void iPktNoPayload(); // process a single byte packet
157     void iPktReserved();  // deal with reserved header value
158     void iPktExtension();
159     void iPktASync();
160     void iPktTraceInfo();
161     void iPktTimestamp();
162     void iPktException();
163     void iPktCycleCntF123();
164     void iPktSpeclRes();
165     void iPktCondInstr();
166     void iPktCondResult();
167     void iPktContext();
168     void iPktAddrCtxt();
169     void iPktShortAddr();
170     void iPktLongAddr();
171     void iPktQ();
172     void iAtom();
173
174     unsigned extractContField(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t &value, const unsigned byte_limit = 5);
175     unsigned extractContField64(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint64_t &value, const unsigned byte_limit = 9);
176     unsigned extractCondResult(const std::vector<uint8_t> &buffer, const unsigned st_idx, uint32_t& key, uint8_t &result);
177     void extractAndSetContextInfo(const std::vector<uint8_t> &buffer, const int st_idx);
178     int extract64BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint64_t &value);
179     int extract32BitLongAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value);
180     int extractShortAddr(const std::vector<uint8_t> &buffer, const int st_idx, const uint8_t IS, uint32_t &value, int &bits);
181
182     // packet processing is table driven.    
183     typedef void (EtmV4IPktProcImpl::*PPKTFN)(void);
184     PPKTFN m_pIPktFn;
185
186     struct _pkt_i_table_t {
187         ocsd_etmv4_i_pkt_type pkt_type;
188         PPKTFN pptkFn;
189     } m_i_table[256];
190
191     void BuildIPacketTable();
192
193     void throwBadSequenceError(const char *pszExtMsg);
194 };
195
196
197 inline const bool EtmV4IPktProcImpl::isBadPacket() const
198 {
199     return m_curr_packet.isBadPacket();
200 }
201
202 #endif // ARM_TRC_PKT_PROC_ETMV4I_IMPL_H_INCLUDED
203
204 /* End of File trc_pkt_proc_etmv4i_impl.h */