2 * \file trc_pkt_elem_etmv4i.cpp
5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved.
9 * Redistribution and use in source and binary forms, with or without modification,
10 * are permitted provided that the following conditions are met:
12 * 1. Redistributions of source code must retain the above copyright notice,
13 * this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright notice,
16 * this list of conditions and the following disclaimer in the documentation
17 * and/or other materials provided with the distribution.
19 * 3. Neither the name of the copyright holder nor the names of its contributors
20 * may be used to endorse or promote products derived from this software without
21 * specific prior written permission.
23 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
25 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
26 * IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
27 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
28 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
29 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
30 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
31 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
32 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
37 #include "opencsd/etmv4/trc_pkt_elem_etmv4i.h"
39 EtmV4ITrcPacket::EtmV4ITrcPacket()
43 EtmV4ITrcPacket::~EtmV4ITrcPacket()
47 void EtmV4ITrcPacket::initStartState()
49 // clear packet state to start of trace (first sync or post discontinuity)
51 // clear all valid bits
56 v_addr.valid_bits = 0;
67 void EtmV4ITrcPacket::initNextPacket()
69 // clear valid bits for elements that are only valid over a single packet.
70 pkt_valid.bits.cc_valid = 0;
71 pkt_valid.bits.commit_elem_valid = 0;
74 context.updated_v = 0;
75 context.updated_c = 0;
76 err_type = ETM4_PKT_I_NO_ERR_TYPE;
80 void EtmV4ITrcPacket::toString(std::string &str) const
84 std::string valStr, ctxtStr = "";
86 name = packetTypeName(type, &desc);
87 str = name + (std::string)" : " + desc;
89 // extended descriptions
92 case ETM4_PKT_I_BAD_SEQUENCE:
93 case ETM4_PKT_I_INCOMPLETE_EOT:
94 case ETM4_PKT_I_RESERVED_CFG:
95 name = packetTypeName(err_type, 0);
96 str += "[" + (std::string)name + "]";
99 case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
100 case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
102 case ETM4_PKT_I_ADDR_L_32IS0:
103 case ETM4_PKT_I_ADDR_L_32IS1:
104 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 32) ? v_addr.pkt_bits : 0);
105 str += "; Addr=" + valStr + "; " + ctxtStr;
108 case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
109 case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
111 case ETM4_PKT_I_ADDR_L_64IS0:
112 case ETM4_PKT_I_ADDR_L_64IS1:
113 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, (v_addr.pkt_bits < 64) ? v_addr.pkt_bits : 0);
114 str += "; Addr=" + valStr + "; " + ctxtStr;
117 case ETM4_PKT_I_CTXT:
119 str += "; " + ctxtStr;
122 case ETM4_PKT_I_ADDR_S_IS0:
123 case ETM4_PKT_I_ADDR_S_IS1:
124 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits);
125 str += "; Addr=" + valStr;
128 case ETM4_PKT_I_ADDR_MATCH:
129 addrMatchIdx(valStr);
130 str += ", " + valStr;
131 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true);
132 str += "; Addr=" + valStr + "; " + ctxtStr;
135 case ETM4_PKT_I_ATOM_F1:
136 case ETM4_PKT_I_ATOM_F2:
137 case ETM4_PKT_I_ATOM_F3:
138 case ETM4_PKT_I_ATOM_F4:
139 case ETM4_PKT_I_ATOM_F5:
140 case ETM4_PKT_I_ATOM_F6:
142 str += "; " + valStr;
145 case ETM4_PKT_I_EXCEPT:
146 exceptionInfo(valStr);
147 str += "; " + valStr;
150 case ETM4_PKT_I_TIMESTAMP:
152 std::ostringstream oss;
153 oss << "; Updated val = " << std::hex << "0x" << ts.timestamp;
154 if (pkt_valid.bits.cc_valid)
155 oss << "; CC=" << std::hex << "0x" << cycle_count;
160 case ETM4_PKT_I_TRACE_INFO:
162 std::ostringstream oss;
163 oss << "; INFO=" << std::hex << "0x" << trace_info.val;
164 if (trace_info.bits.cc_enabled)
165 oss << "; CC_THRESHOLD=" << std::hex << "0x" << cc_threshold;
170 case ETM4_PKT_I_CCNT_F1:
171 case ETM4_PKT_I_CCNT_F2:
172 case ETM4_PKT_I_CCNT_F3:
174 std::ostringstream oss;
175 oss << "; Count=" << std::hex << "0x" << cycle_count;
182 void EtmV4ITrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const
184 toString(str); // TBD add in formatted response.
187 const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **ppDesc) const
189 const char *pName = "I_UNKNOWN";
190 const char *pDesc = "Unknown Packet Header";
194 case ETM4_PKT_I_NOTSYNC:
195 pName = "I_NOT_SYNC";
196 pDesc = "I Stream not synchronised";
199 case ETM4_PKT_I_INCOMPLETE_EOT:
200 pName = "I_INCOMPLETE_EOT";
201 pDesc = "Incomplete packet at end of trace.";
204 case ETM4_PKT_I_NO_ERR_TYPE:
205 pName = "I_NO_ERR_TYPE";
206 pDesc = "No Error Type.";
209 case ETM4_PKT_I_BAD_SEQUENCE:
210 pName = "I_BAD_SEQUENCE";
211 pDesc = "Invalid Sequence in packet.";
214 case ETM4_PKT_I_BAD_TRACEMODE:
215 pName = "I_BAD_TRACEMODE";
216 pDesc = "Invalid Packet for trace mode.";
219 case ETM4_PKT_I_RESERVED:
220 pName = "I_RESERVED";
221 pDesc = "Reserved Packet Header";
224 case ETM4_PKT_I_RESERVED_CFG:
225 pName = "I_RESERVED_CFG";
226 pDesc = "Reserved header for current configuration.";
229 case ETM4_PKT_I_EXTENSION:
230 pName = "I_EXTENSION";
231 pDesc = "Extension packet header.";
234 case ETM4_PKT_I_TRACE_INFO:
235 pName = "I_TRACE_INFO";
236 pDesc = "Trace Info.";
239 case ETM4_PKT_I_TIMESTAMP:
240 pName = "I_TIMESTAMP";
241 pDesc = "Timestamp.";
244 case ETM4_PKT_I_TRACE_ON:
245 pName = "I_TRACE_ON";
249 case ETM4_PKT_I_FUNC_RET:
250 pName = "I_FUNC_RET";
251 pDesc = "V8M - function return.";
254 case ETM4_PKT_I_EXCEPT:
256 pDesc = "Exception.";
259 case ETM4_PKT_I_EXCEPT_RTN:
260 pName = "I_EXCEPT_RTN";
261 pDesc = "Exception Return.";
264 case ETM4_PKT_I_CCNT_F1:
266 pDesc = "Cycle Count format 1.";
269 case ETM4_PKT_I_CCNT_F2:
271 pDesc = "Cycle Count format 2.";
274 case ETM4_PKT_I_CCNT_F3:
276 pDesc = "Cycle Count format 3.";
279 case ETM4_PKT_I_NUM_DS_MKR:
280 pName = "I_NUM_DS_MKR";
281 pDesc = "Data Synchronisation Marker - Numbered.";
284 case ETM4_PKT_I_UNNUM_DS_MKR:
285 pName = "I_UNNUM_DS_MKR";
286 pDesc = "Data Synchronisation Marker - Unnumbered.";
289 case ETM4_PKT_I_COMMIT:
294 case ETM4_PKT_I_CANCEL_F1:
295 pName = "I_CANCEL_F1";
296 pDesc = "Cancel Format 1.";
299 case ETM4_PKT_I_MISPREDICT:
300 pName = "I_MISPREDICT";
301 pDesc = "Mispredict.";
304 case ETM4_PKT_I_CANCEL_F2:
305 pName = "I_CANCEL_F2";
306 pDesc = "Cancel Format 2.";
309 case ETM4_PKT_I_CANCEL_F3:
310 pName = "I_CANCEL_F3";
311 pDesc = "Cancel Format 3.";
314 case ETM4_PKT_I_COND_I_F2:
315 pName = "I_COND_I_F2";
316 pDesc = "Conditional Instruction, format 2.";
319 case ETM4_PKT_I_COND_FLUSH:
320 pName = "I_COND_FLUSH";
321 pDesc = "Conditional Flush.";
324 case ETM4_PKT_I_COND_RES_F4:
325 pName = "I_COND_RES_F4";
326 pDesc = "Conditional Result, format 4.";
329 case ETM4_PKT_I_COND_RES_F2:
330 pName = "I_COND_RES_F2";
331 pDesc = "Conditional Result, format 2.";
334 case ETM4_PKT_I_COND_RES_F3:
335 pName = "I_COND_RES_F3";
336 pDesc = "Conditional Result, format 3.";
339 case ETM4_PKT_I_COND_RES_F1:
340 pName = "I_COND_RES_F1";
341 pDesc = "Conditional Result, format 1.";
344 case ETM4_PKT_I_COND_I_F1:
345 pName = "I_COND_I_F1";
346 pDesc = "Conditional Instruction, format 1.";
349 case ETM4_PKT_I_COND_I_F3:
350 pName = "I_COND_I_F3";
351 pDesc = "Conditional Instruction, format 3.";
354 case ETM4_PKT_I_IGNORE:
359 case ETM4_PKT_I_EVENT:
361 pDesc = "Trace Event.";
364 case ETM4_PKT_I_CTXT:
366 pDesc = "Context Packet.";
369 case ETM4_PKT_I_ADDR_CTXT_L_32IS0:
370 pName = "I_ADDR_CTXT_L_32IS0";
371 pDesc = "Address & Context, Long, 32 bit, IS0.";
374 case ETM4_PKT_I_ADDR_CTXT_L_32IS1:
375 pName = "I_ADDR_CTXT_L_32IS1";
376 pDesc = "Address & Context, Long, 32 bit, IS0.";
379 case ETM4_PKT_I_ADDR_CTXT_L_64IS0:
380 pName = "I_ADDR_CTXT_L_64IS0";
381 pDesc = "Address & Context, Long, 64 bit, IS0.";
384 case ETM4_PKT_I_ADDR_CTXT_L_64IS1:
385 pName = "I_ADDR_CTXT_L_64IS1";
386 pDesc = "Address & Context, Long, 64 bit, IS1.";
389 case ETM4_PKT_I_ADDR_MATCH:
390 pName = "I_ADDR_MATCH";
391 pDesc = "Exact Address Match.";
394 case ETM4_PKT_I_ADDR_S_IS0:
395 pName = "I_ADDR_S_IS0";
396 pDesc = "Address, Short, IS0.";
399 case ETM4_PKT_I_ADDR_S_IS1:
400 pName = "I_ADDR_S_IS1";
401 pDesc = "Address, Short, IS1.";
404 case ETM4_PKT_I_ADDR_L_32IS0:
405 pName = "I_ADDR_L_32IS0";
406 pDesc = "Address, Long, 32 bit, IS0.";
409 case ETM4_PKT_I_ADDR_L_32IS1:
410 pName = "I_ADDR_L_32IS1";
411 pDesc = "Address, Long, 32 bit, IS1.";
414 case ETM4_PKT_I_ADDR_L_64IS0:
415 pName = "I_ADDR_L_64IS0";
416 pDesc = "Address, Long, 64 bit, IS0.";
419 case ETM4_PKT_I_ADDR_L_64IS1:
420 pName = "I_ADDR_L_64IS1";
421 pDesc = "Address, Long, 64 bit, IS1.";
429 case ETM4_PKT_I_ATOM_F6:
431 pDesc = "Atom format 6.";
434 case ETM4_PKT_I_ATOM_F5:
436 pDesc = "Atom format 5.";
439 case ETM4_PKT_I_ATOM_F2:
441 pDesc = "Atom format 2.";
444 case ETM4_PKT_I_ATOM_F4:
446 pDesc = "Atom format 4.";
449 case ETM4_PKT_I_ATOM_F1:
451 pDesc = "Atom format 1.";
454 case ETM4_PKT_I_ATOM_F3:
456 pDesc = "Atom format 3.";
459 case ETM4_PKT_I_ASYNC:
461 pDesc = "Alignment Synchronisation.";
464 case ETM4_PKT_I_DISCARD:
469 case ETM4_PKT_I_OVERFLOW:
470 pName = "I_OVERFLOW";
478 if(ppDesc) *ppDesc = pDesc;
482 void EtmV4ITrcPacket::contextStr(std::string &ctxtStr) const
485 if(pkt_valid.bits.context_valid)
487 std::ostringstream oss;
490 oss << "Ctxt: " << (context.SF ? "AArch64," : "AArch32, ") << "EL" << context.EL << ", " << (context.NS ? "NS; " : "S; ");
491 if(context.updated_c)
493 oss << "CID=0x" << std::hex << std::setfill('0') << std::setw(8) << context.ctxtID << "; ";
495 if(context.updated_v)
497 oss << "VMID=0x" << std::hex << std::setfill('0') << std::setw(4) << context.VMID << "; ";
508 void EtmV4ITrcPacket::atomSeq(std::string &valStr) const
510 std::ostringstream oss;
511 uint32_t bitpattern = atom.En_bits;
512 for(int i = 0; i < atom.num; i++)
514 oss << ((bitpattern & 0x1) ? "E" : "N");
520 void EtmV4ITrcPacket::addrMatchIdx(std::string &valStr) const
522 std::ostringstream oss;
523 oss << "[" << (uint16_t)addr_exact_match_idx << "]";
527 void EtmV4ITrcPacket::exceptionInfo(std::string &valStr) const
529 std::ostringstream oss;
531 static const char *ARv8Excep[] = {
532 "PE Reset", "Debug Halt", "Call", "Trap",
533 "System Error", "Reserved", "Inst Debug", "Data Debug",
534 "Reserved", "Reserved", "Alignment", "Inst Fault",
535 "Data Fault", "Reserved", "IRQ", "FIQ"
538 static const char *MExcep[] = {
539 "Reserved", "PE Reset", "NMI", "HardFault",
540 "MemManage", "BusFault", "UsageFault", "Reserved",
541 "Reserved","Reserved","Reserved","SVC",
542 "DebugMonitor", "Reserved","PendSV","SysTick",
543 "IRQ0","IRQ1","IRQ2","IRQ3",
544 "IRQ4","IRQ5","IRQ6","IRQ7",
545 "DebugHalt", "LazyFP Push", "Lockup", "Reserved",
546 "Reserved","Reserved","Reserved","Reserved"
549 if(exception_info.m_type == 0)
551 if(exception_info.exceptionType < 0x10)
552 oss << " " << ARv8Excep[exception_info.exceptionType] << ";";
559 if(exception_info.exceptionType < 0x20)
560 oss << " " << MExcep[exception_info.exceptionType] << ";";
561 else if((exception_info.exceptionType >= 0x208) && (exception_info.exceptionType <= 0x3EF))
562 oss << " IRQ" << (int)(exception_info.exceptionType - 0x200) << ";";
565 if(exception_info.m_fault_pending)
566 oss << " Fault Pending;";
569 if(exception_info.addr_interp == 0x1)
570 oss << " Ret Addr Follows;";
571 else if(exception_info.addr_interp == 0x2)
572 oss << " Ret Addr Follows, Match Prev;";
577 EtmV4ITrcPacket &EtmV4ITrcPacket::operator =(const ocsd_etmv4_i_pkt* p_pkt)
579 *dynamic_cast<ocsd_etmv4_i_pkt *>(this) = *p_pkt;
583 /* End of File trc_pkt_elem_etmv4i.cpp */