x86/cpu, kvm: Add support for CPUID_80000021_EAX
commit 8415a74852d7c24795007ee9862d25feb519007c upstream. 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 [bwh: Backported to 6.1: adjust context] Signed-off-by: Ben Hutchings <benh@debian.org> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:

committed by
Greg Kroah-Hartman

parent
073a28a9b5
commit
34f23ba8a3
@@ -32,6 +32,7 @@ enum cpuid_leafs
|
|||||||
CPUID_8000_0007_EBX,
|
CPUID_8000_0007_EBX,
|
||||||
CPUID_7_EDX,
|
CPUID_7_EDX,
|
||||||
CPUID_8000_001F_EAX,
|
CPUID_8000_001F_EAX,
|
||||||
|
CPUID_8000_0021_EAX,
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_X86_FEATURE_NAMES
|
#ifdef CONFIG_X86_FEATURE_NAMES
|
||||||
@@ -91,8 +92,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, 17, feature_bit) || \
|
||||||
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 18, 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, 19, feature_bit) || \
|
||||||
|
CHECK_BIT_IN_MASK_WORD(REQUIRED_MASK, 20, feature_bit) || \
|
||||||
REQUIRED_MASK_CHECK || \
|
REQUIRED_MASK_CHECK || \
|
||||||
BUILD_BUG_ON_ZERO(NCAPINTS != 20))
|
BUILD_BUG_ON_ZERO(NCAPINTS != 21))
|
||||||
|
|
||||||
#define DISABLED_MASK_BIT_SET(feature_bit) \
|
#define DISABLED_MASK_BIT_SET(feature_bit) \
|
||||||
( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 0, feature_bit) || \
|
( CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 0, feature_bit) || \
|
||||||
@@ -115,8 +117,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, 17, feature_bit) || \
|
||||||
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 18, 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, 19, feature_bit) || \
|
||||||
|
CHECK_BIT_IN_MASK_WORD(DISABLED_MASK, 20, feature_bit) || \
|
||||||
DISABLED_MASK_CHECK || \
|
DISABLED_MASK_CHECK || \
|
||||||
BUILD_BUG_ON_ZERO(NCAPINTS != 20))
|
BUILD_BUG_ON_ZERO(NCAPINTS != 21))
|
||||||
|
|
||||||
#define cpu_has(c, bit) \
|
#define cpu_has(c, bit) \
|
||||||
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
|
(__builtin_constant_p(bit) && REQUIRED_MASK_BIT_SET(bit) ? 1 : \
|
||||||
|
@@ -13,7 +13,7 @@
|
|||||||
/*
|
/*
|
||||||
* Defines x86 CPU feature bits
|
* 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 2 /* N 32-bit bug flags */
|
#define NBUGINTS 2 /* N 32-bit bug flags */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@@ -102,6 +102,7 @@
|
|||||||
#define DISABLED_MASK17 0
|
#define DISABLED_MASK17 0
|
||||||
#define DISABLED_MASK18 0
|
#define DISABLED_MASK18 0
|
||||||
#define DISABLED_MASK19 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 */
|
#endif /* _ASM_X86_DISABLED_FEATURES_H */
|
||||||
|
@@ -102,6 +102,7 @@
|
|||||||
#define REQUIRED_MASK17 0
|
#define REQUIRED_MASK17 0
|
||||||
#define REQUIRED_MASK18 0
|
#define REQUIRED_MASK18 0
|
||||||
#define REQUIRED_MASK19 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 */
|
#endif /* _ASM_X86_REQUIRED_FEATURES_H */
|
||||||
|
@@ -969,6 +969,9 @@ void get_cpu_cap(struct cpuinfo_x86 *c)
|
|||||||
if (c->extended_cpuid_level >= 0x8000001f)
|
if (c->extended_cpuid_level >= 0x8000001f)
|
||||||
c->x86_capability[CPUID_8000_001F_EAX] = cpuid_eax(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_scattered_cpuid_features(c);
|
||||||
init_speculation_control(c);
|
init_speculation_control(c);
|
||||||
|
|
||||||
|
@@ -63,6 +63,7 @@ static const struct cpuid_reg reverse_cpuid[] = {
|
|||||||
[CPUID_8000_0007_EBX] = {0x80000007, 0, CPUID_EBX},
|
[CPUID_8000_0007_EBX] = {0x80000007, 0, CPUID_EBX},
|
||||||
[CPUID_7_EDX] = { 7, 0, CPUID_EDX},
|
[CPUID_7_EDX] = { 7, 0, CPUID_EDX},
|
||||||
[CPUID_7_1_EAX] = { 7, 1, CPUID_EAX},
|
[CPUID_7_1_EAX] = { 7, 1, CPUID_EAX},
|
||||||
|
[CPUID_8000_0021_EAX] = {0x80000021, 0, CPUID_EAX},
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
Reference in New Issue
Block a user