]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
KVM: x86: Open code vendor_intel() in string_registers_quirk()
authorSean Christopherson <seanjc@google.com>
Fri, 5 Apr 2024 23:56:02 +0000 (16:56 -0700)
committerSean Christopherson <seanjc@google.com>
Mon, 10 Jun 2024 21:29:39 +0000 (14:29 -0700)
Open code the is_guest_vendor_intel() check in string_registers_quirk() to
discourage makiking exact vendor==Intel checks in the emulator, and to
remove the rather awful #ifdeffery.

The string quirk is literally the only Intel specific, *non-architectural*
behavior that KVM emulates.  All Intel specific behavior that is
architecturally defined applies to all vendors that are compatible with
Intel's architecture, i.e. should use guest_cpuid_is_intel_compatible().

Link: https://lore.kernel.org/r/20240405235603.1173076-10-seanjc@google.com
Signed-off-by: Sean Christopherson <seanjc@google.com>
arch/x86/kvm/emulate.c

index 26e8c197a1d165af98561e5c2f8e8a1c296943ea..1acd97c6fa536690989cb7754652ca508e76e88e 100644 (file)
@@ -2354,17 +2354,6 @@ setup_syscalls_segments(struct desc_struct *cs, struct desc_struct *ss)
        ss->avl = 0;
 }
 
-#ifdef CONFIG_X86_64
-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, true);
-       return is_guest_vendor_intel(ebx, ecx, edx);
-}
-#endif
-
 static int em_syscall(struct x86_emulate_ctxt *ctxt)
 {
        const struct x86_emulate_ops *ops = ctxt->ops;
@@ -2622,7 +2611,14 @@ static void string_registers_quirk(struct x86_emulate_ctxt *ctxt)
         * manner when ECX is zero due to REP-string optimizations.
         */
 #ifdef CONFIG_X86_64
-       if (ctxt->ad_bytes != 4 || !vendor_intel(ctxt))
+       u32 eax, ebx, ecx, edx;
+
+       if (ctxt->ad_bytes != 4)
+               return;
+
+       eax = ecx = 0;
+       ctxt->ops->get_cpuid(ctxt, &eax, &ebx, &ecx, &edx, true);
+       if (!is_guest_vendor_intel(ebx, ecx, edx))
                return;
 
        *reg_write(ctxt, VCPU_REGS_RCX) = 0;