lkml.org 
[lkml]   [2020]   [Jul]   [4]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip: x86/urgent] x86/entry/32: Fix #MC and #DB wiring on x86_32
    The following commit has been merged into the x86/urgent branch of tip:

    Commit-ID: 13cbc0cd4a30c815984ad88e3a2e5976493516a3
    Gitweb: https://git.kernel.org/tip/13cbc0cd4a30c815984ad88e3a2e5976493516a3
    Author: Andy Lutomirski <luto@kernel.org>
    AuthorDate: Fri, 03 Jul 2020 10:02:56 -07:00
    Committer: Thomas Gleixner <tglx@linutronix.de>
    CommitterDate: Sat, 04 Jul 2020 19:47:26 +02: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

    ---
    arch/x86/include/asm/idtentry.h | 23 +++++++++++++----------
    arch/x86/kernel/cpu/mce/core.c | 4 +++-
    arch/x86/kernel/traps.c | 2 +-
    3 files changed, 17 insertions(+), 12 deletions(-)

    diff --git a/arch/x86/include/asm/idtentry.h b/arch/x86/include/asm/idtentry.h
    index 94333ac..eeac6dc 100644
    --- a/arch/x86/include/asm/idtentry.h
    +++ b/arch/x86/include/asm/idtentry.h
    @@ -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
    diff --git a/arch/x86/kernel/cpu/mce/core.c b/arch/x86/kernel/cpu/mce/core.c
    index ce9120c..a6a90b5 100644
    --- a/arch/x86/kernel/cpu/mce/core.c
    +++ b/arch/x86/kernel/cpu/mce/core.c
    @@ -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;

    diff --git a/arch/x86/kernel/traps.c b/arch/x86/kernel/traps.c
    index c17f9b5..6ed8cc5 100644
    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -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;

    \
     
     \ /
      Last update: 2020-07-04 19:49    [W:4.164 / U:0.008 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site