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)];
39 const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
40 if (umove(tcp, addr, &mask) < 0) {
41 tprintf("{mask=%#lx}", addr);
48 tprintsigmask_addr("{mask=", mask);
52 #elif defined I386 || defined X86_64 || defined X32
55 if (current_personality != 1) {
56 const unsigned long addr =
57 (unsigned long) *x86_64_rsp_ptr +
58 offsetof(struct ucontext, uc_sigmask);
60 print_sigset_addr_len(tcp, addr, NSIG / 8);
66 * On i386, sigcontext is followed on stack by struct fpstate
67 * and after it an additional u32 extramask which holds
68 * upper half of the mask.
71 uint32_t struct_sigcontext_padding1[20];
73 uint32_t struct_sigcontext_padding2;
74 uint32_t struct_fpstate_padding[156];
77 if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
78 tprintf("{mask=%#lx}", (unsigned long) *i386_esp_ptr);
80 uint32_t mask[2] = { frame.oldmask, frame.extramask };
81 tprintsigmask_addr("{mask=", mask);
87 /* offsetof(struct sigframe, sc) */
88 # define OFFSETOF_STRUCT_SIGFRAME_SC 0xA0
89 const long addr = *ia64_frame_ptr + 16 +
90 OFFSETOF_STRUCT_SIGFRAME_SC +
91 offsetof(struct sigcontext, sc_mask);
93 print_sigset_addr_len(tcp, addr, NSIG / 8);
96 #elif defined(POWERPC)
98 long esp = ppc_regs.gpr[1];
101 /* Skip dummy stack frame. */
103 if (current_personality == 0)
109 if (umove(tcp, esp, &sc) < 0) {
110 tprintf("{mask=%#lx}", esp);
112 unsigned long mask[NSIG / 8 / sizeof(long)];
114 mask[0] = sc.oldmask | (sc._unused[3] << 32);
116 mask[0] = sc.oldmask;
117 mask[1] = sc._unused[3];
119 tprintsigmask_addr("{mask=", mask);
126 if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
128 /* Fetch pointer to struct sigcontext. */
129 if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
131 unsigned long mask[NSIG / 8 / sizeof(long)];
132 /* Fetch first word of signal mask. */
133 if (umove(tcp, addr, &mask[0]) < 0)
135 /* Fetch remaining words of signal mask, located
136 immediately before. */
137 addr -= sizeof(mask) - sizeof(long);
138 if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
140 tprintsigmask_addr("{mask=", mask);
146 if (upeek(tcp->pid, REG_FP, &addr) < 0)
148 addr += offsetof(struct sigcontext, sc_mask);
150 print_sigset_addr_len(tcp, addr, NSIG / 8);
153 #elif defined(SPARC) || defined(SPARC64)
155 long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
157 struct pt_regs si_regs;
160 long insns[2] __attribute__ ((aligned (8)));
161 unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
164 if (umove(tcp, fp, &frame) < 0) {
165 tprintf("{mask=%#lx}", fp);
167 unsigned int mask[NSIG / 8 / sizeof(int)];
169 mask[0] = frame.si_mask;
170 memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
171 tprintsigmask_addr("{mask=", mask);
177 # if defined LINUX_MIPSO32
179 * offsetof(struct sigframe, sf_mask) ==
180 * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
182 const long addr = mips_REG_SP + 6 * 4 +
183 sizeof(struct sigcontext);
186 * This decodes rt_sigreturn.
187 * The 64-bit ABIs do not have sigreturn.
189 * offsetof(struct rt_sigframe, rs_uc) ==
190 * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
192 const long addr = mips_REG_SP + 6 * 4 + 128 +
193 offsetof(struct ucontext, uc_sigmask);
196 print_sigset_addr_len(tcp, addr, NSIG / 8);
199 #elif defined(CRISV10) || defined(CRISV32)
202 if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
203 perror_msg("sigreturn: PTRACE_GETREGS");
206 const long addr = regs[PT_USP] +
207 offsetof(struct sigcontext, oldmask);
209 print_sigset_addr_len(tcp, addr, NSIG / 8);
214 /* offset of ucontext in the kernel's sigframe structure */
215 # define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
216 const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
217 offsetof(struct ucontext, uc_sigmask);
219 print_sigset_addr_len(tcp, addr, NSIG / 8);
222 #elif defined(MICROBLAZE)
223 /* TODO: Verify that this is correct... */
226 /* Read r1, the stack pointer. */
227 if (upeek(tcp->pid, 1 * 4, &addr) < 0)
229 addr += offsetof(struct sigcontext, oldmask);
231 print_sigset_addr_len(tcp, addr, NSIG / 8);
235 # warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture