From 527b42ff8da3f52fa7c48eb766b2b57fb0f0b977 Mon Sep 17 00:00:00 2001 From: "Dmitry V. Levin" Date: Sat, 28 Nov 2015 02:58:29 +0000 Subject: [PATCH] cleanup: make arch_sigreturn.c files more readable Make arch_sigreturn.c files more self-sustained. While they are still being included by sigreturn.c, the latter no longer defines arch_sigreturn function. * linux/alpha/arch_sigreturn.c (arch_sigreturn): Define. * linux/arm/arch_sigreturn.c: Likewise. * linux/crisv10/arch_sigreturn.c: Likewise. * linux/i386/arch_sigreturn.c: Likewise. * linux/ia64/arch_sigreturn.c: Likewise. * linux/m68k/arch_sigreturn.c: Likewise. * linux/microblaze/arch_sigreturn.c: Likewise. * linux/mips/arch_sigreturn.c: Likewise. * linux/powerpc/arch_sigreturn.c: Likewise. * linux/s390/arch_sigreturn.c: Likewise. * linux/sparc/arch_sigreturn.c: Likewise. * linux/tile/arch_sigreturn.c: Likewise. * linux/x32/arch_sigreturn.c: Remove code. Include "x86_64/arch_sigreturn.c". * linux/x86_64/arch_sigreturn.c: Stop including "x32/arch_sigreturn.c". Include "i386/arch_sigreturn.c" with arch_sigreturn temporarily defined to i386_arch_sigreturn. (arch_sigreturn): Define. Add x32 personality support there. * sigreturn.c: Remove arch_sigreturn header and footer. Requested-by: Denys Vlasenko --- linux/alpha/arch_sigreturn.c | 18 ++++++++------ linux/arm/arch_sigreturn.c | 22 ++++++++++------- linux/crisv10/arch_sigreturn.c | 22 ++++++++++------- linux/i386/arch_sigreturn.c | 40 +++++++++++++++++-------------- linux/ia64/arch_sigreturn.c | 18 ++++++++------ linux/m68k/arch_sigreturn.c | 36 +++++++++++++++------------- linux/microblaze/arch_sigreturn.c | 22 ++++++++++------- linux/mips/arch_sigreturn.c | 40 +++++++++++++++++-------------- linux/powerpc/arch_sigreturn.c | 36 +++++++++++++++------------- linux/s390/arch_sigreturn.c | 24 +++++++++++-------- linux/sparc/arch_sigreturn.c | 36 +++++++++++++++------------- linux/tile/arch_sigreturn.c | 18 ++++++++------ linux/x32/arch_sigreturn.c | 16 +------------ linux/x86_64/arch_sigreturn.c | 34 +++++++++++++++++++++----- sigreturn.c | 4 ---- 15 files changed, 219 insertions(+), 167 deletions(-) diff --git a/linux/alpha/arch_sigreturn.c b/linux/alpha/arch_sigreturn.c index b70eb1d7..71a84ef2 100644 --- a/linux/alpha/arch_sigreturn.c +++ b/linux/alpha/arch_sigreturn.c @@ -1,9 +1,13 @@ -long addr; +static void +arch_sigreturn(struct tcb *tcp) +{ + long addr; -if (upeek(tcp->pid, REG_FP, &addr) < 0) - return; -addr += offsetof(struct sigcontext, sc_mask); + if (upeek(tcp->pid, REG_FP, &addr) < 0) + return; + addr += offsetof(struct sigcontext, sc_mask); -tprints("{mask="); -print_sigset_addr_len(tcp, addr, NSIG / 8); -tprints("}"); + tprints("{mask="); + print_sigset_addr_len(tcp, addr, NSIG / 8); + tprints("}"); +} diff --git a/linux/arm/arch_sigreturn.c b/linux/arm/arch_sigreturn.c index 046e19a1..6d32ac5d 100644 --- a/linux/arm/arch_sigreturn.c +++ b/linux/arm/arch_sigreturn.c @@ -1,15 +1,19 @@ +static void +arch_sigreturn(struct tcb *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 = + const long addr = #ifdef AARCH64 - current_personality == 1 ? - (*aarch64_sp_ptr + SIZEOF_STRUCT_SIGINFO + - offsetof(struct ucontext, uc_sigmask)) : + 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("}"); + (*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 index 9dc09f34..9086d533 100644 --- a/linux/crisv10/arch_sigreturn.c +++ b/linux/crisv10/arch_sigreturn.c @@ -1,11 +1,15 @@ -long regs[PT_MAX + 1]; +static void +arch_sigreturn(struct tcb *tcp) +{ + long regs[PT_MAX + 1]; -if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) { - perror_msg("sigreturn: PTRACE_GETREGS"); - return; -} -const long addr = regs[PT_USP] + offsetof(struct sigcontext, oldmask); + if (ptrace(PTRACE_GETREGS, tcp->pid, NULL, (long)regs) < 0) { + perror_msg("sigreturn: PTRACE_GETREGS"); + return; + } + const long addr = regs[PT_USP] + offsetof(struct sigcontext, oldmask); -tprints("{mask="); -print_sigset_addr_len(tcp, addr, NSIG / 8); -tprints("}"); + tprints("{mask="); + print_sigset_addr_len(tcp, addr, NSIG / 8); + tprints("}"); +} diff --git a/linux/i386/arch_sigreturn.c b/linux/i386/arch_sigreturn.c index e726bf1a..9446994e 100644 --- a/linux/i386/arch_sigreturn.c +++ b/linux/i386/arch_sigreturn.c @@ -1,20 +1,24 @@ -/* - * 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; +static void +arch_sigreturn(struct tcb *tcp) +{ + /* + * 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("}"); + 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 index 94e89cfa..8b54d6c1 100644 --- a/linux/ia64/arch_sigreturn.c +++ b/linux/ia64/arch_sigreturn.c @@ -1,8 +1,12 @@ -/* offsetof(struct sigframe, sc) */ +static void +arch_sigreturn(struct tcb *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("}"); + 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 index a2ccac64..0011c174 100644 --- a/linux/m68k/arch_sigreturn.c +++ b/linux/m68k/arch_sigreturn.c @@ -1,20 +1,24 @@ -long addr; +static void +arch_sigreturn(struct tcb *tcp) +{ + long addr; -if (upeek(tcp->pid, 4*PT_USP, &addr) < 0) - return; -/* Fetch pointer to struct sigcontext. */ -if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0) - return; + if (upeek(tcp->pid, 4*PT_USP, &addr) < 0) + return; + /* Fetch pointer to struct sigcontext. */ + if (umove(tcp, addr + 2 * sizeof(int), &addr) < 0) + return; -unsigned long mask[NSIG / 8 / sizeof(long)]; -/* Fetch first word of signal mask. */ -if (umove(tcp, addr, &mask[0]) < 0) - return; + unsigned long mask[NSIG / 8 / sizeof(long)]; + /* Fetch first word of signal mask. */ + if (umove(tcp, addr, &mask[0]) < 0) + return; -/* 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; + /* 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; -tprintsigmask_addr("{mask=", mask); -tprints("}"); + tprintsigmask_addr("{mask=", mask); + tprints("}"); +} diff --git a/linux/microblaze/arch_sigreturn.c b/linux/microblaze/arch_sigreturn.c index 0c7f99cd..839c8057 100644 --- a/linux/microblaze/arch_sigreturn.c +++ b/linux/microblaze/arch_sigreturn.c @@ -1,12 +1,16 @@ -/* TODO: Verify that this is correct... */ +static void +arch_sigreturn(struct tcb *tcp) +{ + /* TODO: Verify that this is correct... */ -long addr; + long addr; -/* Read r1, the stack pointer. */ -if (upeek(tcp->pid, 1 * 4, &addr) < 0) - return; -addr += offsetof(struct sigcontext, oldmask); + /* Read r1, the stack pointer. */ + if (upeek(tcp->pid, 1 * 4, &addr) < 0) + return; + addr += offsetof(struct sigcontext, oldmask); -tprints("{mask="); -print_sigset_addr_len(tcp, addr, NSIG / 8); -tprints("}"); + 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 index 687f871d..3095fe59 100644 --- a/linux/mips/arch_sigreturn.c +++ b/linux/mips/arch_sigreturn.c @@ -1,22 +1,26 @@ +static void +arch_sigreturn(struct tcb *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); + /* + * 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); + /* + * 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("}"); + 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 index bc4802ac..c28a1962 100644 --- a/linux/powerpc/arch_sigreturn.c +++ b/linux/powerpc/arch_sigreturn.c @@ -1,24 +1,28 @@ -long esp = ppc_regs.gpr[1]; -struct sigcontext sc; +static void +arch_sigreturn(struct tcb *tcp) +{ + long esp = ppc_regs.gpr[1]; + struct sigcontext sc; -/* Skip dummy stack frame. */ + /* Skip dummy stack frame. */ #ifdef POWERPC64 -if (current_personality == 0) - esp += 128; -else + if (current_personality == 0) + esp += 128; + else #endif - esp += 64; + esp += 64; -if (umove(tcp, esp, &sc) < 0) { - tprintf("{mask=%#lx}", esp); -} else { - unsigned long mask[NSIG / 8 / sizeof(long)]; + 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); + mask[0] = sc.oldmask | (sc._unused[3] << 32); #else - mask[0] = sc.oldmask; - mask[1] = sc._unused[3]; + mask[0] = sc.oldmask; + mask[1] = sc._unused[3]; #endif - tprintsigmask_addr("{mask=", mask); - tprints("}"); + tprintsigmask_addr("{mask=", mask); + tprints("}"); + } } diff --git a/linux/s390/arch_sigreturn.c b/linux/s390/arch_sigreturn.c index 43afd954..6baf035c 100644 --- a/linux/s390/arch_sigreturn.c +++ b/linux/s390/arch_sigreturn.c @@ -1,14 +1,18 @@ -long mask[NSIG / 8 / sizeof(long)]; -const long addr = *s390_frame_ptr + __SIGNAL_FRAMESIZE; +static void +arch_sigreturn(struct tcb *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 { + if (umove(tcp, addr, &mask) < 0) { + tprintf("{mask=%#lx}", addr); + } else { #ifdef S390 - long v = mask[0]; - mask[0] = mask[1]; - mask[1] = v; + long v = mask[0]; + mask[0] = mask[1]; + mask[1] = v; #endif - tprintsigmask_addr("{mask=", mask); - tprints("}"); + tprintsigmask_addr("{mask=", mask); + tprints("}"); + } } diff --git a/linux/sparc/arch_sigreturn.c b/linux/sparc/arch_sigreturn.c index 144b3a6d..9e86efa9 100644 --- a/linux/sparc/arch_sigreturn.c +++ b/linux/sparc/arch_sigreturn.c @@ -1,19 +1,23 @@ -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; +static void +arch_sigreturn(struct tcb *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)]; + 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("}"); + mask[0] = frame.si_mask; + memcpy(mask + 1, frame.extramask, sizeof(frame.extramask)); + tprintsigmask_addr("{mask=", mask); + tprints("}"); + } } diff --git a/linux/tile/arch_sigreturn.c b/linux/tile/arch_sigreturn.c index 99e2bf8f..b1182fce 100644 --- a/linux/tile/arch_sigreturn.c +++ b/linux/tile/arch_sigreturn.c @@ -1,8 +1,12 @@ -/* 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); +static void +arch_sigreturn(struct tcb *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("}"); + 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 index fd7359ff..9a778fc7 100644 --- a/linux/x32/arch_sigreturn.c +++ b/linux/x32/arch_sigreturn.c @@ -1,15 +1 @@ -if (current_personality != 1) { - typedef struct { - uint32_t flags, link, stack[3], pad; - struct sigcontext mcontext; - } ucontext_x32_header; - - const unsigned long addr = - (unsigned long) *x86_64_rsp_ptr + - sizeof(ucontext_x32_header); - tprints("{mask="); - print_sigset_addr_len(tcp, addr, NSIG / 8); - tprints("}"); - return; -} -#include "i386/arch_sigreturn.c" +#include "x86_64/arch_sigreturn.c" diff --git a/linux/x86_64/arch_sigreturn.c b/linux/x86_64/arch_sigreturn.c index 4c1448b8..1de0a0ad 100644 --- a/linux/x86_64/arch_sigreturn.c +++ b/linux/x86_64/arch_sigreturn.c @@ -1,10 +1,32 @@ -if (current_personality == 0) { - const unsigned long addr = - (unsigned long) *x86_64_rsp_ptr + - offsetof(struct ucontext, uc_sigmask); +#define arch_sigreturn i386_arch_sigreturn +#include "i386/arch_sigreturn.c" +#undef arch_sigreturn + +static void +arch_sigreturn(struct tcb *tcp) +{ + if (current_personality == 1) { + i386_arch_sigreturn(tcp); + return; + } + + typedef struct { + uint32_t flags, link, stack[3], pad; + struct sigcontext mcontext; + } ucontext_x32_header; + +#define X86_64_SIGMASK_OFFSET offsetof(struct ucontext, uc_sigmask) +#define X32_SIGMASK_OFFSET sizeof(ucontext_x32_header) + + const unsigned long offset = +#ifdef X32 + X32_SIGMASK_OFFSET; +#else + current_personality == 2 ? X32_SIGMASK_OFFSET : + X86_64_SIGMASK_OFFSET; +#endif + const unsigned long addr = (unsigned long) *x86_64_rsp_ptr + offset; tprints("{mask="); print_sigset_addr_len(tcp, addr, NSIG / 8); tprints("}"); - return; } -#include "x32/arch_sigreturn.c" diff --git a/sigreturn.c b/sigreturn.c index 9f2e32de..f0dab0da 100644 --- a/sigreturn.c +++ b/sigreturn.c @@ -14,11 +14,7 @@ # error NSIG < 32 #endif -static void -arch_sigreturn(struct tcb *tcp) -{ #include "arch_sigreturn.c" -} SYS_FUNC(sigreturn) { -- 2.40.0