Skip to content

Commit b9188f9

Browse files
rth7680vivier
authored andcommitted
linux-user/sh4: Implement setup_sigtramp
Create and record the two signal trampolines. Use them when the guest does not use SA_RESTORER. Cc: Yoshinori Sato <[email protected]> Reviewed-by: Philippe Mathieu-Daudé <[email protected]> Signed-off-by: Richard Henderson <[email protected]> Message-Id: <[email protected]> Signed-off-by: Laurent Vivier <[email protected]>
1 parent 31330e6 commit b9188f9

File tree

2 files changed

+24
-18
lines changed

2 files changed

+24
-18
lines changed

linux-user/sh4/signal.c

Lines changed: 22 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ struct target_sigframe
5252
{
5353
struct target_sigcontext sc;
5454
target_ulong extramask[TARGET_NSIG_WORDS-1];
55-
uint16_t retcode[3];
5655
};
5756

5857

@@ -68,7 +67,6 @@ struct target_rt_sigframe
6867
{
6968
struct target_siginfo info;
7069
struct target_ucontext uc;
71-
uint16_t retcode[3];
7270
};
7371

7472

@@ -190,15 +188,9 @@ void setup_frame(int sig, struct target_sigaction *ka,
190188
/* Set up to return from userspace. If provided, use a stub
191189
already in userspace. */
192190
if (ka->sa_flags & TARGET_SA_RESTORER) {
193-
regs->pr = (unsigned long) ka->sa_restorer;
191+
regs->pr = ka->sa_restorer;
194192
} else {
195-
/* Generate return code (system call to sigreturn) */
196-
abi_ulong retcode_addr = frame_addr +
197-
offsetof(struct target_sigframe, retcode);
198-
__put_user(MOVW(2), &frame->retcode[0]);
199-
__put_user(TRAP_NOARG, &frame->retcode[1]);
200-
__put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
201-
regs->pr = (unsigned long) retcode_addr;
193+
regs->pr = default_sigreturn;
202194
}
203195

204196
/* Set up registers for signal handler */
@@ -248,15 +240,9 @@ void setup_rt_frame(int sig, struct target_sigaction *ka,
248240
/* Set up to return from userspace. If provided, use a stub
249241
already in userspace. */
250242
if (ka->sa_flags & TARGET_SA_RESTORER) {
251-
regs->pr = (unsigned long) ka->sa_restorer;
243+
regs->pr = ka->sa_restorer;
252244
} else {
253-
/* Generate return code (system call to sigreturn) */
254-
abi_ulong retcode_addr = frame_addr +
255-
offsetof(struct target_rt_sigframe, retcode);
256-
__put_user(MOVW(2), &frame->retcode[0]);
257-
__put_user(TRAP_NOARG, &frame->retcode[1]);
258-
__put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
259-
regs->pr = (unsigned long) retcode_addr;
245+
regs->pr = default_rt_sigreturn;
260246
}
261247

262248
/* Set up registers for signal handler */
@@ -334,3 +320,21 @@ long do_rt_sigreturn(CPUSH4State *regs)
334320
force_sig(TARGET_SIGSEGV);
335321
return -TARGET_QEMU_ESIGRETURN;
336322
}
323+
324+
void setup_sigtramp(abi_ulong sigtramp_page)
325+
{
326+
uint16_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 2 * 6, 0);
327+
assert(tramp != NULL);
328+
329+
default_sigreturn = sigtramp_page;
330+
__put_user(MOVW(2), &tramp[0]);
331+
__put_user(TRAP_NOARG, &tramp[1]);
332+
__put_user(TARGET_NR_sigreturn, &tramp[2]);
333+
334+
default_rt_sigreturn = sigtramp_page + 6;
335+
__put_user(MOVW(2), &tramp[3]);
336+
__put_user(TRAP_NOARG, &tramp[4]);
337+
__put_user(TARGET_NR_rt_sigreturn, &tramp[5]);
338+
339+
unlock_user(tramp, sigtramp_page, 2 * 6);
340+
}

linux-user/sh4/target_signal.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,6 @@ typedef struct target_sigaltstack {
2222
#include "../generic/signal.h"
2323

2424
#define TARGET_ARCH_HAS_SETUP_FRAME
25+
#define TARGET_ARCH_HAS_SIGTRAMP_PAGE 1
26+
2527
#endif /* SH4_TARGET_SIGNAL_H */

0 commit comments

Comments
 (0)