From 04fa45ade113b270e860aa0e31f6087b740e35ae Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Mon, 13 Apr 2020 11:44:23 -0400 Subject: [PATCH] instrumentation: update x86 kvm instrumentation for kernel >= 5.7.0 Signed-off-by: Mathieu Desnoyers --- .../events/lttng-module/arch/x86/kvm/trace.h | 20 +++++++- probes/Kbuild | 48 ++++++++++++------- probes/lttng-probe-kvm-x86.c | 4 ++ 3 files changed, 52 insertions(+), 20 deletions(-) diff --git a/instrumentation/events/lttng-module/arch/x86/kvm/trace.h b/instrumentation/events/lttng-module/arch/x86/kvm/trace.h index 57ac7f48..4416ae02 100644 --- a/instrumentation/events/lttng-module/arch/x86/kvm/trace.h +++ b/instrumentation/events/lttng-module/arch/x86/kvm/trace.h @@ -124,8 +124,13 @@ LTTNG_TRACEPOINT_EVENT_CODE_MAP(kvm_exit, kvm_x86_exit, ), TP_code_pre( +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0)) + kvm_x86_ops.get_exit_info(vcpu, &tp_locvar->info1, + &tp_locvar->info2); +#else kvm_x86_ops->get_exit_info(vcpu, &tp_locvar->info1, &tp_locvar->info2); +#endif ), TP_FIELDS( @@ -430,13 +435,15 @@ LTTNG_TRACEPOINT_EVENT_MAP(kvm_emulate_insn, kvm_x86_emulate_insn, ctf_integer(__u8, len, vcpu->arch.emulate_ctxt.decode.eip - vcpu->arch.emulate_ctxt.decode.fetch.start) ctf_array(__u8, insn, vcpu->arch.emulate_ctxt.decode.fetch.data, 15) + ctf_integer(__u8, flags, kei_decode_mode(vcpu->arch.emulate_ctxt.mode)) #elif (LINUX_VERSION_CODE < KERNEL_VERSION(3,17,0)) ctf_integer(__u64, rip, vcpu->arch.emulate_ctxt.fetch.start) ctf_integer(__u32, csbase, kvm_x86_ops->get_segment_base(vcpu, VCPU_SREG_CS)) ctf_integer(__u8, len, vcpu->arch.emulate_ctxt._eip - vcpu->arch.emulate_ctxt.fetch.start) ctf_array(__u8, insn, vcpu->arch.emulate_ctxt.fetch.data, 15) -#else + ctf_integer(__u8, flags, kei_decode_mode(vcpu->arch.emulate_ctxt.mode)) +#elif (LINUX_VERSION_CODE < KERNEL_VERSION(5,7,0)) ctf_integer(__u64, rip, vcpu->arch.emulate_ctxt._eip - (vcpu->arch.emulate_ctxt.fetch.ptr - vcpu->arch.emulate_ctxt.fetch.data)) @@ -444,8 +451,17 @@ LTTNG_TRACEPOINT_EVENT_MAP(kvm_emulate_insn, kvm_x86_emulate_insn, ctf_integer(__u8, len, vcpu->arch.emulate_ctxt.fetch.ptr - vcpu->arch.emulate_ctxt.fetch.data) ctf_array(__u8, insn, vcpu->arch.emulate_ctxt.fetch.data, 15) -#endif ctf_integer(__u8, flags, kei_decode_mode(vcpu->arch.emulate_ctxt.mode)) +#else + ctf_integer(__u64, rip, vcpu->arch.emulate_ctxt->_eip - + (vcpu->arch.emulate_ctxt->fetch.ptr - + vcpu->arch.emulate_ctxt->fetch.data)) + ctf_integer(__u32, csbase, kvm_x86_ops.get_segment_base(vcpu, VCPU_SREG_CS)) + ctf_integer(__u8, len, vcpu->arch.emulate_ctxt->fetch.ptr - + vcpu->arch.emulate_ctxt->fetch.data) + ctf_array(__u8, insn, vcpu->arch.emulate_ctxt->fetch.data, 15) + ctf_integer(__u8, flags, kei_decode_mode(vcpu->arch.emulate_ctxt->mode)) +#endif ctf_integer(__u8, failed, failed) ) ) diff --git a/probes/Kbuild b/probes/Kbuild index ceef8995..3ae2d39e 100644 --- a/probes/Kbuild +++ b/probes/Kbuild @@ -30,25 +30,37 @@ ifneq ($(CONFIG_KVM),) obj-$(CONFIG_LTTNG) += lttng-probe-kvm.o ifneq ($(CONFIG_X86),) kvm_dep_lapic = $(srctree)/arch/x86/kvm/lapic.h - ifneq ($(wildcard $(kvm_dep_lapic)),) - kvm_dep = $(srctree)/virt/kvm/iodev.h $(srctree)/include/kvm/iodev.h - ifneq ($(wildcard $(kvm_dep)),) - CFLAGS_lttng-probe-kvm-x86.o += -I$(srctree)/virt/kvm - CFLAGS_lttng-probe-kvm-x86-mmu.o += -I$(srctree)/virt/kvm - obj-$(CONFIG_LTTNG) += $(shell \ - if [ $(VERSION) -ge 3 \ - -o \( $(VERSION) -eq 2 -a $(PATCHLEVEL) -eq 6 -a $(SUBLEVEL) -ge 38 \) ] ; then \ - echo "lttng-probe-kvm-x86.o" ; fi;) - obj-$(CONFIG_LTTNG) += $(shell \ - if [ $(VERSION) -ge 3 \ - -o \( $(VERSION) -eq 2 -a $(PATCHLEVEL) -eq 6 -a $(SUBLEVEL) -ge 38 \) ] ; then \ - echo "lttng-probe-kvm-x86-mmu.o" ; fi;) - else - $(warning File $(kvm_dep) not found. Probe "kvm" x86-specific is disabled. Use full kernel source tree to enable it.) - endif # $(wildcard $(kvm_dep)) - else + kvm_dep_lapic_check = $(wildcard $(kvm_dep_lapic)) + ifneq ($(kvm_dep_lapic_check),) + # search for iodev.h in any of its known locations + kvm_dep_iodev = $(srctree)/virt/kvm/iodev.h $(srctree)/include/kvm/iodev.h + kvm_dep_iodev_check = $(wildcard $(kvm_dep_iodev)) + ifneq ($(kvm_dep_iodev_check),) + kvm_dep_emulate = $(srctree)/arch/x86/kvm/kvm_emulate.h + kvm_dep_emulate_wildcard = $(wildcard $(kvm_dep_emulate)) + kvm_dep_emulate_check = $(shell \ + if [ \( $(VERSION) -ge 6 \ + -o \( $(VERSION) -eq 5 -a $(PATCHLEVEL) -eq 7 \) \) -a \ + -z "$(kvm_dep_emulate_wildcard)" ] ; then \ + echo "warn" ; \ + else \ + echo "ok" ; \ + fi ;) + ifeq ($(kvm_dep_emulate_check),ok) + CFLAGS_lttng-probe-kvm-x86.o += -I$(srctree)/virt/kvm \ + -I$(srctree)/arch/x86/kvm + CFLAGS_lttng-probe-kvm-x86-mmu.o += -I$(srctree)/virt/kvm + obj-$(CONFIG_LTTNG) += lttng-probe-kvm-x86.o + obj-$(CONFIG_LTTNG) += lttng-probe-kvm-x86-mmu.o + else # ($(kvm_dep_emulate_check),ok) + $(warning File $(kvm_dep_emulate) not found. Probe "kvm" x86-specific is disabled. Use full kernel source tree to enable it.) + endif # ($(kvm_dep_emulate_check),ok) + else # $(kvm_dep_iodev_check) + $(warning File $(kvm_dep_iodev) not found. Probe "kvm" x86-specific is disabled. Use full kernel source tree to enable it.) + endif # $(kvm_dep_iodev_check) + else # $(kvm_dep_lapic_check) $(warning File $(kvm_dep_lapic) not found. Probe "kvm" x86-specific is disabled. Use full kernel source tree to enable it.) - endif # $(wildcard $(kvm_dep_lapic)) + endif # $(kvm_dep_lapic_check) endif # CONFIG_X86 endif # CONFIG_KVM diff --git a/probes/lttng-probe-kvm-x86.c b/probes/lttng-probe-kvm-x86.c index f081cdd5..6dfaa31e 100644 --- a/probes/lttng-probe-kvm-x86.c +++ b/probes/lttng-probe-kvm-x86.c @@ -12,6 +12,10 @@ #include #include +#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5,7,0)) +#include +#endif + #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)) #include #else /* #if (LINUX_VERSION_CODE >= KERNEL_VERSION(4,1,0)) */ -- 2.34.1