Move sigreturn/rt_sigreturn parser to a separate file

* sigreturn.c: New file.
* Makefile.am (strace_SOURCES): Add it.
* defs.h (sprintsigmask_n): New prototype.
(tprintsigmask_addr): New macro.
* signal.c (sprintsigmask_n): Make global.
(tprintsigmask_addr): Remove.
(sys_sigreturn): Move to sigreturn.c.
diff --git a/signal.c b/signal.c
index 7a915da..710fb19 100644
--- a/signal.c
+++ b/signal.c
@@ -32,41 +32,12 @@
  */
 
 #include "defs.h"
-#include <fcntl.h>
-
-#include "regs.h"
-#include "ptrace.h"
-
-#if defined(SPARC) || defined(SPARC64) || defined(MIPS)
-typedef struct {
-	struct pt_regs		si_regs;
-	int			si_mask;
-} m_siginfo_t;
-#elif defined HAVE_ASM_SIGCONTEXT_H
-# if !defined(IA64) && !defined(X86_64) && !defined(X32)
-#  include <asm/sigcontext.h>
-# endif
-#else /* !HAVE_ASM_SIGCONTEXT_H */
-# if defined M68K && !defined HAVE_STRUCT_SIGCONTEXT
-struct sigcontext {
-	unsigned long sc_mask;
-	unsigned long sc_usp;
-	unsigned long sc_d0;
-	unsigned long sc_d1;
-	unsigned long sc_a0;
-	unsigned long sc_a1;
-	unsigned short sc_sr;
-	unsigned long sc_pc;
-	unsigned short sc_formatvec;
-};
-# endif /* M68K */
-#endif /* !HAVE_ASM_SIGCONTEXT_H */
 
 #ifndef NSIG
-# warning: NSIG is not defined, using 32
+# warning NSIG is not defined, using 32
 # define NSIG 32
 #elif NSIG < 32
-# error: NSIG < 32
+# error NSIG < 32
 #endif
 
 /* The libc headers do not define this constant since it should only be
@@ -181,7 +152,7 @@
 	return count;
 }
 
-static const char *
+const char *
 sprintsigmask_n(const char *prefix, const void *sig_mask, unsigned int bytes)
 {
 	/*
@@ -239,9 +210,6 @@
 	return outstr;
 }
 
-#define tprintsigmask_addr(prefix, mask) \
-	tprints(sprintsigmask_n((prefix), (mask), sizeof(mask)))
-
 #define sprintsigmask_val(prefix, mask) \
 	sprintsigmask_n((prefix), &(mask), sizeof(mask))
 
@@ -696,223 +664,6 @@
 #endif /* HAVE_SIGACTION */
 
 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 == 0 ?
-				(*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("}");
-	}
-#elif defined(S390) || defined(S390X)
-	if (entering(tcp)) {
-		long mask[NSIG / 8 / sizeof(long)];
-		tprints("{mask=");
-		const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE;
-		if (umove(tcp, addr, &mask) < 0) {
-			tprintf("%#lx", addr);
-		} else {
-# ifdef S390
-			long v = mask[0];
-			mask[0] = mask[1];
-			mask[1] = v;
-# endif
-			tprintsigmask_addr("", 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;
-		tprints("{mask=");
-		if (umove(tcp, *i386_esp_ptr, &frame) < 0) {
-			tprintf("%#lx", (unsigned long) *i386_esp_ptr);
-		} else {
-			uint32_t mask[2] = { frame.oldmask, frame.extramask };
-			tprintsigmask_addr("", 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;
-
-		tprints("{mask=");
-		if (umove(tcp, esp, &sc) < 0) {
-			tprintf("%#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_val("", mask);
-		}
-		tprints("}");
-	}
-#elif defined(M68K)
-	if (entering(tcp)) {
-		long addr;
-		if (upeek(tcp->pid, 4*PT_USP, &addr) < 0)
-			return 0;
-		addr += offsetof(struct sigcontext, sc_mask);
-		tprints("{mask=");
-		print_sigset_addr_len(tcp, addr, NSIG / 8);
-		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 {
-			m_siginfo_t si;
-			void *fpu_save;
-			long insns[2] __attribute__ ((aligned (8)));
-			unsigned int extramask[NSIG / 8 / sizeof(int) - 1];
-		} frame;
-
-		tprints("{mask=");
-		if (umove(tcp, fp, &frame) < 0) {
-			tprintf("%#lx", fp);
-		} else {
-			unsigned int mask[NSIG / 8 / sizeof(int)];
-
-			mask[0] = frame.si.si_mask;
-			memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
-			tprintsigmask_val("", 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;
-}
-
-int
 sys_siggetmask(struct tcb *tcp)
 {
 	if (exiting(tcp)) {