[v4] gdb, btrace: support libipt v2.2 events
Commit Message
Add support for printing new events added in libipt v2.2 originating from
Event Tracing in combination with Flexible Return and Event Delivery
(FRED) and from Trigger Tracing.
Reviewed-By: Keith Seitz <keiths@redhat.com>
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
---
gdb/NEWS | 4 ++++
gdb/btrace.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++++++++
2 files changed, 71 insertions(+)
@@ -75,6 +75,10 @@
* The Windows native target now supports scheduler-locking. E.g.,
"set scheduler-locking on" now works. Previously it gave an error.
+* GDB now supports libipt v2.2 events originating from Event Tracing (set
+ record btrace pt event-tracing on) on a FRED-enabled system and from
+ Trigger Tracing.
+
* New targets
GNU/Linux/MicroBlaze (gdbserver) microblazeel-*linux*
@@ -1597,6 +1597,59 @@ handle_pt_insn_events (struct btrace_thread_info *btinfo,
break;
}
#endif /* (LIBIPT_VERSION >= 0x201) */
+
+#if (LIBIPT_VERSION >= 0x202)
+ case ptev_trig:
+ {
+ std::string aux_string = std::string (_("trig: trbv = "))
+ + hex_string (event.variant.trig.trbv);
+
+ if (event.variant.trig.mult != 0)
+ aux_string += std::string (", mult");
+
+ if (event.ip_suppressed == 0)
+ {
+ pc = event.variant.trig.ip;
+ aux_string += std::string (", ip = ") + hex_string (*pc);
+ }
+
+ if (event.variant.trig.icnt != 0)
+ aux_string += std::string (", icnt = ")
+ + hex_string (event.variant.trig.icnt);
+
+ handle_pt_aux_insn (btinfo, aux_string, pc);
+ break;
+ }
+
+ case ptev_swintr:
+ {
+ std::string aux_string = std::string (_("swintr: vector = "))
+ + hex_string (event.variant.swintr.vector);
+
+ if (event.ip_suppressed == 0)
+ {
+ pc = event.variant.swintr.ip;
+ aux_string += std::string (", ip = ") + hex_string (*pc);
+ }
+
+ handle_pt_aux_insn (btinfo, aux_string, pc);
+ break;
+ }
+
+ case ptev_syscall:
+ {
+ std::string aux_string = std::string (_("syscall"));
+
+ if (event.ip_suppressed == 0)
+ {
+ pc = event.variant.syscall.ip;
+ aux_string += std::string (": ip = ") + hex_string (*pc);
+ }
+
+ handle_pt_aux_insn (btinfo, aux_string, pc);
+ break;
+ }
+#endif /* (LIBIPT_VERSION >= 0x202) */
}
}
#endif /* defined (HAVE_PT_INSN_EVENT) */
@@ -3025,6 +3078,20 @@ pt_print_packet (const struct pt_packet *packet)
packet->payload.evd.payload);
break;
#endif /* (LIBIPT_VERSION >= 0x201) */
+
+#if (LIBIPT_VERSION >= 0x202)
+ case ppt_trig:
+ if (packet->payload.trig.icntv == 0)
+ gdb_printf ("trig 0x%x%s%s", packet->payload.trig.trbv,
+ packet->payload.trig.ip ? " ip" : "",
+ packet->payload.trig.mult ? " mult" : "");
+ else
+ gdb_printf ("trig 0x%x%s%s icnt: %u", packet->payload.trig.trbv,
+ packet->payload.trig.ip ? " ip" : "",
+ packet->payload.trig.mult ? " mult" : "",
+ packet->payload.trig.icnt);
+ break;
+#endif /* (LIBIPT_VERSION >= 0x202) */
}
}