xref: /freebsd-src/contrib/opencsd/decoder/source/etmv3/trc_pkt_elem_etmv3.cpp (revision 46e6e290975f19ea62d03f90ac3e523af4dae557)
1c120c564SAndrew Turner /*
2c120c564SAndrew Turner  * \file       trc_pkt_elem_etmv3.cpp
3c120c564SAndrew Turner  * \brief      OpenCSD :
4c120c564SAndrew Turner  *
5c120c564SAndrew Turner  * \copyright  Copyright (c) 2015, ARM Limited. All Rights Reserved.
6c120c564SAndrew Turner  */
7c120c564SAndrew Turner 
8c120c564SAndrew Turner /*
9c120c564SAndrew Turner  * Redistribution and use in source and binary forms, with or without modification,
10c120c564SAndrew Turner  * are permitted provided that the following conditions are met:
11c120c564SAndrew Turner  *
12c120c564SAndrew Turner  * 1. Redistributions of source code must retain the above copyright notice,
13c120c564SAndrew Turner  * this list of conditions and the following disclaimer.
14c120c564SAndrew Turner  *
15c120c564SAndrew Turner  * 2. Redistributions in binary form must reproduce the above copyright notice,
16c120c564SAndrew Turner  * this list of conditions and the following disclaimer in the documentation
17c120c564SAndrew Turner  * and/or other materials provided with the distribution.
18c120c564SAndrew Turner  *
19c120c564SAndrew Turner  * 3. Neither the name of the copyright holder nor the names of its contributors
20c120c564SAndrew Turner  * may be used to endorse or promote products derived from this software without
21c120c564SAndrew Turner  * specific prior written permission.
22c120c564SAndrew Turner  *
23c120c564SAndrew Turner  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24c120c564SAndrew Turner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25c120c564SAndrew Turner  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26c120c564SAndrew Turner  * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27c120c564SAndrew Turner  * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28c120c564SAndrew Turner  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29c120c564SAndrew Turner  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30c120c564SAndrew Turner  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31c120c564SAndrew Turner  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32c120c564SAndrew Turner  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
33c120c564SAndrew Turner  */
34c120c564SAndrew Turner 
35c120c564SAndrew Turner #include <cstring>
36c120c564SAndrew Turner #include <sstream>
37c120c564SAndrew Turner #include <iomanip>
38c120c564SAndrew Turner 
39c120c564SAndrew Turner #include "opencsd/etmv3/trc_pkt_elem_etmv3.h"
40c120c564SAndrew Turner 
EtmV3TrcPacket()41c120c564SAndrew Turner EtmV3TrcPacket::EtmV3TrcPacket()
42c120c564SAndrew Turner {
43c120c564SAndrew Turner     m_pkt_data.addr.size = VA_32BIT;   // etm v3 only handles 32 bit addresses.
44c120c564SAndrew Turner }
45c120c564SAndrew Turner 
~EtmV3TrcPacket()46c120c564SAndrew Turner EtmV3TrcPacket::~EtmV3TrcPacket()
47c120c564SAndrew Turner {
48c120c564SAndrew Turner }
49c120c564SAndrew Turner 
50c120c564SAndrew Turner // update interface - set packet values
51c120c564SAndrew Turner 
52c120c564SAndrew Turner // clear this packet info
Clear()53c120c564SAndrew Turner void EtmV3TrcPacket::Clear()
54c120c564SAndrew Turner {
55c120c564SAndrew Turner     // clear structure flags and counter elements etc, that work per packet.
56c120c564SAndrew Turner     // leave intra packet data unchanged
57c120c564SAndrew Turner     m_pkt_data.addr.pkt_bits = 0;
58c120c564SAndrew Turner     m_pkt_data.prev_isa = m_pkt_data.curr_isa;    // mark ISA as not changed
59c120c564SAndrew Turner     m_pkt_data.exception.bits.present = 0;
60c120c564SAndrew Turner     m_pkt_data.atom.num = 0;
61c120c564SAndrew Turner     m_pkt_data.cycle_count = 0;
62c120c564SAndrew Turner     m_pkt_data.context.updated = 0;
63c120c564SAndrew Turner     m_pkt_data.context.updated_c = 0;
64c120c564SAndrew Turner     m_pkt_data.context.updated_v = 0;
65c120c564SAndrew Turner     m_pkt_data.data.ooo_tag = 0;
66c120c564SAndrew Turner     m_pkt_data.data.value = 0;
67c120c564SAndrew Turner     m_pkt_data.data.update_addr = 0;
68c120c564SAndrew Turner     m_pkt_data.data.update_be = 0;
69c120c564SAndrew Turner     m_pkt_data.data.update_dval = 0;
70c120c564SAndrew Turner     m_pkt_data.ts_update_bits = 0;
71c120c564SAndrew Turner     m_pkt_data.isync_info.has_cycle_count = 0;
72c120c564SAndrew Turner     m_pkt_data.isync_info.has_LSipAddress = 0;
73c120c564SAndrew Turner     m_pkt_data.isync_info.no_address = 0;
74c120c564SAndrew Turner }
75c120c564SAndrew Turner 
76c120c564SAndrew Turner // reset all state including intra packet
ResetState()77c120c564SAndrew Turner void EtmV3TrcPacket::ResetState()
78c120c564SAndrew Turner {
79c120c564SAndrew Turner     memset(&m_pkt_data,0,sizeof(ocsd_etmv3_pkt));
80c120c564SAndrew Turner     m_pkt_data.curr_isa = m_pkt_data.prev_isa = ocsd_isa_unknown;
81c120c564SAndrew Turner }
82c120c564SAndrew Turner 
UpdateAddress(const ocsd_vaddr_t partAddrVal,const int updateBits)83c120c564SAndrew Turner void EtmV3TrcPacket::UpdateAddress(const ocsd_vaddr_t partAddrVal, const int updateBits)
84c120c564SAndrew Turner {
85c120c564SAndrew Turner     ocsd_vaddr_t validMask = OCSD_VA_MASK;
86c120c564SAndrew Turner     validMask >>= OCSD_MAX_VA_BITSIZE-updateBits;
87c120c564SAndrew Turner     m_pkt_data.addr.pkt_bits = updateBits;
88c120c564SAndrew Turner     m_pkt_data.addr.val &= ~validMask;
89c120c564SAndrew Turner     m_pkt_data.addr.val |= (partAddrVal & validMask);
90c120c564SAndrew Turner     if(updateBits > m_pkt_data.addr.valid_bits)
91c120c564SAndrew Turner         m_pkt_data.addr.valid_bits = updateBits;
92c120c564SAndrew Turner }
93c120c564SAndrew Turner 
UpdateDataAddress(const uint32_t value,const uint8_t valid_bits)94c120c564SAndrew Turner void EtmV3TrcPacket::UpdateDataAddress(const uint32_t value, const uint8_t valid_bits)
95c120c564SAndrew Turner {
96c120c564SAndrew Turner     // ETMv3 data addresses 32 bits.
97c120c564SAndrew Turner     uint32_t validMask = 0xFFFFFFFF;
98c120c564SAndrew Turner     validMask >>= 32-valid_bits;
99c120c564SAndrew Turner     m_pkt_data.addr.pkt_bits = valid_bits;
100c120c564SAndrew Turner     m_pkt_data.addr.val &= ~validMask;
101c120c564SAndrew Turner     m_pkt_data.addr.val |= (value & validMask);
102c120c564SAndrew Turner     if(valid_bits > m_pkt_data.addr.valid_bits)
103c120c564SAndrew Turner         m_pkt_data.addr.valid_bits = valid_bits;
104c120c564SAndrew Turner     m_pkt_data.data.update_addr = 1;
105c120c564SAndrew Turner }
106c120c564SAndrew Turner 
UpdateTimestamp(const uint64_t tsVal,const uint8_t updateBits)107c120c564SAndrew Turner void EtmV3TrcPacket::UpdateTimestamp(const uint64_t tsVal, const uint8_t updateBits)
108c120c564SAndrew Turner {
109c120c564SAndrew Turner     uint64_t validMask = ~0ULL;
110c120c564SAndrew Turner     validMask >>= 64-updateBits;
111c120c564SAndrew Turner     m_pkt_data.timestamp &= ~validMask;
112c120c564SAndrew Turner     m_pkt_data.timestamp |= (tsVal & validMask);
113c120c564SAndrew Turner     m_pkt_data.ts_update_bits = updateBits;
114c120c564SAndrew Turner }
115c120c564SAndrew Turner 
116c120c564SAndrew Turner 
117c120c564SAndrew Turner 
SetException(const ocsd_armv7_exception type,const uint16_t number,const bool cancel,const bool cm_type,const int irq_n,const int resume)118c120c564SAndrew Turner void EtmV3TrcPacket::SetException(  const ocsd_armv7_exception type,
119c120c564SAndrew Turner                                     const uint16_t number,
120c120c564SAndrew Turner                                     const bool cancel,
121c120c564SAndrew Turner                                     const bool cm_type,
122c120c564SAndrew Turner                                     const int irq_n  /*= 0*/,
123c120c564SAndrew Turner                                     const int resume /* = 0*/)
124c120c564SAndrew Turner {
125c120c564SAndrew Turner     // initial data
126c120c564SAndrew Turner     m_pkt_data.exception.bits.cancel = cancel ? 1 : 0;
127c120c564SAndrew Turner     m_pkt_data.exception.bits.cm_irq_n = irq_n;
128c120c564SAndrew Turner     m_pkt_data.exception.bits.cm_resume = resume;
129c120c564SAndrew Turner     m_pkt_data.exception.bits.cm_type = cm_type ? 1 : 0;
130c120c564SAndrew Turner     m_pkt_data.exception.number = number;
131c120c564SAndrew Turner     m_pkt_data.exception.type = type;
132c120c564SAndrew Turner 
133c120c564SAndrew Turner     // mark as valid in this packet
134c120c564SAndrew Turner     m_pkt_data.exception.bits.present = 1;
135c120c564SAndrew Turner }
136c120c564SAndrew Turner 
UpdateAtomFromPHdr(const uint8_t pHdr,const bool cycleAccurate)137c120c564SAndrew Turner bool EtmV3TrcPacket::UpdateAtomFromPHdr(const uint8_t pHdr, const bool cycleAccurate)
138c120c564SAndrew Turner {
139c120c564SAndrew Turner     bool bValid = true;
140c120c564SAndrew Turner     uint8_t E = 0, N = 0;
141c120c564SAndrew Turner     if(!cycleAccurate)
142c120c564SAndrew Turner     {
143c120c564SAndrew Turner         if((pHdr & 0x3) == 0x0)
144c120c564SAndrew Turner         {
145c120c564SAndrew Turner             E = ((pHdr >> 2) & 0xF);
146c120c564SAndrew Turner             N = (pHdr & 0x40) ? 1 : 0;
147c120c564SAndrew Turner             m_pkt_data.atom.num = E+N;
148c120c564SAndrew Turner             m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1;
149c120c564SAndrew Turner             m_pkt_data.p_hdr_fmt = 1;
150c120c564SAndrew Turner         }
151c120c564SAndrew Turner         else if((pHdr & 0x3) == 0x2)
152c120c564SAndrew Turner         {
153c120c564SAndrew Turner             m_pkt_data.atom.num = 2;
154c120c564SAndrew Turner             m_pkt_data.p_hdr_fmt = 2;
155c120c564SAndrew Turner             m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) |  (pHdr & 0x4 ? 0 : 0x2);
156c120c564SAndrew Turner         }
157c120c564SAndrew Turner         else
158c120c564SAndrew Turner             bValid = false;
159c120c564SAndrew Turner     }
160c120c564SAndrew Turner     else
161c120c564SAndrew Turner     {
162c120c564SAndrew Turner         uint8_t pHdr_code = pHdr & 0xA3;
163c120c564SAndrew Turner         switch(pHdr_code)
164c120c564SAndrew Turner         {
165c120c564SAndrew Turner         case 0x80:
166c120c564SAndrew Turner             m_pkt_data.p_hdr_fmt = 1;
167c120c564SAndrew Turner             E = ((pHdr >> 2) & 0x7);
168c120c564SAndrew Turner             N = (pHdr & 0x40) ? 1 : 0;
169c120c564SAndrew Turner             m_pkt_data.atom.num = E+N;
170c120c564SAndrew Turner             if(m_pkt_data.atom.num)
171c120c564SAndrew Turner             {
172c120c564SAndrew Turner                 m_pkt_data.atom.En_bits = (((uint32_t)0x1) << E) - 1;
173c120c564SAndrew Turner                 m_pkt_data.cycle_count = E+N;
174c120c564SAndrew Turner             }
175c120c564SAndrew Turner             else
176c120c564SAndrew Turner                 bValid = false; // deprecated 8b'10000000 code
177c120c564SAndrew Turner 
178c120c564SAndrew Turner             break;
179c120c564SAndrew Turner 
180c120c564SAndrew Turner         case 0x82:
181c120c564SAndrew Turner             m_pkt_data.p_hdr_fmt = 2;
182c120c564SAndrew Turner             if(pHdr & 0x10)
183c120c564SAndrew Turner             {
184c120c564SAndrew Turner                 m_pkt_data.p_hdr_fmt = 4;
185c120c564SAndrew Turner                 m_pkt_data.atom.num = 1;
186c120c564SAndrew Turner                 m_pkt_data.cycle_count  = 0;
187c120c564SAndrew Turner                 m_pkt_data.atom.En_bits = pHdr & 0x04 ? 0 : 1;
188c120c564SAndrew Turner             }
189c120c564SAndrew Turner             else
190c120c564SAndrew Turner             {
191c120c564SAndrew Turner                 m_pkt_data.atom.num = 2;
192c120c564SAndrew Turner                 m_pkt_data.cycle_count  = 1;
193c120c564SAndrew Turner                 m_pkt_data.atom.En_bits = (pHdr & 0x8 ? 0 : 1) |  (pHdr & 0x4 ? 0 : 0x2);
194c120c564SAndrew Turner             }
195c120c564SAndrew Turner             break;
196c120c564SAndrew Turner 
197c120c564SAndrew Turner         case 0xA0:
198c120c564SAndrew Turner             m_pkt_data.p_hdr_fmt = 3;
199c120c564SAndrew Turner             m_pkt_data.cycle_count  = ((pHdr >> 2) & 7) + 1;
200c120c564SAndrew Turner             E = pHdr & 0x40 ? 1 : 0;
201c120c564SAndrew Turner             m_pkt_data.atom.num = E;
202c120c564SAndrew Turner             m_pkt_data.atom.En_bits = E;
203c120c564SAndrew Turner             break;
204c120c564SAndrew Turner 
205c120c564SAndrew Turner         default:
206c120c564SAndrew Turner             bValid = false;
207c120c564SAndrew Turner             break;
208c120c564SAndrew Turner 
209c120c564SAndrew Turner         }
210c120c564SAndrew Turner     }
211c120c564SAndrew Turner     return bValid;
212c120c564SAndrew Turner }
213c120c564SAndrew Turner 
operator =(const ocsd_etmv3_pkt * p_pkt)214c120c564SAndrew Turner EtmV3TrcPacket &EtmV3TrcPacket::operator =(const ocsd_etmv3_pkt* p_pkt)
215c120c564SAndrew Turner {
216c120c564SAndrew Turner     m_pkt_data = *p_pkt;
217c120c564SAndrew Turner     return *this;
218c120c564SAndrew Turner }
219c120c564SAndrew Turner 
220c120c564SAndrew Turner     // printing
toString(std::string & str) const221c120c564SAndrew Turner void EtmV3TrcPacket::toString(std::string &str) const
222c120c564SAndrew Turner {
223c120c564SAndrew Turner     const char *name;
224c120c564SAndrew Turner     const char *desc;
225c120c564SAndrew Turner     std::string valStr, ctxtStr = "";
226c120c564SAndrew Turner 
227c120c564SAndrew Turner     name = packetTypeName(m_pkt_data.type, &desc);
228c120c564SAndrew Turner     str = name + (std::string)" : " + desc;
229c120c564SAndrew Turner 
230c120c564SAndrew Turner     switch(m_pkt_data.type)
231c120c564SAndrew Turner     {
232c120c564SAndrew Turner         // print the original header type for the bad sequences.
233c120c564SAndrew Turner     case ETM3_PKT_BAD_SEQUENCE:
234c120c564SAndrew Turner     case ETM3_PKT_BAD_TRACEMODE:
235c120c564SAndrew Turner         name = packetTypeName(m_pkt_data.err_type,0);
236c120c564SAndrew Turner         str += "[" + (std::string)name + "]";
237c120c564SAndrew Turner         break;
238c120c564SAndrew Turner 
239c120c564SAndrew Turner     case ETM3_PKT_BRANCH_ADDRESS:
240c120c564SAndrew Turner         getBranchAddressStr(valStr);
241c120c564SAndrew Turner         str += "; " + valStr;
242c120c564SAndrew Turner         break;
243c120c564SAndrew Turner 
244c120c564SAndrew Turner     case ETM3_PKT_I_SYNC_CYCLE:
245c120c564SAndrew Turner     case ETM3_PKT_I_SYNC:
246c120c564SAndrew Turner         getISyncStr(valStr);
247c120c564SAndrew Turner         str += "; " + valStr;
248c120c564SAndrew Turner         break;
249c120c564SAndrew Turner 
250c120c564SAndrew Turner     case ETM3_PKT_P_HDR:
251c120c564SAndrew Turner         getAtomStr(valStr);
252c120c564SAndrew Turner         str += "; " + valStr;
253c120c564SAndrew Turner         break;
254c120c564SAndrew Turner 
255c120c564SAndrew Turner     case ETM3_PKT_CYCLE_COUNT:
256c120c564SAndrew Turner         {
257c120c564SAndrew Turner             std::ostringstream oss;
258c120c564SAndrew Turner             oss << "; Cycles=" << m_pkt_data.cycle_count;
259c120c564SAndrew Turner             str += oss.str();
260c120c564SAndrew Turner         }
261c120c564SAndrew Turner         break;
262c120c564SAndrew Turner 
263c120c564SAndrew Turner     case ETM3_PKT_CONTEXT_ID:
264c120c564SAndrew Turner         {
265c120c564SAndrew Turner             std::ostringstream oss;
266c120c564SAndrew Turner             oss << "; CtxtID=" << std::hex << "0x" << m_pkt_data.context.ctxtID;
267c120c564SAndrew Turner             str += oss.str();
268c120c564SAndrew Turner         }
269c120c564SAndrew Turner         break;
270c120c564SAndrew Turner 
271c120c564SAndrew Turner     case ETM3_PKT_VMID:
272c120c564SAndrew Turner         {
273c120c564SAndrew Turner             std::ostringstream oss;
274c120c564SAndrew Turner             oss << "; VMID=" << std::hex << "0x" << m_pkt_data.context.VMID;
275c120c564SAndrew Turner             str += oss.str();
276c120c564SAndrew Turner         }
277c120c564SAndrew Turner         break;
278c120c564SAndrew Turner 
279c120c564SAndrew Turner     case ETM3_PKT_TIMESTAMP:
280c120c564SAndrew Turner         {
281c120c564SAndrew Turner             std::ostringstream oss;
282c120c564SAndrew Turner             oss << "; TS=" << std::hex << "0x" << m_pkt_data.timestamp << " (" << std::dec << m_pkt_data.timestamp << ") ";
283c120c564SAndrew Turner             str += oss.str();
284c120c564SAndrew Turner         }
285c120c564SAndrew Turner         break;
286c120c564SAndrew Turner 
287c120c564SAndrew Turner     case ETM3_PKT_OOO_DATA:
288c120c564SAndrew Turner         {
289c120c564SAndrew Turner             std::ostringstream oss;
290c120c564SAndrew Turner             oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value;
291c120c564SAndrew Turner             oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag;
292c120c564SAndrew Turner             str += oss.str();
293c120c564SAndrew Turner         }
294c120c564SAndrew Turner         break;
295c120c564SAndrew Turner 
296c120c564SAndrew Turner     case ETM3_PKT_VAL_NOT_TRACED:
297c120c564SAndrew Turner         if(m_pkt_data.data.update_addr)
298c120c564SAndrew Turner         {
299c120c564SAndrew Turner             trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
300c120c564SAndrew Turner                 m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
301c120c564SAndrew Turner             str += "; Addr=" + valStr;
302c120c564SAndrew Turner         }
303c120c564SAndrew Turner         break;
304c120c564SAndrew Turner 
305c120c564SAndrew Turner     case ETM3_PKT_OOO_ADDR_PLC:
306c120c564SAndrew Turner         if(m_pkt_data.data.update_addr)
307c120c564SAndrew Turner         {
308c120c564SAndrew Turner             trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
309c120c564SAndrew Turner                 m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
310c120c564SAndrew Turner             str += "; Addr=" + valStr;
311c120c564SAndrew Turner         }
312c120c564SAndrew Turner         {
313c120c564SAndrew Turner             std::ostringstream oss;
314c120c564SAndrew Turner             oss << "; OO_Tag=" << std::hex << "0x" << m_pkt_data.data.ooo_tag;
315c120c564SAndrew Turner             str += oss.str();
316c120c564SAndrew Turner         }
317c120c564SAndrew Turner         break;
318c120c564SAndrew Turner 
319c120c564SAndrew Turner     case ETM3_PKT_NORM_DATA:
320c120c564SAndrew Turner         if(m_pkt_data.data.update_addr)
321c120c564SAndrew Turner         {
322c120c564SAndrew Turner             trcPrintableElem::getValStr(valStr,32, m_pkt_data.data.addr.valid_bits,
323c120c564SAndrew Turner                 m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
324c120c564SAndrew Turner             str += "; Addr=" + valStr;
325c120c564SAndrew Turner         }
326c120c564SAndrew Turner         if(m_pkt_data.data.update_dval)
327c120c564SAndrew Turner         {
328c120c564SAndrew Turner             std::ostringstream oss;
329c120c564SAndrew Turner             oss << "; Val=" << std::hex << "0x" << m_pkt_data.data.value;
330c120c564SAndrew Turner             str += oss.str();
331c120c564SAndrew Turner         }
332c120c564SAndrew Turner         break;
333c120c564SAndrew Turner     }
334c120c564SAndrew Turner }
335c120c564SAndrew Turner 
toStringFmt(const uint32_t fmtFlags,std::string & str) const336c120c564SAndrew Turner void EtmV3TrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
337c120c564SAndrew Turner {
338c120c564SAndrew Turner     // no formatting implemented at present.
339c120c564SAndrew Turner     toString(str);
340c120c564SAndrew Turner }
341c120c564SAndrew Turner 
packetTypeName(const ocsd_etmv3_pkt_type type,const char ** ppDesc) const342c120c564SAndrew Turner const char *EtmV3TrcPacket::packetTypeName(const ocsd_etmv3_pkt_type type, const char **ppDesc) const
343c120c564SAndrew Turner {
344c120c564SAndrew Turner     const char *pName = "I_RESERVED";
345c120c564SAndrew Turner     const char *pDesc = "Reserved Packet Header";
346c120c564SAndrew Turner 
347c120c564SAndrew Turner     switch(type)
348c120c564SAndrew Turner     {
349c120c564SAndrew Turner // markers for unknown packets
350c120c564SAndrew Turner     // case ETM3_PKT_NOERROR:,        //!< no error in packet - supplimentary data.
351c120c564SAndrew Turner     case ETM3_PKT_NOTSYNC:        //!< no sync found yet
352c120c564SAndrew Turner         pName = "NOTSYNC";
353c120c564SAndrew Turner         pDesc = "Trace Stream not synchronised";
354c120c564SAndrew Turner         break;
355c120c564SAndrew Turner 
356c120c564SAndrew Turner     case ETM3_PKT_INCOMPLETE_EOT: //!< flushing incomplete/empty packet at end of trace.
357c120c564SAndrew Turner         pName = "INCOMPLETE_EOT.";
358c120c564SAndrew Turner         pDesc = "Incomplete packet at end of trace data.";
359c120c564SAndrew Turner         break;
360c120c564SAndrew Turner 
361c120c564SAndrew Turner // markers for valid packets
362c120c564SAndrew Turner     case ETM3_PKT_BRANCH_ADDRESS:
363c120c564SAndrew Turner         pName = "BRANCH_ADDRESS";
364c120c564SAndrew Turner         pDesc = "Branch address.";
365c120c564SAndrew Turner         break;
366c120c564SAndrew Turner 
367c120c564SAndrew Turner     case ETM3_PKT_A_SYNC:
368c120c564SAndrew Turner         pName = "A_SYNC";
369c120c564SAndrew Turner         pDesc = "Alignment Synchronisation.";
370c120c564SAndrew Turner         break;
371c120c564SAndrew Turner 
372c120c564SAndrew Turner     case ETM3_PKT_CYCLE_COUNT:
373c120c564SAndrew Turner         pName = "CYCLE_COUNT";
374c120c564SAndrew Turner         pDesc = "Cycle Count.";
375c120c564SAndrew Turner         break;
376c120c564SAndrew Turner 
377c120c564SAndrew Turner     case ETM3_PKT_I_SYNC:
378c120c564SAndrew Turner         pName = "I_SYNC";
379c120c564SAndrew Turner         pDesc = "Instruction Packet synchronisation.";
380c120c564SAndrew Turner         break;
381c120c564SAndrew Turner 
382c120c564SAndrew Turner     case ETM3_PKT_I_SYNC_CYCLE:
383c120c564SAndrew Turner         pName = "I_SYNC_CYCLE";
384c120c564SAndrew Turner         pDesc = "Instruction Packet synchronisation with cycle count.";
385c120c564SAndrew Turner         break;
386c120c564SAndrew Turner 
387c120c564SAndrew Turner     case ETM3_PKT_TRIGGER:
388c120c564SAndrew Turner         pName = "TRIGGER";
389c120c564SAndrew Turner         pDesc = "Trace Trigger Event.";
390c120c564SAndrew Turner         break;
391c120c564SAndrew Turner 
392c120c564SAndrew Turner     case ETM3_PKT_P_HDR:
393c120c564SAndrew Turner         pName = "P_HDR";
394c120c564SAndrew Turner         pDesc = "Atom P-header.";
395c120c564SAndrew Turner         break;
396c120c564SAndrew Turner 
397c120c564SAndrew Turner     case ETM3_PKT_STORE_FAIL:
398c120c564SAndrew Turner         pName = "STORE_FAIL";
399c120c564SAndrew Turner         pDesc = "Data Store Failed.";
400c120c564SAndrew Turner         break;
401c120c564SAndrew Turner 
402c120c564SAndrew Turner     case ETM3_PKT_OOO_DATA:
403c120c564SAndrew Turner         pName = "OOO_DATA";
404c120c564SAndrew Turner         pDesc = "Out of Order data value packet.";
405c120c564SAndrew Turner         break;
406c120c564SAndrew Turner 
407c120c564SAndrew Turner     case ETM3_PKT_OOO_ADDR_PLC:
408c120c564SAndrew Turner         pName = "OOO_ADDR_PLC";
409c120c564SAndrew Turner         pDesc = "Out of Order data address placeholder.";
410c120c564SAndrew Turner         break;
411c120c564SAndrew Turner 
412c120c564SAndrew Turner     case ETM3_PKT_NORM_DATA:
413c120c564SAndrew Turner         pName = "NORM_DATA";
414c120c564SAndrew Turner         pDesc = "Data trace packet.";
415c120c564SAndrew Turner         break;
416c120c564SAndrew Turner 
417c120c564SAndrew Turner     case ETM3_PKT_DATA_SUPPRESSED:
418c120c564SAndrew Turner         pName = "DATA_SUPPRESSED";
419c120c564SAndrew Turner         pDesc = "Data trace suppressed.";
420c120c564SAndrew Turner         break;
421c120c564SAndrew Turner 
422c120c564SAndrew Turner     case ETM3_PKT_VAL_NOT_TRACED:
423c120c564SAndrew Turner         pName = "VAL_NOT_TRACED";
424c120c564SAndrew Turner         pDesc = "Data trace value not traced.";
425c120c564SAndrew Turner         break;
426c120c564SAndrew Turner 
427c120c564SAndrew Turner     case ETM3_PKT_IGNORE:
428c120c564SAndrew Turner         pName = "IGNORE";
429c120c564SAndrew Turner         pDesc = "Packet ignored.";
430c120c564SAndrew Turner         break;
431c120c564SAndrew Turner 
432c120c564SAndrew Turner     case ETM3_PKT_CONTEXT_ID:
433c120c564SAndrew Turner         pName = "CONTEXT_ID";
434c120c564SAndrew Turner         pDesc = "Context ID change.";
435c120c564SAndrew Turner         break;
436c120c564SAndrew Turner 
437c120c564SAndrew Turner     case ETM3_PKT_VMID:
438c120c564SAndrew Turner         pName = "VMID";
439c120c564SAndrew Turner         pDesc = "VMID change.";
440c120c564SAndrew Turner         break;
441c120c564SAndrew Turner 
442c120c564SAndrew Turner     case ETM3_PKT_EXCEPTION_ENTRY:
443c120c564SAndrew Turner         pName = "EXCEPTION_ENTRY";
444c120c564SAndrew Turner         pDesc = "Exception entry data marker.";
445c120c564SAndrew Turner         break;
446c120c564SAndrew Turner 
447c120c564SAndrew Turner     case ETM3_PKT_EXCEPTION_EXIT:
448c120c564SAndrew Turner         pName = "EXCEPTION_EXIT";
449c120c564SAndrew Turner         pDesc = "Exception return.";
450c120c564SAndrew Turner         break;
451c120c564SAndrew Turner 
452c120c564SAndrew Turner     case ETM3_PKT_TIMESTAMP:
453c120c564SAndrew Turner         pName = "TIMESTAMP";
454c120c564SAndrew Turner         pDesc = "Timestamp Value.";
455c120c564SAndrew Turner         break;
456c120c564SAndrew Turner 
457c120c564SAndrew Turner // internal processing types
458c120c564SAndrew Turner     // case ETM3_PKT_BRANCH_OR_BYPASS_EOT: not externalised
459c120c564SAndrew Turner 
460c120c564SAndrew Turner // packet errors
461c120c564SAndrew Turner     case ETM3_PKT_BAD_SEQUENCE:
462c120c564SAndrew Turner         pName = "BAD_SEQUENCE";
463c120c564SAndrew Turner         pDesc = "Invalid sequence for packet type.";
464c120c564SAndrew Turner         break;
465c120c564SAndrew Turner 
466c120c564SAndrew Turner     case ETM3_PKT_BAD_TRACEMODE:
467c120c564SAndrew Turner         pName = "BAD_TRACEMODE";
468c120c564SAndrew Turner         pDesc = "Invalid packet type for this trace mode.";
469c120c564SAndrew Turner         break;
470c120c564SAndrew Turner 
471c120c564SAndrew Turner         // leave thest unchanged.
472c120c564SAndrew Turner     case ETM3_PKT_RESERVED:
473c120c564SAndrew Turner     default:
474c120c564SAndrew Turner         break;
475c120c564SAndrew Turner 
476c120c564SAndrew Turner     }
477c120c564SAndrew Turner 
478c120c564SAndrew Turner     if(ppDesc) *ppDesc = pDesc;
479c120c564SAndrew Turner     return pName;
480c120c564SAndrew Turner }
481c120c564SAndrew Turner 
getBranchAddressStr(std::string & valStr) const482c120c564SAndrew Turner void EtmV3TrcPacket::getBranchAddressStr(std::string &valStr) const
483c120c564SAndrew Turner {
484c120c564SAndrew Turner     std::ostringstream oss;
485c120c564SAndrew Turner     std::string subStr;
486c120c564SAndrew Turner 
487c120c564SAndrew Turner     // print address.
488c120c564SAndrew Turner     trcPrintableElem::getValStr(subStr,32,m_pkt_data.addr.valid_bits,
489c120c564SAndrew Turner         m_pkt_data.addr.val,true,m_pkt_data.addr.pkt_bits);
490c120c564SAndrew Turner     oss << "Addr=" << subStr << "; ";
491c120c564SAndrew Turner 
492c120c564SAndrew Turner     // current ISA if changed.
493c120c564SAndrew Turner     if(m_pkt_data.curr_isa != m_pkt_data.prev_isa)
494c120c564SAndrew Turner     {
495c120c564SAndrew Turner         getISAStr(subStr);
496c120c564SAndrew Turner         oss << subStr;
497c120c564SAndrew Turner     }
498c120c564SAndrew Turner 
499c120c564SAndrew Turner     // S / NS etc if changed.
500c120c564SAndrew Turner     if(m_pkt_data.context.updated)
501c120c564SAndrew Turner     {
502c120c564SAndrew Turner         oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; ");
503c120c564SAndrew Turner         oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : "");
504c120c564SAndrew Turner     }
505c120c564SAndrew Turner 
506c120c564SAndrew Turner     // exception?
507c120c564SAndrew Turner     if(m_pkt_data.exception.bits.present)
508c120c564SAndrew Turner     {
509c120c564SAndrew Turner         getExcepStr(subStr);
510c120c564SAndrew Turner         oss << subStr;
511c120c564SAndrew Turner     }
512c120c564SAndrew Turner     valStr = oss.str();
513c120c564SAndrew Turner }
514c120c564SAndrew Turner 
getAtomStr(std::string & valStr) const515c120c564SAndrew Turner void EtmV3TrcPacket::getAtomStr(std::string &valStr) const
516c120c564SAndrew Turner {
517c120c564SAndrew Turner     std::ostringstream oss;
518c120c564SAndrew Turner     uint32_t bitpattern = m_pkt_data.atom.En_bits; // arranged LSBit oldest, MSbit newest
519c120c564SAndrew Turner 
520c120c564SAndrew Turner     if(!m_pkt_data.cycle_count)
521c120c564SAndrew Turner     {
522c120c564SAndrew Turner         for(int i = 0; i < m_pkt_data.atom.num; i++)
523c120c564SAndrew Turner         {
524c120c564SAndrew Turner             oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
525c120c564SAndrew Turner             bitpattern >>= 1;
526c120c564SAndrew Turner         }
527c120c564SAndrew Turner     }
528c120c564SAndrew Turner     else
529c120c564SAndrew Turner     {
530c120c564SAndrew Turner         switch(m_pkt_data.p_hdr_fmt)
531c120c564SAndrew Turner         {
532c120c564SAndrew Turner         case 1:
533c120c564SAndrew Turner             for(int i = 0; i < m_pkt_data.atom.num; i++)
534c120c564SAndrew Turner             {
535c120c564SAndrew Turner                 oss << ((bitpattern & 0x1) ? "WE" : "WN"); // in spec read L->R, oldest->newest
536c120c564SAndrew Turner                 bitpattern >>= 1;
537c120c564SAndrew Turner             }
538c120c564SAndrew Turner             break;
539c120c564SAndrew Turner 
540c120c564SAndrew Turner         case 2:
541c120c564SAndrew Turner             oss << "W";
542c120c564SAndrew Turner             for(int i = 0; i < m_pkt_data.atom.num; i++)
543c120c564SAndrew Turner             {
544c120c564SAndrew Turner                 oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
545c120c564SAndrew Turner                 bitpattern >>= 1;
546c120c564SAndrew Turner             }
547c120c564SAndrew Turner             break;
548c120c564SAndrew Turner 
549c120c564SAndrew Turner         case 3:
550c120c564SAndrew Turner             for(uint32_t i = 0; i < m_pkt_data.cycle_count; i++)
551c120c564SAndrew Turner                 oss << "W";
552c120c564SAndrew Turner             if(m_pkt_data.atom.num)
553c120c564SAndrew Turner                 oss << ((bitpattern & 0x1) ? "E" : "N"); // in spec read L->R, oldest->newest
554c120c564SAndrew Turner             break;
555c120c564SAndrew Turner         }
556c120c564SAndrew Turner         oss << "; Cycles=" << m_pkt_data.cycle_count;
557c120c564SAndrew Turner     }
558c120c564SAndrew Turner     valStr = oss.str();
559c120c564SAndrew Turner }
560c120c564SAndrew Turner 
getISyncStr(std::string & valStr) const561c120c564SAndrew Turner void EtmV3TrcPacket::getISyncStr(std::string &valStr) const
562c120c564SAndrew Turner {
563c120c564SAndrew Turner     std::ostringstream oss;
564c120c564SAndrew Turner     static const char *reason[] = { "Periodic", "Trace Enable", "Restart Overflow", "Debug Exit" };
565c120c564SAndrew Turner 
566c120c564SAndrew Turner     // reason.
567c120c564SAndrew Turner     oss << "(" << reason[(int)m_pkt_data.isync_info.reason] << "); ";
568c120c564SAndrew Turner 
569c120c564SAndrew Turner     // full address.
570c120c564SAndrew Turner     if(!m_pkt_data.isync_info.no_address)
571c120c564SAndrew Turner     {
572c120c564SAndrew Turner         if(m_pkt_data.isync_info.has_LSipAddress)
573c120c564SAndrew Turner             oss << "Data Instr Addr=0x";
574c120c564SAndrew Turner         else
575c120c564SAndrew Turner             oss << "Addr=0x";
576c120c564SAndrew Turner         oss << std::hex << std::setfill('0') << std::setw(8) << m_pkt_data.addr.val << "; ";
577c120c564SAndrew Turner     }
578c120c564SAndrew Turner 
579c120c564SAndrew Turner     oss << (m_pkt_data.context.curr_NS ? "NS; " : "S; ");
580c120c564SAndrew Turner     oss << (m_pkt_data.context.curr_Hyp ? "Hyp; " : " ");
581c120c564SAndrew Turner 
582c120c564SAndrew Turner     if(m_pkt_data.context.updated_c)
583c120c564SAndrew Turner     {
584c120c564SAndrew Turner         oss << "CtxtID=" << std::hex << m_pkt_data.context.ctxtID << "; ";
585c120c564SAndrew Turner     }
586c120c564SAndrew Turner 
587c120c564SAndrew Turner     if(m_pkt_data.isync_info.no_address)
588c120c564SAndrew Turner     {
589c120c564SAndrew Turner         valStr = oss.str();
590c120c564SAndrew Turner         return;     // bail out at this point if a data only ISYNC
591c120c564SAndrew Turner     }
592c120c564SAndrew Turner 
593c120c564SAndrew Turner     std::string isaStr;
594c120c564SAndrew Turner     getISAStr(isaStr);
595c120c564SAndrew Turner     oss << isaStr;
596c120c564SAndrew Turner 
597c120c564SAndrew Turner     if(m_pkt_data.isync_info.has_cycle_count)
598c120c564SAndrew Turner     {
599c120c564SAndrew Turner         oss << "Cycles=" << std::dec << m_pkt_data.cycle_count << "; ";
600c120c564SAndrew Turner     }
601c120c564SAndrew Turner 
602c120c564SAndrew Turner     if(m_pkt_data.isync_info.has_LSipAddress)
603c120c564SAndrew Turner     {
604c120c564SAndrew Turner         std::string addrStr;
605c120c564SAndrew Turner 
606c120c564SAndrew Turner         // extract address updata.
607c120c564SAndrew Turner         trcPrintableElem::getValStr(addrStr,32,m_pkt_data.data.addr.valid_bits,
608c120c564SAndrew Turner             m_pkt_data.data.addr.val,true,m_pkt_data.data.addr.pkt_bits);
609c120c564SAndrew Turner         oss << "Curr Instr Addr=" << addrStr << ";";
610c120c564SAndrew Turner     }
611c120c564SAndrew Turner     valStr = oss.str();
612c120c564SAndrew Turner }
613c120c564SAndrew Turner 
getISAStr(std::string & isaStr) const614c120c564SAndrew Turner void EtmV3TrcPacket::getISAStr(std::string &isaStr) const
615c120c564SAndrew Turner {
616c120c564SAndrew Turner     std::ostringstream oss;
617c120c564SAndrew Turner     oss << "ISA=";
618c120c564SAndrew Turner     switch(m_pkt_data.curr_isa)
619c120c564SAndrew Turner     {
620c120c564SAndrew Turner     case ocsd_isa_arm:
621c120c564SAndrew Turner         oss << "ARM(32); ";
622c120c564SAndrew Turner         break;
623c120c564SAndrew Turner 
624c120c564SAndrew Turner     case ocsd_isa_thumb2:
625c120c564SAndrew Turner         oss << "Thumb2; ";
626c120c564SAndrew Turner         break;
627c120c564SAndrew Turner 
628c120c564SAndrew Turner     case ocsd_isa_aarch64:
629c120c564SAndrew Turner         oss << "AArch64; ";
630c120c564SAndrew Turner         break;
631c120c564SAndrew Turner 
632c120c564SAndrew Turner     case ocsd_isa_tee:
633c120c564SAndrew Turner         oss << "ThumbEE; ";
634c120c564SAndrew Turner         break;
635c120c564SAndrew Turner 
636c120c564SAndrew Turner     case ocsd_isa_jazelle:
637c120c564SAndrew Turner         oss << "Jazelle; ";
638c120c564SAndrew Turner         break;
639c120c564SAndrew Turner 
640c120c564SAndrew Turner     default:
641c120c564SAndrew Turner     case ocsd_isa_unknown:
642c120c564SAndrew Turner         oss << "Unknown; ";
643c120c564SAndrew Turner         break;
644c120c564SAndrew Turner     }
645c120c564SAndrew Turner     isaStr = oss.str();
646c120c564SAndrew Turner }
647c120c564SAndrew Turner 
getExcepStr(std::string & excepStr) const648c120c564SAndrew Turner void EtmV3TrcPacket::getExcepStr(std::string &excepStr) const
649c120c564SAndrew Turner {
650c120c564SAndrew Turner     static const char *ARv7Excep[] = {
651c120c564SAndrew Turner         "No Exception", "Debug Halt", "SMC", "Hyp",
652c120c564SAndrew Turner         "Async Data Abort", "Jazelle", "Reserved", "Reserved",
653c120c564SAndrew Turner         "PE Reset", "Undefined Instr", "SVC", "Prefetch Abort",
654c120c564SAndrew Turner         "Data Fault", "Generic", "IRQ", "FIQ"
655c120c564SAndrew Turner     };
656c120c564SAndrew Turner 
657c120c564SAndrew Turner     static const char *MExcep[] = {
658c120c564SAndrew Turner         "No Exception", "IRQ1", "IRQ2", "IRQ3",
659c120c564SAndrew Turner         "IRQ4", "IRQ5", "IRQ6", "IRQ7",
660c120c564SAndrew Turner         "IRQ0","usage Fault","NMI","SVC",
661c120c564SAndrew Turner         "DebugMonitor", "Mem Manage","PendSV","SysTick",
662*46e6e290SRuslan Bukin         "Reserved","PE Reset","Reserved","HardFault",
663c120c564SAndrew Turner         "Reserved","BusFault","Reserved","Reserved"
664c120c564SAndrew Turner     };
665c120c564SAndrew Turner 
666c120c564SAndrew Turner     std::ostringstream oss;
667c120c564SAndrew Turner     oss << "Exception=";
668c120c564SAndrew Turner 
669c120c564SAndrew Turner     if(m_pkt_data.exception.bits.cm_type)
670c120c564SAndrew Turner     {
671c120c564SAndrew Turner         if(m_pkt_data.exception.number < 0x18)
672c120c564SAndrew Turner             oss << MExcep[m_pkt_data.exception.number];
673c120c564SAndrew Turner         else
674c120c564SAndrew Turner             oss << "IRQ" << std::dec << (m_pkt_data.exception.number - 0x10);
675c120c564SAndrew Turner         if(m_pkt_data.exception.bits.cm_resume)
676c120c564SAndrew Turner             oss << "; Resume=" << m_pkt_data.exception.bits.cm_resume;
677c120c564SAndrew Turner         if(m_pkt_data.exception.bits.cancel)
678c120c564SAndrew Turner             oss << "; Cancel prev instr";
679c120c564SAndrew Turner     }
680c120c564SAndrew Turner     else
681c120c564SAndrew Turner     {
682c120c564SAndrew Turner         oss << ARv7Excep[m_pkt_data.exception.number] << "; ";
683c120c564SAndrew Turner         if(m_pkt_data.exception.bits.cancel)
684c120c564SAndrew Turner             oss << "; Cancel prev instr";
685c120c564SAndrew Turner     }
686c120c564SAndrew Turner     excepStr = oss.str();
687c120c564SAndrew Turner }
688c120c564SAndrew Turner /* End of File trc_pkt_elem_etmv3.cpp */
689