From: Peter Maydell Date: Thu, 5 Nov 2020 21:23:14 +0000 (+0000) Subject: linux-user/sparc: Don't zero high half of PC, NPC, PSR in sigreturn X-Git-Tag: v5.2.0-rc1~3^2 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=c3ab5df2f5c466d998917f2c707e206322063dcd;p=thirdparty%2Fqemu.git linux-user/sparc: Don't zero high half of PC, NPC, PSR in sigreturn The function do_sigreturn() tries to store the PC, NPC and PSR in uint32_t local variables, which implicitly drops the high half of these fields for 64-bit guests. The usual effect was that a guest which used signals would crash on return from a signal unless it was lucky enough to take it while the PC was in the low 4GB of the address space. In particular, Debian /bin/dash and /bin/bash would segfault after executing external commands. Use abi_ulong, which is the type these fields all have in the __siginfo_t struct. Signed-off-by: Peter Maydell Reviewed-by: Richard Henderson Message-Id: <20201105212314.9628-4-peter.maydell@linaro.org> Signed-off-by: Laurent Vivier --- diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c index c315704b389..d12adc8e6ff 100644 --- a/linux-user/sparc/signal.c +++ b/linux-user/sparc/signal.c @@ -247,7 +247,7 @@ long do_sigreturn(CPUSPARCState *env) { abi_ulong sf_addr; struct target_signal_frame *sf; - uint32_t up_psr, pc, npc; + abi_ulong up_psr, pc, npc; target_sigset_t set; sigset_t host_set; int i;