vmm(4): add dt tracepoints for guest entry/exit
authordv <dv@openbsd.org>
Mon, 7 Jun 2021 13:55:54 +0000 (13:55 +0000)
committerdv <dv@openbsd.org>
Mon, 7 Jun 2021 13:55:54 +0000 (13:55 +0000)
To aid in development and debugging, this adds a tracepoint prior
to vm entry and after vm exit. It captures the vcpu and run params
plus the exit code, but dt(4)/btrace(8) will need some future work
to leverage those args.

The location of the tracepoint might change in the future, but for
now this solves my issues trying to use printf's to debug vmcs state
corruption.

ok mpi@

sys/arch/amd64/amd64/vmm.c
sys/dev/dt/dt_prov_static.c

index 8ef4a14..a3c7e42 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: vmm.c,v 1.284 2021/05/18 00:05:20 dv Exp $    */
+/*     $OpenBSD: vmm.c,v 1.285 2021/06/07 13:55:54 dv Exp $    */
 /*
  * Copyright (c) 2014 Mike Larkin <mlarkin@openbsd.org>
  *
@@ -28,6 +28,7 @@
 #include <sys/rwlock.h>
 #include <sys/pledge.h>
 #include <sys/memrange.h>
+#include <sys/tracepoint.h>
 
 #include <uvm/uvm_extern.h>
 
@@ -4704,6 +4705,8 @@ vcpu_run_vmx(struct vcpu *vcpu, struct vm_run_params *vrp)
                        invvpid(IA32_VMX_INVVPID_SINGLE_CTX_GLB, &vid);
                }
 
+               TRACEPOINT(vmm, guest_enter, vcpu, vrp);
+
                /* Start / resume the VCPU */
 #ifdef VMM_DEBUG
                KERNEL_ASSERT_LOCKED();
@@ -4756,6 +4759,8 @@ vcpu_run_vmx(struct vcpu *vcpu, struct vm_run_params *vrp)
                         }
                }
 
+               TRACEPOINT(vmm, guest_exit, vcpu, vrp, exit_reason);
+
                if (ret || exitinfo != VMX_EXIT_INFO_COMPLETE ||
                    exit_reason != VMX_EXIT_EXTINT) {
                        KERNEL_LOCK();
@@ -7059,6 +7064,8 @@ vcpu_run_svm(struct vcpu *vcpu, struct vm_run_params *vrp)
                        vcpu->vc_event = 0;
                }
 
+               TRACEPOINT(vmm, guest_enter, vcpu, vrp);
+
                /* Start / resume the VCPU */
 #ifdef VMM_DEBUG
                KERNEL_ASSERT_LOCKED();
@@ -7103,6 +7110,8 @@ vcpu_run_svm(struct vcpu *vcpu, struct vm_run_params *vrp)
                        vcpu->vc_gueststate.vg_exit_reason = exit_reason;
                }
 
+               TRACEPOINT(vmm, guest_exit, vcpu, vrp, exit_reason);
+
                /* If we exited successfully ... */
                if (ret == 0) {
                        vcpu->vc_gueststate.vg_rflags = vmcb->v_rflags;
index bfe92e5..05828f0 100644 (file)
@@ -1,4 +1,4 @@
-/*     $OpenBSD: dt_prov_static.c,v 1.7 2021/01/06 07:51:40 claudio Exp $ */
+/*     $OpenBSD: dt_prov_static.c,v 1.8 2021/06/07 13:55:54 dv Exp $ */
 
 /*
  * Copyright (c) 2019 Martin Pieuchot <mpi@openbsd.org>
@@ -68,6 +68,12 @@ DT_STATIC_PROBE3(vfs, bufcache_rel, "long", "int", "int64_t");
 DT_STATIC_PROBE3(vfs, bufcache_take, "long", "int", "int64_t");
 DT_STATIC_PROBE4(vfs, cleaner, "long", "int", "long", "long");
 
+/*
+ * VMM
+ */
+DT_STATIC_PROBE2(vmm, guest_enter, "void *", "void *");
+DT_STATIC_PROBE3(vmm, guest_exit, "void *", "void *", "uint64_t");
+
 /*
  * List of all static probes
  */
@@ -95,6 +101,9 @@ struct dt_probe *dtps_static[] = {
        &_DT_STATIC_P(vfs, bufcache_rel),
        &_DT_STATIC_P(vfs, bufcache_take),
        &_DT_STATIC_P(vfs, cleaner),
+       /* VMM */
+       &_DT_STATIC_P(vmm, guest_enter),
+       &_DT_STATIC_P(vmm, guest_exit),
 };
 
 int