1 #define	arch_sigreturn	i386_arch_sigreturn
2 #include "i386/arch_sigreturn.c"
3 #undef arch_sigreturn
4 
5 static void
arch_sigreturn(struct tcb * tcp)6 arch_sigreturn(struct tcb *tcp)
7 {
8 	if (current_personality == 1) {
9 		i386_arch_sigreturn(tcp);
10 		return;
11 	}
12 
13 	typedef struct {
14 		uint32_t flags, link, stack[3], pad;
15 		struct sigcontext mcontext;
16 	} ucontext_x32_header;
17 
18 #define	X86_64_SIGMASK_OFFSET	offsetof(struct ucontext, uc_sigmask)
19 #define	X32_SIGMASK_OFFSET	sizeof(ucontext_x32_header)
20 
21 	const kernel_ulong_t offset =
22 #ifdef X32
23 		X32_SIGMASK_OFFSET;
24 #else
25 		current_personality == 2 ? X32_SIGMASK_OFFSET :
26 					   X86_64_SIGMASK_OFFSET;
27 #endif
28 	const kernel_ulong_t addr = (kernel_ulong_t) *x86_64_rsp_ptr + offset;
29 	tprints("{mask=");
30 	print_sigset_addr_len(tcp, addr, NSIG_BYTES);
31 	tprints("}");
32 }
33