]> granicus.if.org Git - strace/commitdiff
ppc64: fix sigreturn parser for ppc personality
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 20 Sep 2017 00:15:02 +0000 (00:15 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 20 Sep 2017 00:15:02 +0000 (00:15 +0000)
* linux/powerpc/arch_sigreturn.c (arch_sigreturn) [POWERPC64]: Rewrite.

linux/powerpc/arch_sigreturn.c

index 4f68648d66ad1580af2e8ff210fa76dcf50ca13b..5a5ca3aecf8467881fdadd9030cc1079be5d94a6 100644 (file)
@@ -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("}");
        }