-#endif /* HAVE_SIGACTION */
-
-int
-sys_sigreturn(struct tcb *tcp)
-{
-#if defined(ARM)
- if (entering(tcp)) {
- struct arm_sigcontext {
- unsigned long trap_no;
- unsigned long error_code;
- unsigned long oldmask;
- unsigned long arm_r0;
- unsigned long arm_r1;
- unsigned long arm_r2;
- unsigned long arm_r3;
- unsigned long arm_r4;
- unsigned long arm_r5;
- unsigned long arm_r6;
- unsigned long arm_r7;
- unsigned long arm_r8;
- unsigned long arm_r9;
- unsigned long arm_r10;
- unsigned long arm_fp;
- unsigned long arm_ip;
- unsigned long arm_sp;
- unsigned long arm_lr;
- unsigned long arm_pc;
- unsigned long arm_cpsr;
- unsigned long fault_address;
- };
- struct arm_ucontext {
- unsigned long uc_flags;
- unsigned long uc_link; /* struct ucontext* */
- /* The next three members comprise stack_t struct: */
- unsigned long ss_sp; /* void* */
- unsigned long ss_flags; /* int */
- unsigned long ss_size; /* size_t */
- struct arm_sigcontext sc;
- /* These two members are sigset_t: */
- unsigned long uc_sigmask[2];
- /* more fields follow, which we aren't interested in */
- };
- struct arm_ucontext uc;
- sigset_t sigm;
- if (umove(tcp, arm_regs.ARM_sp, &uc) < 0)
- return 0;
- /* Kernel fills out uc.sc.oldmask too when it sets up signal stack,
- * but for sigmask restore, sigreturn syscall uses uc.uc_sigmask instead.
- * tprints(sprintsigmask_long(") (mask ", uc.sc.oldmask));
- */
- sigemptyset(&sigm);
- memcpy(&sigm, uc.uc_sigmask, 8);
- tprints(sprintsigmask(") (mask ", &sigm));
- }
-#elif defined(S390) || defined(S390X)
- if (entering(tcp)) {
- long usp;
- struct sigcontext sc;
- if (upeek(tcp->pid, PT_GPR15, &usp) < 0)
- return 0;
- if (umove(tcp, usp + __SIGNAL_FRAMESIZE, &sc) < 0)
- return 0;
- tprints(sprintsigmask(") (mask ", (sigset_t *)&sc.oldmask[0]));
- }
-#elif defined(I386) || defined(X86_64)
-# if defined(X86_64)
- if (current_personality == 0) /* 64-bit */
- return 0;
-# endif
- if (entering(tcp)) {
- struct i386_sigcontext_struct {
- uint16_t gs, __gsh;
- uint16_t fs, __fsh;
- uint16_t es, __esh;
- uint16_t ds, __dsh;
- uint32_t edi;
- uint32_t esi;
- uint32_t ebp;
- uint32_t esp;
- uint32_t ebx;
- uint32_t edx;
- uint32_t ecx;
- uint32_t eax;
- uint32_t trapno;
- uint32_t err;
- uint32_t eip;
- uint16_t cs, __csh;
- uint32_t eflags;
- uint32_t esp_at_signal;
- uint16_t ss, __ssh;
- uint32_t i387;
- uint32_t oldmask;
- uint32_t cr2;
- };
- struct i386_fpstate {
- uint32_t cw;
- uint32_t sw;
- uint32_t tag;
- uint32_t ipoff;
- uint32_t cssel;
- uint32_t dataoff;
- uint32_t datasel;
- uint8_t st[8][10]; /* 8*10 bytes: FP regs */
- uint16_t status;
- uint16_t magic;
- uint32_t fxsr_env[6];
- uint32_t mxcsr;
- uint32_t reserved;
- uint8_t stx[8][16]; /* 8*16 bytes: FP regs, each padded to 16 bytes */
- uint8_t xmm[8][16]; /* 8 XMM regs */
- uint32_t padding1[44];
- uint32_t padding2[12]; /* union with struct _fpx_sw_bytes */
- };
- struct {
- struct i386_sigcontext_struct sc;
- struct i386_fpstate fp;
- uint32_t extramask[1];
- } signal_stack;
- /* On i386, sc is followed on stack by struct fpstate
- * and after it an additional u32 extramask[1] which holds
- * upper half of the mask.
- */
- union {
- sigset_t sig;
- uint32_t mask[2];
- } sigmask;
- if (umove(tcp, *i386_esp_ptr, &signal_stack) < 0)
- return 0;
- sigemptyset(&sigmask.sig);
- sigmask.mask[0] = signal_stack.sc.oldmask;
- sigmask.mask[1] = signal_stack.extramask[0];
- tprints(sprintsigmask(") (mask ", &sigmask.sig));
- }
-#elif defined(IA64)
- if (entering(tcp)) {
- struct sigcontext sc;
- long sp;
- sigset_t sigm;
- /* offset of sigcontext in the kernel's sigframe structure: */
-# define SIGFRAME_SC_OFFSET 0x90
- if (upeek(tcp->pid, PT_R12, &sp) < 0)
- return 0;
- if (umove(tcp, sp + 16 + SIGFRAME_SC_OFFSET, &sc) < 0)
- return 0;
- sigemptyset(&sigm);
- memcpy(&sigm, &sc.sc_mask, NSIG / 8);
- tprints(sprintsigmask(") (mask ", &sigm));
- }
-#elif defined(POWERPC)
- if (entering(tcp)) {
- long esp;
- struct sigcontext sc;
-
- esp = ppc_regs.gpr[1];
-
- /* Skip dummy stack frame. */
-#ifdef POWERPC64
- if (current_personality == 0)
- esp += 128;
- else
- esp += 64;
-#else
- esp += 64;
-#endif
- if (umove(tcp, esp, &sc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", sc.oldmask));
- }
-#elif defined(M68K)
- if (entering(tcp)) {
- long usp;
- struct sigcontext sc;
- if (upeek(tcp->pid, 4*PT_USP, &usp) < 0)
- return 0;
- if (umove(tcp, usp, &sc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", sc.sc_mask));
- }
-#elif defined(ALPHA)
- if (entering(tcp)) {
- long fp;
- struct sigcontext sc;
- if (upeek(tcp->pid, REG_FP, &fp) < 0)
- return 0;
- if (umove(tcp, fp, &sc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", sc.sc_mask));
- }
-#elif defined(SPARC) || defined(SPARC64)
- if (entering(tcp)) {
- long i1;
- m_siginfo_t si;
- i1 = sparc_regs.u_regs[U_REG_O1];
- if (umove(tcp, i1, &si) < 0) {
- perror_msg("sigreturn: umove");
- return 0;
- }
- tprints(sprintsigmask_long(") (mask ", si.si_mask));
- }
-#elif defined(LINUX_MIPSN32) || defined(LINUX_MIPSN64)
- /* This decodes rt_sigreturn. The 64-bit ABIs do not have
- sigreturn. */
- if (entering(tcp)) {
- long sp;
- struct ucontext uc;
- sigset_t sigm;
- if (upeek(tcp->pid, REG_SP, &sp) < 0)
- return 0;
- /* There are six words followed by a 128-byte siginfo. */
- sp = sp + 6 * 4 + 128;
- if (umove(tcp, sp, &uc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", *(long *) &uc.uc_sigmask));
- }
-#elif defined(MIPS)
- if (entering(tcp)) {
- long sp;
- struct pt_regs regs;
- m_siginfo_t si;
- if (ptrace(PTRACE_GETREGS, tcp->pid, (char *)®s, 0) < 0) {
- perror_msg("sigreturn: PTRACE_GETREGS");
- return 0;
- }
- sp = regs.regs[29];
- if (umove(tcp, sp, &si) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", si.si_mask));
- }
-#elif defined(CRISV10) || defined(CRISV32)
- if (entering(tcp)) {
- struct sigcontext sc;
- long regs[PT_MAX+1];
- if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
- perror_msg("sigreturn: PTRACE_GETREGS");
- return 0;
- }
- if (umove(tcp, regs[PT_USP], &sc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", sc.oldmask));
- }
-#elif defined(TILE)
- if (entering(tcp)) {
- struct ucontext uc;
- sigset_t sigm;
-
- /* offset of ucontext in the kernel's sigframe structure */
-# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
- if (umove(tcp, tile_regs.sp + SIGFRAME_UC_OFFSET, &uc) < 0)
- return 0;
- sigemptyset(&sigm);
- memcpy(&sigm, &uc.uc_sigmask, NSIG / 8);
- tprints(sprintsigmask(") (mask ", &sigm));
- }
-#elif defined(MICROBLAZE)
- /* TODO: Verify that this is correct... */
- if (entering(tcp)) {
- struct sigcontext sc;
- long sp;
- /* Read r1, the stack pointer. */
- if (upeek(tcp->pid, 1 * 4, &sp) < 0)
- return 0;
- if (umove(tcp, sp, &sc) < 0)
- return 0;
- tprints(sprintsigmask_long(") (mask ", sc.oldmask));
- }
-#elif defined(XTENSA)
- /* Xtensa only has rt_sys_sigreturn */
-#elif defined(ARC)
- /* ARC syscall ABI only supports rt_sys_sigreturn */
-#else
-# warning No sys_sigreturn() for this architecture
-# warning (no problem, just a reminder :-)
-#endif
- return 0;
-}
-
-int
-sys_siggetmask(struct tcb *tcp)