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