lkml.org 
[lkml]   [2023]   [Jan]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/cpu] x86/cpu, kvm: Add support for CPUID_80000021_EAX
    The following commit has been merged into the x86/cpu branch of tip:

    Commit-ID: 8415a74852d7c24795007ee9862d25feb519007c
    Gitweb: https://git.kernel.org/tip/8415a74852d7c24795007ee9862d25feb519007c
    Author: Kim Phillips <kim.phillips@amd.com>
    AuthorDate: Tue, 10 Jan 2023 16:46:37 -06:00
    Committer: Borislav Petkov (AMD) <bp@alien8.de>
    CommitterDate: Wed, 25 Jan 2023 12:33:06 +01:00

    x86/cpu, kvm: Add support for CPUID_80000021_EAX

    Add support for CPUID leaf 80000021, EAX. The majority of the features will be
    used in the kernel and thus a separate leaf is appropriate.

    Include KVM's reverse_cpuid entry because features are used by VM guests, too.

    [ bp: Massage commit message. ]

    Signed-off-by: Kim Phillips <kim.phillips@amd.com>
    Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
    Acked-by: Sean Christopherson <seanjc@google.com>
    Link: https://lore.kernel.org/r/20230124163319.2277355-2-kim.phillips@amd.com
    ---
    arch/x86/include/asm/cpufeature.h | 7 +++++--
    arch/x86/include/asm/cpufeatures.h | 2 +-
    arch/x86/include/asm/disabled-features.h | 3 ++-
    arch/x86/include/asm/required-features.h | 3 ++-
    arch/x86/kernel/cpu/common.c | 3 +++
    arch/x86/kvm/reverse_cpuid.h | 1 +
    6 files changed, 14 insertions(+), 5 deletions(-)

    diff --git a/arch/x86/include/asm/cpufeature.h b/arch/x86/include/asm/cpufeature.h
    index 1a85e1f..ce0c8f7 100644
    --- a/arch/x86/include/asm/cpufeature.h
    +++ b/arch/x86/include/asm/cpufeature.h
    @@ -32,6 +32,7 @@ enum cpuid_leafs
    CPUID_8000_0007_EBX,
    CPUID_7_EDX,
    CPUID_8000_001F_EAX,
    + CPUID_8000_0021_EAX,
    };

    #define X86_CAP_FMT_NUM "%d:%d"
    @@ -94,8 +95,9 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
    CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 17, feature_bit) || \
    CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 18, feature_bit) || \
    CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 19, feature_bit) || \
    + CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 20, feature_bit) || \
    REQUIRED_MASK_CHECK || \
    - BUILD_BUG_ON_ZERO(NCAPINTS != 20))
    + BUILD_BUG_ON_ZERO(NCAPINTS != 21))

    #define DISABLED_MASK_BIT_SET(feature_bit) \
    ( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 0, feature_bit) || \
    @@ -118,8 +120,9 @@ extern const char * const x86_bug_flags[NBUGINTS*32];
    CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 17, feature_bit) || \
    CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 18, feature_bit) || \
    CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 19, feature_bit) || \
    + CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 20, feature_bit) || \
    DISABLED_MASK_CHECK || \
    - BUILD_BUG_ON_ZERO(NCAPINTS != 20))
    + BUILD_BUG_ON_ZERO(NCAPINTS != 21))

    #define cpu_has(c, bit) \
    (__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
    diff --git a/arch/x86/include/asm/cpufeatures.h b/arch/x86/include/asm/cpufeatures.h
    index b70111a..b890058 100644
    --- a/arch/x86/include/asm/cpufeatures.h
    +++ b/arch/x86/include/asm/cpufeatures.h
    @@ -13,7 +13,7 @@
    /*
    * Defines x86 CPU feature bits
    */
    -#define NCAPINTS 20 /* N 32-bit words worth of info */
    +#define NCAPINTS 21 /* N 32-bit words worth of info */
    #define NBUGINTS 1 /* N 32-bit bug flags */

    /*
    diff --git a/arch/x86/include/asm/disabled-features.h b/arch/x86/include/asm/disabled-features.h
    index c44b56f..5dfa4fb 100644
    --- a/arch/x86/include/asm/disabled-features.h
    +++ b/arch/x86/include/asm/disabled-features.h
    @@ -124,6 +124,7 @@
    #define DISABLED_MASK17 0
    #define DISABLED_MASK18 0
    #define DISABLED_MASK19 0
    -#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 20)
    +#define DISABLED_MASK20 0
    +#define DISABLED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 21)

    #endif /* _ASM_X86_DISABLED_FEATURES_H */
    diff --git a/arch/x86/include/asm/required-features.h b/arch/x86/include/asm/required-features.h
    index aff7747..7ba1726 100644
    --- a/arch/x86/include/asm/required-features.h
    +++ b/arch/x86/include/asm/required-features.h
    @@ -98,6 +98,7 @@
    #define REQUIRED_MASK17 0
    #define REQUIRED_MASK18 0
    #define REQUIRED_MASK19 0
    -#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 20)
    +#define REQUIRED_MASK20 0
    +#define REQUIRED_MASK_CHECK BUILD_BUG_ON_ZERO(NCAPINTS != 21)

    #endif /* _ASM_X86_REQUIRED_FEATURES_H */
    diff --git a/arch/x86/kernel/cpu/common.c b/arch/x86/kernel/cpu/common.c
    index b7ac85a..e6f3234 100644
    --- a/arch/x86/kernel/cpu/common.c
    +++ b/arch/x86/kernel/cpu/common.c
    @@ -1093,6 +1093,9 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
    if (c->extended_cpuid_level >= 0x8000001f)
    c->x86_capability[CPUID_8000_001F_EAX] = cpuid_eax(0x8000001f);

    + if (c->extended_cpuid_level >= 0x80000021)
    + c->x86_capability[CPUID_8000_0021_EAX] = cpuid_eax(0x80000021);
    +
    init_scattered_cpuid_features(c);
    init_speculation_control(c);

    diff --git a/arch/x86/kvm/reverse_cpuid.h b/arch/x86/kvm/reverse_cpuid.h
    index 042d0ac..81f4e9c 100644
    --- a/arch/x86/kvm/reverse_cpuid.h
    +++ b/arch/x86/kvm/reverse_cpuid.h
    @@ -68,6 +68,7 @@ static const struct cpuid_reg reverse_cpuid[] = {
    [CPUID_12_EAX] = {0x00000012, 0, CPUID_EAX},
    [CPUID_8000_001F_EAX] = {0x8000001f, 0, CPUID_EAX},
    [CPUID_7_1_EDX] = { 7, 1, CPUID_EDX},
    + [CPUID_8000_0021_EAX] = {0x80000021, 0, CPUID_EAX},
    };

    /*
    \
     
     \ /
      Last update: 2023-03-26 23:56    [W:4.036 / U:0.224 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site