lkml.org 
[lkml]   [2016]   [Jul]   [14]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.12 04/88] sparc: Fix system call tracing register handling.
    Date
    From: Mike Frysinger <vapier@gentoo.org>

    3.12-stable review patch. If anyone has any objections, please let me know.

    ===============

    [ Upstream commit 1a40b95374f680625318ab61d81958e949e0afe3 ]

    A system call trace trigger on entry allows the tracing
    process to inspect and potentially change the traced
    process's registers.

    Account for that by reloading the %g1 (syscall number)
    and %i0-%i5 (syscall argument) values. We need to be
    careful to revalidate the range of %g1, and reload the
    system call table entry it corresponds to into %l7.

    Reported-by: Mike Frysinger <vapier@gentoo.org>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Tested-by: Mike Frysinger <vapier@gentoo.org>
    Signed-off-by: Jiri Slaby <jslaby@suse.cz>
    ---
    arch/sparc/kernel/entry.S | 17 +++++++++++++++++
    arch/sparc/kernel/syscalls.S | 36 ++++++++++++++++++++++++++++++++++++
    2 files changed, 53 insertions(+)

    diff --git a/arch/sparc/kernel/entry.S b/arch/sparc/kernel/entry.S
    index 33c02b15f478..a83707c83be8 100644
    --- a/arch/sparc/kernel/entry.S
    +++ b/arch/sparc/kernel/entry.S
    @@ -948,7 +948,24 @@ linux_syscall_trace:
    cmp %o0, 0
    bne 3f
    mov -ENOSYS, %o0
    +
    + /* Syscall tracing can modify the registers. */
    + ld [%sp + STACKFRAME_SZ + PT_G1], %g1
    + sethi %hi(sys_call_table), %l7
    + ld [%sp + STACKFRAME_SZ + PT_I0], %i0
    + or %l7, %lo(sys_call_table), %l7
    + ld [%sp + STACKFRAME_SZ + PT_I1], %i1
    + ld [%sp + STACKFRAME_SZ + PT_I2], %i2
    + ld [%sp + STACKFRAME_SZ + PT_I3], %i3
    + ld [%sp + STACKFRAME_SZ + PT_I4], %i4
    + ld [%sp + STACKFRAME_SZ + PT_I5], %i5
    + cmp %g1, NR_syscalls
    + bgeu 3f
    + mov -ENOSYS, %o0
    +
    + sll %g1, 2, %l4
    mov %i0, %o0
    + ld [%l7 + %l4], %l7
    mov %i1, %o1
    mov %i2, %o2
    mov %i3, %o3
    diff --git a/arch/sparc/kernel/syscalls.S b/arch/sparc/kernel/syscalls.S
    index 6dee79575791..db4408e54bee 100644
    --- a/arch/sparc/kernel/syscalls.S
    +++ b/arch/sparc/kernel/syscalls.S
    @@ -148,7 +148,25 @@ linux_syscall_trace32:
    add %sp, PTREGS_OFF, %o0
    brnz,pn %o0, 3f
    mov -ENOSYS, %o0
    +
    + /* Syscall tracing can modify the registers. */
    + ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
    + sethi %hi(sys_call_table32), %l7
    + ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
    + or %l7, %lo(sys_call_table32), %l7
    + ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
    + ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
    + ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
    + ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
    + ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
    +
    + cmp %g1, NR_syscalls
    + bgeu,pn %xcc, 3f
    + mov -ENOSYS, %o0
    +
    + sll %g1, 2, %l4
    srl %i0, 0, %o0
    + lduw [%l7 + %l4], %l7
    srl %i4, 0, %o4
    srl %i1, 0, %o1
    srl %i2, 0, %o2
    @@ -160,7 +178,25 @@ linux_syscall_trace:
    add %sp, PTREGS_OFF, %o0
    brnz,pn %o0, 3f
    mov -ENOSYS, %o0
    +
    + /* Syscall tracing can modify the registers. */
    + ldx [%sp + PTREGS_OFF + PT_V9_G1], %g1
    + sethi %hi(sys_call_table64), %l7
    + ldx [%sp + PTREGS_OFF + PT_V9_I0], %i0
    + or %l7, %lo(sys_call_table64), %l7
    + ldx [%sp + PTREGS_OFF + PT_V9_I1], %i1
    + ldx [%sp + PTREGS_OFF + PT_V9_I2], %i2
    + ldx [%sp + PTREGS_OFF + PT_V9_I3], %i3
    + ldx [%sp + PTREGS_OFF + PT_V9_I4], %i4
    + ldx [%sp + PTREGS_OFF + PT_V9_I5], %i5
    +
    + cmp %g1, NR_syscalls
    + bgeu,pn %xcc, 3f
    + mov -ENOSYS, %o0
    +
    + sll %g1, 2, %l4
    mov %i0, %o0
    + lduw [%l7 + %l4], %l7
    mov %i1, %o1
    mov %i2, %o2
    mov %i3, %o3
    --
    2.9.1
    \
     
     \ /
      Last update: 2016-07-14 11:01    [W:8.999 / U:0.028 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site