2 * Copyright (C) - 2013 Christian Babeux <christian.babeux@efficios.com>
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
26 #include "CTFLogVisitor.h"
27 #include "NxMessageVisitor.h"
28 #include "NxMessage.h"
35 struct bt_ctf_field_type
*uint32_bin_type
;
36 struct bt_ctf_field_type
*uint32_oct_type
;
37 struct bt_ctf_field_type
*uint32_dec_type
;
38 struct bt_ctf_field_type
*uint32_hex_type
;
40 struct bt_ctf_field_type
*uint64_bin_type
;
41 struct bt_ctf_field_type
*uint64_oct_type
;
42 struct bt_ctf_field_type
*uint64_dec_type
;
43 struct bt_ctf_field_type
*uint64_hex_type
;
45 struct bt_ctf_field_type
*string_type
;
48 CTFLogVisitor::CTFIntegerField::CTFIntegerField(const string
&name
,
50 enum bt_ctf_integer_base base
)
52 struct bt_ctf_field_type
*type
;
56 case BT_CTF_INTEGER_BASE_BINARY
:
57 type
= uint32_bin_type
;
59 case BT_CTF_INTEGER_BASE_OCTAL
:
60 type
= uint32_oct_type
;
62 case BT_CTF_INTEGER_BASE_DECIMAL
:
63 type
= uint32_dec_type
;
65 case BT_CTF_INTEGER_BASE_HEXADECIMAL
:
66 type
= uint32_hex_type
;
73 create_unsigned_field(name
, type
, value
);
76 CTFLogVisitor::CTFIntegerField::CTFIntegerField(const string
&name
,
78 enum bt_ctf_integer_base base
)
80 struct bt_ctf_field_type
*type
;
84 case BT_CTF_INTEGER_BASE_BINARY
:
85 type
= uint64_bin_type
;
87 case BT_CTF_INTEGER_BASE_OCTAL
:
88 type
= uint64_oct_type
;
90 case BT_CTF_INTEGER_BASE_DECIMAL
:
91 type
= uint64_dec_type
;
93 case BT_CTF_INTEGER_BASE_HEXADECIMAL
:
94 type
= uint64_hex_type
;
101 create_unsigned_field(name
, type
, value
);
104 void CTFLogVisitor::CTFIntegerField::create_unsigned_field(const string
&name
,
105 struct bt_ctf_field_type
*type
,
109 struct bt_ctf_field
*field
= NULL
;
113 field
= bt_ctf_field_create(type
);
116 ret
= bt_ctf_field_unsigned_integer_set_value(field
, value
);
124 CTFLogVisitor::CTFStringField::CTFStringField(const string
&name
,
128 struct bt_ctf_field
*field
= NULL
;
130 field
= bt_ctf_field_create(string_type
);
133 ret
= bt_ctf_field_string_set_value(field
, value
.c_str());
141 CTFLogVisitor::CTFLogVisitor(const string
&trace_path
)
144 uint64_t default_clock
= 1000000000;
146 writer_
= bt_ctf_writer_create(trace_path
.c_str());
148 /* TODO: How can we handle errors in the visitor? */
150 ret
= bt_ctf_writer_add_environment_field(writer_
,
152 "Babeltrace Nexus to CTF");
158 * TODO: Figure out how to obtain clock frequency and precision
159 * from the traced system.
161 clock_
= bt_ctf_clock_create("system_clock");
164 ret
= bt_ctf_clock_set_description(clock_
, "System clock");
167 ret
= bt_ctf_clock_set_frequency(clock_
, default_clock
);
170 ret
= bt_ctf_clock_set_is_absolute(clock_
, 1);
173 ret
= bt_ctf_writer_add_clock(writer_
, clock_
);
177 stream_class_
= bt_ctf_stream_class_create("stream0");
178 assert(stream_class_
);
180 ret
= bt_ctf_stream_class_set_clock(stream_class_
, clock_
);
183 stream_
= bt_ctf_writer_create_stream(writer_
, stream_class_
);
187 string_type
= bt_ctf_field_type_string_create();
189 uint32_bin_type
= bt_ctf_field_type_integer_create(32);
190 ret
= bt_ctf_field_type_integer_set_base(uint32_bin_type
,
191 BT_CTF_INTEGER_BASE_BINARY
);
194 uint64_bin_type
= bt_ctf_field_type_integer_create(64);
195 ret
= bt_ctf_field_type_integer_set_base(uint64_bin_type
,
196 BT_CTF_INTEGER_BASE_BINARY
);
199 uint32_oct_type
= bt_ctf_field_type_integer_create(32);
200 ret
= bt_ctf_field_type_integer_set_base(uint32_oct_type
,
201 BT_CTF_INTEGER_BASE_OCTAL
);
204 uint64_oct_type
= bt_ctf_field_type_integer_create(64);
205 ret
= bt_ctf_field_type_integer_set_base(uint64_oct_type
,
206 BT_CTF_INTEGER_BASE_OCTAL
);
209 uint32_dec_type
= bt_ctf_field_type_integer_create(32);
210 ret
= bt_ctf_field_type_integer_set_base(uint32_dec_type
,
211 BT_CTF_INTEGER_BASE_DECIMAL
);
214 uint64_dec_type
= bt_ctf_field_type_integer_create(64);
215 ret
= bt_ctf_field_type_integer_set_base(uint64_dec_type
,
216 BT_CTF_INTEGER_BASE_DECIMAL
);
219 uint32_hex_type
= bt_ctf_field_type_integer_create(32);
220 ret
= bt_ctf_field_type_integer_set_base(uint32_hex_type
,
221 BT_CTF_INTEGER_BASE_HEXADECIMAL
);
224 uint64_hex_type
= bt_ctf_field_type_integer_create(64);
225 ret
= bt_ctf_field_type_integer_set_base(uint64_hex_type
,
226 BT_CTF_INTEGER_BASE_HEXADECIMAL
);
230 CTFLogVisitor::~CTFLogVisitor()
232 /* Free event classes */
233 map
<const type_info
*, struct bt_ctf_event_class
*>::iterator it
;
234 for (it
= event_class_
.begin(); it
!= event_class_
.end(); ++it
) {
235 bt_ctf_event_class_put(it
->second
);
239 bt_ctf_field_type_put(uint32_bin_type
);
240 bt_ctf_field_type_put(uint64_bin_type
);
242 bt_ctf_field_type_put(uint32_oct_type
);
243 bt_ctf_field_type_put(uint64_oct_type
);
245 bt_ctf_field_type_put(uint32_dec_type
);
246 bt_ctf_field_type_put(uint64_dec_type
);
248 bt_ctf_field_type_put(uint32_hex_type
);
249 bt_ctf_field_type_put(uint64_hex_type
);
251 bt_ctf_field_type_put(string_type
);
253 bt_ctf_clock_put(clock_
);
254 bt_ctf_stream_class_put(stream_class_
);
255 bt_ctf_stream_put(stream_
);
258 bt_ctf_writer_put(writer_
);
261 struct bt_ctf_event_class
* CTFLogVisitor::create_event_class(const NxMessage
*m
,
263 const CTFFields
&fields
)
266 struct bt_ctf_event_class
*event_class
= NULL
;
268 event_class
= bt_ctf_event_class_create(name
.c_str());
271 for (CTFFields::const_iterator it
= fields
.begin();
274 const char *name
= (*it
)->name().c_str();
275 struct bt_ctf_field_type
*type
= (*it
)->type();
279 ret
= bt_ctf_event_class_add_field(event_class
, type
, name
);
283 ret
= bt_ctf_stream_class_add_event_class(stream_class_
, event_class
);
286 event_class_
[&typeid(*m
)] = event_class
;
291 struct bt_ctf_event_class
*
292 CTFLogVisitor::get_event_class(const NxMessage
*m
) const
294 struct bt_ctf_event_class
*event_class
= NULL
;
295 map
<const type_info
*, struct bt_ctf_event_class
*>::const_iterator it
;
299 it
= event_class_
.find(&typeid(*m
));
301 if (it
!= event_class_
.end()) {
302 event_class
= it
->second
;
309 void CTFLogVisitor::event_set_fields(struct bt_ctf_event
*event
,
310 const CTFFields
&fields
) const
314 for (CTFFields::const_iterator it
= fields
.begin();
318 const char *name
= (*it
)->name().c_str();
319 bt_ctf_field
*field
= (*it
)->field();
323 ret
= bt_ctf_event_set_payload(event
, name
, field
);
328 void CTFLogVisitor::append_nexus_message(NxMessage
*m
,
329 const string
&event_name
,
330 const CTFFields
&fields
)
333 struct bt_ctf_event_class
*event_class
= NULL
;
334 struct bt_ctf_event
*event
= NULL
;
338 event_class
= get_event_class(m
);
340 if (event_class
== NULL
) {
341 event_class
= create_event_class(m
, event_name
, fields
);
344 event
= bt_ctf_event_create(event_class
);
347 event_set_fields(event
, fields
);
349 ret
= bt_ctf_stream_append_event(stream_
, event
);
353 * FIXME: There will only be one event per-packet
354 * if we flush for each message.
356 ret
= bt_ctf_stream_flush(stream_
);
359 bt_ctf_event_put(event
);
362 void CTFLogVisitor::visit(NxDefaultMessage
*m
)
365 * These messages are treated as "unknown" and their payload
366 * won't be decoded. No need to process them.
368 useful_visit_
= false;
371 void CTFLogVisitor::visit(NxDebugStatusMessage
*m
)
373 /* Default Nexus Message fields */
374 CTFIntegerField
tcode ("TCODE", m
->tcode());
375 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
376 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
377 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
378 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
380 /* Nexus Debug Status fields */
381 CTFIntegerField
status ("STATUS", m
->status(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
385 fields
.push_back(&tcode
);
386 fields
.push_back(&tcode_desc
);
387 fields
.push_back(&src_id
);
388 fields
.push_back(&src_id_desc
);
389 fields
.push_back(×tamp
);
390 fields
.push_back(&status
);
392 append_nexus_message(m
, "Nexus Debug Status Message", fields
);
393 useful_visit_
= true;
396 void CTFLogVisitor::visit(NxDeviceIDMessage
*m
)
398 /* Default Nexus Message fields */
399 CTFIntegerField
tcode ("TCODE", m
->tcode());
400 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
401 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
402 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
404 /* TODO: Confirm that Nexus Device ID Message can't have timestamp */
405 /*CTFIntegerField timestamp ("TIMESTAMP", m->correctedTimestamp());*/
409 fields
.push_back(&tcode
);
410 fields
.push_back(&tcode_desc
);
411 fields
.push_back(&src_id
);
412 fields
.push_back(&src_id_desc
);
413 /*fields.push_back(×tamp);*/
415 append_nexus_message(m
, "Nexus Device ID Message", fields
);
416 useful_visit_
= true;
419 void CTFLogVisitor::visit(NxOwnershipTraceMessage
*m
)
421 /* Default Nexus Message fields */
422 CTFIntegerField
tcode ("TCODE", m
->tcode());
423 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
424 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
425 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
426 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
428 /* Nexus Ownership Trace Message fields */
429 CTFIntegerField
pid_idx ("PID_INDEX", m
->pidIndex(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
430 CTFStringField
pid_idx_desc ("PID_INDEX_DESC", string(m
->pidIndexString()));
431 CTFIntegerField
pid_val ("PID_VALUE", m
->pidValue());
432 CTFStringField
pid_val_desc ("PID_VALUE_DESC", string(m
->pidValueString()));
436 fields
.push_back(&tcode
);
437 fields
.push_back(&tcode_desc
);
438 fields
.push_back(&src_id
);
439 fields
.push_back(&src_id_desc
);
440 fields
.push_back(×tamp
);
441 fields
.push_back(&pid_idx
);
442 fields
.push_back(&pid_idx_desc
);
443 fields
.push_back(&pid_val
);
444 fields
.push_back(&pid_val_desc
);
446 append_nexus_message(m
, "Nexus Ownership Trace Message", fields
);
447 useful_visit_
= true;
450 void CTFLogVisitor::visit(NxDataAcquisitionMessage
*m
)
452 /* Default Nexus Message fields */
453 CTFIntegerField
tcode ("TCODE", m
->tcode());
454 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
455 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
456 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
457 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
459 /* Nexus Data Acquisition Message fields */
460 CTFIntegerField
id_tag ("IDTAG", m
->idtag(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
461 CTFStringField
id_tag_desc ("IDTAG_DESC", string(m
->idtagString()));
462 CTFIntegerField
dq_data ("DQDATA", m
->dqdata());
463 CTFStringField
dq_data_desc ("DQDATA_DESC", string(m
->dqdataString()));
467 fields
.push_back(&tcode
);
468 fields
.push_back(&tcode_desc
);
469 fields
.push_back(&src_id
);
470 fields
.push_back(&src_id_desc
);
471 fields
.push_back(×tamp
);
472 fields
.push_back(&id_tag
);
473 fields
.push_back(&id_tag_desc
);
474 fields
.push_back(&dq_data
);
475 fields
.push_back(&dq_data_desc
);
477 append_nexus_message(m
, "Nexus Data Acquisition Message", fields
);
478 useful_visit_
= true;
481 void CTFLogVisitor::visit(NxErrorMessage
*m
)
483 /* Default Nexus Message fields */
484 CTFIntegerField
tcode ("TCODE", m
->tcode());
485 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
486 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
487 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
488 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
490 /* Nexus Error Message fields */
491 CTFIntegerField
etype ("ETYPE", m
->etype(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
492 CTFStringField
etype_desc ("ETYPE_DESC", string(m
->etypeString()));
493 CTFIntegerField
ecode ("ECODE", m
->ecode(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
494 CTFStringField
ecode_desc ("ECODE_DESC", string(m
->ecodeString()));
498 fields
.push_back(&tcode
);
499 fields
.push_back(&tcode_desc
);
500 fields
.push_back(&src_id
);
501 fields
.push_back(&src_id_desc
);
502 fields
.push_back(×tamp
);
503 fields
.push_back(&etype
);
504 fields
.push_back(&etype_desc
);
505 fields
.push_back(&ecode
);
506 fields
.push_back(&ecode_desc
);
508 append_nexus_message(m
, "Nexus Error Message", fields
);
509 useful_visit_
= true;
512 void CTFLogVisitor::visit(NxProgramTraceSync
*m
)
514 /* Default Nexus Message fields */
515 CTFIntegerField
tcode ("TCODE", m
->tcode());
516 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
517 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
518 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
519 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
521 /* Nexus Program Trace Sync fields */
522 CTFIntegerField
map ("MAP", m
->map(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
523 CTFIntegerField
icnt ("ICNT", m
->icnt());
524 CTFIntegerField
hist ("HIST", m
->hist(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
525 CTFIntegerField
pc64 ("PC", m
->address().address64(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
526 CTFIntegerField
pc32 ("PC", m
->address().address32(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
530 fields
.push_back(&tcode
);
531 fields
.push_back(&tcode_desc
);
532 fields
.push_back(&src_id
);
533 fields
.push_back(&src_id_desc
);
534 fields
.push_back(×tamp
);
535 fields
.push_back(&map
);
536 fields
.push_back(&icnt
);
537 fields
.push_back(&hist
);
540 * TODO: Is it possible for pc to change bitness between messages?
541 * If so, we should probably add both fields to the trace.
543 if (m
->address().is64bits()) {
544 fields
.push_back(&pc64
);
546 fields
.push_back(&pc32
);
549 append_nexus_message(m
, "Nexus Program Trace Sync Message", fields
);
550 useful_visit_
= true;
553 void CTFLogVisitor::visit(NxDataTraceWrite
*m
)
555 /* Default Nexus Message fields */
556 CTFIntegerField
tcode ("TCODE", m
->tcode());
557 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
558 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
559 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
560 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
562 /* Nexus Data Trace Write fields */
563 CTFIntegerField
dsz ("DSZ", m
->dsz(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
564 CTFStringField
dsz_desc ("DSZ_DESC", string(m
->dszString()));
565 CTFIntegerField
addr ("UADDR", m
->addr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
566 CTFIntegerField
data ("DATA", m
->data(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
570 fields
.push_back(&tcode
);
571 fields
.push_back(&tcode_desc
);
572 fields
.push_back(&src_id
);
573 fields
.push_back(&src_id_desc
);
574 fields
.push_back(×tamp
);
575 fields
.push_back(&dsz
);
576 fields
.push_back(&dsz_desc
);
577 fields
.push_back(&addr
);
578 fields
.push_back(&data
);
580 append_nexus_message(m
, "Nexus Data Trace Write Message", fields
);
581 useful_visit_
= true;
584 void CTFLogVisitor::visit(NxDataTraceRead
*m
)
586 /* Default Nexus Message fields */
587 CTFIntegerField
tcode ("TCODE", m
->tcode());
588 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
589 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
590 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
591 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
593 /* Nexus Data Trace Read fields */
594 CTFIntegerField
dsz ("DSZ", m
->dsz(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
595 CTFStringField
dsz_desc ("DSZ_DESC", string(m
->dszString()));
596 CTFIntegerField
addr ("UADDR", m
->addr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
597 CTFIntegerField
data ("DATA", m
->data(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
601 fields
.push_back(&tcode
);
602 fields
.push_back(&tcode_desc
);
603 fields
.push_back(&src_id
);
604 fields
.push_back(&src_id_desc
);
605 fields
.push_back(×tamp
);
606 fields
.push_back(&dsz
);
607 fields
.push_back(&dsz_desc
);
608 fields
.push_back(&addr
);
609 fields
.push_back(&data
);
611 append_nexus_message(m
, "Nexus Data Trace Read Message", fields
);
612 useful_visit_
= true;
615 void CTFLogVisitor::visit(NxDataTraceWriteSync
*m
)
617 /* Default Nexus Message fields */
618 CTFIntegerField
tcode ("TCODE", m
->tcode());
619 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
620 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
621 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
622 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
624 /* Nexus Data Trace Write Sync fields */
625 CTFIntegerField
dsz ("DSZ", m
->dsz(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
626 CTFStringField
dsz_desc ("DSZ_DESC", string(m
->dszString()));
627 CTFIntegerField
addr ("FADDR", m
->addr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
628 CTFIntegerField
data ("DATA", m
->data(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
632 fields
.push_back(&tcode
);
633 fields
.push_back(&tcode_desc
);
634 fields
.push_back(&src_id
);
635 fields
.push_back(&src_id_desc
);
636 fields
.push_back(×tamp
);
637 fields
.push_back(&dsz
);
638 fields
.push_back(&dsz_desc
);
639 fields
.push_back(&addr
);
640 fields
.push_back(&data
);
642 append_nexus_message(m
, "Nexus Data Trace Write Sync Message", fields
);
643 useful_visit_
= true;
646 void CTFLogVisitor::visit(NxDataTraceReadSync
*m
)
648 /* Default Nexus Message fields */
649 CTFIntegerField
tcode ("TCODE", m
->tcode());
650 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
651 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
652 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
653 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
655 /* Nexus Data Trace Read Sync fields */
656 CTFIntegerField
dsz ("DSZ", m
->dsz(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
657 CTFStringField
dsz_desc ("DSZ_DESC", string(m
->dszString()));
658 CTFIntegerField
addr ("FADDR", m
->addr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
659 CTFIntegerField
data ("DATA", m
->data(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
663 fields
.push_back(&tcode
);
664 fields
.push_back(&tcode_desc
);
665 fields
.push_back(&src_id
);
666 fields
.push_back(&src_id_desc
);
667 fields
.push_back(×tamp
);
668 fields
.push_back(&dsz
);
669 fields
.push_back(&dsz_desc
);
670 fields
.push_back(&addr
);
671 fields
.push_back(&data
);
673 append_nexus_message(m
, "Nexus Data Trace Read Sync Message", fields
);
674 useful_visit_
= true;
677 void CTFLogVisitor::visit(NxWatchpointMessage
*m
)
679 /* Default Nexus Message fields */
680 CTFIntegerField
tcode ("TCODE", m
->tcode());
681 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
682 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
683 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
684 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
686 /* Nexus Watchpoint fields */
687 CTFIntegerField
wphit ("WPHIT", m
->wphit(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
688 CTFStringField
wphit_desc ("WPHIT_DESC", m
->wphitString());
689 CTFIntegerField
wphit_size ("WPHIT_SIZE", m
->wphit_size(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
693 fields
.push_back(&tcode
);
694 fields
.push_back(&tcode_desc
);
695 fields
.push_back(&src_id
);
696 fields
.push_back(&src_id_desc
);
697 fields
.push_back(×tamp
);
698 fields
.push_back(&wphit
);
699 fields
.push_back(&wphit_desc
);
700 fields
.push_back(&wphit_size
);
702 append_nexus_message(m
, "Nexus Watchpoint Message", fields
);
703 useful_visit_
= true;
706 void CTFLogVisitor::visit(NxResourceFullMessage
*m
)
708 /* Default Nexus Message fields */
709 CTFIntegerField
tcode ("TCODE", m
->tcode());
710 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
711 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
712 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
713 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
715 /* Nexus Ressource Full fields */
716 CTFIntegerField
rcode ("RCODE", m
->rcode(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
717 CTFStringField
rcode_desc ("RCODE_DESC", string(m
->rcodeString()));
718 CTFIntegerField
rdata ("RDATA", m
->rdata(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
722 fields
.push_back(&tcode
);
723 fields
.push_back(&tcode_desc
);
724 fields
.push_back(&src_id
);
725 fields
.push_back(&src_id_desc
);
726 fields
.push_back(×tamp
);
727 fields
.push_back(&rcode
);
728 fields
.push_back(&rcode_desc
);
729 fields
.push_back(&rdata
);
731 append_nexus_message(m
, "Nexus Ressource Full Message", fields
);
732 useful_visit_
= true;
735 void CTFLogVisitor::visit(NxProgramTraceIndirectBranch
*m
)
737 /* Default Nexus Message fields */
738 CTFIntegerField
tcode ("TCODE", m
->tcode());
739 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
740 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
741 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
742 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
744 /* Nexus Program Trace Indirect Branch fields */
745 CTFIntegerField
btype ("BTYPE", m
->btype(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
746 CTFStringField
btype_desc ("BTYPE_DESC", m
->btypeString());
747 CTFIntegerField
icnt ("ICNT", m
->icnt());
748 CTFIntegerField
hist ("HIST", m
->hist(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
749 CTFIntegerField
uaddr64 ("UADDR", m
->address().address64(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
750 CTFIntegerField
uaddr32 ("UADDR", m
->address().address32(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
754 fields
.push_back(&tcode
);
755 fields
.push_back(&tcode_desc
);
756 fields
.push_back(&src_id
);
757 fields
.push_back(&src_id_desc
);
758 fields
.push_back(×tamp
);
759 fields
.push_back(&btype
);
760 fields
.push_back(&btype_desc
);
761 fields
.push_back(&icnt
);
762 fields
.push_back(&hist
);
765 * TODO: Is it possible for uaddr to change bitness between messages?
766 * If so, we should probably add both fields to the trace.
768 if (m
->address().is64bits()) {
769 fields
.push_back(&uaddr64
);
771 fields
.push_back(&uaddr32
);
774 append_nexus_message(m
, "Nexus Program Trace Indirect Branch Message", fields
);
775 useful_visit_
= true;
778 void CTFLogVisitor::visit(NxProgramTraceIndirectBranchSync
*m
)
780 /* Default Nexus Message fields */
781 CTFIntegerField
tcode ("TCODE", m
->tcode());
782 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
783 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
784 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
785 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
787 /* Nexus Program Trace Indirect Branch Sync fields */
788 CTFIntegerField
btype ("BTYPE", m
->btype(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
789 CTFStringField
btype_desc ("BTYPE_DESC", m
->btypeString());
790 CTFIntegerField
icnt ("ICNT", m
->icnt());
791 CTFIntegerField
hist ("HIST", m
->hist(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
792 CTFIntegerField
faddr64 ("FADDR", m
->address().address64(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
793 CTFIntegerField
faddr32 ("FADDR", m
->address().address32(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
797 fields
.push_back(&tcode
);
798 fields
.push_back(&tcode_desc
);
799 fields
.push_back(&src_id
);
800 fields
.push_back(&src_id_desc
);
801 fields
.push_back(×tamp
);
802 fields
.push_back(&btype
);
803 fields
.push_back(&btype_desc
);
804 fields
.push_back(&icnt
);
805 fields
.push_back(&hist
);
808 * TODO: Is it possible for faddr to change bitness between messages?
809 * If so, we should probably add both fields to the trace.
811 if (m
->address().is64bits()) {
812 fields
.push_back(&faddr64
);
814 fields
.push_back(&faddr32
);
817 append_nexus_message(m
, "Nexus Program Trace Indirect Branch Sync Message", fields
);
818 useful_visit_
= true;
821 void CTFLogVisitor::visit(NxProgramTraceCorrelation
*m
)
823 /* Default Nexus Message fields */
824 CTFIntegerField
tcode ("TCODE", m
->tcode());
825 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
826 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
827 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
828 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
830 /* Nexus Program Trace Correlation fields */
831 CTFIntegerField
evcode ("EVCODE", m
->evcode(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
832 CTFStringField
evcode_desc ("EVCODE_DESC", m
->evcodeString());
833 CTFIntegerField
icnt ("ICNT", m
->icnt());
834 CTFIntegerField
cdata ("CDATA", m
->cdata(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
838 fields
.push_back(&tcode
);
839 fields
.push_back(&tcode_desc
);
840 fields
.push_back(&src_id
);
841 fields
.push_back(&src_id_desc
);
842 fields
.push_back(×tamp
);
843 fields
.push_back(&evcode
);
844 fields
.push_back(&evcode_desc
);
845 fields
.push_back(&icnt
);
846 fields
.push_back(&cdata
);
848 append_nexus_message(m
, "Nexus Program Trace Correlation Message", fields
);
849 useful_visit_
= true;
852 void CTFLogVisitor::visit(NxDAMInCircuitTraceMessage
*m
)
854 /* Default Nexus Message fields */
855 CTFIntegerField
tcode ("TCODE", m
->tcode());
856 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
857 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
858 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
859 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
861 /* Nexus DAM In-Circuit Trace fields */
862 CTFStringField
ict_msg_type ("ICT_MSG_TYPE", string(m
->ICTMessageType()));
863 CTFIntegerField
ddrmid ("DDRMID", m
->ddrmid());
864 CTFIntegerField
ddrsid ("DDRSID", m
->ddrsid());
865 CTFIntegerField
ddrtt ("DDRTT", m
->ddrtt());
866 CTFStringField
ddrtt_desc ("DDRTT_DESC", string(m
->ddrttString()));
867 CTFIntegerField
ddrsz ("DDRSZ", m
->ddrsz());
868 CTFIntegerField
faddr ("FADDR", (m
->isSyncMessage() ? m
->ddraddr() : 0), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
869 CTFIntegerField
uaddr ("UADDR", (m
->isSyncMessage() ? 0 : m
->ddraddr()), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
870 CTFIntegerField
dddiec ("DDDIEC", m
->dddiec());
874 fields
.push_back(&tcode
);
875 fields
.push_back(&tcode_desc
);
876 fields
.push_back(&src_id
);
877 fields
.push_back(&src_id_desc
);
878 fields
.push_back(×tamp
);
879 fields
.push_back(&ict_msg_type
);
880 fields
.push_back(&ddrmid
);
881 fields
.push_back(&ddrsid
);
882 fields
.push_back(&ddrtt
);
883 fields
.push_back(&ddrtt_desc
);
884 fields
.push_back(&ddrsz
);
885 fields
.push_back(&faddr
);
886 fields
.push_back(&uaddr
);
887 fields
.push_back(&dddiec
);
889 append_nexus_message(m
, "Nexus DAM In-Circuit Trace Message", fields
);
890 useful_visit_
= true;
893 void CTFLogVisitor::visit(NxCAMInCircuitTraceMessage
*m
)
895 useful_visit_
= false;
898 void CTFLogVisitor::visit(NxCDMInCircuitTraceMessage
*m
)
900 useful_visit_
= false;
903 void CTFLogVisitor::visit(NxDPQMInCircuitTraceMessage
*m
)
905 /* Default Nexus Message fields */
906 CTFIntegerField
tcode ("TCODE", m
->tcode());
907 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
908 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
909 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
910 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
912 /* Nexus DPQM In-Circuit Trace fields */
913 CTFStringField
ict_msg_type ("ICT_MSG_TYPE", string(m
->ICTMessageType()));
914 CTFIntegerField
dpdm ("DBG_MARK", m
->dpdm());
915 CTFIntegerField
fqid ("FQ_ID", m
->fqid(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
916 CTFIntegerField
cnum ("CH_NUM", m
->cnum(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
917 CTFIntegerField
pnum ("PORT_NUM", m
->pnum());
918 CTFIntegerField
ptype ("PORT_TYPE", m
->ptype());
919 CTFStringField
ptype_desc ("PORT_TYPE_DESC", (m
->ptype() ? "Direct Connect" : "Software"));
920 CTFIntegerField
qet ("QEVNT_TYPE", m
->qet());
921 CTFStringField
qet_desc ("QEVNT_TYPE_DESC", string(m
->queueEventTypeString()));
922 CTFIntegerField
orf ("ORD_REST", m
->orf());
923 /* TODO: Does the erf field indicate enqueue operation rejection? */
924 CTFIntegerField
erf ("ENQ_REJCT", m
->erf());
925 CTFIntegerField
err ("ENQ_RESP", m
->err(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
926 CTFStringField
err_desc ("ENQ_RESP_DESC", m
->enqueueRejectionString());
927 CTFIntegerField
verb ("VERBOSE", m
->verb());
928 CTFIntegerField
fmbpid ("FRM_BP_ID", m
->fmbpid(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
929 CTFIntegerField
fmsc ("FRM_STAT", m
->fmsc(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
930 CTFIntegerField
fmol ("FRM_OFFSET", m
->fmol(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
931 CTFIntegerField
fmfmt ("FRM_FMT", m
->fmfmt(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
932 CTFIntegerField
fmpid ("FRM_PRT_ID", m
->fmpid(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
933 CTFIntegerField
fmaddr ("FRM_ADDR", m
->fmaddr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
937 fields
.push_back(&tcode
);
938 fields
.push_back(&tcode_desc
);
939 fields
.push_back(&src_id
);
940 fields
.push_back(&src_id_desc
);
941 fields
.push_back(×tamp
);
942 fields
.push_back(&ict_msg_type
);
943 fields
.push_back(&dpdm
);
944 fields
.push_back(&fqid
);
945 fields
.push_back(&cnum
);
946 fields
.push_back(&pnum
);
947 fields
.push_back(&ptype
);
948 fields
.push_back(&ptype_desc
);
949 fields
.push_back(&qet
);
950 fields
.push_back(&qet_desc
);
951 fields
.push_back(&orf
);
952 fields
.push_back(&erf
);
953 fields
.push_back(&err
);
954 fields
.push_back(&err_desc
);
955 fields
.push_back(&verb
);
956 fields
.push_back(&fmbpid
);
957 fields
.push_back(&fmsc
);
958 fields
.push_back(&fmol
);
959 fields
.push_back(&fmfmt
);
960 fields
.push_back(&fmpid
);
961 fields
.push_back(&fmaddr
);
963 append_nexus_message(m
, "Nexus DPQM In-Circuit Trace Message", fields
);
964 useful_visit_
= true;
967 void CTFLogVisitor::visit(NxCoreInCircuitTraceMessage
*m
)
969 /* Default Nexus Message fields */
970 CTFIntegerField
tcode ("TCODE", m
->tcode());
971 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
972 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
973 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
974 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
976 /* Nexus Core In-Circuit Trace fields */
977 CTFStringField
ict_msg_type ("ICT_MSG_TYPE", string(m
->ICTMessageType()));
978 CTFIntegerField
cksrc ("CKSRC", m
->cksrc());
979 CTFStringField
cksrc_desc ("CKSRC_DESC", string(m
->cksrcString()));
980 CTFIntegerField
sync ("SYNC", m
->sync());
981 CTFStringField
sync_desc ("SYNC_DESC", string(m
->syncString()));
982 CTFIntegerField
ckdf ("CKDF", m
->ckdf());
983 CTFIntegerField
ckdata1 ("CKDATA1", m
->ckdata1(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
984 CTFIntegerField
ckdata2 ("CKDATA2", m
->ckdata2(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
988 fields
.push_back(&tcode
);
989 fields
.push_back(&tcode_desc
);
990 fields
.push_back(&src_id
);
991 fields
.push_back(&src_id_desc
);
992 fields
.push_back(×tamp
);
993 fields
.push_back(&ict_msg_type
);
994 fields
.push_back(&cksrc
);
995 fields
.push_back(&cksrc_desc
);
996 fields
.push_back(&sync
);
997 fields
.push_back(&sync_desc
);
998 fields
.push_back(&ckdf
);
999 fields
.push_back(&ckdata1
);
1000 fields
.push_back(&ckdata2
);
1002 append_nexus_message(m
, "Nexus Core In-Circuit Trace Message", fields
);
1003 useful_visit_
= true;
1006 void CTFLogVisitor::visit(NxInCircuitTraceMessage
*m
)
1008 /* Default Nexus Message fields */
1009 CTFIntegerField
tcode ("TCODE", m
->tcode());
1010 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
1011 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
1012 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
1013 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
1015 /* Nexus In-Circuit Trace fields */
1016 CTFStringField
ict_msg_type ("ICT_MSG_TYPE", string(m
->ICTMessageType()));
1020 fields
.push_back(&tcode
);
1021 fields
.push_back(&tcode_desc
);
1022 fields
.push_back(&src_id
);
1023 fields
.push_back(&src_id_desc
);
1024 fields
.push_back(×tamp
);
1025 fields
.push_back(&ict_msg_type
);
1027 append_nexus_message(m
, "Nexus In-Circuit Trace Message", fields
);
1028 useful_visit_
= true;
1031 void CTFLogVisitor::visit(NxTimeStampCorrelation
*m
)
1033 /* Default Nexus Message fields */
1034 CTFIntegerField
tcode ("TCODE", m
->tcode());
1035 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
1036 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
1037 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
1038 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
1040 /* Nexus Timestamp Correlation fields */
1041 CTFIntegerField
tcorr ("TCORR", m
->tcorr(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
1042 CTFIntegerField
ttype ("TTYPE", m
->ttype(), BT_CTF_INTEGER_BASE_HEXADECIMAL
);
1043 CTFStringField
ttype_desc ("TTYPE_DESC", string(m
->ttypeString()));
1047 fields
.push_back(&tcode
);
1048 fields
.push_back(&tcode_desc
);
1049 fields
.push_back(&src_id
);
1050 fields
.push_back(&src_id_desc
);
1051 fields
.push_back(×tamp
);
1052 fields
.push_back(&tcorr
);
1053 fields
.push_back(&ttype
);
1054 fields
.push_back(&ttype_desc
);
1056 append_nexus_message(m
, "Nexus Timestamp Correlation Message", fields
);
1057 useful_visit_
= true;
1060 void CTFLogVisitor::visit(NxDPFMInCircuitTraceMessage
*m
)
1062 /* Default Nexus Message fields */
1063 CTFIntegerField
tcode ("TCODE", m
->tcode());
1064 CTFStringField
tcode_desc ("TCODE_DESC", m
->tcodeString());
1065 CTFIntegerField
src_id ("SRC_ID", m
->sourceId());
1066 CTFStringField
src_id_desc ("SRC_ID_DESC", string(m
->sourceIdString()));
1067 CTFIntegerField
timestamp ("TIMESTAMP", m
->correctedTimestamp());
1069 /* Nexus DPFM In-Circuit Trace fields */
1070 CTFStringField
ict_msg_type ("ICT_MSG_TYPE", string(m
->ICTMessageType()));
1071 CTFIntegerField
fmsel ("FMAN_SEL", m
->getFmsel());
1072 CTFIntegerField
lbeat ("LAST_BEAT", m
->getLbeat());
1073 CTFIntegerField
btcnt ("BEAT_CNT", m
->getBtcnt());
1075 /* TODO: Handle context data as CTF array */
1076 /*CTFIntegerField context ("CONTEXT", m->tcode());*/
1080 fields
.push_back(&tcode
);
1081 fields
.push_back(&tcode_desc
);
1082 fields
.push_back(&src_id
);
1083 fields
.push_back(&src_id_desc
);
1084 fields
.push_back(×tamp
);
1085 fields
.push_back(&ict_msg_type
);
1086 fields
.push_back(&fmsel
);
1087 fields
.push_back(&lbeat
);
1088 fields
.push_back(&btcnt
);
1090 append_nexus_message(m
, "Nexus DPFM In-Circuit Trace Message", fields
);
1091 useful_visit_
= true;
1094 string
CTFLogVisitor::asString() const