From: Dmitry V. Levin Date: Wed, 20 Sep 2017 00:15:02 +0000 (+0000) Subject: ppc64: fix sigreturn parser for ppc personality X-Git-Tag: v4.20~55 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=2d3a6978107504f06dcb03880fc79b9ed8555203;p=strace ppc64: fix sigreturn parser for ppc personality * linux/powerpc/arch_sigreturn.c (arch_sigreturn) [POWERPC64]: Rewrite. --- diff --git a/linux/powerpc/arch_sigreturn.c b/linux/powerpc/arch_sigreturn.c index 4f68648d..5a5ca3ae 100644 --- a/linux/powerpc/arch_sigreturn.c +++ b/linux/powerpc/arch_sigreturn.c @@ -1,27 +1,32 @@ 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("}"); }