From a3c483545a7fb3a075f885a01a3c58b2f84db8fa Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Mon, 23 Mar 2015 21:16:07 +0000 Subject: [PATCH] sigreturn.c: split arch specific code into separate arch files 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. --- Makefile.am | 20 +++ linux/aarch64/arch_sigreturn.c | 1 + linux/alpha/arch_sigreturn.c | 9 ++ linux/arch_sigreturn.c | 1 + linux/arm/arch_sigreturn.c | 15 +++ linux/crisv10/arch_sigreturn.c | 11 ++ linux/crisv32/arch_sigreturn.c | 1 + linux/i386/arch_sigreturn.c | 20 +++ linux/ia64/arch_sigreturn.c | 8 ++ linux/m68k/arch_sigreturn.c | 20 +++ linux/microblaze/arch_sigreturn.c | 12 ++ linux/mips/arch_sigreturn.c | 22 +++ linux/powerpc/arch_sigreturn.c | 24 ++++ linux/powerpc64/arch_sigreturn.c | 1 + linux/s390/arch_sigreturn.c | 14 ++ linux/s390x/arch_sigreturn.c | 1 + linux/sparc/arch_sigreturn.c | 19 +++ linux/sparc64/arch_sigreturn.c | 1 + linux/tile/arch_sigreturn.c | 8 ++ linux/x32/arch_sigreturn.c | 1 + linux/x86_64/arch_sigreturn.c | 10 ++ sigreturn.c | 217 +----------------------------- 22 files changed, 220 insertions(+), 216 deletions(-) create mode 100644 linux/aarch64/arch_sigreturn.c create mode 100644 linux/alpha/arch_sigreturn.c create mode 100644 linux/arch_sigreturn.c create mode 100644 linux/arm/arch_sigreturn.c create mode 100644 linux/crisv10/arch_sigreturn.c create mode 100644 linux/crisv32/arch_sigreturn.c create mode 100644 linux/i386/arch_sigreturn.c create mode 100644 linux/ia64/arch_sigreturn.c create mode 100644 linux/m68k/arch_sigreturn.c create mode 100644 linux/microblaze/arch_sigreturn.c create mode 100644 linux/mips/arch_sigreturn.c create mode 100644 linux/powerpc/arch_sigreturn.c create mode 100644 linux/powerpc64/arch_sigreturn.c create mode 100644 linux/s390/arch_sigreturn.c create mode 100644 linux/s390x/arch_sigreturn.c create mode 100644 linux/sparc/arch_sigreturn.c create mode 100644 linux/sparc64/arch_sigreturn.c create mode 100644 linux/tile/arch_sigreturn.c create mode 100644 linux/x32/arch_sigreturn.c create mode 100644 linux/x86_64/arch_sigreturn.c diff --git a/Makefile.am b/Makefile.am index 27b6a127..04506bce 100644 --- a/Makefile.am +++ b/Makefile.am @@ -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 index 00000000..f0e29c26 --- /dev/null +++ b/linux/aarch64/arch_sigreturn.c @@ -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 index 00000000..278bae19 --- /dev/null +++ b/linux/alpha/arch_sigreturn.c @@ -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 index 00000000..80ec9848 --- /dev/null +++ b/linux/arch_sigreturn.c @@ -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 index 00000000..046e19a1 --- /dev/null +++ b/linux/arm/arch_sigreturn.c @@ -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 index 00000000..b9e6a247 --- /dev/null +++ b/linux/crisv10/arch_sigreturn.c @@ -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 index 00000000..6c0fc03b --- /dev/null +++ b/linux/crisv32/arch_sigreturn.c @@ -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 index 00000000..e726bf1a --- /dev/null +++ b/linux/i386/arch_sigreturn.c @@ -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 index 00000000..94e89cfa --- /dev/null +++ b/linux/ia64/arch_sigreturn.c @@ -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 index 00000000..c3d3ea19 --- /dev/null +++ b/linux/m68k/arch_sigreturn.c @@ -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 index 00000000..8e2e7b89 --- /dev/null +++ b/linux/microblaze/arch_sigreturn.c @@ -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 index 00000000..687f871d --- /dev/null +++ b/linux/mips/arch_sigreturn.c @@ -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 index 00000000..bc4802ac --- /dev/null +++ b/linux/powerpc/arch_sigreturn.c @@ -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 index 00000000..316022fd --- /dev/null +++ b/linux/powerpc64/arch_sigreturn.c @@ -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 index 00000000..43afd954 --- /dev/null +++ b/linux/s390/arch_sigreturn.c @@ -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 index 00000000..679a3952 --- /dev/null +++ b/linux/s390x/arch_sigreturn.c @@ -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 index 00000000..93014317 --- /dev/null +++ b/linux/sparc/arch_sigreturn.c @@ -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 index 00000000..aeec9817 --- /dev/null +++ b/linux/sparc64/arch_sigreturn.c @@ -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 index 00000000..99e2bf8f --- /dev/null +++ b/linux/tile/arch_sigreturn.c @@ -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 index 00000000..9a778fc7 --- /dev/null +++ b/linux/x32/arch_sigreturn.c @@ -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 index 00000000..62aeca5e --- /dev/null +++ b/linux/x86_64/arch_sigreturn.c @@ -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" diff --git a/sigreturn.c b/sigreturn.c index f32c2064..b3fc038b 100644 --- a/sigreturn.c +++ b/sigreturn.c @@ -16,223 +16,8 @@ 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; } -- 2.40.0