lkml.org 
[lkml]   [2020]   [Jun]   [19]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.4 007/101] ARM: 8977/1: ptrace: Fix mask for thumb breakpoint hook
    Date
    From: Fredrik Strupe <fredrik@strupe.net>

    [ Upstream commit 3866f217aaa81bf7165c7f27362eee5d7919c496 ]

    call_undef_hook() in traps.c applies the same instr_mask for both 16-bit
    and 32-bit thumb instructions. If instr_mask then is only 16 bits wide
    (0xffff as opposed to 0xffffffff), the first half-word of 32-bit thumb
    instructions will be masked out. This makes the function match 32-bit
    thumb instructions where the second half-word is equal to instr_val,
    regardless of the first half-word.

    The result in this case is that all undefined 32-bit thumb instructions
    with the second half-word equal to 0xde01 (udf #1) work as breakpoints
    and will raise a SIGTRAP instead of a SIGILL, instead of just the one
    intended 16-bit instruction. An example of such an instruction is
    0xeaa0de01, which is unallocated according to Arm ARM and should raise a
    SIGILL, but instead raises a SIGTRAP.

    This patch fixes the issue by setting all the bits in instr_mask, which
    will still match the intended 16-bit thumb instruction (where the
    upper half is always 0), but not any 32-bit thumb instructions.

    Cc: Oleg Nesterov <oleg@redhat.com>
    Signed-off-by: Fredrik Strupe <fredrik@strupe.net>
    Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    arch/arm/kernel/ptrace.c | 4 ++--
    1 file changed, 2 insertions(+), 2 deletions(-)

    diff --git a/arch/arm/kernel/ptrace.c b/arch/arm/kernel/ptrace.c
    index d54c53b7ab63..711d854ea13a 100644
    --- a/arch/arm/kernel/ptrace.c
    +++ b/arch/arm/kernel/ptrace.c
    @@ -227,8 +227,8 @@ static struct undef_hook arm_break_hook = {
    };

    static struct undef_hook thumb_break_hook = {
    - .instr_mask = 0xffff,
    - .instr_val = 0xde01,
    + .instr_mask = 0xffffffff,
    + .instr_val = 0x0000de01,
    .cpsr_mask = PSR_T_BIT,
    .cpsr_val = PSR_T_BIT,
    .fn = break_trap,
    --
    2.25.1


    \
     
     \ /
      Last update: 2020-06-19 16:37    [W:4.541 / U:0.856 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site