Message ID | 20201105212314.9628-4-peter.maydell@linaro.org |
---|---|
State | New |
Headers | show |
Series | linux-user: fix various sparc64 guest bugs | expand |
On 11/5/20 1:23 PM, Peter Maydell wrote: > 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> > --- > linux-user/sparc/signal.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~
Le 05/11/2020 à 22:23, Peter Maydell a écrit : > 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> > --- > linux-user/sparc/signal.c | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > 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; > Applied to my linux-user-for-5.2 branch. Thanks, Laurent
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;
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> --- linux-user/sparc/signal.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-)