mirror of
https://github.com/AuxXxilium/linux_dsm_epyc7002.git
synced 2024-12-21 02:01:05 +07:00
x86/idtentry: Provide IDTENTRY_DF
Provide a separate macro for #DF as this needs to emit paranoid only code and has also a special ASM stub in 32bit. Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com> Acked-by: Peter Zijlstra <peterz@infradead.org> Acked-by: Andy Lutomirski <luto@kernel.org> Link: https://lkml.kernel.org/r/20200505135315.583415264@linutronix.de
This commit is contained in:
parent
865d3a9afe
commit
6a8dfa8e40
@ -132,6 +132,35 @@ static __always_inline void __##func(struct pt_regs *regs, \
|
||||
#define DEFINE_IDTENTRY_RAW(func) \
|
||||
__visible noinstr void func(struct pt_regs *regs)
|
||||
|
||||
/**
|
||||
* DECLARE_IDTENTRY_RAW_ERRORCODE - Declare functions for raw IDT entry points
|
||||
* Error code pushed by hardware
|
||||
* @vector: Vector number (ignored for C)
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* Maps to DECLARE_IDTENTRY_ERRORCODE()
|
||||
*/
|
||||
#define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \
|
||||
DECLARE_IDTENTRY_ERRORCODE(vector, func)
|
||||
|
||||
/**
|
||||
* DEFINE_IDTENTRY_RAW_ERRORCODE - Emit code for raw IDT entry points
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* @func is called from ASM entry code with interrupts disabled.
|
||||
*
|
||||
* The macro is written so it acts as function definition. Append the
|
||||
* body with a pair of curly brackets.
|
||||
*
|
||||
* Contrary to DEFINE_IDTENTRY_ERRORCODE() this does not invoke the
|
||||
* idtentry_enter/exit() helpers before and after the body invocation. This
|
||||
* needs to be done in the body itself if applicable. Use if extra work
|
||||
* is required before the enter/exit() helpers are invoked.
|
||||
*/
|
||||
#define DEFINE_IDTENTRY_RAW_ERRORCODE(func) \
|
||||
__visible noinstr void func(struct pt_regs *regs, unsigned long error_code)
|
||||
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
/**
|
||||
* DECLARE_IDTENTRY_IST - Declare functions for IST handling IDT entry points
|
||||
@ -165,10 +194,58 @@ __visible noinstr void func(struct pt_regs *regs)
|
||||
#define DEFINE_IDTENTRY_NOIST(func) \
|
||||
DEFINE_IDTENTRY_RAW(noist_##func)
|
||||
|
||||
/**
|
||||
* DECLARE_IDTENTRY_DF - Declare functions for double fault
|
||||
* @vector: Vector number (ignored for C)
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* Maps to DECLARE_IDTENTRY_RAW_ERRORCODE
|
||||
*/
|
||||
#define DECLARE_IDTENTRY_DF(vector, func) \
|
||||
DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func)
|
||||
|
||||
/**
|
||||
* DEFINE_IDTENTRY_DF - Emit code for double fault
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* Maps to DEFINE_IDTENTRY_RAW_ERRORCODE
|
||||
*/
|
||||
#define DEFINE_IDTENTRY_DF(func) \
|
||||
DEFINE_IDTENTRY_RAW_ERRORCODE(func)
|
||||
|
||||
#else /* CONFIG_X86_64 */
|
||||
|
||||
/* Maps to a regular IDTENTRY on 32bit for now */
|
||||
# define DECLARE_IDTENTRY_IST DECLARE_IDTENTRY
|
||||
# define DEFINE_IDTENTRY_IST DEFINE_IDTENTRY
|
||||
|
||||
/**
|
||||
* DECLARE_IDTENTRY_DF - Declare functions for double fault 32bit variant
|
||||
* @vector: Vector number (ignored for C)
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* Declares two functions:
|
||||
* - The ASM entry point: asm_##func
|
||||
* - The C handler called from the C shim
|
||||
*/
|
||||
#define DECLARE_IDTENTRY_DF(vector, func) \
|
||||
asmlinkage void asm_##func(void); \
|
||||
__visible void func(struct pt_regs *regs, \
|
||||
unsigned long error_code, \
|
||||
unsigned long address)
|
||||
|
||||
/**
|
||||
* DEFINE_IDTENTRY_DF - Emit code for double fault on 32bit
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* This is called through the doublefault shim which already provides
|
||||
* cr2 in the address argument.
|
||||
*/
|
||||
#define DEFINE_IDTENTRY_DF(func) \
|
||||
__visible noinstr void func(struct pt_regs *regs, \
|
||||
unsigned long error_code, \
|
||||
unsigned long address)
|
||||
|
||||
#endif /* !CONFIG_X86_64 */
|
||||
|
||||
/* C-Code mapping */
|
||||
@ -212,6 +289,9 @@ __visible noinstr void func(struct pt_regs *regs)
|
||||
#define DECLARE_IDTENTRY_RAW(vector, func) \
|
||||
DECLARE_IDTENTRY(vector, func)
|
||||
|
||||
#define DECLARE_IDTENTRY_RAW_ERRORCODE(vector, func) \
|
||||
DECLARE_IDTENTRY_ERRORCODE(vector, func)
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
# define DECLARE_IDTENTRY_MCE(vector, func) \
|
||||
idtentry_mce_db vector asm_##func func
|
||||
@ -219,12 +299,19 @@ __visible noinstr void func(struct pt_regs *regs)
|
||||
# define DECLARE_IDTENTRY_DEBUG(vector, func) \
|
||||
idtentry_mce_db vector asm_##func func
|
||||
|
||||
# define DECLARE_IDTENTRY_DF(vector, func) \
|
||||
idtentry_df vector asm_##func func
|
||||
|
||||
#else
|
||||
# define DECLARE_IDTENTRY_MCE(vector, func) \
|
||||
DECLARE_IDTENTRY(vector, func)
|
||||
|
||||
# define DECLARE_IDTENTRY_DEBUG(vector, func) \
|
||||
DECLARE_IDTENTRY(vector, func)
|
||||
|
||||
/* No ASM emitted for DF as this goes through a C shim */
|
||||
# define DECLARE_IDTENTRY_DF(vector, func)
|
||||
|
||||
#endif
|
||||
|
||||
/* No ASM code emitted for NMI */
|
||||
|
Loading…
Reference in New Issue
Block a user