]> git.proxmox.com Git - mirror_ubuntu-hirsute-kernel.git/blobdiff - arch/x86/kvm/svm.c
KVM: x86: Drop special XSAVE handling from guest_cpuid_has()
[mirror_ubuntu-hirsute-kernel.git] / arch / x86 / kvm / svm.c
index 122d4ce3b1ab055d1e7fae7ebb4745382d3346b4..d399eb7bbff3eb0b22e271042ec7b72ee72e1310 100644 (file)
@@ -4519,9 +4519,9 @@ static int avic_incomplete_ipi_interception(struct vcpu_svm *svm)
                 */
                kvm_for_each_vcpu(i, vcpu, kvm) {
                        bool m = kvm_apic_match_dest(vcpu, apic,
-                                                    icrl & KVM_APIC_SHORT_MASK,
+                                                    icrl & APIC_SHORT_MASK,
                                                     GET_APIC_DEST_FIELD(icrh),
-                                                    icrl & KVM_APIC_DEST_MASK);
+                                                    icrl & APIC_DEST_MASK);
 
                        if (m && !avic_vcpu_is_running(vcpu))
                                kvm_vcpu_wake_up(vcpu);
@@ -4935,7 +4935,8 @@ static void svm_get_exit_info(struct kvm_vcpu *vcpu, u64 *info1, u64 *info2)
        *info2 = control->exit_info_2;
 }
 
-static int handle_exit(struct kvm_vcpu *vcpu)
+static int handle_exit(struct kvm_vcpu *vcpu,
+       enum exit_fastpath_completion exit_fastpath)
 {
        struct vcpu_svm *svm = to_svm(vcpu);
        struct kvm_run *kvm_run = vcpu->run;
@@ -4993,7 +4994,10 @@ static int handle_exit(struct kvm_vcpu *vcpu)
                       __func__, svm->vmcb->control.exit_int_info,
                       exit_code);
 
-       if (exit_code >= ARRAY_SIZE(svm_exit_handlers)
+       if (exit_fastpath == EXIT_FASTPATH_SKIP_EMUL_INS) {
+               kvm_skip_emulated_instruction(vcpu);
+               return 1;
+       } else if (exit_code >= ARRAY_SIZE(svm_exit_handlers)
            || !svm_exit_handlers[exit_code]) {
                vcpu_unimpl(vcpu, "svm: unexpected exit reason 0x%x\n", exit_code);
                dump_vmcb(vcpu);
@@ -5913,6 +5917,7 @@ static void svm_cpuid_update(struct kvm_vcpu *vcpu)
        struct vcpu_svm *svm = to_svm(vcpu);
 
        vcpu->arch.xsaves_enabled = guest_cpuid_has(vcpu, X86_FEATURE_XSAVE) &&
+                                   boot_cpu_has(X86_FEATURE_XSAVE) &&
                                    boot_cpu_has(X86_FEATURE_XSAVES);
 
        /* Update nrips enabled cache */
@@ -6186,9 +6191,12 @@ out:
        return ret;
 }
 
-static void svm_handle_exit_irqoff(struct kvm_vcpu *vcpu)
+static void svm_handle_exit_irqoff(struct kvm_vcpu *vcpu,
+       enum exit_fastpath_completion *exit_fastpath)
 {
-
+       if (!is_guest_mode(vcpu) &&
+               to_svm(vcpu)->vmcb->control.exit_code == EXIT_REASON_MSR_WRITE)
+               *exit_fastpath = handle_fastpath_set_msr_irqoff(vcpu);
 }
 
 static void svm_sched_in(struct kvm_vcpu *vcpu, int cpu)