lkml.org 
[lkml]   [2018]   [Feb]   [21]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.15 078/163] x86/debug: Use UD2 for WARN()
    Date
    4.15-stable review patch.  If anyone has any objections, please let me know.

    ------------------

    From: Peter Zijlstra <peterz@infradead.org>

    commit 3b3a371cc9bc980429baabe0a8e5f307f3d1f463 upstream.

    Since the Intel SDM added an ModR/M byte to UD0 and binutils followed
    that specification, we now cannot disassemble our kernel anymore.

    This now means Intel and AMD disagree on the encoding of UD0. And instead
    of playing games with additional bytes that are valid ModR/M and single
    byte instructions (0xd6 for instance), simply use UD2 for both WARN() and
    BUG().

    Requested-by: Linus Torvalds <torvalds@linux-foundation.org>
    Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
    Acked-by: Linus Torvalds <torvalds@linux-foundation.org>
    Cc: Andy Lutomirski <luto@kernel.org>
    Cc: Arjan van de Ven <arjan@linux.intel.com>
    Cc: Borislav Petkov <bp@alien8.de>
    Cc: Brian Gerst <brgerst@gmail.com>
    Cc: Denys Vlasenko <dvlasenk@redhat.com>
    Cc: H. Peter Anvin <hpa@zytor.com>
    Cc: Josh Poimboeuf <jpoimboe@redhat.com>
    Cc: Peter Zijlstra <peterz@infradead.org>
    Cc: Thomas Gleixner <tglx@linutronix.de>
    Link: http://lkml.kernel.org/r/20180208194406.GD25181@hirez.programming.kicks-ass.net
    Signed-off-by: Ingo Molnar <mingo@kernel.org>
    Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>

    ---
    arch/x86/include/asm/bug.h | 15 ++++++---------
    arch/x86/kernel/traps.c | 2 +-
    2 files changed, 7 insertions(+), 10 deletions(-)

    --- a/arch/x86/include/asm/bug.h
    +++ b/arch/x86/include/asm/bug.h
    @@ -5,23 +5,20 @@
    #include <linux/stringify.h>

    /*
    - * Since some emulators terminate on UD2, we cannot use it for WARN.
    - * Since various instruction decoders disagree on the length of UD1,
    - * we cannot use it either. So use UD0 for WARN.
    + * Despite that some emulators terminate on UD2, we use it for WARN().
    *
    - * (binutils knows about "ud1" but {en,de}codes it as 2 bytes, whereas
    - * our kernel decoder thinks it takes a ModRM byte, which seems consistent
    - * with various things like the Intel SDM instruction encoding rules)
    + * Since various instruction decoders/specs disagree on the encoding of
    + * UD0/UD1.
    */

    -#define ASM_UD0 ".byte 0x0f, 0xff"
    +#define ASM_UD0 ".byte 0x0f, 0xff" /* + ModRM (for Intel) */
    #define ASM_UD1 ".byte 0x0f, 0xb9" /* + ModRM */
    #define ASM_UD2 ".byte 0x0f, 0x0b"

    #define INSN_UD0 0xff0f
    #define INSN_UD2 0x0b0f

    -#define LEN_UD0 2
    +#define LEN_UD2 2

    #ifdef CONFIG_GENERIC_BUG

    @@ -79,7 +76,7 @@ do { \

    #define __WARN_FLAGS(flags) \
    do { \
    - _BUG_FLAGS(ASM_UD0, BUGFLAG_WARNING|(flags)); \
    + _BUG_FLAGS(ASM_UD2, BUGFLAG_WARNING|(flags)); \
    annotate_reachable(); \
    } while (0)

    --- a/arch/x86/kernel/traps.c
    +++ b/arch/x86/kernel/traps.c
    @@ -181,7 +181,7 @@ int fixup_bug(struct pt_regs *regs, int
    break;

    case BUG_TRAP_TYPE_WARN:
    - regs->ip += LEN_UD0;
    + regs->ip += LEN_UD2;
    return 1;
    }


    \
     
     \ /
      Last update: 2018-02-21 14:37    [W:2.093 / U:0.016 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site