OSDN Git Service

KVM: x86: move kvm_inject_gp up from kvm_set_xcr to callers
authorPaolo Bonzini <pbonzini@redhat.com>
Mon, 14 Dec 2020 12:49:54 +0000 (07:49 -0500)
committerPaolo Bonzini <pbonzini@redhat.com>
Thu, 4 Feb 2021 10:27:37 +0000 (05:27 -0500)
Push the injection of #GP up to the callers, so that they can just use
kvm_complete_insn_gp.

Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/svm/svm.c
arch/x86/kvm/vmx/vmx.c
arch/x86/kvm/x86.c

index 3068163..fdea099 100644 (file)
@@ -2357,11 +2357,8 @@ static int xsetbv_interception(struct vcpu_svm *svm)
        u64 new_bv = kvm_read_edx_eax(&svm->vcpu);
        u32 index = kvm_rcx_read(&svm->vcpu);
 
-       if (kvm_set_xcr(&svm->vcpu, index, new_bv) == 0) {
-               return kvm_skip_emulated_instruction(&svm->vcpu);
-       }
-
-       return 1;
+       int err = kvm_set_xcr(&svm->vcpu, index, new_bv);
+       return kvm_complete_insn_gp(&svm->vcpu, err);
 }
 
 static int rdpru_interception(struct vcpu_svm *svm)
index 0cd24ae..d995f47 100644 (file)
@@ -5223,9 +5223,8 @@ static int handle_xsetbv(struct kvm_vcpu *vcpu)
        u64 new_bv = kvm_read_edx_eax(vcpu);
        u32 index = kvm_rcx_read(vcpu);
 
-       if (kvm_set_xcr(vcpu, index, new_bv) == 0)
-               return kvm_skip_emulated_instruction(vcpu);
-       return 1;
+       int err = kvm_set_xcr(vcpu, index, new_bv);
+       return kvm_complete_insn_gp(vcpu, err);
 }
 
 static int handle_apic_access(struct kvm_vcpu *vcpu)
index a280680..912fc41 100644 (file)
@@ -986,12 +986,10 @@ static int __kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
 
 int kvm_set_xcr(struct kvm_vcpu *vcpu, u32 index, u64 xcr)
 {
-       if (static_call(kvm_x86_get_cpl)(vcpu) != 0 ||
-           __kvm_set_xcr(vcpu, index, xcr)) {
-               kvm_inject_gp(vcpu, 0);
-               return 1;
-       }
-       return 0;
+       if (static_call(kvm_x86_get_cpl)(vcpu) == 0)
+               return __kvm_set_xcr(vcpu, index, xcr);
+
+       return 1;
 }
 EXPORT_SYMBOL_GPL(kvm_set_xcr);