2 * Copyright (C) 2013 Freescale Semiconductor, Inc.
4 * Permission is hereby granted, free of charge, to any person obtaining a copy
5 * of this software and associated documentation files (the "Software"), to deal
6 * in the Software without restriction, including without limitation the rights
7 * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
8 * copies of the Software, and to permit persons to whom the Software is
9 * furnished to do so, subject to the following conditions:
11 * The above copyright notice and this permission notice shall be included
12 * in all copies or substantial portions of the Software.
14 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
15 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
16 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
17 * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
18 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
19 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
23 #include "NxMessage.h"
25 #include <ctype.h> // for isprint()
28 using std::ostringstream
;
35 #define SWAPBYTES32(ui32) \
36 (((ui32)<<24) | (((ui32) & 0xff00) << 8) |\
37 (((ui32) & 0xff0000) >> 8) | ((ui32) >> 24))
39 string
NxMessage::tcodeString() const
42 os
<< "UNKNOWN-" << tcode_
;
46 // decode the source id from the packet
47 uint32_t NxMessage::decodeSourceId(NxPacketSet
&pkt_set
)
49 // packet index, start_pos, length
50 uint32_t src_id
= pkt_set
.getField32(0, 6, 6);
54 // decode the timestamp from the packet
55 uint32_t NxMessage::decodeTimestamp(NxPacketSet
&pkt_set
, uint32_t index
)
57 // packet at index, start_pos, length
58 uint32_t ts
= pkt_set
.getField32(index
, 0, 28);
62 // Returns the SRC_ID as a string
63 const char * NxMessage::sourceIdString() const
67 return "Core0 / CPU0 (Clst0:Core0:Thread0)";
70 return "Nexus Port Controller";
73 return "Core1 / CPU8 (Clst1:Core0:Thread0)";
76 return "Nexus Trace Collector #1";
79 return "Core2 / CPU16 (Clst2:Core0:Thread0)";
82 return "Nexus Trace Collector #2";
88 return "Core4 / CPU2 (Clst0:Core1:Thread0)";
91 return "CoreNet Debug Client";
94 return "Core5 / CPU10 (Clst1:Core1:Thread0)";
97 return "Datapath Debug Client";
100 return "Core6 / CPU18 (Clst2:Core1:Thread0)";
103 return "DDR Debug Interface";
109 return "CPU4 (Clst0:Core2:Thread0)";
112 return "CPU12 (Clst1:Core2:Thread0)";
115 return "CPU20 (Clst2:Core2:Thread0)";
118 return "CPU6 (Clst0:Core3:Thread0)";
121 return "CoreNet Debug Client";
124 return "CPU14 (Clst1:Core3:Thread0)";
127 return "Datapath Debug Interface";
130 return "CPU22 (Clst2:Core3:Thread0)";
133 return "Nexus Concentrator";
136 return "CPU1 (Clst0:Core0:Thread1)";
139 return "CPU9 (Clst1:Core0:Thread1)";
142 return "CPU17 (Clst2:Core0:Thread1)";
145 return "CPU3 (Clst0:Core1:Thread1)";
148 return "CPU11 (Clst1:Core1:Thread1)";
151 return "Datapath Debug Interface";
154 return "CPU19 (Clst2:Core1:Thread1)";
157 return "DDR Debug Interface";
160 return "CPU5 (Clst0:Core2:Thread1)";
163 return "CPU13 (Clst1:Core2:Thread1)";
166 return "CPU21 (Clst2:Core2:Thread1)";
169 return "CPU7 (Clst0:Core3:Thread1)";
172 return "CPU15 (Clst1:Core3:Thread1)";
175 return "CPU23 (Clst2:Core3:Thread1)";
178 return "Event Processing Unit";
181 return "Nexus Concentrator";
190 // Determines if the TIMESTAMP value needs correction
191 bool NxMessage::timestampNeedsCorrection() const
193 return (timestamp_
& 0x0f000000);
196 // Returns the corrected TIMESTAMP value
197 uint32_t NxMessage::correctedTimestamp() const
199 uint32_t correction
= (timestamp_
& 0x0f000000) >> 24;
200 uint32_t ts
= (timestamp_
& 0x00ffffff) - correction
;
203 // Returns a string representing the timestamp
204 string
NxMessage::timestampAsString() const
207 os
<< dec
<< correctedTimestamp() << " (0x" << hex
208 << correctedTimestamp() << ")";
212 // represent this message as a formatted string
213 string
NxMessage::asString() const
216 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
217 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
219 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
223 // decode message info from the packet set
224 bool NxDebugStatusMessage::decode(NxPacketSet
&pkt_set
)
227 source_id_
= decodeSourceId(pkt_set
);
229 // index, start_pos, length
230 status_
= pkt_set
.getField32(0, 12, 16);
232 // index, start_pos, length
233 timestamp_
= pkt_set
.getField32(0, 28, 28);
238 // represent this message as a formatted string
239 string
NxDebugStatusMessage::asString() const
242 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
243 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
245 os
<< "STATUS : 0x" << hex
<< setfill('0') << setw(4) << status_
247 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
251 // decode message info from the packet set
252 bool NxDeviceIDMessage::decode(NxPacketSet
&pkt_set
)
255 source_id_
= decodeSourceId(pkt_set
);
260 // represent this message as a formatted string
261 string
NxDeviceIDMessage::asString() const
264 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
265 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
269 // decode message info from the packet set
270 bool NxOwnershipTraceMessage::decode(NxPacketSet
&pkt_set
)
273 source_id_
= decodeSourceId(pkt_set
);
275 // index, start_pos, length
276 pid_index_
= pkt_set
.getField32(0, 12, 4);
278 // index, start_pos, length
279 pid_value_
= pkt_set
.getField64(0, 16, 40);
281 // if there is a optional timestamp
282 if (pkt_set
.packetAtIndexExists(1)) {
283 timestamp_
= decodeTimestamp(pkt_set
, 1);
288 // represent this message as a formatted string
289 string
NxOwnershipTraceMessage::asString() const
292 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
293 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
295 os
<< "PID INDEX : 0x" << hex
<< setfill('0') << setw(2) << pid_index_
;
296 os
<< " - " << pidIndexString() << endl
;
297 if (pid_index_
< 2) {
298 os
<< "PID VALUE : " << dec
<< pid_value_
;
300 os
<< "PID VALUE : 0x" << hex
<< setfill('0') << setw(10)
303 os
<< " - " << pidValueString() << endl
;
304 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
308 // decode the data as a string
309 const char * NxOwnershipTraceMessage::pidIndexString() const
311 switch (pid_index_
) {
316 return "Hypervisor PID";
328 // decode the data as a string
329 const char * NxOwnershipTraceMessage::pidValueString() const
331 switch (pid_index_
) {
333 return "PID/NPIDR ref:DC1[OTS]";
339 return "LPIDR, MSR[GS], PID/NPIDR (ref:DC1[OTS]), MSR[PR]";
348 // decode message info from the packet set
349 bool NxDataAcquisitionMessage::decode(NxPacketSet
&pkt_set
)
352 source_id_
= decodeSourceId(pkt_set
);
354 // index, start_pos, length
355 idtag_
= pkt_set
.getField32(0, 12, 8);
357 // index, start_pos, length
358 dqdata_
= pkt_set
.getField32(0, 20, 32);
360 // if there is a optional timestamp
361 if (pkt_set
.packetAtIndexExists(1)) {
362 timestamp_
= decodeTimestamp(pkt_set
, 1);
367 // represent this message as a formatted string
368 string
NxDataAcquisitionMessage::asString() const
371 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
372 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
374 os
<< "IDTAG : 0x" << hex
<< setfill('0') << setw(2) << idtag_
;
375 os
<< " - " << idtagString() << endl
;
377 os
<< "DQDATA : 0x" << hex
<< setfill('0') << setw(8)
379 os
<< " - \"" << dqdataString() << "\"" << endl
;
381 os
<< "DQDATA : " << dec
<< dqdata_
<< endl
;
383 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
387 // decode the data as a string
388 const char * NxDataAcquisitionMessage::idtagString() const
416 // decode the data as a string
417 string
NxDataAcquisitionMessage::dqdataString() const
421 for (uint32_t i
= 0; i
< 4; ++i
) {
422 char c
= (dqdata_
>> ((3 - i
) * 8)) & 0xff;
432 // decode message info from the packet set
433 bool NxErrorMessage::decode(NxPacketSet
&pkt_set
)
436 source_id_
= decodeSourceId(pkt_set
);
438 // index, start_pos, length
439 etype_
= pkt_set
.getField32(0, 12, 4);
441 // index, start_pos, length
442 ecode_
= pkt_set
.getField32(0, 16, 8);
444 // if there is a optional timestamp
445 if (pkt_set
.packetAtIndexExists(1)) {
446 timestamp_
= decodeTimestamp(pkt_set
, 1);
451 // represent this message as a formatted string
452 string
NxErrorMessage::asString() const
455 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
456 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
458 os
<< "ETYPE : 0x" << hex
<< setfill('0') << setw(2) << etype_
;
459 os
<< " - " << etypeString() << endl
;
460 os
<< "ECODE : 0x" << hex
<< setfill('0') << setw(8) << ecode_
;
461 os
<< " - " << ecodeString() << endl
;
462 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
465 // decode the data as a string
466 const char * NxErrorMessage::etypeString() const
470 return "Message Queue Overrun";
473 return "Contention with higher priority message";
482 // decode the data as a string
483 string
NxErrorMessage::ecodeString() const
486 if ((ecode_
& 0x1) && (etype_
== 0)) {
487 os
<< "Watchpoint Trace ";
489 if ((ecode_
& 0x2) && (etype_
== 0)) {
493 os
<< "Program Trace ";
495 if ((ecode_
& 0x8) && (etype_
== 0)) {
496 os
<< "Ownership Trace ";
498 if ((ecode_
& 0x10) && (etype_
== 0)) {
499 os
<< "Debug (Status) Trace ";
502 os
<< "Data Acquisition Trace ";
508 // decode message info from the packet set
509 bool NxProgramTraceSync::decode(NxPacketSet
&pkt_set
)
512 source_id_
= decodeSourceId(pkt_set
);
514 // index, start_pos, length
515 map_
= pkt_set
.getField32(0, 12, 1);
517 // index, start_pos, length
518 icnt_
= pkt_set
.getField32(0, 13, 1);
520 // index, start_pos, length
521 pc_
.lower32(pkt_set
.getField32(1, 0, 32));
522 if (pkt_set
.getNumMDO(1) > 1) {
523 // get the upper 32bits of 64bit address
524 pc_
.upper32(pkt_set
.getField32(1, 32, 32));
527 // if there is a optional timestamp
528 if (pkt_set
.packetAtIndexExists(2)) {
529 timestamp_
= decodeTimestamp(pkt_set
, 2);
534 // represent this message as a formatted string
535 string
NxProgramTraceSync::asString() const
538 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
539 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
541 os
<< "MAP : 0x" << hex
<< setw(1) << map_
<< endl
;
542 os
<< "I-CNT : " << dec
<< icnt_
<< endl
;
543 os
<< "PC : " << pc_
.asString() << endl
;
544 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
548 // decode the data as a string
549 const char * NxDataTraceBase::dszString() const
551 switch (source_id_
) {
556 return "0 bytes (0-bit)";
559 return "1 byte (8-bit)";
562 return "2 bytes (16-bit/half word)";
565 return "3 bytes (24-bit/string)";
568 return "4 bytes (32-bit/word)";
571 return "5 bytes (mis-aligned access)";
574 return "6 bytes (mis-aligned access)";
577 return "7 bytes (mis-aligned access)";
580 return "8 bytes (64-bit/double)";
583 return "16 bytes (128-bit)";
586 return "32 bytes (256-bit)";
589 return "64 bytes (512-bit)";
637 return "Not Supported";
642 default: // All other sources
649 // decode message info from the packet set
650 bool NxDataTraceWrite::decode(NxPacketSet
&pkt_set
)
653 source_id_
= decodeSourceId(pkt_set
);
655 // index, start_pos, length
656 dsz_
= pkt_set
.getField32(0, 12, 4);
658 // index, start_pos, length
659 addr_
= pkt_set
.getField64(0, 16, 64);
661 // index, start_pos, length
662 data_
= pkt_set
.getField64(1, 0, 64);
664 // if there is a optional timestamp
665 if (pkt_set
.packetAtIndexExists(2)) {
666 timestamp_
= decodeTimestamp(pkt_set
, 2);
671 // represent this message as a formatted string
672 string
NxDataTraceWrite::asString() const
675 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
676 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
678 os
<< "DSZ : 0x" << hex
<< setfill('0') << setw(1) << dsz_
;
679 os
<< " - " << dszString() << endl
;
680 os
<< "U-ADDR : 0x" << hex
<< setfill('0') << setw(16) << addr_
682 os
<< "DATA : 0x" << hex
<< setfill('0') << setw(16) << data_
684 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
689 // decode message info from the packet set
690 bool NxDataTraceRead::decode(NxPacketSet
&pkt_set
)
693 source_id_
= decodeSourceId(pkt_set
);
695 // index, start_pos, length
696 dsz_
= pkt_set
.getField32(0, 12, 4);
698 // index, start_pos, length
699 addr_
= pkt_set
.getField64(0, 16, 64);
701 // index, start_pos, length
702 data_
= pkt_set
.getField64(1, 0, 64);
704 // if there is a optional timestamp
705 if (pkt_set
.packetAtIndexExists(2)) {
706 timestamp_
= decodeTimestamp(pkt_set
, 2);
711 // represent this message as a formatted string
712 string
NxDataTraceRead::asString() const
715 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
716 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
718 os
<< "DSZ : 0x" << hex
<< setfill('0') << setw(1) << dsz_
;
719 os
<< " - " << dszString() << endl
;
720 os
<< "U-ADDR : 0x" << hex
<< setfill('0') << setw(16) << addr_
722 os
<< "DATA : 0x" << hex
<< setfill('0') << setw(16) << data_
724 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
728 // decode message info from the packet set
729 bool NxDataTraceWriteSync::decode(NxPacketSet
&pkt_set
)
732 source_id_
= decodeSourceId(pkt_set
);
734 // index, start_pos, length
735 dsz_
= pkt_set
.getField32(0, 12, 4);
737 // index, start_pos, length
738 addr_
= pkt_set
.getField64(0, 16, 64);
740 // index, start_pos, length
741 data_
= pkt_set
.getField64(1, 0, 64);
743 // if there is a optional timestamp
744 if (pkt_set
.packetAtIndexExists(2)) {
745 timestamp_
= decodeTimestamp(pkt_set
, 2);
750 // represent this message as a formatted string
751 string
NxDataTraceWriteSync::asString() const
754 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
755 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
757 os
<< "DSZ : 0x" << hex
<< setfill('0') << setw(1) << dsz_
;
758 os
<< " - " << dszString() << endl
;
759 os
<< "F-ADDR : 0x" << hex
<< setfill('0') << setw(16) << addr_
761 os
<< "DATA : 0x" << hex
<< setfill('0') << setw(16) << data_
763 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
768 // decode message info from the packet set
769 bool NxDataTraceReadSync::decode(NxPacketSet
&pkt_set
)
772 source_id_
= decodeSourceId(pkt_set
);
774 // index, start_pos, length
775 dsz_
= pkt_set
.getField32(0, 12, 4);
777 // index, start_pos, length
778 addr_
= pkt_set
.getField64(0, 16, 64);
780 // index, start_pos, length
781 data_
= pkt_set
.getField64(1, 0, 64);
783 // if there is a optional timestamp
784 if (pkt_set
.packetAtIndexExists(2)) {
785 timestamp_
= decodeTimestamp(pkt_set
, 2);
790 // represent this message as a formatted string
791 string
NxDataTraceReadSync::asString() const
794 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
795 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
797 os
<< "DSZ : 0x" << hex
<< setfill('0') << setw(1) << dsz_
;
798 os
<< " - " << dszString() << endl
;
799 os
<< "F-ADDR : 0x" << hex
<< setfill('0') << setw(16) << addr_
801 os
<< "DATA : 0x" << hex
<< setfill('0') << setw(16) << data_
803 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
807 // decode message info from the packet set
808 bool NxWatchpointMessage::decode(NxPacketSet
&pkt_set
)
811 source_id_
= decodeSourceId(pkt_set
);
813 // determine the number of bits used to represent wphit_
814 if (pkt_set
.getNumMDO(0) > 1) {
818 // index, start_pos, length
819 wphit_
= pkt_set
.getField32(0, 12, wphit_size_
);
821 // if there is a optional timestamp
822 if (pkt_set
.packetAtIndexExists(1)) {
823 timestamp_
= decodeTimestamp(pkt_set
, 1);
829 // represent this message as a formatted string
830 string
NxWatchpointMessage::asString() const
833 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
834 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
836 os
<< "WPHIT : 0x" << hex
<< setfill('0') << setw(wphit_size_
/ 4)
837 << wphit_
<< " " << wphitString() << endl
;
838 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
842 // decode the data as a string
843 string
NxWatchpointMessage::wphitString() const
846 switch (source_id_
) {
847 case 0x0: // Cores 0-7
886 case 0x1: // Nexus Port Controller
888 os
<< "Client Sync:";
890 os
<< "Enter Suppress:";
892 os
<< "Tracebuffer Wrap:";
902 case 0x3d: //Event Processing Unit
903 os
<< ((wphit_size_
== 16) ? "SCUEVT[15:0]" : "CTREVT[31:0]");
938 os
<< "Unknown Src:" << source_id_
;
944 // decode message info from the packet set
945 bool NxResourceFullMessage::decode(NxPacketSet
&pkt_set
)
948 source_id_
= decodeSourceId(pkt_set
);
950 // index, start_pos, length
951 rcode_
= pkt_set
.getField32(0, 12, 4);
953 // index, start_pos, length
954 rdata_
= pkt_set
.getField32(0, 16, 30);
956 // if there is a optional timestamp
957 if (pkt_set
.packetAtIndexExists(1)) {
958 timestamp_
= decodeTimestamp(pkt_set
, 1);
963 // represent this message as a formatted string
964 string
NxResourceFullMessage::asString() const
967 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
968 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
970 os
<< "RCODE : 0x" << hex
<< setfill('0') << setw(1) << rcode_
;
971 os
<< " - " << rcodeString() << endl
;
972 os
<< "RDATA : 0x" << hex
<< setfill('0') << setw(8) << rdata_
974 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
977 // decode the data as a string
978 const char * NxResourceFullMessage::rcodeString() const
982 return "Instruction counter";
985 return "Branch history buffer";
988 return "Timestamp counter";
997 // decode message info from the packet set
998 bool NxProgramTraceIndirectBranch::decode(NxPacketSet
&pkt_set
)
1001 source_id_
= decodeSourceId(pkt_set
);
1003 // index, start_pos, length
1004 btype_
= pkt_set
.getField32(0, 12, 2);
1006 // index, start_pos, length
1007 icnt_
= pkt_set
.getField32(0, 14, 8);
1009 // index, start_pos, length
1010 uaddr_
.lower32(pkt_set
.getField32(1, 0, 32));
1011 if (pkt_set
.getNumMDO(1) > 1) {
1012 // get the upper 32bits of 64bit address
1013 uaddr_
.upper32(pkt_set
.getField32(1, 32, 32));
1016 // index, start_pos, length
1017 hist_
= pkt_set
.getField32(2, 0, 30);
1019 // if there is a optional timestamp
1020 if (pkt_set
.packetAtIndexExists(3)) {
1021 timestamp_
= decodeTimestamp(pkt_set
, 3);
1026 // represent this message as a formatted string
1027 string
NxProgramTraceIndirectBranch::asString() const
1030 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1031 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1033 os
<< "BTYPE : 0x" << hex
<< setfill('0') << setw(2) << btype_
;
1034 os
<< " - " << btypeString() << endl
;
1035 os
<< "I-CNT : " << dec
<< icnt_
<< endl
;
1036 os
<< "U-ADDR : " << uaddr_
.asString() << endl
;
1037 os
<< "HIST : 0x" << hex
<< setfill('0') << setw(8) << hist_
1039 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1043 // decode the data as a string
1044 const char * NxProgramTraceIndirectBranch::btypeString() const
1048 return "Branch Instruction";
1060 // decode message info from the packet set
1061 bool NxProgramTraceIndirectBranchSync::decode(NxPacketSet
&pkt_set
)
1064 source_id_
= decodeSourceId(pkt_set
);
1066 // index, start_pos, length
1067 btype_
= pkt_set
.getField32(0, 12, 2);
1069 // index, start_pos, length
1070 icnt_
= pkt_set
.getField32(0, 14, 8);
1072 // index, start_pos, length
1073 faddr_
.lower32(pkt_set
.getField32(1, 0, 32));
1074 if (pkt_set
.getNumMDO(1) > 1) {
1075 // get the upper 32bits of 64bit address
1076 faddr_
.upper32(pkt_set
.getField32(1, 32, 32));
1079 // index, start_pos, length
1080 hist_
= pkt_set
.getField32(2, 0, 30);
1082 // if there is a optional timestamp
1083 if (pkt_set
.packetAtIndexExists(3)) {
1084 timestamp_
= decodeTimestamp(pkt_set
, 3);
1089 // represent this message as a formatted string
1090 string
NxProgramTraceIndirectBranchSync::asString() const
1093 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1094 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1096 os
<< "BTYPE : 0x" << hex
<< setfill('0') << setw(1) << btype_
;
1097 os
<< " - " << btypeString() << endl
;
1098 os
<< "I-CNT : " << dec
<< icnt_
<< endl
;
1099 os
<< "F-ADDR : " << faddr_
.asString() << endl
;
1100 os
<< "HIST : 0x" << hex
<< setfill('0') << setw(8) << hist_
1102 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1106 // decode the data as a string
1107 const char * NxProgramTraceIndirectBranchSync::btypeString() const
1111 return "Branch Instruction";
1123 // decode message info from the packet set
1124 bool NxProgramTraceCorrelation::decode(NxPacketSet
&pkt_set
)
1127 source_id_
= decodeSourceId(pkt_set
);
1129 // index, start_pos, length
1130 evcode_
= pkt_set
.getField32(0, 12, 4);
1132 // index, start_pos, length
1133 icnt_
= pkt_set
.getField32(0, 16, 8);
1135 // index, start_pos, length
1136 cdata_
= pkt_set
.getField32(1, 0, 32);
1138 // if there is a optional timestamp
1139 if (pkt_set
.packetAtIndexExists(2)) {
1140 timestamp_
= decodeTimestamp(pkt_set
, 2);
1145 // represent this message as a formatted string
1146 string
NxProgramTraceCorrelation::asString() const
1149 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1150 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1152 os
<< "EVCODE : 0x" << hex
<< setfill('0') << setw(1) << evcode_
;
1153 os
<< " - " << evcodeString() << endl
;
1154 os
<< "I-CNT : " << dec
<< icnt_
<< endl
;
1155 os
<< "CDATA : 0x" << hex
<< setfill('0') << setw(8) << cdata_
1157 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1161 // decode the data as a string
1162 const char * NxProgramTraceCorrelation::evcodeString() const
1166 return "Entry into Halted state for debug";
1169 return "Entry into Halted or Stopped state for Power Mgt.";
1172 return "Program Trace disabled";
1175 return "Begin masking of program trace due to MSR[PMM] = 0";
1178 return "Branch and link occurrence";
1187 // ICT for both TCode 34,35
1188 string
NxInCircuitTraceBase::tcodeString() const
1192 return "In-Circuit Trace Message";
1195 return "In-Circuit Trace Sync Message";
1198 return "ICT Reserved";
1204 // decode message info from the packet set
1205 bool NxInCircuitTraceMessage::decode(NxPacketSet
&pkt_set
)
1208 source_id_
= decodeSourceId(pkt_set
);
1210 // if there is a optional timestamp
1211 if (pkt_set
.packetAtIndexExists(1)) {
1212 timestamp_
= decodeTimestamp(pkt_set
, 1);
1218 // represent this message as a formatted string
1219 string
NxInCircuitTraceMessage::asString() const
1222 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1223 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1225 os
<< "MSG TYPE : " << ICTMessageType() << endl
;
1226 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1231 // decode message info from the packet set
1232 bool NxDAMInCircuitTraceMessage::decode(NxPacketSet
&pkt_set
)
1235 source_id_
= decodeSourceId(pkt_set
);
1237 // index, start_pos, length
1238 ddrmid_
= pkt_set
.getField32(0, 12, 1);
1239 ddrsid_
= pkt_set
.getField32(0, 13, 8);
1240 ddrtt_
= pkt_set
.getField32(0, 21, 3);
1242 ddrsz_
= pkt_set
.getField32(0, 24, 4);
1243 uint32_t ddraddr_1
= pkt_set
.getField32(0, 28, 2);
1244 dddiec_
= pkt_set
.getField32(0, 30, 11);
1245 uint64_t ddraddr_2
= pkt_set
.getField64(0, 41, 34);
1246 ddraddr_
= (ddraddr_2
<< 2) | (ddraddr_1
& 0x3);
1248 ddraddr_
= pkt_set
.getField64(0, 24, 36);
1251 // if there is a optional timestamp
1252 if (pkt_set
.packetAtIndexExists(1)) {
1253 timestamp_
= decodeTimestamp(pkt_set
, 1);
1259 // decode the type data as a string
1260 const char * NxDAMInCircuitTraceMessage::ddrttString() const
1264 return "Write Transaction";
1267 return "Read Transaction";
1270 return "Speculative Read Transaction";
1273 return "Atomic_Clr; RMW, Clear selected fields to zero";
1276 return "Atomic_Set; RMW, Set selected fields to zero";
1279 return "Atomic_Dec; RMW, Decrement selected field";
1282 return "Atomic_Inc; RMW, Increment selected field";
1285 // fall through to default
1293 // decode the size data as a string
1294 string
NxDAMInCircuitTraceMessage::ddrszString() const
1298 os
<< ddrsz_
<< "DW";
1305 // represent this message as a formatted string
1306 string
NxDAMInCircuitTraceMessage::asString() const
1309 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1310 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1312 os
<< "MSG TYPE : " << ICTMessageType() << endl
;
1313 os
<< "DDR MID : " << ddrmid_
<< " "
1314 << (ddrmid_
? "Verbose" : "Terse") << endl
;
1315 os
<< "DDR SID : " << dec
<< ddrsid_
<< endl
;
1316 os
<< "DDR TT : " << dec
<< ddrtt_
<< " " << ddrttString() << endl
;
1318 os
<< "DDR SZ : " << dec
<< ddrsz_
<< " " << ddrszString()
1320 os
<< "DDDIEC : " << dec
<< dddiec_
<< endl
;
1322 if (isSyncMessage()) {
1323 os
<< "F-ADDR : " << hex
<< "0x" << ddraddr_
<< endl
;
1325 os
<< "U-ADDR : " << hex
<< "0x" << ddraddr_
<< endl
;
1327 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1331 // decode message info from the packet set
1332 bool NxDPQMInCircuitTraceMessage::decode(NxPacketSet
&pkt_set
)
1335 source_id_
= decodeSourceId(pkt_set
);
1337 // index, start_pos, length
1338 verb_
= pkt_set
.getField32(0, 12, 1);
1339 dpdm_
= pkt_set
.getField32(0, 13, 2);
1340 fqid_
= pkt_set
.getField32(0, 15, 24);
1341 cnum_
= pkt_set
.getField32(0, 39, 13);
1342 pnum_
= pkt_set
.getField32(0, 52, 5);
1343 ptype_
= pkt_set
.getField32(0, 57, 1);
1344 qet_
= pkt_set
.getField32(0, 58, 2);
1345 orf_
= pkt_set
.getField32(0, 60, 1);
1346 erf_
= pkt_set
.getField32(0, 61, 1);
1347 err_
= pkt_set
.getField32(0, 62, 4);
1350 fmbpid_
= pkt_set
.getField32(0, 66, 6);
1351 fmsc_
= pkt_set
.getField32(0, 72, 32);
1352 fmol_
= pkt_set
.getField32(0, 104, 29);
1353 fmfmt_
= pkt_set
.getField32(0, 133, 3);
1354 fmpid_
= pkt_set
.getField32(0, 136, 6);
1355 fmaddr_
= pkt_set
.getField64(0, 142, 48);
1357 // if there is a optional timestamp
1358 if (pkt_set
.packetAtIndexExists(1)) {
1359 timestamp_
= decodeTimestamp(pkt_set
, 1);
1365 // decode the queue event type as a string
1366 const char * NxDPQMInCircuitTraceMessage::queueEventTypeString() const
1370 return "Enqueue Command Event";
1373 return "Deferred Enqueue Complete";
1376 return "Dequeue Trace Event";
1385 // decode the enqueue rejection response code as a string
1386 const char * NxDPQMInCircuitTraceMessage::enqueueRejectionString() const
1391 return "Enqueue Command Event";
1394 return "Deferred Enqueue Complete";
1397 return "Dequeue Trace Event";
1407 // represent this message as a formatted string
1408 string
NxDPQMInCircuitTraceMessage::asString() const
1411 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1412 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1414 os
<< "MSG TYPE : " << ICTMessageType() << endl
;
1415 os
<< "DBG MARK : " << dec
<< dpdm_
<< endl
;
1416 os
<< "FQ ID : 0x" << hex
<< fqid_
<< dec
<< endl
;
1417 os
<< "CH NUM : 0x" << hex
<< cnum_
<< dec
<< endl
;
1418 os
<< "PORT NUM : " << dec
<< pnum_
<< endl
;
1419 os
<< "PORT TYP : " << dec
<< ptype_
1420 << (ptype_
? " Direct Connect" : " Software") << endl
;
1421 os
<< "QEVNT TYP : " << dec
<< qet_
<< " " << queueEventTypeString()
1423 os
<< "ORD REST : " << dec
<< orf_
<< " Order Restoration"
1424 << (orf_
? " was" : " was NOT") << " specified at enqueue"
1426 // FIXME: Does the erf field indicate enqueue operation rejection?
1427 // If so, s/orf_/erf_/ in the line below.
1428 os
<< "ENQ REJCT : " << dec
<< orf_
<< " Enqueue operation"
1429 << (orf_
? " was" : " was NOT") << " rejected" << endl
;
1430 os
<< "ENQ RESP : " << hex
<< "0x" << err_
<< dec
<< " "
1431 << enqueueRejectionString() << endl
;
1434 os
<< "FRM BP ID : " << hex
<< "0x" << fmbpid_
<< dec
<< endl
;
1435 os
<< "FRM STAT : " << hex
<< "0x" << fmsc_
<< dec
<< endl
;
1436 os
<< "FRM OFSET : " << hex
<< "0x" << fmol_
<< dec
<< endl
;
1437 os
<< "FRM FMT : " << hex
<< "0x" << fmfmt_
<< dec
<< endl
;
1438 os
<< "FRM PRT ID: " << hex
<< "0x" << fmpid_
<< dec
<< endl
;
1439 os
<< "FRM ADDR : " << hex
<< "0x" << hex
<< setfill('0')
1440 << setw(16) << fmaddr_
<< dec
<< endl
;
1443 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1447 // decode message info from the packet set
1448 bool NxDPFMInCircuitTraceMessage::decode(NxPacketSet
&pkt_set
)
1451 source_id_
= decodeSourceId(pkt_set
);
1453 // index, start_pos, length
1454 fmsel_
= pkt_set
.getField32(0, 12, 1);
1455 lbeat_
= pkt_set
.getField32(0, 13, 1);
1456 btcnt_
= pkt_set
.getField32(0, 14, 6);
1458 // capture the 128bit context data
1459 // Fman debug data is byte swapped on word boundries
1460 for (int i
= 0; i
< 4; i
++) {
1461 context_
[i
] = SWAPBYTES32(pkt_set
.getField32(0, 20+i
*32, 32));
1464 // if there is a optional timestamp
1465 if (pkt_set
.packetAtIndexExists(1)) {
1466 timestamp_
= decodeTimestamp(pkt_set
, 1);
1472 // represent this message as a formatted string
1473 string
NxDPFMInCircuitTraceMessage::asString() const
1476 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1477 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1479 os
<< "MSG TYPE : " << ICTMessageType() << endl
;
1480 os
<< "FMAN SEL : " << dec
<< fmsel_
<< " FMAN" << (fmsel_
? "2" : "1")
1482 os
<< "LAST BEAT : " << dec
<< lbeat_
<< endl
;
1483 os
<< "BEAT CNT : " << dec
<< btcnt_
<< endl
;
1484 os
<< "CONTEXT : " << hex
<< "0x" << hex
<< setfill('0') << setw(8)
1485 << context_
[0] << ":" << setfill('0') << setw(8) << context_
[1]
1486 << ":" << setfill('0') << setw(8) << context_
[2] << ":"
1487 << setfill('0') << setw(8) << context_
[3] << dec
<< endl
;
1489 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1494 // decode message info from the packet set
1495 bool NxCoreInCircuitTraceMessage::decode(NxPacketSet
&pkt_set
)
1498 source_id_
= decodeSourceId(pkt_set
);
1500 // index, start_pos, length
1501 cksrc_
= pkt_set
.getField32(0, 12, 3);
1502 sync_
= pkt_set
.getField32(0, 15, 2);
1503 ckdf_
= pkt_set
.getField32(0, 17, 2);
1506 ckdata1_
= pkt_set
.getField32(0, 19, 32);
1509 ckdata1_
= pkt_set
.getField32(0, 19, 32);
1510 ckdata2_
= pkt_set
.getField32(1, 0, 32);
1516 // if there is a optional timestamp
1517 if (pkt_set
.packetAtIndexExists(2)) {
1518 timestamp_
= decodeTimestamp(pkt_set
, 2);
1524 // decode the sync code as a string
1525 const char * NxCoreInCircuitTraceMessage::syncString() const
1529 return "Previous Message successful";
1532 return "Previous Message not sent due to contention";
1535 return "Previous Snapshot not completed";
1545 // decode the sync code as a string
1546 const char * NxCoreInCircuitTraceMessage::cksrcString() const
1553 return "PMCC0[32:64], PMCC1[32:64]";
1556 return "PMCC2[32:64], PMCC3[32:64]";
1559 return "PMCC4[32:64], PMCC5[32:64]";
1569 // represent this message as a formatted string
1570 string
NxCoreInCircuitTraceMessage::asString() const
1573 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1574 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1576 os
<< "MSG TYPE : " << ICTMessageType() << endl
;
1577 os
<< "CKSRC : " << cksrc_
<< " - " << cksrcString() << endl
;
1578 os
<< "SYNC : " << sync_
<< " - " << syncString() << endl
;
1579 os
<< "CKDF : " << ckdf_
<< " - " << ckdf_
+1 << " CKDATA fields included" << endl
;
1580 os
<< "CKDATA1 : " << "0x" << hex
<< setfill('0') << setw(8) << ckdata1_
<< endl
;
1582 os
<< "CKDATA2 : " << "0x" << hex
<< setfill('0') << setw(8) << ckdata2_
<< endl
;
1584 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1588 // decode message info from the packet set
1589 bool NxTimeStampCorrelation::decode(NxPacketSet
&pkt_set
)
1592 source_id_
= decodeSourceId(pkt_set
);
1594 // index, start_pos, length
1595 tcorr_
= pkt_set
.getField32(0, 12, 4);
1596 ttype_
= pkt_set
.getField32(0, 17, 6);
1598 // T4rev1 errata A-004813
1599 if ((source_id_
& 0x1) == 0) {
1600 tcorr_
= pkt_set
.getField32(0, 16, 4);
1601 ttype_
= pkt_set
.getField32(0, 20, 6);
1604 // if there is a optional timestamp
1605 if (pkt_set
.packetAtIndexExists(1)) {
1606 timestamp_
= decodeTimestamp(pkt_set
, 1);
1612 // represent this message as a formatted string
1613 string
NxTimeStampCorrelation::asString() const
1616 os
<< "TCODE : " << dec
<< tcode() << " " << tcodeString() << endl
;
1617 os
<< "SRC ID : " << dec
<< sourceId() << " " << sourceIdString()
1619 os
<< "TCORR : 0x" << hex
<< setfill('0') << setw(4) << tcorr_
1621 os
<< "T-TYPE : 0x" << hex
<< setfill('0') << setw(6) << ttype_
1622 << " - " << ttypeString() << endl
;
1623 os
<< "TIMESTAMP : " << timestampAsString() << endl
;
1627 // decode the time stamp type code as a string
1628 const char * NxTimeStampCorrelation::ttypeString() const
1635 return "Halt Mode Exit";
1638 return "Low Power Mode Exit";
1641 return "External Event";
This page took 0.065732 seconds and 4 git commands to generate.