qemu/linux-user
Shivaprasad G Bhat 5d9f3ea081 linux-user: ppc64: don't use volatile register during safe_syscall
r11 is a volatile register on PPC as per calling conventions.
The safe_syscall code uses it to check if the signal_pending
is set during the safe_syscall. When a syscall is interrupted
on return from signal handling, the r11 might be corrupted
before we retry the syscall leading to a crash. The registers
r0-r13 are not to be used here as they have
volatile/designated/reserved usages.

Change the code to use r14 which is non-volatile.
Use SP+16 which is a slot for LR, for save/restore of previous value
of r14. SP+16 can be used, as LR is preserved across the syscall.

Steps to reproduce:
On PPC host, issue `qemu-x86_64 /usr/bin/cc -E -`
Attempt Ctrl-C, the issue is reproduced.

Reference:
https://refspecs.linuxfoundation.org/ELF/ppc64/PPC-elf64abi-1.9.html#REG
https://openpowerfoundation.org/wp-content/uploads/2016/03/ABI64BitOpenPOWERv1.1_16July2015_pub4.pdf

Signed-off-by: Shivaprasad G Bhat <sbhat@linux.vnet.ibm.com>
Tested-by: Richard Henderson <richard.henderson@linaro.org>
Tested-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Laurent Vivier <laurent@vivier.eu>
Message-Id: <153301568965.30312.10498134581068746871.stgit@dhcp-9-109-246-16>
Signed-off-by: Laurent Vivier <laurent@vivier.eu>
2018-07-31 09:57:43 +02:00
..
aarch64 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
alpha linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
arm linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
cris linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
generic linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
host linux-user: ppc64: don't use volatile register during safe_syscall 2018-07-31 09:57:43 +02:00
hppa linux-user/hppa: Fix typo in mknodat syscall 2018-06-11 14:45:44 +02:00
i386 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
m68k linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
microblaze linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
mips linux-user: move mips signal definitions to mips/target_signal.h 2018-06-04 01:30:44 +02:00
mips64 linux-user: move mips signal definitions to mips/target_signal.h 2018-06-04 01:30:44 +02:00
nios2 linux-user: Do not report "syscall not implemented" by default 2018-07-09 00:52:04 +02:00
openrisc linux-user: Fix struct sigaltstack for openrisc 2018-07-03 22:40:33 +09:00
ppc linux-user/ppc: Implement swapcontext syscall 2018-07-22 21:33:45 +02:00
riscv linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
s390x linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
sh4 linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
sparc linux-user: Report error message on stderr, rather than stdout 2018-07-09 00:52:50 +02:00
sparc64 linux-user/sparc64: Add inotify_rm_watch and tee syscalls 2018-06-11 14:47:45 +02:00
tilegx linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
x86_64 linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
xtensa linux-user: move generic signal definitions to generic/signal.h 2018-06-04 01:30:44 +02:00
cpu_loop-common.h linux-user: create a dummy per arch cpu_loop.c 2018-04-30 09:47:55 +02:00
elfload.c linux-user: fix ELF load alignment error 2018-07-22 21:32:50 +02:00
errno_defs.h linux-user: Handle ERFKILL and EHWPOISON 2017-01-22 18:14:10 -08:00
exit.c linux-user: add gcov support to preexit_cleanup 2018-07-05 15:59:41 +01:00
flat.h
flatload.c linux-user: Use is_error() to avoid warnings and make the code clearer 2018-06-11 14:40:11 +02:00
ioctls.h linux-user: Implement ioctl cmd TIOCGPTPEER 2018-02-18 18:52:32 +01:00
linux_loop.h linux-user: Add loop control ioctls 2016-07-19 15:22:33 +03:00
linuxload.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
m68k-sim.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
main.c linux-user: fix mmap_find_vma_reserved() 2018-07-15 16:01:31 +02:00
Makefile.objs linux-user: introduce preexit_cleanup 2018-07-05 15:59:41 +01:00
mmap.c linux-user/mmap.c: handle invalid len maps correctly 2018-07-31 09:57:25 +02:00
qemu.h linux-user/ppc: Implement swapcontext syscall 2018-07-22 21:33:45 +02:00
safe-syscall.S linux-user: Provide safe_syscall for fixing races between signals and syscalls 2016-05-27 14:49:51 +03:00
signal-common.h linux-user: introduce target_sigsp() and target_save_altstack() 2018-05-03 18:29:15 +02:00
signal.c linux-user: Implement signals for openrisc 2018-07-03 22:40:33 +09:00
socket.h linux-user: update ARCH_HAS_SOCKET_TYPES use 2018-05-25 10:10:55 +02:00
strace.c linux-user: fix O_TMPFILE handling 2017-10-16 16:00:56 +03:00
strace.list linux-user/strace: Improve recvmsg() output 2018-07-03 16:27:15 +02:00
syscall_defs.h linux-user: remove useless #if 2018-06-04 01:30:44 +02:00
syscall_types.h linux-user: Add FICLONE and FICLONERANGE ioctls 2017-02-16 15:29:30 +01:00
syscall.c linux-user/ppc: Implement swapcontext syscall 2018-07-22 21:33:45 +02:00
target_flat.h
trace-events trace-events: fix code style: print 0x before hex numbers 2017-08-01 12:13:07 +01:00
uaccess.c util: move declarations out of qemu-common.h 2016-03-22 22:20:17 +01:00
uname.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00
uname.h Clean up decorations and whitespace around header guards 2016-07-12 16:20:46 +02:00
vm86.c linux-user: Clean up includes 2016-01-29 15:07:22 +00:00