lkml.org 
[lkml]   [2023]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v9 2/8] KVM: x86: Move open-coded cpuid leaf 0x80000021 EAX bit propagation code
    Date
    Move code from __do_cpuid_func() to kvm_set_cpu_caps() in preparation
    for adding the features in their native leaf.

    Also drop the bit description comments as it will be more self-
    describing once the individual features are added.

    Whilst there, switch to using the more efficient cpu_feature_enabled()
    instead of static_cpu_has().

    Note, LFENCE_RDTSC and "NULL selector clears base" are currently
    synthetic, Linux-defined feature flags as Linux tracking of the features
    predates AMD's definition. Keep the manual propagation of the flags from
    their synthetic counterparts until the kernel fully converts to AMD's
    definition, otherwise KVM would stop synthesizing the flags as intended.

    Signed-off-by: Kim Phillips <kim.phillips@amd.com>
    ---
    arch/x86/kvm/cpuid.c | 31 ++++++++++++-------------------
    1 file changed, 12 insertions(+), 19 deletions(-)

    diff --git a/arch/x86/kvm/cpuid.c b/arch/x86/kvm/cpuid.c
    index 596061c1610e..a1047763fdd3 100644
    --- a/arch/x86/kvm/cpuid.c
    +++ b/arch/x86/kvm/cpuid.c
    @@ -741,6 +741,17 @@ void kvm_set_cpu_caps(void)
    0 /* SME */ | F(SEV) | 0 /* VM_PAGE_FLUSH */ | F(SEV_ES) |
    F(SME_COHERENT));

    + kvm_cpu_cap_mask(CPUID_8000_0021_EAX,
    + BIT(0) /* NO_NESTED_DATA_BP */ |
    + BIT(2) /* LFENCE Always serializing */ | 0 /* SmmPgCfgLock */ |
    + BIT(6) /* NULL_SEL_CLR_BASE */ | 0 /* PrefetchCtlMsr */
    + );
    + if (cpu_feature_enabled(X86_FEATURE_LFENCE_RDTSC))
    + kvm_cpu_caps[CPUID_8000_0021_EAX] |= BIT(2) /* LFENCE Always serializing */;
    + if (!static_cpu_has_bug(X86_BUG_NULL_SEG))
    + kvm_cpu_caps[CPUID_8000_0021_EAX] |= BIT(6) /* NULL_SEL_CLR_BASE */;
    + kvm_cpu_caps[CPUID_8000_0021_EAX] |= BIT(9) /* NO_SMM_CTL_MSR */;
    +
    kvm_cpu_cap_mask(CPUID_C000_0001_EDX,
    F(XSTORE) | F(XSTORE_EN) | F(XCRYPT) | F(XCRYPT_EN) |
    F(ACE2) | F(ACE2_EN) | F(PHE) | F(PHE_EN) |
    @@ -1222,25 +1233,7 @@ static inline int __do_cpuid_func(struct kvm_cpuid_array *array, u32 function)
    break;
    case 0x80000021:
    entry->ebx = entry->ecx = entry->edx = 0;
    - /*
    - * Pass down these bits:
    - * EAX 0 NNDBP, Processor ignores nested data breakpoints
    - * EAX 2 LAS, LFENCE always serializing
    - * EAX 6 NSCB, Null selector clear base
    - *
    - * Other defined bits are for MSRs that KVM does not expose:
    - * EAX 3 SPCL, SMM page configuration lock
    - * EAX 13 PCMSR, Prefetch control MSR
    - *
    - * KVM doesn't support SMM_CTL.
    - * EAX 9 SMM_CTL MSR is not supported
    - */
    - entry->eax &= BIT(0) | BIT(2) | BIT(6);
    - entry->eax |= BIT(9);
    - if (static_cpu_has(X86_FEATURE_LFENCE_RDTSC))
    - entry->eax |= BIT(2);
    - if (!static_cpu_has_bug(X86_BUG_NULL_SEG))
    - entry->eax |= BIT(6);
    + cpuid_entry_override(entry, CPUID_8000_0021_EAX);
    break;
    /*Add support for Centaur's CPUID instruction*/
    case 0xC0000000:
    --
    2.34.1
    \
     
     \ /
      Last update: 2023-03-26 23:54    [W:7.820 / U:0.140 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site