/* SPDX-License-Identifier: GPL-2.0 */ #include <linux/kernel.h> #include <asm/desc.h> #include <asm/fred.h> #include <asm/tlbflush.h> #include <asm/traps.h> /* #DB in the kernel would imply the use of a kernel debugger. */ #define FRED_DB_STACK_LEVEL … #define FRED_NMI_STACK_LEVEL … #define FRED_MC_STACK_LEVEL … /* * #DF is the highest level because a #DF means "something went wrong * *while delivering an exception*." The number of cases for which that * can happen with FRED is drastically reduced and basically amounts to * "the stack you pointed me to is broken." Thus, always change stacks * on #DF, which means it should be at the highest level. */ #define FRED_DF_STACK_LEVEL … #define FRED_STKLVL(vector, lvl) … DEFINE_PER_CPU(unsigned long, fred_rsp0); EXPORT_PER_CPU_SYMBOL(…); void cpu_init_fred_exceptions(void) { … } /* Must be called after setup_cpu_entry_areas() */ void cpu_init_fred_rsps(void) { … }