xref: /freebsd-src/contrib/opencsd/decoder/source/stm/trc_pkt_elem_stm.cpp (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner  * \file       trc_pkt_elem_stm.cpp
3*c120c564SAndrew Turner  * \brief      OpenCSD : STM decode - packet class
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  * Redistribution and use in source and binary forms, with or without modification,
10*c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
11*c120c564SAndrew Turner  *
12*c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
13*c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
14*c120c564SAndrew Turner  *
15*c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
16*c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
17*c120c564SAndrew Turner  * and/or other materials provided with the distribution.
18*c120c564SAndrew Turner  *
19*c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
20*c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
21*c120c564SAndrew Turner  * specific prior written permission.
22*c120c564SAndrew Turner  *
23*c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24*c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25*c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26*c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27*c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28*c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29*c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30*c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31*c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32*c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33*c120c564SAndrew Turner  */
34*c120c564SAndrew Turner 
35*c120c564SAndrew Turner #include <sstream>
36*c120c564SAndrew Turner #include <iomanip>
37*c120c564SAndrew Turner #include "opencsd/stm/trc_pkt_elem_stm.h"
38*c120c564SAndrew Turner 
StmTrcPacket()39*c120c564SAndrew Turner StmTrcPacket::StmTrcPacket()
40*c120c564SAndrew Turner {
41*c120c564SAndrew Turner     initStartState();
42*c120c564SAndrew Turner }
43*c120c564SAndrew Turner 
operator =(const ocsd_stm_pkt * p_pkt)44*c120c564SAndrew Turner StmTrcPacket &StmTrcPacket::operator =(const ocsd_stm_pkt *p_pkt)
45*c120c564SAndrew Turner {
46*c120c564SAndrew Turner     *dynamic_cast<ocsd_stm_pkt *>(this) = *p_pkt;
47*c120c564SAndrew Turner     return *this;
48*c120c564SAndrew Turner }
49*c120c564SAndrew Turner 
initStartState()50*c120c564SAndrew Turner void StmTrcPacket::initStartState()
51*c120c564SAndrew Turner {
52*c120c564SAndrew Turner     master = 0;
53*c120c564SAndrew Turner     channel = 0;
54*c120c564SAndrew Turner     timestamp = 0;
55*c120c564SAndrew Turner     ts_type = STM_TS_UNKNOWN;
56*c120c564SAndrew Turner     type =  STM_PKT_NOTSYNC;
57*c120c564SAndrew Turner     initNextPacket();
58*c120c564SAndrew Turner }
59*c120c564SAndrew Turner 
initNextPacket()60*c120c564SAndrew Turner void StmTrcPacket::initNextPacket()
61*c120c564SAndrew Turner {
62*c120c564SAndrew Turner     err_type = STM_PKT_NO_ERR_TYPE;
63*c120c564SAndrew Turner     pkt_ts_bits = 0;
64*c120c564SAndrew Turner     pkt_has_marker = 0;
65*c120c564SAndrew Turner     pkt_has_ts = 0;
66*c120c564SAndrew Turner }
67*c120c564SAndrew Turner 
setTS(const uint64_t ts_val,const uint8_t updatedBits)68*c120c564SAndrew Turner void StmTrcPacket::setTS(const uint64_t ts_val, const uint8_t updatedBits)
69*c120c564SAndrew Turner {
70*c120c564SAndrew Turner     if(updatedBits == 64)
71*c120c564SAndrew Turner     {
72*c120c564SAndrew Turner         timestamp = ts_val;
73*c120c564SAndrew Turner     }
74*c120c564SAndrew Turner     else
75*c120c564SAndrew Turner     {
76*c120c564SAndrew Turner         uint64_t mask = (0x1ULL << updatedBits) - 1;
77*c120c564SAndrew Turner         timestamp &= ~mask;
78*c120c564SAndrew Turner         timestamp |= ts_val & mask;
79*c120c564SAndrew Turner     }
80*c120c564SAndrew Turner     pkt_ts_bits = updatedBits;  // mark number of bits
81*c120c564SAndrew Turner     pkt_has_ts = 1;
82*c120c564SAndrew Turner }
83*c120c564SAndrew Turner 
84*c120c564SAndrew Turner // printing
toString(std::string & str) const85*c120c564SAndrew Turner void StmTrcPacket::toString(std::string &str) const
86*c120c564SAndrew Turner {
87*c120c564SAndrew Turner     std::string name, desc;
88*c120c564SAndrew Turner     std::ostringstream oss;
89*c120c564SAndrew Turner 
90*c120c564SAndrew Turner     pktTypeName(type,name, desc);
91*c120c564SAndrew Turner     str = name + ":" + desc;
92*c120c564SAndrew Turner 
93*c120c564SAndrew Turner     // extended information
94*c120c564SAndrew Turner     switch(type)
95*c120c564SAndrew Turner     {
96*c120c564SAndrew Turner     case STM_PKT_INCOMPLETE_EOT:
97*c120c564SAndrew Turner     case STM_PKT_BAD_SEQUENCE:
98*c120c564SAndrew Turner         pktTypeName(err_type,name, desc);
99*c120c564SAndrew Turner         str+= "[" + name + "]";
100*c120c564SAndrew Turner         break;
101*c120c564SAndrew Turner 
102*c120c564SAndrew Turner     case STM_PKT_VERSION:
103*c120c564SAndrew Turner         oss << "; Ver=" << (uint16_t)payload.D8;
104*c120c564SAndrew Turner         str+= oss.str();
105*c120c564SAndrew Turner         break;
106*c120c564SAndrew Turner 
107*c120c564SAndrew Turner     case STM_PKT_FREQ:
108*c120c564SAndrew Turner         oss << "; Freq=" << std::dec << payload.D32 << "Hz";
109*c120c564SAndrew Turner         str+= oss.str();
110*c120c564SAndrew Turner         break;
111*c120c564SAndrew Turner 
112*c120c564SAndrew Turner     case STM_PKT_TRIG:
113*c120c564SAndrew Turner         oss << "; TrigData=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8;
114*c120c564SAndrew Turner         str+= oss.str();
115*c120c564SAndrew Turner         break;
116*c120c564SAndrew Turner 
117*c120c564SAndrew Turner     case STM_PKT_M8:
118*c120c564SAndrew Turner         oss << "; Master=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)master;
119*c120c564SAndrew Turner         str+= oss.str();
120*c120c564SAndrew Turner         break;
121*c120c564SAndrew Turner 
122*c120c564SAndrew Turner     case STM_PKT_C8:
123*c120c564SAndrew Turner     case STM_PKT_C16:
124*c120c564SAndrew Turner         oss << "; Chan=0x" << std::hex << std::setw(4) << std::setfill('0') << channel;
125*c120c564SAndrew Turner         str+= oss.str();
126*c120c564SAndrew Turner         break;
127*c120c564SAndrew Turner 
128*c120c564SAndrew Turner     case STM_PKT_D4:
129*c120c564SAndrew Turner         oss << "; Data=0x" << std::hex << std::setw(1) << (uint16_t)(payload.D8 & 0xF);
130*c120c564SAndrew Turner         str+= oss.str();
131*c120c564SAndrew Turner         break;
132*c120c564SAndrew Turner 
133*c120c564SAndrew Turner     case STM_PKT_D8:
134*c120c564SAndrew Turner         oss << "; Data=0x" << std::hex << std::setw(2) << std::setfill('0') << (uint16_t)payload.D8;
135*c120c564SAndrew Turner         str+= oss.str();
136*c120c564SAndrew Turner         break;
137*c120c564SAndrew Turner 
138*c120c564SAndrew Turner     case STM_PKT_D16:
139*c120c564SAndrew Turner         oss << "; Data=0x" << std::hex << std::setw(4) << std::setfill('0') << payload.D16;
140*c120c564SAndrew Turner         str+= oss.str();
141*c120c564SAndrew Turner         break;
142*c120c564SAndrew Turner 
143*c120c564SAndrew Turner     case STM_PKT_D32:
144*c120c564SAndrew Turner         oss << "; Data=0x" << std::hex << std::setw(8) << std::setfill('0') << payload.D32;
145*c120c564SAndrew Turner         str+= oss.str();
146*c120c564SAndrew Turner         break;
147*c120c564SAndrew Turner 
148*c120c564SAndrew Turner     case STM_PKT_D64:
149*c120c564SAndrew Turner         oss << "; Data=0x" << std::hex << std::setw(16) << std::setfill('0') << payload.D64;
150*c120c564SAndrew Turner         str+= oss.str();
151*c120c564SAndrew Turner         break;
152*c120c564SAndrew Turner     }
153*c120c564SAndrew Turner 
154*c120c564SAndrew Turner     if(isTSPkt())
155*c120c564SAndrew Turner     {
156*c120c564SAndrew Turner         std::string valStr;
157*c120c564SAndrew Turner         trcPrintableElem::getValStr(valStr,64,64,timestamp,true,pkt_ts_bits);
158*c120c564SAndrew Turner         str += "; TS=" + valStr;
159*c120c564SAndrew Turner     }
160*c120c564SAndrew Turner }
161*c120c564SAndrew Turner 
toStringFmt(const uint32_t fmtFlags,std::string & str) const162*c120c564SAndrew Turner void StmTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
163*c120c564SAndrew Turner {
164*c120c564SAndrew Turner     // no formatting for now.
165*c120c564SAndrew Turner     toString(str);
166*c120c564SAndrew Turner }
167*c120c564SAndrew Turner 
pktTypeName(const ocsd_stm_pkt_type pkt_type,std::string & name,std::string & desc) const168*c120c564SAndrew Turner void StmTrcPacket::pktTypeName(const ocsd_stm_pkt_type pkt_type, std::string &name, std::string &desc) const
169*c120c564SAndrew Turner {
170*c120c564SAndrew Turner     std::ostringstream oss_name;
171*c120c564SAndrew Turner     std::ostringstream oss_desc;
172*c120c564SAndrew Turner     bool addMarkerTS = false;
173*c120c564SAndrew Turner 
174*c120c564SAndrew Turner 
175*c120c564SAndrew Turner     switch(pkt_type)
176*c120c564SAndrew Turner     {
177*c120c564SAndrew Turner     case STM_PKT_RESERVED:
178*c120c564SAndrew Turner         oss_name << "RESERVED";
179*c120c564SAndrew Turner         oss_desc << "Reserved Packet Header";
180*c120c564SAndrew Turner         break;
181*c120c564SAndrew Turner 
182*c120c564SAndrew Turner     case STM_PKT_NOTSYNC:
183*c120c564SAndrew Turner         oss_name << "NOTSYNC";
184*c120c564SAndrew Turner         oss_desc << "STM not synchronised";
185*c120c564SAndrew Turner         break;
186*c120c564SAndrew Turner 
187*c120c564SAndrew Turner     case STM_PKT_INCOMPLETE_EOT:
188*c120c564SAndrew Turner         oss_name << "INCOMPLETE_EOT";
189*c120c564SAndrew Turner         oss_desc << "Incomplete packet flushed at end of trace";
190*c120c564SAndrew Turner         break;
191*c120c564SAndrew Turner 
192*c120c564SAndrew Turner     case STM_PKT_NO_ERR_TYPE:
193*c120c564SAndrew Turner         oss_name << "NO_ERR_TYPE";
194*c120c564SAndrew Turner         oss_desc << "Error type not set";
195*c120c564SAndrew Turner         break;
196*c120c564SAndrew Turner 
197*c120c564SAndrew Turner     case STM_PKT_BAD_SEQUENCE:
198*c120c564SAndrew Turner         oss_name << "BAD_SEQUENCE";
199*c120c564SAndrew Turner         oss_desc << "Invalid sequence in packet";
200*c120c564SAndrew Turner         break;
201*c120c564SAndrew Turner 
202*c120c564SAndrew Turner     case STM_PKT_ASYNC:
203*c120c564SAndrew Turner         oss_name << "ASYNC";
204*c120c564SAndrew Turner         oss_desc << "Alignment synchronisation packet";
205*c120c564SAndrew Turner         break;
206*c120c564SAndrew Turner 
207*c120c564SAndrew Turner     case STM_PKT_VERSION:
208*c120c564SAndrew Turner         oss_name << "VERSION";
209*c120c564SAndrew Turner         oss_desc << "Version packet";
210*c120c564SAndrew Turner         break;
211*c120c564SAndrew Turner 
212*c120c564SAndrew Turner     case STM_PKT_FREQ:
213*c120c564SAndrew Turner         oss_name << "FREQ";
214*c120c564SAndrew Turner         oss_desc << "Frequency packet";
215*c120c564SAndrew Turner         break;
216*c120c564SAndrew Turner 
217*c120c564SAndrew Turner     case STM_PKT_NULL:
218*c120c564SAndrew Turner         oss_name << "NULL";
219*c120c564SAndrew Turner         oss_desc << "Null packet";
220*c120c564SAndrew Turner         break;
221*c120c564SAndrew Turner 
222*c120c564SAndrew Turner     case STM_PKT_TRIG:
223*c120c564SAndrew Turner         oss_name << "TRIG";
224*c120c564SAndrew Turner         oss_desc << "Trigger packet";
225*c120c564SAndrew Turner         addMarkerTS = true;
226*c120c564SAndrew Turner         break;
227*c120c564SAndrew Turner 
228*c120c564SAndrew Turner     case STM_PKT_GERR:
229*c120c564SAndrew Turner         oss_name << "GERR";
230*c120c564SAndrew Turner         oss_desc << "Global Error";
231*c120c564SAndrew Turner         break;
232*c120c564SAndrew Turner 
233*c120c564SAndrew Turner     case STM_PKT_MERR:
234*c120c564SAndrew Turner         oss_name << "MERR";
235*c120c564SAndrew Turner         oss_desc << "Master Error";
236*c120c564SAndrew Turner         break;
237*c120c564SAndrew Turner 
238*c120c564SAndrew Turner     case STM_PKT_M8:
239*c120c564SAndrew Turner         oss_name << "M8";
240*c120c564SAndrew Turner         oss_desc << "Set current master";
241*c120c564SAndrew Turner         break;
242*c120c564SAndrew Turner 
243*c120c564SAndrew Turner     case STM_PKT_C8:
244*c120c564SAndrew Turner         oss_name << "C8";
245*c120c564SAndrew Turner         oss_desc << "Set current channel";
246*c120c564SAndrew Turner         break;
247*c120c564SAndrew Turner 
248*c120c564SAndrew Turner     case STM_PKT_C16:
249*c120c564SAndrew Turner         oss_name << "C16";
250*c120c564SAndrew Turner         oss_desc << "Set current channel";
251*c120c564SAndrew Turner         break;
252*c120c564SAndrew Turner 
253*c120c564SAndrew Turner     case STM_PKT_FLAG:
254*c120c564SAndrew Turner         oss_name << "FLAG";
255*c120c564SAndrew Turner         oss_desc << "Flag packet";
256*c120c564SAndrew Turner         addMarkerTS = true;
257*c120c564SAndrew Turner         break;
258*c120c564SAndrew Turner 
259*c120c564SAndrew Turner     case STM_PKT_D4:
260*c120c564SAndrew Turner         oss_name << "D4";
261*c120c564SAndrew Turner         oss_desc << "4 bit data";
262*c120c564SAndrew Turner         addMarkerTS = true;
263*c120c564SAndrew Turner         break;
264*c120c564SAndrew Turner 
265*c120c564SAndrew Turner     case STM_PKT_D8:
266*c120c564SAndrew Turner         oss_name << "D8";
267*c120c564SAndrew Turner         oss_desc << "8 bit data";
268*c120c564SAndrew Turner         addMarkerTS = true;
269*c120c564SAndrew Turner         break;
270*c120c564SAndrew Turner 
271*c120c564SAndrew Turner     case STM_PKT_D16:
272*c120c564SAndrew Turner         oss_name << "D16";
273*c120c564SAndrew Turner         oss_desc << "16 bit data";
274*c120c564SAndrew Turner         addMarkerTS = true;
275*c120c564SAndrew Turner         break;
276*c120c564SAndrew Turner 
277*c120c564SAndrew Turner     case STM_PKT_D32:
278*c120c564SAndrew Turner         oss_name << "D32";
279*c120c564SAndrew Turner         oss_desc << "32 bit data";
280*c120c564SAndrew Turner         addMarkerTS = true;
281*c120c564SAndrew Turner         break;
282*c120c564SAndrew Turner 
283*c120c564SAndrew Turner     case STM_PKT_D64:
284*c120c564SAndrew Turner         oss_name << "D64";
285*c120c564SAndrew Turner         oss_desc << "64 bit data";
286*c120c564SAndrew Turner         addMarkerTS = true;
287*c120c564SAndrew Turner         break;
288*c120c564SAndrew Turner 
289*c120c564SAndrew Turner     default:
290*c120c564SAndrew Turner         oss_name << "UNKNOWN";
291*c120c564SAndrew Turner         oss_desc << "ERROR: unknown packet type";
292*c120c564SAndrew Turner         break;
293*c120c564SAndrew Turner     }
294*c120c564SAndrew Turner 
295*c120c564SAndrew Turner     if(addMarkerTS)
296*c120c564SAndrew Turner     {
297*c120c564SAndrew Turner         if(isMarkerPkt())
298*c120c564SAndrew Turner         {
299*c120c564SAndrew Turner             oss_name << "M";
300*c120c564SAndrew Turner             oss_desc << " + marker";
301*c120c564SAndrew Turner         }
302*c120c564SAndrew Turner 
303*c120c564SAndrew Turner         if(isTSPkt())
304*c120c564SAndrew Turner         {
305*c120c564SAndrew Turner             oss_name << "TS";
306*c120c564SAndrew Turner             oss_desc << " + timestamp";
307*c120c564SAndrew Turner         }
308*c120c564SAndrew Turner     }
309*c120c564SAndrew Turner     desc = oss_desc.str();
310*c120c564SAndrew Turner     name =  oss_name.str();
311*c120c564SAndrew Turner }
312*c120c564SAndrew Turner 
313*c120c564SAndrew Turner 
314*c120c564SAndrew Turner /* End of File trc_pkt_elem_stm.cpp */
315