]> granicus.if.org Git - strace/commitdiff
ppc, ppc64: fix sigreturn decoding
authorDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Mar 2015 16:01:47 +0000 (16:01 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Wed, 4 Mar 2015 16:06:05 +0000 (16:06 +0000)
* signal.c (sys_sigreturn) [POWERPC]: Fix decoding of upper 32 bits
of the sigmask.

signal.c

index 28f7713821108310a164aa72e401b69acd8b9496..0dc31ea2c02eeb500a8fd0ffaa1bebe03230198e 100644 (file)
--- a/signal.c
+++ b/signal.c
@@ -826,23 +826,33 @@ sys_sigreturn(struct tcb *tcp)
        }
 #elif defined(POWERPC)
        if (entering(tcp)) {
-               long esp;
+               long esp = ppc_regs.gpr[1];
                struct sigcontext sc;
 
-               esp = ppc_regs.gpr[1];
-
                /* Skip dummy stack frame. */
 #ifdef POWERPC64
                if (current_personality == 0)
                        esp += 128;
                else
+#endif
                        esp += 64;
-#else
-               esp += 64;
+
+               tprints(") (mask ");
+               if (umove(tcp, esp, &sc) < 0) {
+                       tprintf("%#lx", esp);
+               } else {
+                       unsigned long mask[NSIG / 8 / sizeof(long)];
+#ifdef POWERPC64
+                       if (current_personality == 0)
+                               mask[0] = sc.oldmask | (sc._unused[3] << 32);
+                       else
 #endif
-               if (umove(tcp, esp, &sc) < 0)
-                       return 0;
-               tprintsigmask_val(") (mask ", sc.oldmask);
+                       {
+                               mask[0] = sc.oldmask;
+                               mask[1] = sc._unused[3];
+                       }
+                       tprintsigmask_val("", mask);
+               }
        }
 #elif defined(M68K)
        if (entering(tcp)) {