1 /* 2 * \file trc_pkt_elem_etmv4i.cpp 3 * \brief OpenCSD : 4 * 5 * \copyright Copyright (c) 2015, ARM Limited. All Rights Reserved. 6 */ 7 8 /* 9 * Redistribution and use in source and binary forms, with or without modification, 10 * are permitted provided that the following conditions are met: 11 * 12 * 1. Redistributions of source code must retain the above copyright notice, 13 * this list of conditions and the following disclaimer. 14 * 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. 18 * 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. 22 * 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. 33 */ 34 #include <sstream> 35 #include <iomanip> 36 37 #include "opencsd/etmv4/trc_pkt_elem_etmv4i.h" 38 39 EtmV4ITrcPacket::EtmV4ITrcPacket() 40 { 41 protocol_version = 0x42; // min protocol version. 42 } 43 44 EtmV4ITrcPacket::~EtmV4ITrcPacket() 45 { 46 } 47 48 void EtmV4ITrcPacket::initStartState() 49 { 50 // clear packet state to start of trace (first sync or post discontinuity) 51 52 // clear all valid bits 53 pkt_valid.val = 0; 54 55 // virtual address 56 v_addr.pkt_bits = 0; 57 v_addr.valid_bits = 0; 58 v_addr_ISA = 0; 59 60 // timestamp 61 ts.bits_changed = 0; 62 ts.timestamp = 0; 63 64 // per packet init 65 initNextPacket(); 66 } 67 68 void EtmV4ITrcPacket::initNextPacket() 69 { 70 // clear valid bits for elements that are only valid over a single packet. 71 pkt_valid.bits.cc_valid = 0; 72 pkt_valid.bits.commit_elem_valid = 0; 73 atom.num = 0; 74 context.updated = 0; 75 context.updated_v = 0; 76 context.updated_c = 0; 77 err_type = ETM4_PKT_I_NO_ERR_TYPE; 78 } 79 80 // printing 81 void EtmV4ITrcPacket::toString(std::string &str) const 82 { 83 const char *name; 84 const char *desc; 85 std::string valStr, ctxtStr = ""; 86 87 name = packetTypeName(type, &desc); 88 str = name + (std::string)" : " + desc; 89 90 // extended descriptions 91 switch (type) 92 { 93 case ETM4_PKT_I_BAD_SEQUENCE: 94 case ETM4_PKT_I_INCOMPLETE_EOT: 95 case ETM4_PKT_I_RESERVED_CFG: 96 name = packetTypeName(err_type, 0); 97 str += "[" + (std::string)name + "]"; 98 break; 99 100 case ETM4_PKT_I_ADDR_CTXT_L_32IS0: 101 case ETM4_PKT_I_ADDR_CTXT_L_32IS1: 102 contextStr(ctxtStr); 103 case ETM4_PKT_I_ADDR_L_32IS0: 104 case ETM4_PKT_I_ADDR_L_32IS1: 105 case ETE_PKT_I_SRC_ADDR_L_32IS0: 106 case ETE_PKT_I_SRC_ADDR_L_32IS1: 107 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); 108 str += "; Addr=" + valStr + "; " + ctxtStr; 109 break; 110 111 case ETM4_PKT_I_ADDR_CTXT_L_64IS0: 112 case ETM4_PKT_I_ADDR_CTXT_L_64IS1: 113 contextStr(ctxtStr); 114 case ETM4_PKT_I_ADDR_L_64IS0: 115 case ETM4_PKT_I_ADDR_L_64IS1: 116 case ETE_PKT_I_SRC_ADDR_L_64IS0: 117 case ETE_PKT_I_SRC_ADDR_L_64IS1: 118 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); 119 str += "; Addr=" + valStr + "; " + ctxtStr; 120 break; 121 122 case ETM4_PKT_I_CTXT: 123 contextStr(ctxtStr); 124 str += "; " + ctxtStr; 125 break; 126 127 case ETM4_PKT_I_ADDR_S_IS0: 128 case ETM4_PKT_I_ADDR_S_IS1: 129 case ETE_PKT_I_SRC_ADDR_S_IS0: 130 case ETE_PKT_I_SRC_ADDR_S_IS1: 131 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true, v_addr.pkt_bits); 132 str += "; Addr=" + valStr; 133 break; 134 135 case ETM4_PKT_I_ADDR_MATCH: 136 case ETE_PKT_I_SRC_ADDR_MATCH: 137 addrMatchIdx(valStr); 138 str += ", " + valStr; 139 trcPrintableElem::getValStr(valStr, (v_addr.size == VA_64BIT) ? 64 : 32, v_addr.valid_bits, v_addr.val, true); 140 str += "; Addr=" + valStr + "; " + ctxtStr; 141 break; 142 143 case ETM4_PKT_I_ATOM_F1: 144 case ETM4_PKT_I_ATOM_F2: 145 case ETM4_PKT_I_ATOM_F3: 146 case ETM4_PKT_I_ATOM_F4: 147 case ETM4_PKT_I_ATOM_F5: 148 case ETM4_PKT_I_ATOM_F6: 149 atomSeq(valStr); 150 str += "; " + valStr; 151 break; 152 153 case ETM4_PKT_I_EXCEPT: 154 exceptionInfo(valStr); 155 str += "; " + valStr; 156 break; 157 158 case ETM4_PKT_I_TIMESTAMP: 159 { 160 std::ostringstream oss; 161 oss << "; Updated val = " << std::hex << "0x" << ts.timestamp; 162 if (pkt_valid.bits.cc_valid) 163 oss << "; CC=" << std::hex << "0x" << cycle_count; 164 str += oss.str(); 165 } 166 break; 167 168 case ETM4_PKT_I_TRACE_INFO: 169 { 170 std::ostringstream oss; 171 oss << "; INFO=" << std::hex << "0x" << trace_info.val; 172 oss << " { CC." << std::dec << trace_info.bits.cc_enabled; 173 if (isETE()) 174 oss << ", TSTATE." << std::dec << trace_info.bits.in_trans_state; 175 oss << " }"; 176 if (trace_info.bits.cc_enabled) 177 oss << "; CC_THRESHOLD=" << std::hex << "0x" << cc_threshold; 178 str += oss.str(); 179 } 180 break; 181 182 case ETM4_PKT_I_CCNT_F1: 183 case ETM4_PKT_I_CCNT_F2: 184 case ETM4_PKT_I_CCNT_F3: 185 { 186 std::ostringstream oss; 187 oss << "; Count=" << std::hex << "0x" << cycle_count; 188 str += oss.str(); 189 } 190 break; 191 192 case ETM4_PKT_I_CANCEL_F1: 193 { 194 std::ostringstream oss; 195 oss << "; Cancel(" << std::dec << cancel_elements << ")"; 196 str += oss.str(); 197 } 198 break; 199 200 case ETM4_PKT_I_CANCEL_F1_MISPRED: 201 { 202 std::ostringstream oss; 203 oss << "; Cancel(" << std::dec << cancel_elements << "), Mispredict"; 204 str += oss.str(); 205 } 206 break; 207 208 case ETM4_PKT_I_MISPREDICT: 209 { 210 std::ostringstream oss; 211 oss << "; "; 212 if (atom.num) { 213 atomSeq(valStr); 214 oss << "Atom: " << valStr << ", "; 215 } 216 oss << "Mispredict"; 217 str += oss.str(); 218 } 219 break; 220 221 case ETM4_PKT_I_CANCEL_F2: 222 { 223 std::ostringstream oss; 224 oss << "; "; 225 if (atom.num) { 226 atomSeq(valStr); 227 oss << "Atom: " << valStr << ", "; 228 } 229 oss << "Cancel(1), Mispredict"; 230 str += oss.str(); 231 } 232 break; 233 234 case ETM4_PKT_I_CANCEL_F3: 235 { 236 std::ostringstream oss; 237 oss << "; "; 238 if (atom.num) { 239 oss << "Atom: E, "; 240 } 241 oss << "Cancel(" << std::dec << cancel_elements << "), Mispredict"; 242 str += oss.str(); 243 } 244 break; 245 246 case ETM4_PKT_I_COMMIT: 247 { 248 std::ostringstream oss; 249 oss << "; Commit(" << std::dec << commit_elements << ")"; 250 str += oss.str(); 251 } 252 break; 253 254 case ETM4_PKT_I_Q: 255 { 256 std::ostringstream oss; 257 if (Q_pkt.count_present) 258 { 259 oss << "; Count(" << std::dec << Q_pkt.q_count << ")"; 260 str += oss.str(); 261 } 262 else 263 str += "; Count(Unknown)"; 264 265 if (Q_pkt.addr_match) 266 { 267 addrMatchIdx(valStr); 268 str += "; " + valStr; 269 } 270 271 if (Q_pkt.addr_present || Q_pkt.addr_match) 272 { 273 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); 274 str += "; Addr=" + valStr; 275 } 276 } 277 break; 278 279 case ETE_PKT_I_ITE: 280 { 281 std::ostringstream oss; 282 oss << "; EL" << std::dec << (int)ite_pkt.el << "; Payload=0x" << std::hex << ite_pkt.value; 283 str += oss.str(); 284 } 285 break; 286 } 287 288 } 289 290 void EtmV4ITrcPacket::toStringFmt(const uint32_t fmtFlags, std::string &str) const 291 { 292 toString(str); // TBD add in formatted response. 293 } 294 295 const char *EtmV4ITrcPacket::packetTypeName(const ocsd_etmv4_i_pkt_type type, const char **ppDesc) const 296 { 297 const char *pName = "I_UNKNOWN"; 298 const char *pDesc = "Unknown Packet Header"; 299 300 switch(type) 301 { 302 case ETM4_PKT_I_NOTSYNC: 303 pName = "I_NOT_SYNC"; 304 pDesc = "I Stream not synchronised"; 305 break; 306 307 case ETM4_PKT_I_INCOMPLETE_EOT: 308 pName = "I_INCOMPLETE_EOT"; 309 pDesc = "Incomplete packet at end of trace."; 310 break; 311 312 case ETM4_PKT_I_NO_ERR_TYPE: 313 pName = "I_NO_ERR_TYPE"; 314 pDesc = "No Error Type."; 315 break; 316 317 case ETM4_PKT_I_BAD_SEQUENCE: 318 pName = "I_BAD_SEQUENCE"; 319 pDesc = "Invalid Sequence in packet."; 320 break; 321 322 case ETM4_PKT_I_BAD_TRACEMODE: 323 pName = "I_BAD_TRACEMODE"; 324 pDesc = "Invalid Packet for trace mode."; 325 break; 326 327 case ETM4_PKT_I_RESERVED: 328 pName = "I_RESERVED"; 329 pDesc = "Reserved Packet Header"; 330 break; 331 332 case ETM4_PKT_I_RESERVED_CFG: 333 pName = "I_RESERVED_CFG"; 334 pDesc = "Reserved header for current configuration."; 335 break; 336 337 case ETM4_PKT_I_EXTENSION: 338 pName = "I_EXTENSION"; 339 pDesc = "Extension packet header."; 340 break; 341 342 case ETM4_PKT_I_TRACE_INFO: 343 pName = "I_TRACE_INFO"; 344 pDesc = "Trace Info."; 345 break; 346 347 case ETM4_PKT_I_TIMESTAMP: 348 pName = "I_TIMESTAMP"; 349 pDesc = "Timestamp."; 350 break; 351 352 case ETM4_PKT_I_TRACE_ON: 353 pName = "I_TRACE_ON"; 354 pDesc = "Trace On."; 355 break; 356 357 case ETM4_PKT_I_FUNC_RET: 358 pName = "I_FUNC_RET"; 359 pDesc = "V8M - function return."; 360 break; 361 362 case ETM4_PKT_I_EXCEPT: 363 pName = "I_EXCEPT"; 364 pDesc = "Exception."; 365 break; 366 367 case ETM4_PKT_I_EXCEPT_RTN: 368 pName = "I_EXCEPT_RTN"; 369 pDesc = "Exception Return."; 370 break; 371 372 case ETE_PKT_I_TRANS_ST: 373 pName = "I_TRANS_ST"; 374 pDesc = "Transaction Start."; 375 break; 376 377 case ETE_PKT_I_TRANS_COMMIT: 378 pName = "I_TRANS_COMMIT"; 379 pDesc = "Transaction Commit."; 380 break; 381 382 case ETM4_PKT_I_CCNT_F1: 383 pName = "I_CCNT_F1"; 384 pDesc = "Cycle Count format 1."; 385 break; 386 387 case ETM4_PKT_I_CCNT_F2: 388 pName = "I_CCNT_F2"; 389 pDesc = "Cycle Count format 2."; 390 break; 391 392 case ETM4_PKT_I_CCNT_F3: 393 pName = "I_CCNT_F3"; 394 pDesc = "Cycle Count format 3."; 395 break; 396 397 case ETM4_PKT_I_NUM_DS_MKR: 398 pName = "I_NUM_DS_MKR"; 399 pDesc = "Data Synchronisation Marker - Numbered."; 400 break; 401 402 case ETM4_PKT_I_UNNUM_DS_MKR: 403 pName = "I_UNNUM_DS_MKR"; 404 pDesc = "Data Synchronisation Marker - Unnumbered."; 405 break; 406 407 case ETM4_PKT_I_COMMIT: 408 pName = "I_COMMIT"; 409 pDesc = "Commit"; 410 break; 411 412 case ETM4_PKT_I_CANCEL_F1: 413 pName = "I_CANCEL_F1"; 414 pDesc = "Cancel Format 1."; 415 break; 416 417 case ETM4_PKT_I_CANCEL_F1_MISPRED: 418 pName = "I_CANCEL_F1_MISPRED"; 419 pDesc = "Cancel Format 1 + Mispredict."; 420 break; 421 422 423 case ETM4_PKT_I_MISPREDICT: 424 pName = "I_MISPREDICT"; 425 pDesc = "Mispredict."; 426 break; 427 428 case ETM4_PKT_I_CANCEL_F2: 429 pName = "I_CANCEL_F2"; 430 pDesc = "Cancel Format 2."; 431 break; 432 433 case ETM4_PKT_I_CANCEL_F3: 434 pName = "I_CANCEL_F3"; 435 pDesc = "Cancel Format 3."; 436 break; 437 438 case ETM4_PKT_I_COND_I_F2: 439 pName = "I_COND_I_F2"; 440 pDesc = "Conditional Instruction, format 2."; 441 break; 442 443 case ETM4_PKT_I_COND_FLUSH: 444 pName = "I_COND_FLUSH"; 445 pDesc = "Conditional Flush."; 446 break; 447 448 case ETM4_PKT_I_COND_RES_F4: 449 pName = "I_COND_RES_F4"; 450 pDesc = "Conditional Result, format 4."; 451 break; 452 453 case ETM4_PKT_I_COND_RES_F2: 454 pName = "I_COND_RES_F2"; 455 pDesc = "Conditional Result, format 2."; 456 break; 457 458 case ETM4_PKT_I_COND_RES_F3: 459 pName = "I_COND_RES_F3"; 460 pDesc = "Conditional Result, format 3."; 461 break; 462 463 case ETM4_PKT_I_COND_RES_F1: 464 pName = "I_COND_RES_F1"; 465 pDesc = "Conditional Result, format 1."; 466 break; 467 468 case ETM4_PKT_I_COND_I_F1: 469 pName = "I_COND_I_F1"; 470 pDesc = "Conditional Instruction, format 1."; 471 break; 472 473 case ETM4_PKT_I_COND_I_F3: 474 pName = "I_COND_I_F3"; 475 pDesc = "Conditional Instruction, format 3."; 476 break; 477 478 case ETM4_PKT_I_IGNORE: 479 pName = "I_IGNORE"; 480 pDesc = "Ignore."; 481 break; 482 483 case ETM4_PKT_I_EVENT: 484 pName = "I_EVENT"; 485 pDesc = "Trace Event."; 486 break; 487 488 case ETM4_PKT_I_CTXT: 489 pName = "I_CTXT"; 490 pDesc = "Context Packet."; 491 break; 492 493 case ETM4_PKT_I_ADDR_CTXT_L_32IS0: 494 pName = "I_ADDR_CTXT_L_32IS0"; 495 pDesc = "Address & Context, Long, 32 bit, IS0."; 496 break; 497 498 case ETM4_PKT_I_ADDR_CTXT_L_32IS1: 499 pName = "I_ADDR_CTXT_L_32IS1"; 500 pDesc = "Address & Context, Long, 32 bit, IS0."; 501 break; 502 503 case ETM4_PKT_I_ADDR_CTXT_L_64IS0: 504 pName = "I_ADDR_CTXT_L_64IS0"; 505 pDesc = "Address & Context, Long, 64 bit, IS0."; 506 break; 507 508 case ETM4_PKT_I_ADDR_CTXT_L_64IS1: 509 pName = "I_ADDR_CTXT_L_64IS1"; 510 pDesc = "Address & Context, Long, 64 bit, IS1."; 511 break; 512 513 case ETE_PKT_I_TS_MARKER: 514 pName = "I_TS_MARKER"; 515 pDesc = "Timestamp Marker"; 516 break; 517 518 case ETM4_PKT_I_ADDR_MATCH: 519 pName = "I_ADDR_MATCH"; 520 pDesc = "Exact Address Match."; 521 break; 522 523 case ETM4_PKT_I_ADDR_S_IS0: 524 pName = "I_ADDR_S_IS0"; 525 pDesc = "Address, Short, IS0."; 526 break; 527 528 case ETM4_PKT_I_ADDR_S_IS1: 529 pName = "I_ADDR_S_IS1"; 530 pDesc = "Address, Short, IS1."; 531 break; 532 533 case ETM4_PKT_I_ADDR_L_32IS0: 534 pName = "I_ADDR_L_32IS0"; 535 pDesc = "Address, Long, 32 bit, IS0."; 536 break; 537 538 case ETM4_PKT_I_ADDR_L_32IS1: 539 pName = "I_ADDR_L_32IS1"; 540 pDesc = "Address, Long, 32 bit, IS1."; 541 break; 542 543 case ETM4_PKT_I_ADDR_L_64IS0: 544 pName = "I_ADDR_L_64IS0"; 545 pDesc = "Address, Long, 64 bit, IS0."; 546 break; 547 548 case ETM4_PKT_I_ADDR_L_64IS1: 549 pName = "I_ADDR_L_64IS1"; 550 pDesc = "Address, Long, 64 bit, IS1."; 551 break; 552 553 case ETM4_PKT_I_Q: 554 pName = "I_Q"; 555 pDesc = "Q Packet."; 556 break; 557 558 case ETE_PKT_I_SRC_ADDR_MATCH: 559 pName = "I_SRC_ADDR_MATCH"; 560 pDesc = "Exact Source Address Match."; 561 break; 562 563 case ETE_PKT_I_SRC_ADDR_S_IS0: 564 pName = "I_SRC_ADDR_S_IS0"; 565 pDesc = "Source Address, Short, IS0."; 566 break; 567 568 case ETE_PKT_I_SRC_ADDR_S_IS1: 569 pName = "I_SRC_ADDR_S_IS1"; 570 pDesc = "Source Address, Short, IS1."; 571 break; 572 573 case ETE_PKT_I_SRC_ADDR_L_32IS0: 574 pName = "I_SCR_ADDR_L_32IS0"; 575 pDesc = "Source Address, Long, 32 bit, IS0."; 576 break; 577 578 case ETE_PKT_I_SRC_ADDR_L_32IS1: 579 pName = "I_SRC_ADDR_L_32IS1"; 580 pDesc = "Source Address, Long, 32 bit, IS1."; 581 break; 582 583 case ETE_PKT_I_SRC_ADDR_L_64IS0: 584 pName = "I_SRC_ADDR_L_64IS0"; 585 pDesc = "Source Address, Long, 64 bit, IS0."; 586 break; 587 588 case ETE_PKT_I_SRC_ADDR_L_64IS1: 589 pName = "I_SRC_ADDR_L_64IS1"; 590 pDesc = "Source Address, Long, 64 bit, IS1."; 591 break; 592 593 case ETM4_PKT_I_ATOM_F6: 594 pName = "I_ATOM_F6"; 595 pDesc = "Atom format 6."; 596 break; 597 598 case ETM4_PKT_I_ATOM_F5: 599 pName = "I_ATOM_F5"; 600 pDesc = "Atom format 5."; 601 break; 602 603 case ETM4_PKT_I_ATOM_F2: 604 pName = "I_ATOM_F2"; 605 pDesc = "Atom format 2."; 606 break; 607 608 case ETM4_PKT_I_ATOM_F4: 609 pName = "I_ATOM_F4"; 610 pDesc = "Atom format 4."; 611 break; 612 613 case ETM4_PKT_I_ATOM_F1: 614 pName = "I_ATOM_F1"; 615 pDesc = "Atom format 1."; 616 break; 617 618 case ETM4_PKT_I_ATOM_F3: 619 pName = "I_ATOM_F3"; 620 pDesc = "Atom format 3."; 621 break; 622 623 case ETM4_PKT_I_ASYNC: 624 pName = "I_ASYNC"; 625 pDesc = "Alignment Synchronisation."; 626 break; 627 628 case ETM4_PKT_I_DISCARD: 629 pName = "I_DISCARD"; 630 pDesc = "Discard."; 631 break; 632 633 case ETM4_PKT_I_OVERFLOW: 634 pName = "I_OVERFLOW"; 635 pDesc = "Overflow."; 636 break; 637 638 case ETE_PKT_I_PE_RESET: 639 pName = "I_PE_RESET"; 640 pDesc = "PE Reset."; 641 break; 642 643 case ETE_PKT_I_TRANS_FAIL: 644 pName = "I_TRANS_FAIL"; 645 pDesc = "Transaction Fail."; 646 break; 647 648 case ETE_PKT_I_ITE: 649 pName = "I_ITE"; 650 pDesc = "Instrumentation"; 651 break; 652 653 default: 654 break; 655 } 656 657 if(ppDesc) *ppDesc = pDesc; 658 return pName; 659 } 660 661 void EtmV4ITrcPacket::contextStr(std::string &ctxtStr) const 662 { 663 ctxtStr = ""; 664 if(pkt_valid.bits.context_valid) 665 { 666 std::ostringstream oss; 667 if(context.updated) 668 { 669 oss << "Ctxt: " << (context.SF ? "AArch64," : "AArch32, ") << "EL" << context.EL << ", " << (context.NS ? "NS; " : "S; "); 670 if(context.updated_c) 671 { 672 oss << "CID=0x" << std::hex << std::setfill('0') << std::setw(8) << context.ctxtID << "; "; 673 } 674 if(context.updated_v) 675 { 676 oss << "VMID=0x" << std::hex << std::setfill('0') << std::setw(4) << context.VMID << "; "; 677 } 678 } 679 else 680 { 681 oss << "Ctxt: Same"; 682 } 683 ctxtStr = oss.str(); 684 } 685 } 686 687 void EtmV4ITrcPacket::atomSeq(std::string &valStr) const 688 { 689 std::ostringstream oss; 690 uint32_t bitpattern = atom.En_bits; 691 for(int i = 0; i < atom.num; i++) 692 { 693 oss << ((bitpattern & 0x1) ? "E" : "N"); 694 bitpattern >>= 1; 695 } 696 valStr = oss.str(); 697 } 698 699 void EtmV4ITrcPacket::addrMatchIdx(std::string &valStr) const 700 { 701 std::ostringstream oss; 702 oss << "[" << (uint16_t)addr_exact_match_idx << "]"; 703 valStr = oss.str(); 704 } 705 706 void EtmV4ITrcPacket::exceptionInfo(std::string &valStr) const 707 { 708 std::ostringstream oss; 709 710 static const char *ARv8Excep[] = { 711 "PE Reset", "Debug Halt", "Call", "Trap", 712 "System Error", "Reserved", "Inst Debug", "Data Debug", 713 "Reserved", "Reserved", "Alignment", "Inst Fault", 714 "Data Fault", "Reserved", "IRQ", "FIQ" 715 }; 716 717 static const char *MExcep[] = { 718 "Reserved", "PE Reset", "NMI", "HardFault", 719 "MemManage", "BusFault", "UsageFault", "Reserved", 720 "Reserved","Reserved","Reserved","SVC", 721 "DebugMonitor", "Reserved","PendSV","SysTick", 722 "IRQ0","IRQ1","IRQ2","IRQ3", 723 "IRQ4","IRQ5","IRQ6","IRQ7", 724 "DebugHalt", "LazyFP Push", "Lockup", "Reserved", 725 "Reserved","Reserved","Reserved","Reserved" 726 }; 727 728 if(exception_info.m_type == 0) 729 { 730 if(exception_info.exceptionType < 0x10) 731 oss << " " << ARv8Excep[exception_info.exceptionType] << ";"; 732 else 733 oss << " Reserved;"; 734 735 } 736 else 737 { 738 if(exception_info.exceptionType < 0x20) 739 oss << " " << MExcep[exception_info.exceptionType] << ";"; 740 else if((exception_info.exceptionType >= 0x208) && (exception_info.exceptionType <= 0x3EF)) 741 oss << " IRQ" << (int)(exception_info.exceptionType - 0x200) << ";"; 742 else 743 oss << " Reserved;"; 744 if(exception_info.m_fault_pending) 745 oss << " Fault Pending;"; 746 } 747 748 if(exception_info.addr_interp == 0x1) 749 oss << " Ret Addr Follows;"; 750 else if(exception_info.addr_interp == 0x2) 751 oss << " Ret Addr Follows, Match Prev;"; 752 753 valStr = oss.str(); 754 } 755 756 EtmV4ITrcPacket &EtmV4ITrcPacket::operator =(const ocsd_etmv4_i_pkt* p_pkt) 757 { 758 *dynamic_cast<ocsd_etmv4_i_pkt *>(this) = *p_pkt; 759 return *this; 760 } 761 762 /* End of File trc_pkt_elem_etmv4i.cpp */ 763