x86/entry/xen: Route #DB correctly on Xen PV
On Xen PV, #DB doesn't use IST. It still needs to be correctly routed
depending on whether it came from user or kernel mode.
Get rid of DECLARE/DEFINE_IDTENTRY_XEN -- it was too hard to follow the
logic. Instead, route #DB and NMI through DECLARE/DEFINE_IDTENTRY_RAW on
Xen, and do the right thing for #DB. Also add more warnings to the
exc_debug* handlers to make this type of failure more obvious.
This fixes various forms of corruption that happen when usermode
triggers #DB on Xen PV.
Fixes: 4c0dcd8350
("x86/entry: Implement user mode C entry points for #DB and #MCE")
Signed-off-by: Andy Lutomirski <luto@kernel.org>
Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/4163e733cce0b41658e252c6c6b3464f33fdff17.1593795633.git.luto@kernel.org
This commit is contained in:

committed by
Thomas Gleixner

parent
3c73b81a91
commit
f41f082422
@@ -398,18 +398,6 @@ __visible noinstr void func(struct pt_regs *regs, \
|
||||
#define DEFINE_IDTENTRY_DEBUG DEFINE_IDTENTRY_IST
|
||||
#define DEFINE_IDTENTRY_DEBUG_USER DEFINE_IDTENTRY_NOIST
|
||||
|
||||
/**
|
||||
* DECLARE_IDTENTRY_XEN - Declare functions for XEN redirect IDT entry points
|
||||
* @vector: Vector number (ignored for C)
|
||||
* @func: Function name of the entry point
|
||||
*
|
||||
* Used for xennmi and xendebug redirections. No DEFINE as this is all ASM
|
||||
* indirection magic.
|
||||
*/
|
||||
#define DECLARE_IDTENTRY_XEN(vector, func) \
|
||||
asmlinkage void xen_asm_exc_xen##func(void); \
|
||||
asmlinkage void asm_exc_xen##func(void)
|
||||
|
||||
#else /* !__ASSEMBLY__ */
|
||||
|
||||
/*
|
||||
@@ -469,10 +457,6 @@ __visible noinstr void func(struct pt_regs *regs, \
|
||||
/* No ASM code emitted for NMI */
|
||||
#define DECLARE_IDTENTRY_NMI(vector, func)
|
||||
|
||||
/* XEN NMI and DB wrapper */
|
||||
#define DECLARE_IDTENTRY_XEN(vector, func) \
|
||||
idtentry vector asm_exc_xen##func exc_##func has_error_code=0
|
||||
|
||||
/*
|
||||
* ASM code to emit the common vector entry stubs where each stub is
|
||||
* packed into 8 bytes.
|
||||
@@ -570,11 +554,15 @@ DECLARE_IDTENTRY_MCE(X86_TRAP_MC, exc_machine_check);
|
||||
|
||||
/* NMI */
|
||||
DECLARE_IDTENTRY_NMI(X86_TRAP_NMI, exc_nmi);
|
||||
DECLARE_IDTENTRY_XEN(X86_TRAP_NMI, nmi);
|
||||
#ifdef CONFIG_XEN_PV
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_NMI, xenpv_exc_nmi);
|
||||
#endif
|
||||
|
||||
/* #DB */
|
||||
DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB, exc_debug);
|
||||
DECLARE_IDTENTRY_XEN(X86_TRAP_DB, debug);
|
||||
#ifdef CONFIG_XEN_PV
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_DB, xenpv_exc_debug);
|
||||
#endif
|
||||
|
||||
/* #DF */
|
||||
DECLARE_IDTENTRY_DF(X86_TRAP_DF, exc_double_fault);
|
||||
|
Reference in New Issue
Block a user