aboutsummaryrefslogtreecommitdiff
path: root/linux/powerpc/arch_sigreturn.c
blob: 5a5ca3aecf8467881fdadd9030cc1079be5d94a6 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
static void
arch_sigreturn(struct tcb *tcp)
{
	/* Skip dummy stack frame. */
	const unsigned long addr = ppc_regs.gpr[1] + 64;

#ifdef POWERPC64
	/* The only sigreturn on ppc64 is compat_sys_sigreturn. */
	typedef struct {
		unsigned int _unused[4];
		int signal;
		unsigned int handler;
		unsigned int oldmask;
		/* all the rest is irrelevant */
	} sigreturn_context;
#else
	typedef struct sigcontext sigreturn_context;
#endif

	sigreturn_context sc;

	if (umove(tcp, addr, &sc) < 0) {
		tprintf("{mask=%#lx}", addr);
	} else {
		const unsigned int mask[NSIG_BYTES / sizeof(int)] = {
			sc.oldmask,
			sc._unused[3]
		};

		tprintsigmask_addr("{mask=", mask);
		tprints("}");
	}
}