On Fri, Aug 09 2024 at 11:52, Thomas Gleixner wrote:
static inline u64 xfeatures_mask_independent(void) {
- if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR))
- if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR) ||
(fpu_kernel_cfg.max_features & XFEATURE_MASK_LBR) != XFEATURE_MASK_LBR)
This is wrong because fpu_kernel_cfg.max_features never contains XFEATURE_MASK_LBR. It only contains the bits which are managed by the FPU subsystem.
You want something like the uncompiled below.
The LBR bit should be probably cleared when the CPU feature is not there at some point in the boot process to avoid the whole is enabled and masking business, but that's an orthogonal issue.
Thanks,
tglx --- arch/x86/include/asm/fpu/types.h | 7 +++++++ arch/x86/kernel/fpu/xstate.c | 2 ++ arch/x86/kernel/fpu/xstate.h | 4 ++-- 3 files changed, 11 insertions(+), 2 deletions(-)
--- a/arch/x86/include/asm/fpu/types.h +++ b/arch/x86/include/asm/fpu/types.h @@ -591,6 +591,13 @@ struct fpu_state_config { * even without XSAVE support, i.e. legacy features FP + SSE */ u64 legacy_features; + /* + * @independent_features: + * + * Features which are supported by XSAVES but not managed + * by the FPU core, e.g. LBR + */ + u64 independent_features; };
/* FPU state configuration information */ --- a/arch/x86/kernel/fpu/xstate.c +++ b/arch/x86/kernel/fpu/xstate.c @@ -788,6 +788,8 @@ void __init fpu__init_system_xstate(unsi goto out_disable; }
+ fpu_kernel_cfg.independent_features = fpu_kernel_cfg.max_features & + XFEATURE_MASK_INDEPENDENT; /* * Clear XSAVE features that are disabled in the normal CPUID. */ --- a/arch/x86/kernel/fpu/xstate.h +++ b/arch/x86/kernel/fpu/xstate.h @@ -62,9 +62,9 @@ static inline u64 xfeatures_mask_supervi static inline u64 xfeatures_mask_independent(void) { if (!cpu_feature_enabled(X86_FEATURE_ARCH_LBR)) - return XFEATURE_MASK_INDEPENDENT & ~XFEATURE_MASK_LBR; + return fpu_kernel_cfg.independent_features & ~XFEATURE_MASK_LBR;
- return XFEATURE_MASK_INDEPENDENT; + return fpu_kernel_cfg.independent_features; }
/* XSAVE/XRSTOR wrapper functions */