• Sean Christopherson's avatar
    KVM: x86: Squash CPUID 0x2.0 insanity for modern CPUs · c571a144
    Sean Christopherson authored
    Rework CPUID 0x2.0 to be a normal CPUID leaf if it returns "01" in AL,
    i.e. EAX & 0xff, as a step towards removing KVM's stateful CPUID code
    altogether.
    
    Long ago, Intel documented CPUID 0x2.0 as being a stateful leaf, e.g. a
    version of the SDM circa 1995 states:
    
      The least-significant byte in register EAX (register AL) indicates the
      number of times the CPUID instruction must be executed with an input
      value of 2 to get a complete description of the processors's caches
      and TLBs.  The Pentium Pro family of processors will return a 1.
    
    A 2000 version of the SDM only updated the paragraph to reference
    Intel's new processory family:
    
      The first member of the family of Pentium 4 processors will return a 1.
    
    Fast forward to the present, and Intel's SDM now states:
    
      The least-significant byte in register EAX (register AL) will always
      return 01H.  Software should ignore this value and not interpret it as
      an information descriptor.
    
    AMD's APM simply states that CPUID 0x2 is reserved.
    
    Given that CPUID itself was introduced in the Pentium, odds are good
    that the only Intel CPU family that *maybe* implemented a stateful CPUID
    was the P5.  Which obviously did not support VMX, or KVM.
    
    In other words, KVM's emulation of a stateful CPUID 0x2.0 has likely
    been dead code from the day it was introduced.  This is backed up by
    commit 0fdf8e59 ("KVM: Fix cpuid iteration on multiple leaves per
    eac"), which shows that the stateful iteration code was completely
    broken when it was introduced by commit 07716717 ("KVM: Enhance
    guest cpuid management"), i.e. not actually tested.
    
    Annotate all stateful code paths as "unlikely", but defer its removal to
    a future patch to simplify reinstating the code if by some miracle there
    is someone running KVM on a CPU with a stateful CPUID 0x2.
    Reviewed-by: default avatarVitaly Kuznetsov <vkuznets@redhat.com>
    Signed-off-by: default avatarSean Christopherson <sean.j.christopherson@intel.com>
    Signed-off-by: default avatarPaolo Bonzini <pbonzini@redhat.com>
    c571a144
cpuid.c 27 KB