// SPDX-License-Identifier: GPL-2.0-only /* * x86 FPU boot time init code: */ #include <asm/fpu/api.h> #include <asm/tlbflush.h> #include <asm/setup.h> #include <linux/sched.h> #include <linux/sched/task.h> #include <linux/init.h> #include "internal.h" #include "legacy.h" #include "xstate.h" /* * Initialize the registers found in all CPUs, CR0 and CR4: */ static void fpu__init_cpu_generic(void) { … } /* * Enable all supported FPU features. Called when a CPU is brought online: */ void fpu__init_cpu(void) { … } static bool __init fpu__probe_without_cpuid(void) { … } static void __init fpu__init_system_early_generic(void) { … } /* * Boot time FPU feature detection code: */ unsigned int mxcsr_feature_mask __ro_after_init = …; EXPORT_SYMBOL_GPL(…); static void __init fpu__init_system_mxcsr(void) { … } /* * Once per bootup FPU initialization sequences that will run on most x86 CPUs: */ static void __init fpu__init_system_generic(void) { … } /* * Enforce that 'MEMBER' is the last field of 'TYPE'. * * Align the computed size with alignment of the TYPE, * because that's how C aligns structs. */ #define CHECK_MEMBER_AT_END_OF(TYPE, MEMBER) … /* * We append the 'struct fpu' to the task_struct: */ static void __init fpu__init_task_struct_size(void) { … } /* * Set up the user and kernel xstate sizes based on the legacy FPU context size. * * We set this up first, and later it will be overwritten by * fpu__init_system_xstate() if the CPU knows about xstates. */ static void __init fpu__init_system_xstate_size_legacy(void) { … } /* * Called on the boot CPU once per system bootup, to set up the initial * FPU state that is later cloned into all processes: */ void __init fpu__init_system(void) { … }