Commit e95bf37d authored by Bibo Mao's avatar Bibo Mao Committed by Xianglai Li
Browse files

LoongArch: KVM: Add mmio trace events support

mainline inclusion
from mainline-v6.10-rc1
commit 7b7e584f90bf670d5c6f2b1fff884bf3b972cad4
category: feature
bugzilla: https://gitee.com/openeuler/kernel/issues/IAZJDO


CVE: NA

--------------------------------

Add mmio trace events support, currently generic mmio events
KVM_TRACE_MMIO_WRITE/xxx_READ/xx_READ_UNSATISFIED are added here.

Also vcpu id field is added for all kvm trace events, since perf
KVM tool parses vcpu id information for kvm entry event.

Signed-off-by: default avatarBibo Mao <maobibo@loongson.cn>
Signed-off-by: default avatarHuacai Chen <chenhuacai@loongson.cn>
Signed-off-by: default avatarXianglai Li <lixianglai@loongson.cn>
parent 9f2011ed
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -9,6 +9,7 @@
#include <linux/module.h>
#include <linux/preempt.h>
#include <linux/vmalloc.h>
#include <trace/events/kvm.h>
#include <asm/fpu.h>
#include <asm/inst.h>
#include <asm/loongarch.h>
@@ -484,6 +485,8 @@ int kvm_emu_mmio_read(struct kvm_vcpu *vcpu, larch_inst inst)
		vcpu->arch.io_gpr = rd;
		run->mmio.is_write = 0;
		vcpu->mmio_is_write = 0;
		trace_kvm_mmio(KVM_TRACE_MMIO_READ_UNSATISFIED, run->mmio.len,
				run->mmio.phys_addr, NULL);
		return EMULATE_DO_MMIO;
	}

@@ -531,6 +534,9 @@ int kvm_complete_mmio_read(struct kvm_vcpu *vcpu, struct kvm_run *run)
		break;
	}

	trace_kvm_mmio(KVM_TRACE_MMIO_READ, run->mmio.len,
			run->mmio.phys_addr, run->mmio.data);

	return er;
}

@@ -642,6 +648,8 @@ int kvm_emu_mmio_write(struct kvm_vcpu *vcpu, larch_inst inst)
		run->mmio.is_write = 1;
		vcpu->mmio_needed = 1;
		vcpu->mmio_is_write = 1;
		trace_kvm_mmio(KVM_TRACE_MMIO_WRITE, run->mmio.len,
				run->mmio.phys_addr, data);
		return EMULATE_DO_MMIO;
	}

+14 −6
Original line number Diff line number Diff line
@@ -19,14 +19,16 @@ DECLARE_EVENT_CLASS(kvm_transition,
	TP_PROTO(struct kvm_vcpu *vcpu),
	TP_ARGS(vcpu),
	TP_STRUCT__entry(
		__field(unsigned int, vcpu_id)
		__field(unsigned long, pc)
	),

	TP_fast_assign(
		__entry->vcpu_id = vcpu->vcpu_id;
		__entry->pc = vcpu->arch.pc;
	),

	TP_printk("PC: 0x%08lx", __entry->pc)
	TP_printk("vcpu %u PC: 0x%08lx", __entry->vcpu_id, __entry->pc)
);

DEFINE_EVENT(kvm_transition, kvm_enter,
@@ -54,16 +56,19 @@ DECLARE_EVENT_CLASS(kvm_exit,
	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int reason),
	    TP_ARGS(vcpu, reason),
	    TP_STRUCT__entry(
			__field(unsigned int, vcpu_id)
			__field(unsigned long, pc)
			__field(unsigned int, reason)
	    ),

	    TP_fast_assign(
			__entry->vcpu_id = vcpu->vcpu_id;
			__entry->pc = vcpu->arch.pc;
			__entry->reason = reason;
	    ),

	    TP_printk("[%s]PC: 0x%08lx",
	    TP_printk("vcpu %u [%s] PC: 0x%08lx",
			__entry->vcpu_id,
			__print_symbolic(__entry->reason,
				kvm_trace_symbol_exit_types),
			__entry->pc)
@@ -85,14 +90,17 @@ TRACE_EVENT(kvm_exit_gspr,
	    TP_PROTO(struct kvm_vcpu *vcpu, unsigned int inst_word),
	    TP_ARGS(vcpu, inst_word),
	    TP_STRUCT__entry(
			__field(unsigned int, vcpu_id)
			__field(unsigned int, inst_word)
	    ),

	    TP_fast_assign(
			__entry->vcpu_id = vcpu->vcpu_id;
			__entry->inst_word = inst_word;
	    ),

	    TP_printk("Inst word: 0x%08x", __entry->inst_word)
	    TP_printk("vcpu %u Inst word: 0x%08x", __entry->vcpu_id,
			__entry->inst_word)
);

#define KVM_TRACE_AUX_SAVE		0