aboutsummaryrefslogtreecommitdiff
path: root/linux-user/sparc
diff options
context:
space:
mode:
authorPeter Maydell <peter.maydell@linaro.org>2020-11-05 21:23:14 +0000
committerLaurent Vivier <laurent@vivier.eu>2020-11-10 07:54:22 +0100
commitc3ab5df2f5c466d998917f2c707e206322063dcd (patch)
treebc045a48f8b8403d900ddcd2934366e03efab91a /linux-user/sparc
parent266b41582e0de8c30707614d6733ecf6485c7677 (diff)
downloadqemu-c3ab5df2f5c466d998917f2c707e206322063dcd.zip
qemu-c3ab5df2f5c466d998917f2c707e206322063dcd.tar.gz
qemu-c3ab5df2f5c466d998917f2c707e206322063dcd.tar.bz2
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 <peter.maydell@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20201105212314.9628-4-peter.maydell@linaro.org> Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Diffstat (limited to 'linux-user/sparc')
-rw-r--r--linux-user/sparc/signal.c2
1 files changed, 1 insertions, 1 deletions
diff --git a/linux-user/sparc/signal.c b/linux-user/sparc/signal.c
index c315704..d12adc8 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;