• junhua huang's avatar
    arm64:uprobe fix the uprobe SWBP_INSN in big-endian · 60f07e22
    junhua huang authored
    We use uprobe in aarch64_be, which we found the tracee task would exit
    due to SIGILL when we enable the uprobe trace.
    We can see the replace inst from uprobe is not correct in aarch big-endian.
    As in Armv8-A, instruction fetches are always treated as little-endian,
    we should treat the UPROBE_SWBP_INSN as little-endian。
    
    The test case is as following。
    bash-4.4# ./mqueue_test_aarchbe 1 1 2 1 10 > /dev/null &
    bash-4.4# cd /sys/kernel/debug/tracing/
    bash-4.4# echo 'p:test /mqueue_test_aarchbe:0xc30 %x0 %x1' > uprobe_events
    bash-4.4# echo 1 > events/uprobes/enable
    bash-4.4#
    bash-4.4# ps
      PID TTY          TIME CMD
      140 ?        00:00:01 bash
      237 ?        00:00:00 ps
    [1]+  Illegal instruction     ./mqueue_test_aarchbe 1 1 2 1 100 > /dev/null
    
    which we debug use gdb as following:
    
    bash-4.4# gdb attach 155
    (gdb) disassemble send
    Dump of assembler code for function send:
       0x0000000000400c30 <+0>:     .inst   0xa00020d4 ; undefined
       0x0000000000400c34 <+4>:     mov     x29, sp
       0x0000000000400c38 <+8>:     str     w0, [sp, #28]
       0x0000000000400c3c <+12>:    strb    w1, [sp, #27]
       0x0000000000400c40 <+16>:    str     xzr, [sp, #40]
       0x0000000000400c44 <+20>:    str     xzr, [sp, #48]
       0x0000000000400c48 <+24>:    add     x0, sp, #0x1b
       0x0000000000400c4c <+28>:    mov     w3, #0x0                 // #0
       0x0000000000400c50 <+32>:    mov     x2, #0x1                 // #1
       0x0000000000400c54 <+36>:    mov     x1, x0
       0x0000000000400c58 <+40>:    ldr     w0, [sp, #28]
       0x0000000000400c5c <+44>:    bl      0x405e10 <mq_send>
       0x0000000000400c60 <+48>:    str     w0, [sp, #60]
       0x0000000000400c64 <+52>:    ldr     w0, [sp, #60]
       0x0000000000400c68 <+56>:    ldp     x29, x30, [sp], #64
       0x0000000000400c6c <+60>:    ret
    End of assembler dump.
    (gdb) info b
    No breakpoints or watchpoints.
    (gdb) c
    Continuing.
    
    Program received signal SIGILL, Illegal instruction.
    0x0000000000400c30 in send ()
    (gdb) x/10x 0x400c30
    0x400c30 <send>:    0xd42000a0   0xfd030091      0xe01f00b9      0xe16f0039
    0x400c40 <send+16>: 0xff1700f9   0xff1b00f9      0xe06f0091      0x03008052
    0x400c50 <send+32>: 0x220080d2   0xe10300aa
    (gdb) disassemble 0x400c30
    Dump of assembler code for function send:
    => 0x0000000000400c30 <+0>:     .inst   0xa00020d4 ; undefined
       0x0000000000400c34 <+4>:     mov     x29, sp
       0x0000000000400c38 <+8>:     str     w0, [sp, #28]
       0x0000000000400c3c <+12>:    strb    w1, [sp, #27]
       0x0000000000400c40 <+16>:    str     xzr, [sp, #40]
    Signed-off-by: default avatarjunhua huang <huang.junhua@zte.com.cn>
    Link: https://lore.kernel.org/r/202212021511106844809@zte.com.cnSigned-off-by: default avatarWill Deacon <will@kernel.org>
    60f07e22
uprobes.h 644 Bytes