static void
arch_sigreturn(struct tcb *tcp)
{
- unsigned long addr = ppc_regs.gpr[1];
- struct sigcontext sc;
-
/* Skip dummy stack frame. */
+ const unsigned long addr = ppc_regs.gpr[1] + 64;
+
#ifdef POWERPC64
- if (current_personality == 0)
- addr += 128;
- else
+ /* 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
- addr += 64;
+
+ sigreturn_context sc;
if (umove(tcp, addr, &sc) < 0) {
tprintf("{mask=%#lx}", addr);
} else {
- unsigned long mask[NSIG_BYTES / sizeof(long)];
-#ifdef POWERPC64
- mask[0] = sc.oldmask | (sc._unused[3] << 32);
-#else
- mask[0] = sc.oldmask;
- mask[1] = sc._unused[3];
-#endif
+ const unsigned int mask[NSIG_BYTES / sizeof(int)] = {
+ sc.oldmask,
+ sc._unused[3]
+ };
+
tprintsigmask_addr("{mask=", mask);
tprints("}");
}