x86/fpu: Add fpu_state_config::legacy_features
authorThomas Gleixner <tglx@linutronix.de>
Thu, 21 Oct 2021 22:55:09 +0000 (15:55 -0700)
committerBorislav Petkov <bp@suse.de>
Tue, 26 Oct 2021 08:18:09 +0000 (10:18 +0200)
The upcoming prctl() which is required to request the permission for a
dynamically enabled feature will also provide an option to retrieve the
supported features. If the CPU does not support XSAVE, the supported
features would be 0 even when the CPU supports FP and SSE.

Provide separate storage for the legacy feature set to avoid that and fill
in the bits in the legacy init function.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Chang S. Bae <chang.seok.bae@intel.com>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20211021225527.10184-6-chang.seok.bae@intel.com
arch/x86/include/asm/fpu/types.h
arch/x86/kernel/fpu/init.c

index c3ec562..595122f 100644 (file)
@@ -503,6 +503,13 @@ struct fpu_state_config {
         * be requested by user space before usage.
         */
        u64 default_features;
+       /*
+        * @legacy_features:
+        *
+        * Features which can be reported back to user space
+        * even without XSAVE support, i.e. legacy features FP + SSE
+        */
+       u64 legacy_features;
 };
 
 /* FPU state configuration information */
index 7074154..621f4b6 100644 (file)
@@ -193,12 +193,15 @@ static void __init fpu__init_system_xstate_size_legacy(void)
         * Note that the size configuration might be overwritten later
         * during fpu__init_system_xstate().
         */
-       if (!cpu_feature_enabled(X86_FEATURE_FPU))
+       if (!cpu_feature_enabled(X86_FEATURE_FPU)) {
                size = sizeof(struct swregs_state);
-       else if (cpu_feature_enabled(X86_FEATURE_FXSR))
+       } else if (cpu_feature_enabled(X86_FEATURE_FXSR)) {
                size = sizeof(struct fxregs_state);
-       else
+               fpu_user_cfg.legacy_features = XFEATURE_MASK_FPSSE;
+       } else {
                size = sizeof(struct fregs_state);
+               fpu_user_cfg.legacy_features = XFEATURE_MASK_FP;
+       }
 
        fpu_kernel_cfg.max_size = size;
        fpu_kernel_cfg.default_size = size;