Commit 97c95059 authored by Alexander Graf's avatar Alexander Graf
Browse files

KVM: PPC: PR: Use generic tracepoint for guest exit



We want to have tracing information on guest exits for booke as well
as book3s. Since most information is identical, use a common trace point.

Signed-off-by: default avatarAlexander Graf <agraf@suse.de>
parent 8e525d59
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -549,7 +549,7 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,
	/* We get here with MSR.EE=0, so enable it to be a nice citizen */
	__hard_irq_enable();

	trace_kvm_book3s_exit(exit_nr, vcpu);
	trace_kvm_exit(exit_nr, vcpu);
	preempt_enable();
	kvm_resched(vcpu);
	switch (exit_nr) {
+3 −0
Original line number Diff line number Diff line
@@ -39,6 +39,7 @@

#include "timing.h"
#include "booke.h"
#include "trace.h"

unsigned long kvmppc_booke_handlers;

@@ -677,6 +678,8 @@ int kvmppc_handle_exit(struct kvm_run *run, struct kvm_vcpu *vcpu,

	local_irq_enable();

	trace_kvm_exit(exit_nr, vcpu);

	run->exit_reason = KVM_EXIT_UNKNOWN;
	run->ready_for_interrupt_injection = 1;

+51 −28
Original line number Diff line number Diff line
@@ -31,6 +31,57 @@ TRACE_EVENT(kvm_ppc_instr,
		  __entry->inst, __entry->pc, __entry->emulate)
);

TRACE_EVENT(kvm_exit,
	TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu),
	TP_ARGS(exit_nr, vcpu),

	TP_STRUCT__entry(
		__field(	unsigned int,	exit_nr		)
		__field(	unsigned long,	pc		)
		__field(	unsigned long,	msr		)
		__field(	unsigned long,	dar		)
#ifdef CONFIG_KVM_BOOK3S_PR
		__field(	unsigned long,	srr1		)
#endif
		__field(	unsigned long,	last_inst	)
	),

	TP_fast_assign(
#ifdef CONFIG_KVM_BOOK3S_PR
		struct kvmppc_book3s_shadow_vcpu *svcpu;
#endif
		__entry->exit_nr	= exit_nr;
		__entry->pc		= kvmppc_get_pc(vcpu);
		__entry->dar		= kvmppc_get_fault_dar(vcpu);
		__entry->msr		= vcpu->arch.shared->msr;
#ifdef CONFIG_KVM_BOOK3S_PR
		svcpu = svcpu_get(vcpu);
		__entry->srr1		= svcpu->shadow_srr1;
		svcpu_put(svcpu);
#endif
		__entry->last_inst	= vcpu->arch.last_inst;
	),

	TP_printk("exit=0x%x"
		" | pc=0x%lx"
		" | msr=0x%lx"
		" | dar=0x%lx"
#ifdef CONFIG_KVM_BOOK3S_PR
		" | srr1=0x%lx"
#endif
		" | last_inst=0x%lx"
		,
		__entry->exit_nr,
		__entry->pc,
		__entry->msr,
		__entry->dar,
#ifdef CONFIG_KVM_BOOK3S_PR
		__entry->srr1,
#endif
		__entry->last_inst
		)
);

TRACE_EVENT(kvm_stlb_inval,
	TP_PROTO(unsigned int stlb_index),
	TP_ARGS(stlb_index),
@@ -105,34 +156,6 @@ TRACE_EVENT(kvm_gtlb_write,

#ifdef CONFIG_KVM_BOOK3S_PR

TRACE_EVENT(kvm_book3s_exit,
	TP_PROTO(unsigned int exit_nr, struct kvm_vcpu *vcpu),
	TP_ARGS(exit_nr, vcpu),

	TP_STRUCT__entry(
		__field(	unsigned int,	exit_nr		)
		__field(	unsigned long,	pc		)
		__field(	unsigned long,	msr		)
		__field(	unsigned long,	dar		)
		__field(	unsigned long,	srr1		)
	),

	TP_fast_assign(
		struct kvmppc_book3s_shadow_vcpu *svcpu;
		__entry->exit_nr	= exit_nr;
		__entry->pc		= kvmppc_get_pc(vcpu);
		__entry->dar		= kvmppc_get_fault_dar(vcpu);
		__entry->msr		= vcpu->arch.shared->msr;
		svcpu = svcpu_get(vcpu);
		__entry->srr1		= svcpu->shadow_srr1;
		svcpu_put(svcpu);
	),

	TP_printk("exit=0x%x | pc=0x%lx | msr=0x%lx | dar=0x%lx | srr1=0x%lx",
		  __entry->exit_nr, __entry->pc, __entry->msr, __entry->dar,
		  __entry->srr1)
);

TRACE_EVENT(kvm_book3s_reenter,
	TP_PROTO(int r, struct kvm_vcpu *vcpu),
	TP_ARGS(r, vcpu),