Commit 33271a9e authored by Sean Christopherson's avatar Sean Christopherson Committed by Peter Zijlstra
Browse files

KVM: x86: Move Intel Processor Trace interrupt handler to vmx.c



Now that all state needed for VMX's PT interrupt handler is exposed to
vmx.c (specifically the currently running vCPU), move the handler into
vmx.c where it belongs.

Signed-off-by: default avatarSean Christopherson <seanjc@google.com>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lore.kernel.org/r/20211111020738.2512932-14-seanjc@google.com
parent e1bfc245
Loading
Loading
Loading
Loading
+1 −1
Original line number Original line Diff line number Diff line
@@ -1517,7 +1517,7 @@ struct kvm_x86_init_ops {
	int (*disabled_by_bios)(void);
	int (*disabled_by_bios)(void);
	int (*check_processor_compatibility)(void);
	int (*check_processor_compatibility)(void);
	int (*hardware_setup)(void);
	int (*hardware_setup)(void);
	bool (*intel_pt_intr_in_guest)(void);
	unsigned int (*handle_intel_pt_intr)(void);


	struct kvm_x86_ops *runtime_ops;
	struct kvm_x86_ops *runtime_ops;
};
};
+21 −1
Original line number Original line Diff line number Diff line
@@ -7655,6 +7655,20 @@ static struct kvm_x86_ops vmx_x86_ops __initdata = {
	.vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
	.vcpu_deliver_sipi_vector = kvm_vcpu_deliver_sipi_vector,
};
};


static unsigned int vmx_handle_intel_pt_intr(void)
{
	struct kvm_vcpu *vcpu = kvm_get_running_vcpu();

	/* '0' on failure so that the !PT case can use a RET0 static call. */
	if (!kvm_arch_pmi_in_guest(vcpu))
		return 0;

	kvm_make_request(KVM_REQ_PMI, vcpu);
	__set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT,
		  (unsigned long *)&vcpu->arch.pmu.global_status);
	return 1;
}

static __init void vmx_setup_user_return_msrs(void)
static __init void vmx_setup_user_return_msrs(void)
{
{


@@ -7681,6 +7695,8 @@ static __init void vmx_setup_user_return_msrs(void)
		kvm_add_user_return_msr(vmx_uret_msrs_list[i]);
		kvm_add_user_return_msr(vmx_uret_msrs_list[i]);
}
}


static struct kvm_x86_init_ops vmx_init_ops __initdata;

static __init int hardware_setup(void)
static __init int hardware_setup(void)
{
{
	unsigned long host_bndcfgs;
	unsigned long host_bndcfgs;
@@ -7839,6 +7855,10 @@ static __init int hardware_setup(void)
		return -EINVAL;
		return -EINVAL;
	if (!enable_ept || !cpu_has_vmx_intel_pt())
	if (!enable_ept || !cpu_has_vmx_intel_pt())
		pt_mode = PT_MODE_SYSTEM;
		pt_mode = PT_MODE_SYSTEM;
	if (pt_mode == PT_MODE_HOST_GUEST)
		vmx_init_ops.handle_intel_pt_intr = vmx_handle_intel_pt_intr;
	else
		vmx_init_ops.handle_intel_pt_intr = NULL;


	setup_default_sgx_lepubkeyhash();
	setup_default_sgx_lepubkeyhash();


@@ -7867,7 +7887,7 @@ static struct kvm_x86_init_ops vmx_init_ops __initdata = {
	.disabled_by_bios = vmx_disabled_by_bios,
	.disabled_by_bios = vmx_disabled_by_bios,
	.check_processor_compatibility = vmx_check_processor_compat,
	.check_processor_compatibility = vmx_check_processor_compat,
	.hardware_setup = hardware_setup,
	.hardware_setup = hardware_setup,
	.intel_pt_intr_in_guest = vmx_pt_mode_is_host_guest,
	.handle_intel_pt_intr = NULL,


	.runtime_ops = &vmx_x86_ops,
	.runtime_ops = &vmx_x86_ops,
};
};
+1 −19
Original line number Original line Diff line number Diff line
@@ -8469,20 +8469,6 @@ static void kvm_timer_init(void)
			  kvmclock_cpu_online, kvmclock_cpu_down_prep);
			  kvmclock_cpu_online, kvmclock_cpu_down_prep);
}
}


static unsigned int kvm_handle_intel_pt_intr(void)
{
	struct kvm_vcpu *vcpu = kvm_get_running_vcpu();

	/* '0' on failure so that the !PT case can use a RET0 static call. */
	if (!kvm_arch_pmi_in_guest(vcpu))
		return 0;

	kvm_make_request(KVM_REQ_PMI, vcpu);
	__set_bit(MSR_CORE_PERF_GLOBAL_OVF_CTRL_TRACE_TOPA_PMI_BIT,
			(unsigned long *)&vcpu->arch.pmu.global_status);
	return 1;
}

#ifdef CONFIG_X86_64
#ifdef CONFIG_X86_64
static void pvclock_gtod_update_fn(struct work_struct *work)
static void pvclock_gtod_update_fn(struct work_struct *work)
{
{
@@ -11192,11 +11178,7 @@ int kvm_arch_hardware_setup(void *opaque)
	memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops));
	memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops));
	kvm_ops_static_call_update();
	kvm_ops_static_call_update();


	/* Temporary ugliness. */
	kvm_register_perf_callbacks(ops->handle_intel_pt_intr);
	if (ops->intel_pt_intr_in_guest && ops->intel_pt_intr_in_guest())
		kvm_register_perf_callbacks(kvm_handle_intel_pt_intr);
	else
		kvm_register_perf_callbacks(NULL);


	if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES))
	if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES))
		supported_xss = 0;
		supported_xss = 0;