]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
x86/fpu: Add size and mask information to fpstate
authorThomas Gleixner <tglx@linutronix.de>
Wed, 13 Oct 2021 14:55:46 +0000 (16:55 +0200)
committerStefan Bader <stefan.bader@canonical.com>
Wed, 27 Apr 2022 09:55:58 +0000 (11:55 +0200)
BugLink: https://bugs.launchpad.net/bugs/1967750
Add state size and feature mask information to the fpstate container. This
will be used for runtime checks with the upcoming support for dynamically
enabled features and dynamically sized buffers. That avoids conditionals
all over the place as the required information is accessible for both
default and extended buffers.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Link: https://lkml.kernel.org/r/20211013145322.921388806@linutronix.de
(cherry picked from commit 248452ce21aeb08da2d2af23d88f890886bd379f)
Acked-by: Dimitri John Ledkov <dimitri.ledkov@canonical.com>
Signed-off-by: Andrea Righi <andrea.righi@canonical.com>
arch/x86/include/asm/fpu/types.h
arch/x86/kernel/fpu/core.c
arch/x86/kernel/fpu/init.c
arch/x86/kernel/fpu/xstate.c

index 297e3b4920cbd029c30c243ec2cce1c9c0a035f9..3a12e97e475dc21fa312c122e970f6af3e7edca0 100644 (file)
@@ -310,6 +310,18 @@ union fpregs_state {
 };
 
 struct fpstate {
+       /* @kernel_size: The size of the kernel register image */
+       unsigned int            size;
+
+       /* @user_size: The size in non-compacted UABI format */
+       unsigned int            user_size;
+
+       /* @xfeatures:          xfeatures for which the storage is sized */
+       u64                     xfeatures;
+
+       /* @user_xfeatures:     xfeatures valid in UABI buffers */
+       u64                     user_xfeatures;
+
        /* @regs: The register state union for all supported formats */
        union fpregs_state              regs;
 
index c6df97517ec8028de77597f171dd74c55b0fccaf..a8cc20e90751221e971b934aac7cde7c7cbbe06d 100644 (file)
@@ -342,6 +342,12 @@ void fpstate_reset(struct fpu *fpu)
 {
        /* Set the fpstate pointer to the default fpstate */
        fpu->fpstate = &fpu->__fpstate;
+
+       /* Initialize sizes and feature masks */
+       fpu->fpstate->size              = fpu_kernel_xstate_size;
+       fpu->fpstate->user_size         = fpu_user_xstate_size;
+       fpu->fpstate->xfeatures         = xfeatures_mask_all;
+       fpu->fpstate->user_xfeatures    = xfeatures_mask_uabi();
 }
 
 #if IS_ENABLED(CONFIG_KVM)
index cffbaf491886d52fa06d5a52ec9ca0d37fabf6d6..65d763faace9898878924df1dda9b5376fab1653 100644 (file)
@@ -212,6 +212,14 @@ static void __init fpu__init_system_xstate_size_legacy(void)
        }
 
        fpu_user_xstate_size = fpu_kernel_xstate_size;
+       fpstate_reset(&current->thread.fpu);
+}
+
+static void __init fpu__init_init_fpstate(void)
+{
+       /* Bring init_fpstate size and features up to date */
+       init_fpstate.size               = fpu_kernel_xstate_size;
+       init_fpstate.xfeatures          = xfeatures_mask_all;
 }
 
 /*
@@ -233,4 +241,5 @@ void __init fpu__init_system(struct cpuinfo_x86 *c)
        fpu__init_system_xstate_size_legacy();
        fpu__init_system_xstate();
        fpu__init_task_struct_size();
+       fpu__init_init_fpstate();
 }
index ca72a3e9080ca52410d26bf26cd809fc5e4da4eb..4beb010d19fc6859ac8ad47ef11567a2f0cdea56 100644 (file)
@@ -720,6 +720,7 @@ static void __init fpu__init_disable_system_xstate(void)
        xfeatures_mask_all = 0;
        cr4_clear_bits(X86_CR4_OSXSAVE);
        setup_clear_cpu_cap(X86_FEATURE_XSAVE);
+       fpstate_reset(&current->thread.fpu);
 }
 
 /*
@@ -792,6 +793,8 @@ void __init fpu__init_system_xstate(void)
        if (err)
                goto out_disable;
 
+       fpstate_reset(&current->thread.fpu);
+
        /*
         * Update info used for ptrace frames; use standard-format size and no
         * supervisor xstates: