{
struct target_sigcontext sc;
target_ulong extramask[TARGET_NSIG_WORDS-1];
- uint16_t retcode[3];
};
{
struct target_siginfo info;
struct target_ucontext uc;
- uint16_t retcode[3];
};
/* Set up to return from userspace. If provided, use a stub
already in userspace. */
if (ka->sa_flags & TARGET_SA_RESTORER) {
- regs->pr = (unsigned long) ka->sa_restorer;
+ regs->pr = ka->sa_restorer;
} else {
- /* Generate return code (system call to sigreturn) */
- abi_ulong retcode_addr = frame_addr +
- offsetof(struct target_sigframe, retcode);
- __put_user(MOVW(2), &frame->retcode[0]);
- __put_user(TRAP_NOARG, &frame->retcode[1]);
- __put_user((TARGET_NR_sigreturn), &frame->retcode[2]);
- regs->pr = (unsigned long) retcode_addr;
+ regs->pr = default_sigreturn;
}
/* Set up registers for signal handler */
/* Set up to return from userspace. If provided, use a stub
already in userspace. */
if (ka->sa_flags & TARGET_SA_RESTORER) {
- regs->pr = (unsigned long) ka->sa_restorer;
+ regs->pr = ka->sa_restorer;
} else {
- /* Generate return code (system call to sigreturn) */
- abi_ulong retcode_addr = frame_addr +
- offsetof(struct target_rt_sigframe, retcode);
- __put_user(MOVW(2), &frame->retcode[0]);
- __put_user(TRAP_NOARG, &frame->retcode[1]);
- __put_user((TARGET_NR_rt_sigreturn), &frame->retcode[2]);
- regs->pr = (unsigned long) retcode_addr;
+ regs->pr = default_rt_sigreturn;
}
/* Set up registers for signal handler */
force_sig(TARGET_SIGSEGV);
return -TARGET_QEMU_ESIGRETURN;
}
+
+void setup_sigtramp(abi_ulong sigtramp_page)
+{
+ uint16_t *tramp = lock_user(VERIFY_WRITE, sigtramp_page, 2 * 6, 0);
+ assert(tramp != NULL);
+
+ default_sigreturn = sigtramp_page;
+ __put_user(MOVW(2), &tramp[0]);
+ __put_user(TRAP_NOARG, &tramp[1]);
+ __put_user(TARGET_NR_sigreturn, &tramp[2]);
+
+ default_rt_sigreturn = sigtramp_page + 6;
+ __put_user(MOVW(2), &tramp[3]);
+ __put_user(TRAP_NOARG, &tramp[4]);
+ __put_user(TARGET_NR_rt_sigreturn, &tramp[5]);
+
+ unlock_user(tramp, sigtramp_page, 2 * 6);
+}