s390/ptrace: race of single stepping vs signal delivery
authorMartin Schwidefsky <schwidefsky@de.ibm.com>
Wed, 21 Nov 2012 15:36:27 +0000 (16:36 +0100)
committerMartin Schwidefsky <schwidefsky@de.ibm.com>
Fri, 23 Nov 2012 10:14:33 +0000 (11:14 +0100)
commit39efd4ec9a2967e9720be7b66d9a4b31a58dbf61
tree084c2ba72e4ffaf2dcc3d3c89f7ce32ab93d9827
parentc68dba202f54a4c9c68a8bb83d426bf8a00c99f8
s390/ptrace: race of single stepping vs signal delivery

The current single step code is racy in regard to concurrent delivery
of signals. If a signal is delivered after a PER program check occurred
but before the TIF_PER_TRAP bit has been checked in entry[64].S the code
clears TIF_PER_TRAP and then calls do_signal. This is wrong, if the
instruction completed (or has been suppressed) a SIGTRAP should be
delivered to the debugger in any case. Only if the instruction has been
nullified the SIGTRAP may not be send.

The new logic always sets TIF_PER_TRAP if the program check indicates PER
tracing but removes it again for all program checks that are nullifying.
The effect is that for each change in the PSW address we now get a
single SIGTRAP.

Reported-by: Andreas Arnez <arnez@linux.vnet.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
arch/s390/kernel/entry.S
arch/s390/kernel/entry64.S
arch/s390/kernel/signal.c
arch/s390/mm/fault.c