From: Andreas Krebbel <kreb...@linux.ibm.com> When setting up the pointer for the sigreturn stub in the return address register (r14) we currently use the host frame address instead of the guest frame address.
Note: This only caused problems if Qemu has been built with --disable-pie (as it is in distros nowadays). Otherwise guest_base defaults to 0 hiding the actual problem. Signed-off-by: Andreas Krebbel <kreb...@linux.ibm.com> Reviewed-by: Laurent Vivier <laur...@vivier.eu> Reviewed-by: Richard Henderson <richard.hender...@linaro.org> Message-Id: <20210324185128.63971-1-kreb...@linux.ibm.com> Signed-off-by: Laurent Vivier <laur...@vivier.eu> --- linux-user/s390x/signal.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/linux-user/s390x/signal.c b/linux-user/s390x/signal.c index ecfa2a14a982..7107c5fb5335 100644 --- a/linux-user/s390x/signal.c +++ b/linux-user/s390x/signal.c @@ -211,9 +211,10 @@ void setup_rt_frame(int sig, struct target_sigaction *ka, /* Set up to return from userspace. If provided, use a stub already in userspace. */ if (ka->sa_flags & TARGET_SA_RESTORER) { - env->regs[14] = (unsigned long) ka->sa_restorer | PSW_ADDR_AMODE; + env->regs[14] = ka->sa_restorer | PSW_ADDR_AMODE; } else { - env->regs[14] = (unsigned long) frame->retcode | PSW_ADDR_AMODE; + env->regs[14] = (frame_addr + offsetof(typeof(*frame), retcode)) + | PSW_ADDR_AMODE; __put_user(S390_SYSCALL_OPCODE | TARGET_NR_rt_sigreturn, (uint16_t *)(frame->retcode)); } -- 2.30.2