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.
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
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 \
--- /dev/null
+#include "arm/arch_sigreturn.c"
--- /dev/null
+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("}");
--- /dev/null
+#warning sigreturn/rt_sigreturn signal mask decoding is not implemented for this architecture
--- /dev/null
+#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("}");
--- /dev/null
+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("}");
--- /dev/null
+#include "crisv10/arch_sigreturn.c"
--- /dev/null
+/*
+ * 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("}");
+}
--- /dev/null
+/* 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("}");
--- /dev/null
+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("}");
--- /dev/null
+/* 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("}");
--- /dev/null
+#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("}");
--- /dev/null
+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("}");
+}
--- /dev/null
+#include "powerpc/arch_sigreturn.c"
--- /dev/null
+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("}");
+}
--- /dev/null
+#include "s390/arch_sigreturn.c"
--- /dev/null
+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("}");
+}
--- /dev/null
+#include "sparc/arch_sigreturn.c"
--- /dev/null
+/* 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("}");
--- /dev/null
+#include "x86_64/arch_sigreturn.c"
--- /dev/null
+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"
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;
}