xref: /freebsd-src/contrib/opencsd/decoder/source/ptm/trc_pkt_elem_ptm.cpp (revision c120c5646da1a1d2c4d90fd069a7e2a8d559eb46)
1*c120c564SAndrew Turner /*
2*c120c564SAndrew Turner  * \file       trc_pkt_elem_ptm.cpp
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 #include <sstream>
37*c120c564SAndrew Turner #include <iomanip>
38*c120c564SAndrew Turner 
39*c120c564SAndrew Turner #include "opencsd/ptm/trc_pkt_elem_ptm.h"
40*c120c564SAndrew Turner 
PtmTrcPacket()41*c120c564SAndrew Turner PtmTrcPacket::PtmTrcPacket()
42*c120c564SAndrew Turner {
43*c120c564SAndrew Turner }
44*c120c564SAndrew Turner 
~PtmTrcPacket()45*c120c564SAndrew Turner PtmTrcPacket::~PtmTrcPacket()
46*c120c564SAndrew Turner {
47*c120c564SAndrew Turner }
48*c120c564SAndrew Turner 
operator =(const ocsd_ptm_pkt * p_pkt)49*c120c564SAndrew Turner PtmTrcPacket &PtmTrcPacket::operator =(const ocsd_ptm_pkt* p_pkt)
50*c120c564SAndrew Turner {
51*c120c564SAndrew Turner     *dynamic_cast<ocsd_ptm_pkt *>(this) = *p_pkt;
52*c120c564SAndrew Turner     return *this;
53*c120c564SAndrew Turner }
54*c120c564SAndrew Turner 
Clear()55*c120c564SAndrew Turner void PtmTrcPacket::Clear()
56*c120c564SAndrew Turner {
57*c120c564SAndrew Turner     err_type = PTM_PKT_NOERROR;
58*c120c564SAndrew Turner     cycle_count = 0;
59*c120c564SAndrew Turner     cc_valid = 0;
60*c120c564SAndrew Turner     context.updated = 0;
61*c120c564SAndrew Turner     context.updated_c = 0;
62*c120c564SAndrew Turner     context.updated_v = 0;
63*c120c564SAndrew Turner     ts_update_bits = 0;
64*c120c564SAndrew Turner     atom.En_bits = 0;
65*c120c564SAndrew Turner     exception.bits.present = 0;
66*c120c564SAndrew Turner     prev_isa = curr_isa;    // mark ISA as not changed
67*c120c564SAndrew Turner }
68*c120c564SAndrew Turner 
ResetState()69*c120c564SAndrew Turner void PtmTrcPacket::ResetState()
70*c120c564SAndrew Turner {
71*c120c564SAndrew Turner     type = PTM_PKT_NOTSYNC;
72*c120c564SAndrew Turner 
73*c120c564SAndrew Turner     context.ctxtID = 0;
74*c120c564SAndrew Turner     context.VMID = 0;
75*c120c564SAndrew Turner     context.curr_alt_isa = 0;
76*c120c564SAndrew Turner     context.curr_Hyp = 0;
77*c120c564SAndrew Turner     context.curr_NS = 0;
78*c120c564SAndrew Turner 
79*c120c564SAndrew Turner     addr.valid_bits = 0;
80*c120c564SAndrew Turner     addr.size = VA_32BIT;
81*c120c564SAndrew Turner     addr.val = 0;
82*c120c564SAndrew Turner 
83*c120c564SAndrew Turner     prev_isa = curr_isa = ocsd_isa_unknown;
84*c120c564SAndrew Turner 
85*c120c564SAndrew Turner     timestamp = 0;
86*c120c564SAndrew Turner 
87*c120c564SAndrew Turner     Clear();
88*c120c564SAndrew Turner }
89*c120c564SAndrew Turner 
UpdateAddress(const ocsd_vaddr_t partAddrVal,const int updateBits)90*c120c564SAndrew Turner void PtmTrcPacket::UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits)
91*c120c564SAndrew Turner {
92*c120c564SAndrew Turner     ocsd_vaddr_t validMask = OCSD_VA_MASK;
93*c120c564SAndrew Turner     validMask >>= OCSD_MAX_VA_BITSIZE-updateBits;
94*c120c564SAndrew Turner     addr.pkt_bits = updateBits;
95*c120c564SAndrew Turner     addr.val &= ~validMask;
96*c120c564SAndrew Turner     addr.val |= (partAddrVal & validMask);
97*c120c564SAndrew Turner     if(updateBits > addr.valid_bits)
98*c120c564SAndrew Turner         addr.valid_bits = updateBits;
99*c120c564SAndrew Turner }
100*c120c564SAndrew Turner 
UpdateTimestamp(const uint64_t tsVal,const uint8_t updateBits)101*c120c564SAndrew Turner void PtmTrcPacket::UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits)
102*c120c564SAndrew Turner {
103*c120c564SAndrew Turner     uint64_t validMask = ~0ULL;
104*c120c564SAndrew Turner     validMask >>= 64-updateBits;
105*c120c564SAndrew Turner     timestamp &= ~validMask;
106*c120c564SAndrew Turner     timestamp |= (tsVal & validMask);
107*c120c564SAndrew Turner     ts_update_bits = updateBits;
108*c120c564SAndrew Turner }
109*c120c564SAndrew Turner 
SetCycleAccAtomFromPHdr(const uint8_t pHdr)110*c120c564SAndrew Turner void PtmTrcPacket::SetCycleAccAtomFromPHdr(const uint8_t pHdr)
111*c120c564SAndrew Turner {
112*c120c564SAndrew Turner     atom.num = 1;
113*c120c564SAndrew Turner     atom.En_bits = (pHdr & 0x2) ? 0x0 : 0x1;
114*c120c564SAndrew Turner }
115*c120c564SAndrew Turner 
SetAtomFromPHdr(const uint8_t pHdr)116*c120c564SAndrew Turner void PtmTrcPacket::SetAtomFromPHdr(const uint8_t pHdr)
117*c120c564SAndrew Turner {
118*c120c564SAndrew Turner     // how many atoms
119*c120c564SAndrew Turner     uint8_t atom_fmt_id = pHdr & 0xF0;
120*c120c564SAndrew Turner     if(atom_fmt_id == 0x80)
121*c120c564SAndrew Turner     {
122*c120c564SAndrew Turner         // format 1 or 2
123*c120c564SAndrew Turner         if((pHdr & 0x08) == 0x08)
124*c120c564SAndrew Turner             atom.num = 2;
125*c120c564SAndrew Turner         else
126*c120c564SAndrew Turner             atom.num = 1;
127*c120c564SAndrew Turner     }
128*c120c564SAndrew Turner     else if(atom_fmt_id == 0x90)
129*c120c564SAndrew Turner     {
130*c120c564SAndrew Turner         atom.num = 3;
131*c120c564SAndrew Turner     }
132*c120c564SAndrew Turner     else
133*c120c564SAndrew Turner     {
134*c120c564SAndrew Turner         if((pHdr & 0xE0) == 0xA0)
135*c120c564SAndrew Turner             atom.num = 4;
136*c120c564SAndrew Turner         else
137*c120c564SAndrew Turner             atom.num = 5;
138*c120c564SAndrew Turner     }
139*c120c564SAndrew Turner 
140*c120c564SAndrew Turner     // extract the E/N bits
141*c120c564SAndrew Turner     uint8_t atom_mask = 0x2;    // start @ bit 1 - newest instruction
142*c120c564SAndrew Turner     atom.En_bits = 0;
143*c120c564SAndrew Turner     for(int i = 0; i < atom.num; i++)
144*c120c564SAndrew Turner     {
145*c120c564SAndrew Turner         atom.En_bits <<= 1;
146*c120c564SAndrew Turner         if(!(atom_mask & pHdr)) // 0 bit is an E in PTM -> a one in the standard atom bit type
147*c120c564SAndrew Turner             atom.En_bits |= 0x1;
148*c120c564SAndrew Turner         atom_mask <<= 1;
149*c120c564SAndrew Turner     }
150*c120c564SAndrew Turner }
151*c120c564SAndrew Turner 
152*c120c564SAndrew Turner     // printing
toString(std::string & str) const153*c120c564SAndrew Turner void PtmTrcPacket::toString(std::string &str) const
154*c120c564SAndrew Turner {
155*c120c564SAndrew Turner     std::string temp1, temp2;
156*c120c564SAndrew Turner     std::ostringstream oss;
157*c120c564SAndrew Turner 
158*c120c564SAndrew Turner     packetTypeName(type, temp1,temp2);
159*c120c564SAndrew Turner     oss << temp1 << " : " << temp2 << "; ";
160*c120c564SAndrew Turner 
161*c120c564SAndrew Turner     // some packets require additional data.
162*c120c564SAndrew Turner     switch(type)
163*c120c564SAndrew Turner     {
164*c120c564SAndrew Turner     case PTM_PKT_BAD_SEQUENCE:
165*c120c564SAndrew Turner         packetTypeName(err_type, temp1,temp2);
166*c120c564SAndrew Turner         oss << "[" << temp1 << "]; ";
167*c120c564SAndrew Turner         break;
168*c120c564SAndrew Turner 
169*c120c564SAndrew Turner     case PTM_PKT_ATOM:
170*c120c564SAndrew Turner         getAtomStr(temp1);
171*c120c564SAndrew Turner         oss << temp1;
172*c120c564SAndrew Turner         break;
173*c120c564SAndrew Turner 
174*c120c564SAndrew Turner     case PTM_PKT_CONTEXT_ID:
175*c120c564SAndrew Turner         oss << "CtxtID=0x" << std::hex << std::setw(8) << std::setfill('0') << context.ctxtID << "; ";
176*c120c564SAndrew Turner         break;
177*c120c564SAndrew Turner 
178*c120c564SAndrew Turner     case PTM_PKT_VMID:
179*c120c564SAndrew Turner         oss << "VMID=0x" << std::hex << std::setw(2) << std::setfill('0') << context.VMID << "; ";
180*c120c564SAndrew Turner         break;
181*c120c564SAndrew Turner 
182*c120c564SAndrew Turner     case PTM_PKT_WPOINT_UPDATE:
183*c120c564SAndrew Turner     case PTM_PKT_BRANCH_ADDRESS:
184*c120c564SAndrew Turner         getBranchAddressStr(temp1);
185*c120c564SAndrew Turner         oss << temp1;
186*c120c564SAndrew Turner         break;
187*c120c564SAndrew Turner 
188*c120c564SAndrew Turner     case PTM_PKT_I_SYNC:
189*c120c564SAndrew Turner         getISyncStr(temp1);
190*c120c564SAndrew Turner         oss << temp1;
191*c120c564SAndrew Turner         break;
192*c120c564SAndrew Turner 
193*c120c564SAndrew Turner     case PTM_PKT_TIMESTAMP:
194*c120c564SAndrew Turner         getTSStr(temp1);
195*c120c564SAndrew Turner         oss << temp1;
196*c120c564SAndrew Turner         break;
197*c120c564SAndrew Turner     }
198*c120c564SAndrew Turner 
199*c120c564SAndrew Turner     str = oss.str();
200*c120c564SAndrew Turner }
201*c120c564SAndrew Turner 
toStringFmt(const uint32_t fmtFlags,std::string & str) const202*c120c564SAndrew Turner void PtmTrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
203*c120c564SAndrew Turner {
204*c120c564SAndrew Turner     toString(str);
205*c120c564SAndrew Turner }
206*c120c564SAndrew Turner 
getAtomStr(std::string & valStr) const207*c120c564SAndrew Turner void PtmTrcPacket::getAtomStr(std::string &valStr) const
208*c120c564SAndrew Turner {
209*c120c564SAndrew Turner     std::ostringstream oss;
210*c120c564SAndrew Turner     uint32_t bitpattern = atom.En_bits; // arranged LSBit oldest, MSbit newest
211*c120c564SAndrew Turner 
212*c120c564SAndrew Turner     if(cc_valid)    // cycle accurate trace - single atom
213*c120c564SAndrew Turner     {
214*c120c564SAndrew Turner         std::string subStr;
215*c120c564SAndrew Turner         oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
216*c120c564SAndrew Turner         oss << "; ";
217*c120c564SAndrew Turner         getCycleCountStr(subStr);
218*c120c564SAndrew Turner         oss << subStr;
219*c120c564SAndrew Turner     }
220*c120c564SAndrew Turner     else
221*c120c564SAndrew Turner     {
222*c120c564SAndrew Turner         // none cycle count
223*c120c564SAndrew Turner         for(int i = 0; i < atom.num; i++)
224*c120c564SAndrew Turner         {
225*c120c564SAndrew Turner             oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
226*c120c564SAndrew Turner             bitpattern >>= 1;
227*c120c564SAndrew Turner         }
228*c120c564SAndrew Turner         oss << "; ";
229*c120c564SAndrew Turner     }
230*c120c564SAndrew Turner     valStr = oss.str();
231*c120c564SAndrew Turner }
232*c120c564SAndrew Turner 
getBranchAddressStr(std::string & valStr) const233*c120c564SAndrew Turner void PtmTrcPacket::getBranchAddressStr(std::string &valStr) const
234*c120c564SAndrew Turner {
235*c120c564SAndrew Turner     std::ostringstream oss;
236*c120c564SAndrew Turner     std::string subStr;
237*c120c564SAndrew Turner 
238*c120c564SAndrew Turner     // print address.
239*c120c564SAndrew Turner     trcPrintableElem::getValStr(subStr,32,addr.valid_bits,addr.val,true,addr.pkt_bits);
240*c120c564SAndrew Turner     oss << "Addr=" << subStr << "; ";
241*c120c564SAndrew Turner 
242*c120c564SAndrew Turner     // current ISA if changed.
243*c120c564SAndrew Turner     if(curr_isa != prev_isa)
244*c120c564SAndrew Turner     {
245*c120c564SAndrew Turner         getISAStr(subStr);
246*c120c564SAndrew Turner         oss << subStr;
247*c120c564SAndrew Turner     }
248*c120c564SAndrew Turner 
249*c120c564SAndrew Turner     // S / NS etc if changed.
250*c120c564SAndrew Turner     if(context.updated)
251*c120c564SAndrew Turner     {
252*c120c564SAndrew Turner         oss << (context.curr_NS ? "NS; " : "S; ");
253*c120c564SAndrew Turner         oss << (context.curr_Hyp ? "Hyp; " : "");
254*c120c564SAndrew Turner     }
255*c120c564SAndrew Turner 
256*c120c564SAndrew Turner     // exception?
257*c120c564SAndrew Turner     if(exception.bits.present)
258*c120c564SAndrew Turner     {
259*c120c564SAndrew Turner         getExcepStr(subStr);
260*c120c564SAndrew Turner         oss << subStr;
261*c120c564SAndrew Turner     }
262*c120c564SAndrew Turner 
263*c120c564SAndrew Turner     if(cc_valid)
264*c120c564SAndrew Turner     {
265*c120c564SAndrew Turner         getCycleCountStr(subStr);
266*c120c564SAndrew Turner         oss << subStr;
267*c120c564SAndrew Turner     }
268*c120c564SAndrew Turner     valStr = oss.str();
269*c120c564SAndrew Turner }
270*c120c564SAndrew Turner 
getISAStr(std::string & isaStr) const271*c120c564SAndrew Turner void PtmTrcPacket::getISAStr(std::string &isaStr) const
272*c120c564SAndrew Turner {
273*c120c564SAndrew Turner     std::ostringstream oss;
274*c120c564SAndrew Turner     oss << "ISA=";
275*c120c564SAndrew Turner     switch(curr_isa)
276*c120c564SAndrew Turner     {
277*c120c564SAndrew Turner     case ocsd_isa_arm:
278*c120c564SAndrew Turner         oss << "ARM(32); ";
279*c120c564SAndrew Turner         break;
280*c120c564SAndrew Turner 
281*c120c564SAndrew Turner     case ocsd_isa_thumb2:
282*c120c564SAndrew Turner         oss << "Thumb2; ";
283*c120c564SAndrew Turner         break;
284*c120c564SAndrew Turner 
285*c120c564SAndrew Turner     case ocsd_isa_aarch64:
286*c120c564SAndrew Turner         oss << "AArch64; ";
287*c120c564SAndrew Turner         break;
288*c120c564SAndrew Turner 
289*c120c564SAndrew Turner     case ocsd_isa_tee:
290*c120c564SAndrew Turner         oss << "ThumbEE; ";
291*c120c564SAndrew Turner         break;
292*c120c564SAndrew Turner 
293*c120c564SAndrew Turner     case ocsd_isa_jazelle:
294*c120c564SAndrew Turner         oss << "Jazelle; ";
295*c120c564SAndrew Turner         break;
296*c120c564SAndrew Turner 
297*c120c564SAndrew Turner     default:
298*c120c564SAndrew Turner     case ocsd_isa_unknown:
299*c120c564SAndrew Turner         oss << "Unknown; ";
300*c120c564SAndrew Turner         break;
301*c120c564SAndrew Turner     }
302*c120c564SAndrew Turner     isaStr = oss.str();
303*c120c564SAndrew Turner }
304*c120c564SAndrew Turner 
getExcepStr(std::string & excepStr) const305*c120c564SAndrew Turner void PtmTrcPacket::getExcepStr(std::string &excepStr) const
306*c120c564SAndrew Turner {
307*c120c564SAndrew Turner     static const char *ARv7Excep[] = {
308*c120c564SAndrew Turner         "No Exception", "Debug Halt", "SMC", "Hyp",
309*c120c564SAndrew Turner         "Async Data Abort", "Jazelle", "Reserved", "Reserved",
310*c120c564SAndrew Turner         "PE Reset", "Undefined Instr", "SVC", "Prefetch Abort",
311*c120c564SAndrew Turner         "Data Fault", "Generic", "IRQ", "FIQ"
312*c120c564SAndrew Turner     };
313*c120c564SAndrew Turner 
314*c120c564SAndrew Turner     std::ostringstream oss;
315*c120c564SAndrew Turner     oss << "Excep=";
316*c120c564SAndrew Turner     if(exception.number < 16)
317*c120c564SAndrew Turner         oss << ARv7Excep[exception.number];
318*c120c564SAndrew Turner     else
319*c120c564SAndrew Turner         oss << "Unknown";
320*c120c564SAndrew Turner     oss << " [" << std::hex << std::setw(2) << std::setfill('0') << exception.number << "]; ";
321*c120c564SAndrew Turner     excepStr = oss.str();
322*c120c564SAndrew Turner }
323*c120c564SAndrew Turner 
getISyncStr(std::string & valStr) const324*c120c564SAndrew Turner void PtmTrcPacket::getISyncStr(std::string &valStr) const
325*c120c564SAndrew Turner {
326*c120c564SAndrew Turner     std::ostringstream oss;
327*c120c564SAndrew Turner     std::string tmpStr;
328*c120c564SAndrew Turner     static const char *reason[] = { "Periodic", "Trace Enable", "Restart Overflow", "Debug Exit" };
329*c120c564SAndrew Turner 
330*c120c564SAndrew Turner     // reason.
331*c120c564SAndrew Turner     oss << "(" << reason[(int)i_sync_reason] << "); ";
332*c120c564SAndrew Turner 
333*c120c564SAndrew Turner     // full address.
334*c120c564SAndrew Turner     oss << "Addr=0x" << std::hex << std::setfill('0') << std::setw(8) << (uint32_t)addr.val << "; ";
335*c120c564SAndrew Turner 
336*c120c564SAndrew Turner     oss << (context.curr_NS ? "NS; " : "S; ");
337*c120c564SAndrew Turner     oss << (context.curr_Hyp ? "Hyp; " : " ");
338*c120c564SAndrew Turner 
339*c120c564SAndrew Turner     if(context.updated_c)
340*c120c564SAndrew Turner     {
341*c120c564SAndrew Turner         oss << "CtxtID=" << std::hex  << std::setw(8) << std::setfill('0') << context.ctxtID << "; ";
342*c120c564SAndrew Turner     }
343*c120c564SAndrew Turner 
344*c120c564SAndrew Turner     getISAStr(tmpStr);
345*c120c564SAndrew Turner     oss << tmpStr;
346*c120c564SAndrew Turner 
347*c120c564SAndrew Turner     if(cc_valid)
348*c120c564SAndrew Turner     {
349*c120c564SAndrew Turner         getCycleCountStr(tmpStr);
350*c120c564SAndrew Turner         oss << tmpStr;
351*c120c564SAndrew Turner     }
352*c120c564SAndrew Turner     valStr = oss.str();
353*c120c564SAndrew Turner }
354*c120c564SAndrew Turner 
getTSStr(std::string & valStr) const355*c120c564SAndrew Turner void PtmTrcPacket::getTSStr(std::string &valStr) const
356*c120c564SAndrew Turner {
357*c120c564SAndrew Turner     std::string tmpStr;
358*c120c564SAndrew Turner     std::ostringstream oss;
359*c120c564SAndrew Turner 
360*c120c564SAndrew Turner     trcPrintableElem::getValStr(tmpStr,64,64,timestamp,true,ts_update_bits);
361*c120c564SAndrew Turner     oss << "TS=" << tmpStr + "(" << std::dec << timestamp << "); ";
362*c120c564SAndrew Turner     if(cc_valid)
363*c120c564SAndrew Turner     {
364*c120c564SAndrew Turner         getCycleCountStr(tmpStr);
365*c120c564SAndrew Turner         oss << tmpStr;
366*c120c564SAndrew Turner     }
367*c120c564SAndrew Turner     valStr = oss.str();
368*c120c564SAndrew Turner }
369*c120c564SAndrew Turner 
370*c120c564SAndrew Turner 
getCycleCountStr(std::string & subStr) const371*c120c564SAndrew Turner void PtmTrcPacket::getCycleCountStr(std::string &subStr) const
372*c120c564SAndrew Turner {
373*c120c564SAndrew Turner     std::ostringstream oss;
374*c120c564SAndrew Turner     oss << "Cycles=" << std::dec << cycle_count << "; ";
375*c120c564SAndrew Turner     subStr = oss.str();
376*c120c564SAndrew Turner }
377*c120c564SAndrew Turner 
378*c120c564SAndrew Turner 
packetTypeName(const ocsd_ptm_pkt_type pkt_type,std::string & name,std::string & desc) const379*c120c564SAndrew Turner void PtmTrcPacket::packetTypeName(const ocsd_ptm_pkt_type pkt_type, std::string &name, std::string &desc) const
380*c120c564SAndrew Turner {
381*c120c564SAndrew Turner     switch(pkt_type)
382*c120c564SAndrew Turner     {
383*c120c564SAndrew Turner     case PTM_PKT_NOTSYNC:        //!< no sync found yet
384*c120c564SAndrew Turner         name = "NOTSYNC";
385*c120c564SAndrew Turner         desc = "PTM Not Synchronised";
386*c120c564SAndrew Turner         break;
387*c120c564SAndrew Turner 
388*c120c564SAndrew Turner     case PTM_PKT_INCOMPLETE_EOT:
389*c120c564SAndrew Turner         name = "INCOMPLETE_EOT";
390*c120c564SAndrew Turner         desc = "Incomplete packet flushed at end of trace";
391*c120c564SAndrew Turner         break;
392*c120c564SAndrew Turner 
393*c120c564SAndrew Turner     case PTM_PKT_NOERROR:
394*c120c564SAndrew Turner         name = "NO_ERROR";
395*c120c564SAndrew Turner         desc = "Error type not set";
396*c120c564SAndrew Turner         break;
397*c120c564SAndrew Turner 
398*c120c564SAndrew Turner     case PTM_PKT_BAD_SEQUENCE:
399*c120c564SAndrew Turner         name = "BAD_SEQUENCE";
400*c120c564SAndrew Turner         desc = "Invalid sequence in packet";
401*c120c564SAndrew Turner         break;
402*c120c564SAndrew Turner 
403*c120c564SAndrew Turner     case PTM_PKT_RESERVED:
404*c120c564SAndrew Turner         name = "RESERVED";
405*c120c564SAndrew Turner         desc = "Reserved Packet Header";
406*c120c564SAndrew Turner         break;
407*c120c564SAndrew Turner 
408*c120c564SAndrew Turner     case PTM_PKT_BRANCH_ADDRESS:
409*c120c564SAndrew Turner         name = "BRANCH_ADDRESS";
410*c120c564SAndrew Turner         desc = "Branch address packet";
411*c120c564SAndrew Turner         break;
412*c120c564SAndrew Turner 
413*c120c564SAndrew Turner     case PTM_PKT_A_SYNC:
414*c120c564SAndrew Turner         name = "ASYNC";
415*c120c564SAndrew Turner         desc = "Alignment Synchronisation Packet";
416*c120c564SAndrew Turner         break;
417*c120c564SAndrew Turner 
418*c120c564SAndrew Turner 	case PTM_PKT_I_SYNC:
419*c120c564SAndrew Turner         name = "ISYNC";
420*c120c564SAndrew Turner         desc = "Instruction Synchronisation packet";
421*c120c564SAndrew Turner         break;
422*c120c564SAndrew Turner 
423*c120c564SAndrew Turner     case PTM_PKT_TRIGGER:
424*c120c564SAndrew Turner         name = "TRIGGER";
425*c120c564SAndrew Turner         desc = "Trigger Event packet";
426*c120c564SAndrew Turner         break;
427*c120c564SAndrew Turner 
428*c120c564SAndrew Turner 	case PTM_PKT_WPOINT_UPDATE:
429*c120c564SAndrew Turner         name = "WP_UPDATE";
430*c120c564SAndrew Turner         desc = "Waypoint update packet";
431*c120c564SAndrew Turner         break;
432*c120c564SAndrew Turner 
433*c120c564SAndrew Turner 	case PTM_PKT_IGNORE:
434*c120c564SAndrew Turner         name = "IGNORE";
435*c120c564SAndrew Turner         desc = "Ignore packet";
436*c120c564SAndrew Turner         break;
437*c120c564SAndrew Turner 
438*c120c564SAndrew Turner 	case PTM_PKT_CONTEXT_ID:
439*c120c564SAndrew Turner         name = "CTXTID";
440*c120c564SAndrew Turner         desc = "Context ID packet";
441*c120c564SAndrew Turner         break;
442*c120c564SAndrew Turner 
443*c120c564SAndrew Turner     case PTM_PKT_VMID:
444*c120c564SAndrew Turner         name = "VMID";
445*c120c564SAndrew Turner         desc = "VM ID packet";
446*c120c564SAndrew Turner         break;
447*c120c564SAndrew Turner 
448*c120c564SAndrew Turner 	case PTM_PKT_ATOM:
449*c120c564SAndrew Turner         name = "ATOM";
450*c120c564SAndrew Turner         desc = "Atom packet";
451*c120c564SAndrew Turner         break;
452*c120c564SAndrew Turner 
453*c120c564SAndrew Turner 	case PTM_PKT_TIMESTAMP:
454*c120c564SAndrew Turner         name = "TIMESTAMP";
455*c120c564SAndrew Turner         desc = "Timestamp packet";
456*c120c564SAndrew Turner         break;
457*c120c564SAndrew Turner 
458*c120c564SAndrew Turner 	case PTM_PKT_EXCEPTION_RET:
459*c120c564SAndrew Turner         name = "ERET";
460*c120c564SAndrew Turner         desc = "Exception return packet";
461*c120c564SAndrew Turner         break;
462*c120c564SAndrew Turner 
463*c120c564SAndrew Turner     default:
464*c120c564SAndrew Turner         name = "UNKNOWN";
465*c120c564SAndrew Turner         desc = "Unknown packet type";
466*c120c564SAndrew Turner         break;
467*c120c564SAndrew Turner 
468*c120c564SAndrew Turner 	//PTM_PKT_BRANCH_OR_BYPASS_EOT,
469*c120c564SAndrew Turner     //PTM_PKT_TPIU_PAD_EOB,
470*c120c564SAndrew Turner     }
471*c120c564SAndrew Turner }
472*c120c564SAndrew Turner 
473*c120c564SAndrew Turner /* End of File trc_pkt_elem_ptm.cpp */
474