]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
btrace: Add support for further events.
authorFelix Willgerodt <felix.willgerodt@intel.com>
Tue, 27 Jun 2023 09:20:55 +0000 (11:20 +0200)
committerFelix Willgerodt <felix.willgerodt@intel.com>
Tue, 24 Sep 2024 12:22:29 +0000 (14:22 +0200)
This is similar to the previous events that we added, and adds support for
SMI, RSM, SIPI, INIT, VMENTRY, VMEXIT, SHUTDOWN, UINTR and UIRET.
Though since these are mainly mechanical and not really possible to test,
they are bundled in one commit.

Approved-By: Markus Metzger <markus.t.metzger@intel.com>
gdb/btrace.c

index 317516c8ce1df8fbb416d9713b92d59ce988dcd2..152f6f2ec472e583dd6aeb8ef38700246c86633a 100644 (file)
@@ -1442,6 +1442,161 @@ handle_pt_insn_events (struct btrace_thread_info *btinfo,
            handle_pt_aux_insn (btinfo, aux_string, pc);
            break;
          }
+
+       case ptev_smi:
+         {
+           std::string aux_string = std::string (_("smi"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.smi.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_rsm:
+         {
+           std::string aux_string = std::string (_("rsm"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.rsm.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_sipi:
+         {
+           std::string aux_string = std::string (_("sipi: vector = "))
+             + hex_string (event.variant.sipi.vector);
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_init:
+         {
+           std::string aux_string = std::string (_("init"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.init.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_vmentry:
+         {
+           std::string aux_string = std::string (_("vmentry"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.vmentry.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_vmexit:
+         {
+           std::string aux_string = std::string (_("vmexit"));
+
+           if (event.variant.vmexit.has_vector != 0
+               || event.variant.vmexit.has_vmxr != 0
+               || event.variant.vmexit.has_vmxq != 0
+               || event.ip_suppressed != 0)
+             aux_string += std::string (":");
+
+           if (event.variant.vmexit.has_vector != 0)
+             {
+               aux_string += std::string (_(" vector = "))
+                             + hex_string (event.variant.vmexit.vector);
+
+               const char* decoded = decode_interrupt_vector
+                                       (event.variant.vmexit.vector);
+               if (decoded != nullptr)
+                 aux_string += std::string (" (") + decoded + ")";
+             }
+
+           if (event.variant.vmexit.has_vmxr != 0)
+             {
+               std::string seperator = aux_string.back () == ':' ? "" : ",";
+               aux_string += seperator + std::string (" vmxr = ")
+                             + hex_string (event.variant.vmexit.vmxr);
+             }
+
+           if (event.variant.vmexit.has_vmxq != 0)
+             {
+               std::string seperator = aux_string.back () == ':' ? "" : ",";
+               aux_string += seperator + std::string (" vmxq = ")
+                             + hex_string (event.variant.vmexit.vmxq);
+             }
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.vmexit.ip;
+               std::string seperator = aux_string.back () == ':' ? "" : ",";
+               aux_string += seperator + std::string (" ip = ")
+                             + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_shutdown:
+         {
+           std::string aux_string = std::string (_("shutdown"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.shutdown.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_uintr:
+         {
+           std::string aux_string = std::string (_("uintr: vector = "))
+                                    + hex_string (event.variant.uintr.vector);
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.uintr.ip;
+               aux_string += std::string (", ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
+
+       case ptev_uiret:
+         {
+           std::string aux_string = std::string (_("uiret"));
+
+           if (event.ip_suppressed == 0)
+             {
+               pc = event.variant.uiret.ip;
+               aux_string += std::string (": ip = ") + hex_string (*pc);
+             }
+
+           handle_pt_aux_insn (btinfo, aux_string, pc);
+           break;
+         }
 #endif /* defined (LIBIPT_VERSION >= 0x201) */
        }
     }