5 #if defined HAVE_ASM_SIGCONTEXT_H && !defined HAVE_STRUCT_SIGCONTEXT
6 # include <asm/sigcontext.h>
10 # warning NSIG is not defined, using 32
17 sys_sigreturn(struct tcb *tcp)
19 #if defined AARCH64 || defined ARM
21 # define SIZEOF_STRUCT_SIGINFO 128
22 # define SIZEOF_STRUCT_SIGCONTEXT (21 * 4)
23 # define OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK (5 * 4 + SIZEOF_STRUCT_SIGCONTEXT)
26 current_personality == 1 ?
27 (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO +
28 offsetof(struct ucontext, uc_sigmask)) :
31 OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
33 print_sigset_addr_len(tcp, addr, NSIG / 8);
36 #elif defined(S390) || defined(S390X)
38 long mask[NSIG / 8 / sizeof(long)];
40 const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
41 if (umove(tcp, addr, &mask) < 0) {
42 tprintf("%#lx", addr);
49 tprintsigmask_addr("", mask);
53 #elif defined I386 || defined X86_64 || defined X32
56 if (current_personality != 1) {
57 const unsigned long addr =
58 (unsigned long) *x86_64_rsp_ptr +
59 offsetof(struct ucontext, uc_sigmask);
61 print_sigset_addr_len(tcp, addr, NSIG / 8);
67 * On i386, sigcontext is followed on stack by struct fpstate
68 * and after it an additional u32 extramask which holds
69 * upper half of the mask.
72 uint32_t struct_sigcontext_padding1[20];
74 uint32_t struct_sigcontext_padding2;
75 uint32_t struct_fpstate_padding[156];
79 if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
80 tprintf("%#lx", (unsigned long) *i386_esp_ptr);
82 uint32_t mask[2] = { frame.oldmask, frame.extramask };
83 tprintsigmask_addr("", mask);
89 /* offsetof(struct sigframe, sc) */
90 # define OFFSETOF_STRUCT_SIGFRAME_SC 0xA0
91 const long addr = *ia64_frame_ptr + 16 +
92 OFFSETOF_STRUCT_SIGFRAME_SC +
93 offsetof(struct sigcontext, sc_mask);
95 print_sigset_addr_len(tcp, addr, NSIG / 8);
98 #elif defined(POWERPC)
100 long esp = ppc_regs.gpr[1];
101 struct sigcontext sc;
103 /* Skip dummy stack frame. */
105 if (current_personality == 0)
112 if (umove(tcp, esp, &sc) < 0) {
113 tprintf("%#lx", esp);
115 unsigned long mask[NSIG / 8 / sizeof(long)];
117 mask[0] = sc.oldmask | (sc._unused[3] << 32);
119 mask[0] = sc.oldmask;
120 mask[1] = sc._unused[3];
122 tprintsigmask_addr("", mask);
129 if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
131 /* Fetch pointer to struct sigcontext. */
132 if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
134 unsigned long mask[NSIG / 8 / sizeof(long)];
135 /* Fetch first word of signal mask. */
136 if (umove(tcp, addr, &mask[0]) < 0)
138 /* Fetch remaining words of signal mask, located
139 immediately before. */
140 addr -= sizeof(mask) - sizeof(long);
141 if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
144 tprintsigmask_addr("", mask);
150 if (upeek(tcp->pid, REG_FP, &addr) < 0)
152 addr += offsetof(struct sigcontext, sc_mask);
154 print_sigset_addr_len(tcp, addr, NSIG / 8);
157 #elif defined(SPARC) || defined(SPARC64)
159 long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
161 struct pt_regs si_regs;
164 long insns[2] __attribute__ ((aligned (8)));
165 unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
169 if (umove(tcp, fp, &frame) < 0) {
172 unsigned int mask[NSIG / 8 / sizeof(int)];
174 mask[0] = frame.si_mask;
175 memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
176 tprintsigmask_addr("", mask);
182 # if defined LINUX_MIPSO32
184 * offsetof(struct sigframe, sf_mask) ==
185 * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
187 const long addr = mips_REG_SP + 6 * 4 +
188 sizeof(struct sigcontext);
191 * This decodes rt_sigreturn.
192 * The 64-bit ABIs do not have sigreturn.
194 * offsetof(struct rt_sigframe, rs_uc) ==
195 * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
197 const long addr = mips_REG_SP + 6 * 4 + 128 +
198 offsetof(struct ucontext, uc_sigmask);
201 print_sigset_addr_len(tcp, addr, NSIG / 8);
204 #elif defined(CRISV10) || defined(CRISV32)
207 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
208 perror_msg("sigreturn: PTRACE_GETREGS");
211 const long addr = regs[PT_USP] +
212 offsetof(struct sigcontext, oldmask);
214 print_sigset_addr_len(tcp, addr, NSIG / 8);
219 /* offset of ucontext in the kernel's sigframe structure */
220 # define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
221 const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
222 offsetof(struct ucontext, uc_sigmask);
224 print_sigset_addr_len(tcp, addr, NSIG / 8);
227 #elif defined(MICROBLAZE)
228 /* TODO: Verify that this is correct... */
231 /* Read r1, the stack pointer. */
232 if (upeek(tcp->pid, 1 * 4, &addr) < 0)
234 addr += offsetof(struct sigcontext, oldmask);
236 print_sigset_addr_len(tcp, addr, NSIG / 8);
240 # warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture