mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-24 17:59:32 +00:00
x86/entry/32: Fix #MC and #DB wiring on x86_32
DEFINE_IDTENTRY_MCE and DEFINE_IDTENTRY_DEBUG were wired up as non-RAW on x86_32, but the code expected them to be RAW. Get rid of all the macro indirection for them on 32-bit and just use DECLARE_IDTENTRY_RAW and DEFINE_IDTENTRY_RAW directly. Also add a warning to make sure that we only hit the _kernel paths in kernel mode. Reported-by: Naresh Kamboju <naresh.kamboju@linaro.org> 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/9e90a7ee8e72fd757db6d92e1e5ff16339c1ecf9.1593795633.git.luto@kernel.org
This commit is contained in:
parent
f41f082422
commit
13cbc0cd4a
3 changed files with 17 additions and 12 deletions
|
@ -353,10 +353,6 @@ static __always_inline void __##func(struct pt_regs *regs)
|
|||
|
||||
#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)
|
||||
|
@ -387,16 +383,18 @@ __visible noinstr void func(struct pt_regs *regs, \
|
|||
#endif /* !CONFIG_X86_64 */
|
||||
|
||||
/* C-Code mapping */
|
||||
#define DECLARE_IDTENTRY_NMI DECLARE_IDTENTRY_RAW
|
||||
#define DEFINE_IDTENTRY_NMI DEFINE_IDTENTRY_RAW
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
#define DECLARE_IDTENTRY_MCE DECLARE_IDTENTRY_IST
|
||||
#define DEFINE_IDTENTRY_MCE DEFINE_IDTENTRY_IST
|
||||
#define DEFINE_IDTENTRY_MCE_USER DEFINE_IDTENTRY_NOIST
|
||||
|
||||
#define DECLARE_IDTENTRY_NMI DECLARE_IDTENTRY_RAW
|
||||
#define DEFINE_IDTENTRY_NMI DEFINE_IDTENTRY_RAW
|
||||
|
||||
#define DECLARE_IDTENTRY_DEBUG DECLARE_IDTENTRY_IST
|
||||
#define DEFINE_IDTENTRY_DEBUG DEFINE_IDTENTRY_IST
|
||||
#define DEFINE_IDTENTRY_DEBUG_USER DEFINE_IDTENTRY_NOIST
|
||||
#endif
|
||||
|
||||
#else /* !__ASSEMBLY__ */
|
||||
|
||||
|
@ -443,9 +441,6 @@ __visible noinstr void func(struct pt_regs *regs, \
|
|||
# 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)
|
||||
|
||||
|
@ -549,7 +544,11 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_BP, exc_int3);
|
|||
DECLARE_IDTENTRY_RAW_ERRORCODE(X86_TRAP_PF, exc_page_fault);
|
||||
|
||||
#ifdef CONFIG_X86_MCE
|
||||
#ifdef CONFIG_X86_64
|
||||
DECLARE_IDTENTRY_MCE(X86_TRAP_MC, exc_machine_check);
|
||||
#else
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_MC, exc_machine_check);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* NMI */
|
||||
|
@ -559,7 +558,11 @@ DECLARE_IDTENTRY_RAW(X86_TRAP_NMI, xenpv_exc_nmi);
|
|||
#endif
|
||||
|
||||
/* #DB */
|
||||
#ifdef CONFIG_X86_64
|
||||
DECLARE_IDTENTRY_DEBUG(X86_TRAP_DB, exc_debug);
|
||||
#else
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_DB, exc_debug);
|
||||
#endif
|
||||
#ifdef CONFIG_XEN_PV
|
||||
DECLARE_IDTENTRY_RAW(X86_TRAP_DB, xenpv_exc_debug);
|
||||
#endif
|
||||
|
|
|
@ -1901,6 +1901,8 @@ void (*machine_check_vector)(struct pt_regs *) = unexpected_machine_check;
|
|||
|
||||
static __always_inline void exc_machine_check_kernel(struct pt_regs *regs)
|
||||
{
|
||||
WARN_ON_ONCE(user_mode(regs));
|
||||
|
||||
/*
|
||||
* Only required when from kernel mode. See
|
||||
* mce_check_crashing_cpu() for details.
|
||||
|
@ -1954,7 +1956,7 @@ DEFINE_IDTENTRY_MCE_USER(exc_machine_check)
|
|||
}
|
||||
#else
|
||||
/* 32bit unified entry point */
|
||||
DEFINE_IDTENTRY_MCE(exc_machine_check)
|
||||
DEFINE_IDTENTRY_RAW(exc_machine_check)
|
||||
{
|
||||
unsigned long dr7;
|
||||
|
||||
|
|
|
@ -925,7 +925,7 @@ DEFINE_IDTENTRY_DEBUG_USER(exc_debug)
|
|||
}
|
||||
#else
|
||||
/* 32 bit does not have separate entry points. */
|
||||
DEFINE_IDTENTRY_DEBUG(exc_debug)
|
||||
DEFINE_IDTENTRY_RAW(exc_debug)
|
||||
{
|
||||
unsigned long dr6, dr7;
|
||||
|
||||
|
|
Loading…
Reference in a new issue