From: Chen Gang <cheng...@emindsoft.com.cn> The restorer needs the return code address which is frame->retcode, not frame itself.
Signed-off-by: Chen Gang <gang.chen.5...@gmail.com> --- linux-user/signal.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/linux-user/signal.c b/linux-user/signal.c index e487f9e..34367ce 100644 --- a/linux-user/signal.c +++ b/linux-user/signal.c @@ -5396,7 +5396,7 @@ static void setup_frame(int sig, struct target_sigaction *ka, &frame->retcode[1]); __put_user(INSN_CALLSYS, &frame->retcode[2]); /* imb() */ - r26 = frame_addr; + r26 = frame_addr + offsetof(struct target_sigframe, retcode); } unlock_user_struct(frame, frame_addr, 1); @@ -5455,7 +5455,7 @@ static void setup_rt_frame(int sig, struct target_sigaction *ka, &frame->retcode[1]); __put_user(INSN_CALLSYS, &frame->retcode[2]); /* imb(); */ - r26 = frame_addr; + r26 = frame_addr + offsetof(struct target_rt_sigframe, retcode); } if (err) { -- 1.9.3