Merge tag 'kvmarm-fixes-5.17-2' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux-2.6-microblaze.git] / arch / x86 / kvm / x86.c
index b533aab..7131d73 100644 (file)
@@ -8722,50 +8722,6 @@ static void kvm_timer_init(void)
                          kvmclock_cpu_online, kvmclock_cpu_down_prep);
 }
 
-DEFINE_PER_CPU(struct kvm_vcpu *, current_vcpu);
-EXPORT_PER_CPU_SYMBOL_GPL(current_vcpu);
-
-int kvm_is_in_guest(void)
-{
-       return __this_cpu_read(current_vcpu) != NULL;
-}
-
-static int kvm_is_user_mode(void)
-{
-       int user_mode = 3;
-
-       if (__this_cpu_read(current_vcpu))
-               user_mode = static_call(kvm_x86_get_cpl)(__this_cpu_read(current_vcpu));
-
-       return user_mode != 0;
-}
-
-static unsigned long kvm_get_guest_ip(void)
-{
-       unsigned long ip = 0;
-
-       if (__this_cpu_read(current_vcpu))
-               ip = kvm_rip_read(__this_cpu_read(current_vcpu));
-
-       return ip;
-}
-
-static void kvm_handle_intel_pt_intr(void)
-{
-       struct kvm_vcpu *vcpu = __this_cpu_read(current_vcpu);
-
-       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);
-}
-
-static struct perf_guest_info_callbacks kvm_guest_cbs = {
-       .is_in_guest            = kvm_is_in_guest,
-       .is_user_mode           = kvm_is_user_mode,
-       .get_guest_ip           = kvm_get_guest_ip,
-       .handle_intel_pt_intr   = kvm_handle_intel_pt_intr,
-};
-
 #ifdef CONFIG_X86_64
 static void pvclock_gtod_update_fn(struct work_struct *work)
 {
@@ -8878,8 +8834,6 @@ int kvm_arch_init(void *opaque)
 
        kvm_timer_init();
 
-       perf_register_guest_info_callbacks(&kvm_guest_cbs);
-
        if (boot_cpu_has(X86_FEATURE_XSAVE)) {
                host_xcr0 = xgetbv(XCR_XFEATURE_ENABLED_MASK);
                supported_xcr0 = host_xcr0 & KVM_SUPPORTED_XCR0;
@@ -8911,7 +8865,6 @@ void kvm_arch_exit(void)
                clear_hv_tscchange_cb();
 #endif
        kvm_lapic_exit();
-       perf_unregister_guest_info_callbacks(&kvm_guest_cbs);
 
        if (!boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
                cpufreq_unregister_notifier(&kvmclock_cpufreq_notifier_block,
@@ -10163,7 +10116,7 @@ static int vcpu_enter_guest(struct kvm_vcpu *vcpu)
         * interrupts on processors that implement an interrupt shadow, the
         * stat.exits increment will do nicely.
         */
-       kvm_before_interrupt(vcpu);
+       kvm_before_interrupt(vcpu, KVM_HANDLING_IRQ);
        local_irq_enable();
        ++vcpu->stat.exits;
        local_irq_disable();
@@ -11522,6 +11475,8 @@ int kvm_arch_hardware_setup(void *opaque)
        memcpy(&kvm_x86_ops, ops->runtime_ops, sizeof(kvm_x86_ops));
        kvm_ops_static_call_update();
 
+       kvm_register_perf_callbacks(ops->handle_intel_pt_intr);
+
        if (!kvm_cpu_cap_has(X86_FEATURE_XSAVES))
                supported_xss = 0;
 
@@ -11549,6 +11504,8 @@ int kvm_arch_hardware_setup(void *opaque)
 
 void kvm_arch_hardware_unsetup(void)
 {
+       kvm_unregister_perf_callbacks();
+
        static_call(kvm_x86_hardware_unsetup)();
 }
 
@@ -12140,6 +12097,11 @@ bool kvm_arch_vcpu_in_kernel(struct kvm_vcpu *vcpu)
        return vcpu->arch.preempted_in_kernel;
 }
 
+unsigned long kvm_arch_vcpu_get_ip(struct kvm_vcpu *vcpu)
+{
+       return kvm_rip_read(vcpu);
+}
+
 int kvm_arch_vcpu_should_kick(struct kvm_vcpu *vcpu)
 {
        return kvm_vcpu_exiting_guest_mode(vcpu) == IN_GUEST_MODE;