KVM: x86: Refactor kvm_cpuid() param that controls out-of-range logic
authorSean Christopherson <sean.j.christopherson@intel.com>
Thu, 5 Mar 2020 01:34:37 +0000 (17:34 -0800)
committerPaolo Bonzini <pbonzini@redhat.com>
Mon, 16 Mar 2020 16:58:50 +0000 (17:58 +0100)
Invert and rename the kvm_cpuid() param that controls out-of-range logic
to better reflect the semantics of the affected callers, i.e. callers
that bypass the out-of-range logic do so because they are looking up an
exact guest CPUID entry, e.g. to query the maxphyaddr.

Similarly, rename kvm_cpuid()'s internal "found" to "exact" to clarify
that it tracks whether or not the exact requested leaf was found, as
opposed to any usable leaf being found.

No functional change intended.

Signed-off-by: Sean Christopherson <sean.j.christopherson@intel.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
arch/x86/kvm/cpuid.c
arch/x86/kvm/cpuid.h
arch/x86/kvm/emulate.c
arch/x86/kvm/kvm_emulate.h
arch/x86/kvm/svm.c
arch/x86/kvm/x86.c

index afa2062b5a799064ec0410256d2bb8169504cf37..08280d8a2ac982131cc7975fdc933764a4f895c7 100644 (file)
@@ -986,16 +986,16 @@ get_out_of_range_cpuid_entry(struct kvm_vcpu *vcpu, u32 *fn_ptr, u32 index)
 }
 
 bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
-              u32 *ecx, u32 *edx, bool check_limit)
+              u32 *ecx, u32 *edx, bool exact_only)
 {
        u32 orig_function = *eax, function = *eax, index = *ecx;
        struct kvm_cpuid_entry2 *entry;
-       bool found;
+       bool exact;
 
        entry = kvm_find_cpuid_entry(vcpu, function, index);
-       found = entry;
+       exact = !!entry;
 
-       if (!entry && check_limit)
+       if (!entry && !exact_only)
                entry = get_out_of_range_cpuid_entry(vcpu, &function, index);
 
        if (entry) {
@@ -1026,8 +1026,8 @@ bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
                        }
                }
        }
-       trace_kvm_cpuid(orig_function, *eax, *ebx, *ecx, *edx, found);
-       return found;
+       trace_kvm_cpuid(orig_function, *eax, *ebx, *ecx, *edx, exact);
+       return exact;
 }
 EXPORT_SYMBOL_GPL(kvm_cpuid);
 
@@ -1040,7 +1040,7 @@ int kvm_emulate_cpuid(struct kvm_vcpu *vcpu)
 
        eax = kvm_rax_read(vcpu);
        ecx = kvm_rcx_read(vcpu);
-       kvm_cpuid(vcpu, &eax, &ebx, &ecx, &edx, true);
+       kvm_cpuid(vcpu, &eax, &ebx, &ecx, &edx, false);
        kvm_rax_write(vcpu, eax);
        kvm_rbx_write(vcpu, ebx);
        kvm_rcx_write(vcpu, ecx);
index a0988609f620760e8180600c2d40c1a08d517476..23b4cd1ad986549c3fd1459e3ac3480ee679c183 100644 (file)
@@ -25,7 +25,7 @@ int kvm_vcpu_ioctl_get_cpuid2(struct kvm_vcpu *vcpu,
                              struct kvm_cpuid2 *cpuid,
                              struct kvm_cpuid_entry2 __user *entries);
 bool kvm_cpuid(struct kvm_vcpu *vcpu, u32 *eax, u32 *ebx,
-              u32 *ecx, u32 *edx, bool check_limit);
+              u32 *ecx, u32 *edx, bool exact_only);
 
 int cpuid_query_maxphyaddr(struct kvm_vcpu *vcpu);
 
index 6663f6887d2cb25bc21a5005f6dfa8e662bd6a80..fefa32d6af0038d6861b5a6548f1e9fd8fc61c8d 100644 (file)
@@ -2722,7 +2722,7 @@ static bool vendor_intel(struct x86_emulate_ctxt *ctxt)
        u32 eax, ebx, ecx, edx;
 
        eax = ecx = 0;
-       ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
+       ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
        return is_guest_vendor_intel(ebx, ecx, edx);
 }
 
@@ -2740,7 +2740,7 @@ static bool em_syscall_is_enabled(struct x86_emulate_ctxt *ctxt)
 
        eax = 0x00000000;
        ecx = 0x00000000;
-       ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
+       ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
        /*
         * remark: Intel CPUs only support "syscall" in 64bit longmode. Also a
         * 64bit guest with a 32bit compat-app running will #UD !! While this
@@ -3971,7 +3971,7 @@ static int em_cpuid(struct x86_emulate_ctxt *ctxt)
 
        eax = reg_read(ctxt, VCPU_REGS_RAX);
        ecx = reg_read(ctxt, VCPU_REGS_RCX);
-       ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
+       ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, false);
        *reg_write(ctxt, VCPU_REGS_RAX) = eax;
        *reg_write(ctxt, VCPU_REGS_RBX) = ebx;
        *reg_write(ctxt, VCPU_REGS_RCX) = ecx;
@@ -4241,7 +4241,7 @@ static int check_cr_write(struct x86_emulate_ctxt *ctxt)
                        eax = 0x80000008;
                        ecx = 0;
                        if (ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx,
-                                                &edx, false))
+                                                &edx, true))
                                maxphyaddr = eax & 0xff;
                        else
                                maxphyaddr = 36;
index 3cb50eda606d30233c8cc7852982e1efba4ce2f4..4688b26c17eee4293f27fb88b3c3c5e0a29b7158 100644 (file)
@@ -221,7 +221,7 @@ struct x86_emulate_ops {
                         enum x86_intercept_stage stage);
 
        bool (*get_cpuid)(struct x86_emulate_ctxt *ctxt, u32 *eax, u32 *ebx,
-                         u32 *ecx, u32 *edx, bool check_limit);
+                         u32 *ecx, u32 *edx, bool exact_only);
        bool (*guest_has_long_mode)(struct x86_emulate_ctxt *ctxt);
        bool (*guest_has_movbe)(struct x86_emulate_ctxt *ctxt);
        bool (*guest_has_fxsr)(struct x86_emulate_ctxt *ctxt);
index 4dca3579e740bb240ce8f063350cbd53aeb07f80..95d0d184148319fcbeb1932b1149ae9c0cfd5264 100644 (file)
@@ -2193,7 +2193,7 @@ static void svm_vcpu_reset(struct kvm_vcpu *vcpu, bool init_event)
        }
        init_vmcb(svm);
 
-       kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy, true);
+       kvm_cpuid(vcpu, &eax, &dummy, &dummy, &dummy, false);
        kvm_rdx_write(vcpu, eax);
 
        if (kvm_vcpu_apicv_active(vcpu) && !init_event)
index cda0b787b2e3e30b6ea1a55e47caa6c45381a459..62cf170b31d40c4f7f83f078fe6837fb580a2999 100644 (file)
@@ -6241,9 +6241,10 @@ static int emulator_intercept(struct x86_emulate_ctxt *ctxt,
 }
 
 static bool emulator_get_cpuid(struct x86_emulate_ctxt *ctxt,
-                       u32 *eax, u32 *ebx, u32 *ecx, u32 *edx, bool check_limit)
+                             u32 *eax, u32 *ebx, u32 *ecx, u32 *edx,
+                             bool exact_only)
 {
-       return kvm_cpuid(emul_to_vcpu(ctxt), eax, ebx, ecx, edx, check_limit);
+       return kvm_cpuid(emul_to_vcpu(ctxt), eax, ebx, ecx, edx, exact_only);
 }
 
 static bool emulator_guest_has_long_mode(struct x86_emulate_ctxt *ctxt)