]> granicus.if.org Git - strace/commitdiff
sigreturn.c: split arch specific code into separate arch files
authorDmitry V. Levin <ldv@altlinux.org>
Mon, 23 Mar 2015 21:16:07 +0000 (21:16 +0000)
committerDmitry V. Levin <ldv@altlinux.org>
Mon, 23 Mar 2015 22:25:05 +0000 (22:25 +0000)
Split code that use arch-specific registers to separate arch files.

* sigreturn.c (sys_sigreturn): Move arch-specific code
to linux/*/arch_sigreturn.c, include "arch_sigreturn.c".
* linux/arch_sigreturn.c: New file.
* Makefile.am (EXTRA_DIST): Add linux/arch_sigreturn.c
and linux/*/arch_sigreturn.c files.

22 files changed:
Makefile.am
linux/aarch64/arch_sigreturn.c [new file with mode: 0644]
linux/alpha/arch_sigreturn.c [new file with mode: 0644]
linux/arch_sigreturn.c [new file with mode: 0644]
linux/arm/arch_sigreturn.c [new file with mode: 0644]
linux/crisv10/arch_sigreturn.c [new file with mode: 0644]
linux/crisv32/arch_sigreturn.c [new file with mode: 0644]
linux/i386/arch_sigreturn.c [new file with mode: 0644]
linux/ia64/arch_sigreturn.c [new file with mode: 0644]
linux/m68k/arch_sigreturn.c [new file with mode: 0644]
linux/microblaze/arch_sigreturn.c [new file with mode: 0644]
linux/mips/arch_sigreturn.c [new file with mode: 0644]
linux/powerpc/arch_sigreturn.c [new file with mode: 0644]
linux/powerpc64/arch_sigreturn.c [new file with mode: 0644]
linux/s390/arch_sigreturn.c [new file with mode: 0644]
linux/s390x/arch_sigreturn.c [new file with mode: 0644]
linux/sparc/arch_sigreturn.c [new file with mode: 0644]
linux/sparc64/arch_sigreturn.c [new file with mode: 0644]
linux/tile/arch_sigreturn.c [new file with mode: 0644]
linux/x32/arch_sigreturn.c [new file with mode: 0644]
linux/x86_64/arch_sigreturn.c [new file with mode: 0644]
sigreturn.c

index 27b6a127b64172dcbe359707e084f2f3d2ae10c8..04506bce1cb1cd2bc5788cb88f27cd774811804d 100644 (file)
@@ -166,6 +166,7 @@ EXTRA_DIST =                                \
        linux/64/syscallent.h           \
        linux/aarch64/arch_regs.c       \
        linux/aarch64/arch_regs.h       \
+       linux/aarch64/arch_sigreturn.c  \
        linux/aarch64/errnoent1.h       \
        linux/aarch64/get_error.c       \
        linux/aarch64/get_scno.c        \
@@ -181,6 +182,7 @@ EXTRA_DIST =                                \
        linux/alpha/arch_getrval2.c     \
        linux/alpha/arch_regs.c         \
        linux/alpha/arch_regs.h         \
+       linux/alpha/arch_sigreturn.c    \
        linux/alpha/errnoent.h          \
        linux/alpha/get_error.c         \
        linux/alpha/get_scno.c          \
@@ -201,8 +203,10 @@ EXTRA_DIST =                               \
        linux/arc/print_pc.c            \
        linux/arc/syscallent.h          \
        linux/arch_regs.h               \
+       linux/arch_sigreturn.c          \
        linux/arm/arch_regs.c           \
        linux/arm/arch_regs.h           \
+       linux/arm/arch_sigreturn.c      \
        linux/arm/get_error.c           \
        linux/arm/get_scno.c            \
        linux/arm/get_syscall_args.c    \
@@ -231,6 +235,7 @@ EXTRA_DIST =                                \
        linux/bfin/syscallent.h         \
        linux/bfin/userent.h            \
        linux/crisv10/arch_regs.c       \
+       linux/crisv10/arch_sigreturn.c  \
        linux/crisv10/get_error.c       \
        linux/crisv10/get_scno.c        \
        linux/crisv10/get_syscall_args.c        \
@@ -238,6 +243,7 @@ EXTRA_DIST =                                \
        linux/crisv10/print_pc.c        \
        linux/crisv10/userent.h         \
        linux/crisv32/arch_regs.c       \
+       linux/crisv32/arch_sigreturn.c  \
        linux/crisv32/get_error.c       \
        linux/crisv32/get_scno.c        \
        linux/crisv32/get_syscall_args.c        \
@@ -260,6 +266,7 @@ EXTRA_DIST =                                \
        linux/hppa/syscallent.h         \
        linux/i386/arch_regs.c          \
        linux/i386/arch_regs.h          \
+       linux/i386/arch_sigreturn.c     \
        linux/i386/get_error.c          \
        linux/i386/get_scno.c           \
        linux/i386/get_syscall_args.c   \
@@ -272,6 +279,7 @@ EXTRA_DIST =                                \
        linux/ia64/arch_getrval2.c      \
        linux/ia64/arch_regs.c          \
        linux/ia64/arch_regs.h          \
+       linux/ia64/arch_sigreturn.c     \
        linux/ia64/get_error.c          \
        linux/ia64/get_scno.c           \
        linux/ia64/get_syscall_args.c   \
@@ -282,6 +290,7 @@ EXTRA_DIST =                                \
        linux/ia64/userent.h            \
        linux/inet_diag.h               \
        linux/m68k/arch_regs.c          \
+       linux/m68k/arch_sigreturn.c     \
        linux/m68k/get_error.c          \
        linux/m68k/get_scno.c           \
        linux/m68k/get_syscall_args.c   \
@@ -300,6 +309,7 @@ EXTRA_DIST =                                \
        linux/metag/print_pc.c          \
        linux/metag/syscallent.h        \
        linux/microblaze/arch_regs.c    \
+       linux/microblaze/arch_sigreturn.c       \
        linux/microblaze/get_error.c    \
        linux/microblaze/get_scno.c     \
        linux/microblaze/get_syscall_args.c     \
@@ -311,6 +321,7 @@ EXTRA_DIST =                                \
        linux/microblaze/userent.h      \
        linux/mips/arch_regs.c          \
        linux/mips/arch_regs.h          \
+       linux/mips/arch_sigreturn.c     \
        linux/mips/errnoent.h           \
        linux/mips/genstub.sh           \
        linux/mips/get_error.c          \
@@ -339,6 +350,7 @@ EXTRA_DIST =                                \
        linux/personality.h             \
        linux/powerpc/arch_regs.c       \
        linux/powerpc/arch_regs.h       \
+       linux/powerpc/arch_sigreturn.c  \
        linux/powerpc/errnoent.h        \
        linux/powerpc/get_error.c       \
        linux/powerpc/get_scno.c        \
@@ -351,6 +363,7 @@ EXTRA_DIST =                                \
        linux/powerpc/userent.h         \
        linux/powerpc64/arch_regs.c     \
        linux/powerpc64/arch_regs.h     \
+       linux/powerpc64/arch_sigreturn.c        \
        linux/powerpc64/errnoent.h      \
        linux/powerpc64/errnoent1.h     \
        linux/powerpc64/get_error.c     \
@@ -369,6 +382,7 @@ EXTRA_DIST =                                \
        linux/ptp_clock.h               \
        linux/s390/arch_regs.c          \
        linux/s390/arch_regs.h          \
+       linux/s390/arch_sigreturn.c     \
        linux/s390/get_error.c          \
        linux/s390/get_scno.c           \
        linux/s390/get_syscall_args.c   \
@@ -381,6 +395,7 @@ EXTRA_DIST =                                \
        linux/s390/userent1.h           \
        linux/s390x/arch_regs.c         \
        linux/s390x/arch_regs.h         \
+       linux/s390x/arch_sigreturn.c    \
        linux/s390x/get_error.c         \
        linux/s390x/get_scno.c          \
        linux/s390x/get_syscall_args.c  \
@@ -417,6 +432,7 @@ EXTRA_DIST =                                \
        linux/sparc/arch_getrval2.c     \
        linux/sparc/arch_regs.c         \
        linux/sparc/arch_regs.h         \
+       linux/sparc/arch_sigreturn.c    \
        linux/sparc/dummy2.h            \
        linux/sparc/errnoent.h          \
        linux/sparc/errnoent1.h         \
@@ -437,6 +453,7 @@ EXTRA_DIST =                                \
        linux/sparc64/arch_getrval2.c   \
        linux/sparc64/arch_regs.c       \
        linux/sparc64/arch_regs.h       \
+       linux/sparc64/arch_sigreturn.c  \
        linux/sparc64/dummy2.h          \
        linux/sparc64/errnoent.h        \
        linux/sparc64/errnoent1.h       \
@@ -462,6 +479,7 @@ EXTRA_DIST =                                \
        linux/syscall.h                 \
        linux/tile/arch_regs.c          \
        linux/tile/arch_regs.h          \
+       linux/tile/arch_sigreturn.c     \
        linux/tile/errnoent1.h          \
        linux/tile/get_error.c          \
        linux/tile/get_scno.c           \
@@ -481,6 +499,7 @@ EXTRA_DIST =                                \
        linux/userent0.h                \
        linux/x32/arch_regs.c           \
        linux/x32/arch_regs.h           \
+       linux/x32/arch_sigreturn.c      \
        linux/x32/errnoent1.h           \
        linux/x32/get_error.c           \
        linux/x32/get_scno.c            \
@@ -496,6 +515,7 @@ EXTRA_DIST =                                \
        linux/x32/userent.h             \
        linux/x86_64/arch_regs.c        \
        linux/x86_64/arch_regs.h        \
+       linux/x86_64/arch_sigreturn.c   \
        linux/x86_64/errnoent1.h        \
        linux/x86_64/errnoent2.h        \
        linux/x86_64/gentab.pl          \
diff --git a/linux/aarch64/arch_sigreturn.c b/linux/aarch64/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..f0e29c2
--- /dev/null
@@ -0,0 +1 @@
+#include "arm/arch_sigreturn.c"
diff --git a/linux/alpha/arch_sigreturn.c b/linux/alpha/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..278bae1
--- /dev/null
@@ -0,0 +1,9 @@
+long addr;
+
+if (upeek(tcp->pid, REG_FP, &addr) < 0)
+       return 0;
+addr += offsetof(struct sigcontext, sc_mask);
+
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/arch_sigreturn.c b/linux/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..80ec984
--- /dev/null
@@ -0,0 +1 @@
+#warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture
diff --git a/linux/arm/arch_sigreturn.c b/linux/arm/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..046e19a
--- /dev/null
@@ -0,0 +1,15 @@
+#define SIZEOF_STRUCT_SIGINFO 128
+#define SIZEOF_STRUCT_SIGCONTEXT (21 * 4)
+#define OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK (5 * 4 + SIZEOF_STRUCT_SIGCONTEXT)
+
+const long addr =
+#ifdef AARCH64
+       current_personality == 1 ?
+               (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO +
+                offsetof(struct ucontext, uc_sigmask)) :
+#endif
+               (*arm_sp_ptr +
+                OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/crisv10/arch_sigreturn.c b/linux/crisv10/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..b9e6a24
--- /dev/null
@@ -0,0 +1,11 @@
+long regs[PT_MAX + 1];
+
+if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
+       perror_msg("sigreturn: PTRACE_GETREGS");
+       return 0;
+}
+const long addr = regs[PT_USP] + offsetof(struct sigcontext, oldmask);
+
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/crisv32/arch_sigreturn.c b/linux/crisv32/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..6c0fc03
--- /dev/null
@@ -0,0 +1 @@
+#include "crisv10/arch_sigreturn.c"
diff --git a/linux/i386/arch_sigreturn.c b/linux/i386/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..e726bf1
--- /dev/null
@@ -0,0 +1,20 @@
+/*
+ * On i386, sigcontext is followed on stack by struct fpstate
+ * and after it an additional u32 extramask which holds
+ * upper half of the mask.
+ */
+struct {
+       uint32_t struct_sigcontext_padding1[20];
+       uint32_t oldmask;
+       uint32_t struct_sigcontext_padding2;
+       uint32_t struct_fpstate_padding[156];
+       uint32_t extramask;
+} frame;
+
+if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
+       tprintf("{mask=%#lx}", (unsigned long) *i386_esp_ptr);
+} else {
+       uint32_t mask[2] = { frame.oldmask, frame.extramask };
+       tprintsigmask_addr("{mask=", mask);
+       tprints("}");
+}
diff --git a/linux/ia64/arch_sigreturn.c b/linux/ia64/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..94e89cf
--- /dev/null
@@ -0,0 +1,8 @@
+/* offsetof(struct sigframe, sc) */
+#define OFFSETOF_STRUCT_SIGFRAME_SC    0xA0
+const long addr = *ia64_frame_ptr + 16 +
+                 OFFSETOF_STRUCT_SIGFRAME_SC +
+                 offsetof(struct sigcontext, sc_mask);
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/m68k/arch_sigreturn.c b/linux/m68k/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..c3d3ea1
--- /dev/null
@@ -0,0 +1,20 @@
+long addr;
+
+if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
+       return 0;
+/* Fetch pointer to struct sigcontext.  */
+if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
+       return 0;
+
+unsigned long mask[NSIG / 8 / sizeof(long)];
+/* Fetch first word of signal mask.  */
+if (umove(tcp, addr, &mask[0]) < 0)
+       return 0;
+
+/* Fetch remaining words of signal mask, located immediately before.  */
+addr -= sizeof(mask) - sizeof(long);
+if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
+       return 0;
+
+tprintsigmask_addr("{mask=", mask);
+tprints("}");
diff --git a/linux/microblaze/arch_sigreturn.c b/linux/microblaze/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..8e2e7b8
--- /dev/null
@@ -0,0 +1,12 @@
+/* TODO: Verify that this is correct...  */
+
+long addr;
+
+/* Read r1, the stack pointer.  */
+if (upeek(tcp->pid, 1 * 4, &addr) < 0)
+       return 0;
+addr += offsetof(struct sigcontext, oldmask);
+
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/mips/arch_sigreturn.c b/linux/mips/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..687f871
--- /dev/null
@@ -0,0 +1,22 @@
+#if defined LINUX_MIPSO32
+/*
+ * offsetof(struct sigframe, sf_mask) ==
+ * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
+ */
+const long addr = mips_REG_SP + 6 * 4 +
+                 sizeof(struct sigcontext);
+#else
+/*
+ * This decodes rt_sigreturn.
+ * The 64-bit ABIs do not have sigreturn.
+ *
+ * offsetof(struct rt_sigframe, rs_uc) ==
+ * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
+ */
+const long addr = mips_REG_SP + 6 * 4 + 128 +
+                 offsetof(struct ucontext, uc_sigmask);
+#endif
+
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/powerpc/arch_sigreturn.c b/linux/powerpc/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..bc4802a
--- /dev/null
@@ -0,0 +1,24 @@
+long esp = ppc_regs.gpr[1];
+struct sigcontext sc;
+
+/* Skip dummy stack frame. */
+#ifdef POWERPC64
+if (current_personality == 0)
+       esp += 128;
+else
+#endif
+       esp += 64;
+
+if (umove(tcp, esp, &sc) < 0) {
+       tprintf("{mask=%#lx}", esp);
+} else {
+       unsigned long mask[NSIG / 8 / sizeof(long)];
+#ifdef POWERPC64
+       mask[0] = sc.oldmask | (sc._unused[3] << 32);
+#else
+       mask[0] = sc.oldmask;
+       mask[1] = sc._unused[3];
+#endif
+       tprintsigmask_addr("{mask=", mask);
+       tprints("}");
+}
diff --git a/linux/powerpc64/arch_sigreturn.c b/linux/powerpc64/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..316022f
--- /dev/null
@@ -0,0 +1 @@
+#include "powerpc/arch_sigreturn.c"
diff --git a/linux/s390/arch_sigreturn.c b/linux/s390/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..43afd95
--- /dev/null
@@ -0,0 +1,14 @@
+long mask[NSIG / 8 / sizeof(long)];
+const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
+
+if (umove(tcp, addr, &mask) < 0) {
+       tprintf("{mask=%#lx}", addr);
+} else {
+#ifdef S390
+       long v = mask[0];
+       mask[0] = mask[1];
+       mask[1] = v;
+#endif
+       tprintsigmask_addr("{mask=", mask);
+       tprints("}");
+}
diff --git a/linux/s390x/arch_sigreturn.c b/linux/s390x/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..679a395
--- /dev/null
@@ -0,0 +1 @@
+#include "s390/arch_sigreturn.c"
diff --git a/linux/sparc/arch_sigreturn.c b/linux/sparc/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..9301431
--- /dev/null
@@ -0,0 +1,19 @@
+long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
+struct {
+       struct pt_regs si_regs;
+       int si_mask;
+       void *fpu_save;
+       long insns[2] __attribute__ ((aligned (8)));
+       unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
+} frame;
+
+if (umove(tcp, fp, &frame) < 0) {
+       tprintf("{mask=%#lx}", fp);
+} else {
+       unsigned int mask[NSIG / 8 / sizeof(int)];
+
+       mask[0] = frame.si_mask;
+       memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
+       tprintsigmask_addr("{mask=", mask);
+       tprints("}");
+}
diff --git a/linux/sparc64/arch_sigreturn.c b/linux/sparc64/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..aeec981
--- /dev/null
@@ -0,0 +1 @@
+#include "sparc/arch_sigreturn.c"
diff --git a/linux/tile/arch_sigreturn.c b/linux/tile/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..99e2bf8
--- /dev/null
@@ -0,0 +1,8 @@
+/* offset of ucontext in the kernel's sigframe structure */
+# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
+const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
+                 offsetof(struct ucontext, uc_sigmask);
+
+tprints("{mask=");
+print_sigset_addr_len(tcp, addr, NSIG / 8);
+tprints("}");
diff --git a/linux/x32/arch_sigreturn.c b/linux/x32/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..9a778fc
--- /dev/null
@@ -0,0 +1 @@
+#include "x86_64/arch_sigreturn.c"
diff --git a/linux/x86_64/arch_sigreturn.c b/linux/x86_64/arch_sigreturn.c
new file mode 100644 (file)
index 0000000..62aeca5
--- /dev/null
@@ -0,0 +1,10 @@
+if (current_personality != 1) {
+       const unsigned long addr =
+               (unsigned long) *x86_64_rsp_ptr +
+               offsetof(struct ucontext, uc_sigmask);
+       tprints("{mask=");
+       print_sigset_addr_len(tcp, addr, NSIG / 8);
+       tprints("}");
+       return 0;
+}
+#include "i386/arch_sigreturn.c"
index f32c206498ccfd72fd013e4b3d81e5c5a86079d5..b3fc038ba2d58e146f14323f75907d751e7c6974 100644 (file)
 int
 sys_sigreturn(struct tcb *tcp)
 {
-#if defined AARCH64 || defined ARM
        if (entering(tcp)) {
-# define SIZEOF_STRUCT_SIGINFO 128
-# define SIZEOF_STRUCT_SIGCONTEXT (21 * 4)
-# define OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK (5 * 4 + SIZEOF_STRUCT_SIGCONTEXT)
-               const long addr =
-# ifdef AARCH64
-                       current_personality == 1 ?
-                               (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO +
-                                offsetof(struct ucontext, uc_sigmask)) :
-# endif
-                               (*arm_sp_ptr +
-                                OFFSETOF_STRUCT_UCONTEXT_UC_SIGMASK);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
+#include "arch_sigreturn.c"
        }
-#elif defined(S390) || defined(S390X)
-       if (entering(tcp)) {
-               long mask[NSIG / 8 / sizeof(long)];
-               const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
-               if (umove(tcp, addr, &mask) < 0) {
-                       tprintf("{mask=%#lx}", addr);
-               } else {
-# ifdef S390
-                       long v = mask[0];
-                       mask[0] = mask[1];
-                       mask[1] = v;
-# endif
-                       tprintsigmask_addr("{mask=", mask);
-                       tprints("}");
-               }
-       }
-#elif defined I386 || defined X86_64 || defined X32
-       if (entering(tcp)) {
-# ifndef I386
-               if (current_personality != 1) {
-                       const unsigned long addr =
-                               (unsigned long) *x86_64_rsp_ptr +
-                               offsetof(struct ucontext, uc_sigmask);
-                       tprints("{mask=");
-                       print_sigset_addr_len(tcp, addr, NSIG / 8);
-                       tprints("}");
-                       return 0;
-               }
-# endif
-               /*
-                * On i386, sigcontext is followed on stack by struct fpstate
-                * and after it an additional u32 extramask which holds
-                * upper half of the mask.
-                */
-               struct {
-                       uint32_t struct_sigcontext_padding1[20];
-                       uint32_t oldmask;
-                       uint32_t struct_sigcontext_padding2;
-                       uint32_t struct_fpstate_padding[156];
-                       uint32_t extramask;
-               } frame;
-               if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
-                       tprintf("{mask=%#lx}", (unsigned long) *i386_esp_ptr);
-               } else {
-                       uint32_t mask[2] = { frame.oldmask, frame.extramask };
-                       tprintsigmask_addr("{mask=", mask);
-                       tprints("}");
-               }
-       }
-#elif defined(IA64)
-       if (entering(tcp)) {
-               /* offsetof(struct sigframe, sc) */
-#              define OFFSETOF_STRUCT_SIGFRAME_SC      0xA0
-               const long addr = *ia64_frame_ptr + 16 +
-                                 OFFSETOF_STRUCT_SIGFRAME_SC +
-                                 offsetof(struct sigcontext, sc_mask);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#elif defined(POWERPC)
-       if (entering(tcp)) {
-               long esp = ppc_regs.gpr[1];
-               struct sigcontext sc;
-
-               /* Skip dummy stack frame. */
-#ifdef POWERPC64
-               if (current_personality == 0)
-                       esp += 128;
-               else
-#endif
-                       esp += 64;
-
-               if (umove(tcp, esp, &sc) < 0) {
-                       tprintf("{mask=%#lx}", esp);
-               } else {
-                       unsigned long mask[NSIG / 8 / sizeof(long)];
-#ifdef POWERPC64
-                       mask[0] = sc.oldmask | (sc._unused[3] << 32);
-#else
-                       mask[0] = sc.oldmask;
-                       mask[1] = sc._unused[3];
-#endif
-                       tprintsigmask_addr("{mask=", mask);
-                       tprints("}");
-               }
-       }
-#elif defined(M68K)
-       if (entering(tcp)) {
-               long addr;
-               if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
-                       return 0;
-               /* Fetch pointer to struct sigcontext.  */
-               if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0)
-                       return 0;
-               unsigned long mask[NSIG / 8 / sizeof(long)];
-               /* Fetch first word of signal mask.  */
-               if (umove(tcp, addr, &mask[0]) < 0)
-                       return 0;
-               /* Fetch remaining words of signal mask, located
-                  immediately before.  */
-               addr -= sizeof(mask) - sizeof(long);
-               if (umoven(tcp, addr, sizeof(mask) - sizeof(long), &mask[1]) < 0)
-                       return 0;
-               tprintsigmask_addr("{mask=", mask);
-               tprints("}");
-       }
-#elif defined(ALPHA)
-       if (entering(tcp)) {
-               long addr;
-               if (upeek(tcp->pid, REG_FP, &addr) < 0)
-                       return 0;
-               addr += offsetof(struct sigcontext, sc_mask);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#elif defined(SPARC) || defined(SPARC64)
-       if (entering(tcp)) {
-               long fp = sparc_regs.u_regs[U_REG_FP] + sizeof(struct sparc_stackf);
-               struct {
-                       struct pt_regs si_regs;
-                       int si_mask;
-                       void *fpu_save;
-                       long insns[2] __attribute__ ((aligned (8)));
-                       unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
-               } frame;
-
-               if (umove(tcp, fp, &frame) < 0) {
-                       tprintf("{mask=%#lx}", fp);
-               } else {
-                       unsigned int mask[NSIG / 8 / sizeof(int)];
-
-                       mask[0] = frame.si_mask;
-                       memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
-                       tprintsigmask_addr("{mask=", mask);
-                       tprints("}");
-               }
-       }
-#elif defined MIPS
-       if (entering(tcp)) {
-# if defined LINUX_MIPSO32
-               /*
-                * offsetof(struct sigframe, sf_mask) ==
-                * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct sigcontext)
-                */
-               const long addr = mips_REG_SP + 6 * 4 +
-                                 sizeof(struct sigcontext);
-# else
-               /*
-                * This decodes rt_sigreturn.
-                * The 64-bit ABIs do not have sigreturn.
-                *
-                * offsetof(struct rt_sigframe, rs_uc) ==
-                * sizeof(sf_ass) + sizeof(sf_pad) + sizeof(struct siginfo)
-                */
-               const long addr = mips_REG_SP + 6 * 4 + 128 +
-                                 offsetof(struct ucontext, uc_sigmask);
-# endif
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#elif defined(CRISV10) || defined(CRISV32)
-       if (entering(tcp)) {
-               long regs[PT_MAX+1];
-               if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) {
-                       perror_msg("sigreturn: PTRACE_GETREGS");
-                       return 0;
-               }
-               const long addr = regs[PT_USP] +
-                       offsetof(struct sigcontext, oldmask);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#elif defined(TILE)
-       if (entering(tcp)) {
-               /* offset of ucontext in the kernel's sigframe structure */
-# define SIGFRAME_UC_OFFSET C_ABI_SAVE_AREA_SIZE + sizeof(siginfo_t)
-               const long addr = tile_regs.sp + SIGFRAME_UC_OFFSET +
-                                 offsetof(struct ucontext, uc_sigmask);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#elif defined(MICROBLAZE)
-       /* TODO: Verify that this is correct...  */
-       if (entering(tcp)) {
-               long addr;
-               /* Read r1, the stack pointer.  */
-               if (upeek(tcp->pid, 1 * 4, &addr) < 0)
-                       return 0;
-               addr += offsetof(struct sigcontext, oldmask);
-               tprints("{mask=");
-               print_sigset_addr_len(tcp, addr, NSIG / 8);
-               tprints("}");
-       }
-#else
-# warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture
-#endif
        return 0;
 }