| From 3ec18fc7831e7d79e2d536dd1f3bc0d3ba425e8a Mon Sep 17 00:00:00 2001 |
| From: Sven Schnelle <svens@stackframe.org> |
| Date: Sat, 13 Nov 2021 20:41:17 +0100 |
| Subject: parisc/entry: fix trace test in syscall exit path |
| |
| From: Sven Schnelle <svens@stackframe.org> |
| |
| commit 3ec18fc7831e7d79e2d536dd1f3bc0d3ba425e8a upstream. |
| |
| commit 8779e05ba8aa ("parisc: Fix ptrace check on syscall return") |
| fixed testing of TI_FLAGS. This uncovered a bug in the test mask. |
| syscall_restore_rfi is only used when the kernel needs to exit to |
| usespace with single or block stepping and the recovery counter |
| enabled. The test however used _TIF_SYSCALL_TRACE_MASK, which |
| includes a lot of bits that shouldn't be tested here. |
| |
| Fix this by using TIF_SINGLESTEP and TIF_BLOCKSTEP directly. |
| |
| I encountered this bug by enabling syscall tracepoints. Both in qemu and |
| on real hardware. As soon as i enabled the tracepoint (sys_exit_read, |
| but i guess it doesn't really matter which one), i got random page |
| faults in userspace almost immediately. |
| |
| Signed-off-by: Sven Schnelle <svens@stackframe.org> |
| Signed-off-by: Helge Deller <deller@gmx.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| arch/parisc/kernel/entry.S | 2 +- |
| 1 file changed, 1 insertion(+), 1 deletion(-) |
| |
| --- a/arch/parisc/kernel/entry.S |
| +++ b/arch/parisc/kernel/entry.S |
| @@ -1835,7 +1835,7 @@ syscall_restore: |
| |
| /* Are we being ptraced? */ |
| LDREG TI_FLAGS-THREAD_SZ_ALGN-FRAME_SIZE(%r30),%r19 |
| - ldi _TIF_SYSCALL_TRACE_MASK,%r2 |
| + ldi _TIF_SINGLESTEP|_TIF_BLOCKSTEP,%r2 |
| and,COND(=) %r19,%r2,%r0 |
| b,n syscall_restore_rfi |
| |