mirror of
https://git.proxmox.com/git/mirror_ubuntu-kernels.git
synced 2026-01-25 22:20:52 +00:00
New xfeatures will not longer be automatically stored in the regular XSAVE buffer in thread_struct::fpu. The kernel will provide the default sized buffer for storing the regular features up to AVX512 in thread_struct::fpu and if a task requests to use one of the new features then the register storage has to be extended. The state will be accessed via a pointer in thread_struct::fpu which defaults to the builtin storage and can be switched when extended storage is required. To avoid conditionals all over the code, create a new container for the register storage which will gain other information, e.g. size, feature masks etc., later. For now it just contains the register storage, which gives it exactly the same layout as the exiting fpu::state. Stick fpu::state and the new fpu::__fpstate into an anonymous union and initialize the pointer. Add build time checks to validate that both are at the same place and have the same size. This allows step by step conversion of all users. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Borislav Petkov <bp@suse.de> Link: https://lkml.kernel.org/r/20211013145322.234458659@linutronix.de
32 lines
720 B
C
32 lines
720 B
C
/* SPDX-License-Identifier: GPL-2.0 */
|
|
#ifndef __X86_KERNEL_FPU_INTERNAL_H
|
|
#define __X86_KERNEL_FPU_INTERNAL_H
|
|
|
|
extern union fpregs_state init_fpstate;
|
|
|
|
/* CPU feature check wrappers */
|
|
static __always_inline __pure bool use_xsave(void)
|
|
{
|
|
return cpu_feature_enabled(X86_FEATURE_XSAVE);
|
|
}
|
|
|
|
static __always_inline __pure bool use_fxsr(void)
|
|
{
|
|
return cpu_feature_enabled(X86_FEATURE_FXSR);
|
|
}
|
|
|
|
#ifdef CONFIG_X86_DEBUG_FPU
|
|
# define WARN_ON_FPU(x) WARN_ON_ONCE(x)
|
|
#else
|
|
# define WARN_ON_FPU(x) ({ (void)(x); 0; })
|
|
#endif
|
|
|
|
/* Init functions */
|
|
extern void fpu__init_prepare_fx_sw_frame(void);
|
|
|
|
/* Used in init.c */
|
|
extern void fpstate_init_user(union fpregs_state *state);
|
|
extern void fpstate_reset(struct fpu *fpu);
|
|
|
|
#endif
|