strace/linux/sparc/arch_sigreturn.c

45 lines
1.1 KiB
C
Raw Permalink Normal View History

/*
* Copyright (c) 2015-2018 The strace developers.
* All rights reserved.
*
* SPDX-License-Identifier: LGPL-2.1-or-later
*/
#ifndef SIZEOF_STRUCT_SPARC_STACKF
# define SIZEOF_STRUCT_SPARC_STACKF sizeof(struct sparc_stackf)
#endif
#ifndef SIZEOF_STRUCT_PT_REGS
# define SIZEOF_STRUCT_PT_REGS sizeof(struct pt_regs)
#endif
#ifndef PERSONALITY_WORDSIZE
# define PERSONALITY_WORDSIZE PERSONALITY0_WORDSIZE
#endif
static void
arch_sigreturn(struct tcb *tcp)
{
Refactor stack pointers Change all linux/*/arch_regs.c to provide either ARCH_SP_REG or ARCH_SP_PEEK_ADDR. Introduce get_stack_pointer(), rewrite all code accessing stack pointers to use get_stack_pointer(). On some architectures stack pointers were referred to as frame pointers, clean up this confusion. * defs.h (get_stack_pointer): New prototype. * syscall.c (get_stack_pointer): New function. * linux/arch_rt_sigframe.c: New file. * linux/aarch64/arch_regs.c (aarch64_sp_ptr, arm_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/alpha/arch_regs.c: Import linux/alpha/arch_regs.h. (REG_FP): Rename to REG_SP. (ARCH_SP_PEEK_ADDR): New macro. * linux/alpha/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/arc/arch_regs.c (arc_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/arm/arch_regs.c (arm_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/arm/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/avr32/arch_regs.c (avr32_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/bfin/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/hppa/arch_regs.c: Import linux/hppa/arch_regs.h. (PT_GR30, ARCH_SP_PEEK_ADDR): New macros. * linux/hppa/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/i386/arch_regs.c (i386_esp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/i386/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/i386/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/ia64/arch_regs.c (ia64_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/ia64/arch_regs.h (ia64_frame_ptr): Remove. * linux/ia64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/m68k/arch_regs.c (m68k_usp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/m68k/arch_rt_sigframe.c: Link to i386/arch_rt_sigframe.c. * linux/m68k/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/metag/arch_regs.c (metag_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/metag/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/microblaze/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/mips/arch_regs.c: Import linux/mips/arch_regs.h. (mips_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/mips/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/nios2/arch_regs.c (nios2_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/or1k/arch_regs.c (or1k_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/powerpc/arch_regs.c (ppc_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/powerpc/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/powerpc/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/powerpc64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/riscv/arch_regs.c (riscv_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390/arch_regs.c (s390_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390/arch_sigreturn.c (S390_FRAME_PTR): Remove. (arch_sigreturn): Use get_stack_pointer. * linux/s390x/arch_regs.c (s390_frame_ptr, s390x_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390x/arch_sigreturn.c (S390_FRAME_PTR): Remove. * linux/sh/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/sh64/arch_regs.c: Likewise. * linux/sparc/arch_regs.c: Import linux/sparc/arch_regs.h. (sparc_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/sparc/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/sparc64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/tile/arch_regs.c (tile_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/tile/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/x86_64/arch_regs.c (i386_esp_ptr, x86_64_rsp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/x86_64/arch_regs.h (i386_esp_ptr, x86_64_rsp_ptr): Remove. * linux/x86_64/arch_rt_sigframe.c: Link to i386/arch_rt_sigframe.c. * linux/xtensa/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/aarch64/arch_regs.h: Remove. * linux/aarch64/arch_rt_sigframe.c: Remove. * linux/alpha/arch_regs.h: Remove. * linux/alpha/arch_rt_sigframe.c: Remove. * linux/arc/arch_regs.h: Remove. * linux/arc/arch_rt_sigframe.c: Remove. * linux/arm/arch_regs.h: Remove. * linux/arm/arch_rt_sigframe.c: Remove. * linux/avr32/arch_regs.h: Remove. * linux/avr32/arch_rt_sigframe.c: Remove. * linux/bfin/arch_rt_sigframe.c: Remove. * linux/hppa/arch_regs.h: Remove. * linux/i386/arch_regs.h: Remove. * linux/m68k/arch_regs.h: Remove. * linux/metag/arch_regs.h: Remove. * linux/microblaze/arch_rt_sigframe.c: Remove. * linux/mips/arch_regs.h: Remove. * linux/mips/arch_rt_sigframe.c: Remove. * linux/nios2/arch_regs.h: Remove. * linux/nios2/arch_rt_sigframe.c: Remove. * linux/or1k/arch_regs.h: Remove. * linux/or1k/arch_rt_sigframe.c: Remove. * linux/powerpc/arch_regs.h: Remove. * linux/powerpc64/arch_regs.h: Remove. * linux/riscv/arch_regs.h: Remove. * linux/riscv/arch_rt_sigframe.c: Remove. * linux/s390/arch_regs.h: Remove. * linux/s390/arch_rt_sigframe.c: Remove. * linux/s390x/arch_regs.h: Remove. * linux/s390x/arch_rt_sigframe.c: Remove. * linux/sh/arch_rt_sigframe.c: Remove. * linux/sh64/arch_rt_sigframe.c: Remove. * linux/sparc/arch_regs.h: Remove. * linux/sparc/arch_rt_sigframe.c: Remove. * linux/sparc64/arch_regs.h: Remove. * linux/tile/arch_regs.h: Remove. * linux/tile/arch_rt_sigframe.c: Remove. * linux/xtensa/arch_rt_sigframe.c: Remove. * Makefile.am (EXTRA_DIST): Remove them, add linux/arch_rt_sigframe.c.
2018-12-04 22:31:41 +00:00
kernel_ulong_t addr;
if (!get_stack_pointer(tcp, &addr))
return;
addr += SIZEOF_STRUCT_SPARC_STACKF + SIZEOF_STRUCT_PT_REGS;
struct {
unsigned int mask;
char fpu_save[PERSONALITY_WORDSIZE];
char insns[PERSONALITY_WORDSIZE * 2] ATTRIBUTE_ALIGNED(8);
unsigned int extramask[NSIG_BYTES / sizeof(int) - 1];
} frame;
Refactor stack pointers Change all linux/*/arch_regs.c to provide either ARCH_SP_REG or ARCH_SP_PEEK_ADDR. Introduce get_stack_pointer(), rewrite all code accessing stack pointers to use get_stack_pointer(). On some architectures stack pointers were referred to as frame pointers, clean up this confusion. * defs.h (get_stack_pointer): New prototype. * syscall.c (get_stack_pointer): New function. * linux/arch_rt_sigframe.c: New file. * linux/aarch64/arch_regs.c (aarch64_sp_ptr, arm_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/alpha/arch_regs.c: Import linux/alpha/arch_regs.h. (REG_FP): Rename to REG_SP. (ARCH_SP_PEEK_ADDR): New macro. * linux/alpha/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/arc/arch_regs.c (arc_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/arm/arch_regs.c (arm_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/arm/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/avr32/arch_regs.c (avr32_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/bfin/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/hppa/arch_regs.c: Import linux/hppa/arch_regs.h. (PT_GR30, ARCH_SP_PEEK_ADDR): New macros. * linux/hppa/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/i386/arch_regs.c (i386_esp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/i386/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/i386/arch_sigreturn.c (arch_sigreturn): Likewise. * linux/ia64/arch_regs.c (ia64_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/ia64/arch_regs.h (ia64_frame_ptr): Remove. * linux/ia64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/m68k/arch_regs.c (m68k_usp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/m68k/arch_rt_sigframe.c: Link to i386/arch_rt_sigframe.c. * linux/m68k/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/metag/arch_regs.c (metag_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/metag/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/microblaze/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/mips/arch_regs.c: Import linux/mips/arch_regs.h. (mips_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/mips/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/nios2/arch_regs.c (nios2_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/or1k/arch_regs.c (or1k_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/powerpc/arch_regs.c (ppc_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/powerpc/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/powerpc/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/powerpc64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/riscv/arch_regs.c (riscv_sp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390/arch_regs.c (s390_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390/arch_sigreturn.c (S390_FRAME_PTR): Remove. (arch_sigreturn): Use get_stack_pointer. * linux/s390x/arch_regs.c (s390_frame_ptr, s390x_frame_ptr): Remove. (ARCH_SP_REG): New macro. * linux/s390x/arch_sigreturn.c (S390_FRAME_PTR): Remove. * linux/sh/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/sh64/arch_regs.c: Likewise. * linux/sparc/arch_regs.c: Import linux/sparc/arch_regs.h. (sparc_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/sparc/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/sparc64/arch_rt_sigframe.c (FUNC_GET_RT_SIGFRAME_ADDR): Use get_stack_pointer. * linux/tile/arch_regs.c (tile_regs): Add static qualifier. (ARCH_SP_REG): New macro. * linux/tile/arch_sigreturn.c (arch_sigreturn): Use get_stack_pointer. * linux/x86_64/arch_regs.c (i386_esp_ptr, x86_64_rsp_ptr): Remove. (ARCH_SP_REG): New macro. * linux/x86_64/arch_regs.h (i386_esp_ptr, x86_64_rsp_ptr): Remove. * linux/x86_64/arch_rt_sigframe.c: Link to i386/arch_rt_sigframe.c. * linux/xtensa/arch_regs.c (ARCH_SP_PEEK_ADDR): New macro. * linux/aarch64/arch_regs.h: Remove. * linux/aarch64/arch_rt_sigframe.c: Remove. * linux/alpha/arch_regs.h: Remove. * linux/alpha/arch_rt_sigframe.c: Remove. * linux/arc/arch_regs.h: Remove. * linux/arc/arch_rt_sigframe.c: Remove. * linux/arm/arch_regs.h: Remove. * linux/arm/arch_rt_sigframe.c: Remove. * linux/avr32/arch_regs.h: Remove. * linux/avr32/arch_rt_sigframe.c: Remove. * linux/bfin/arch_rt_sigframe.c: Remove. * linux/hppa/arch_regs.h: Remove. * linux/i386/arch_regs.h: Remove. * linux/m68k/arch_regs.h: Remove. * linux/metag/arch_regs.h: Remove. * linux/microblaze/arch_rt_sigframe.c: Remove. * linux/mips/arch_regs.h: Remove. * linux/mips/arch_rt_sigframe.c: Remove. * linux/nios2/arch_regs.h: Remove. * linux/nios2/arch_rt_sigframe.c: Remove. * linux/or1k/arch_regs.h: Remove. * linux/or1k/arch_rt_sigframe.c: Remove. * linux/powerpc/arch_regs.h: Remove. * linux/powerpc64/arch_regs.h: Remove. * linux/riscv/arch_regs.h: Remove. * linux/riscv/arch_rt_sigframe.c: Remove. * linux/s390/arch_regs.h: Remove. * linux/s390/arch_rt_sigframe.c: Remove. * linux/s390x/arch_regs.h: Remove. * linux/s390x/arch_rt_sigframe.c: Remove. * linux/sh/arch_rt_sigframe.c: Remove. * linux/sh64/arch_rt_sigframe.c: Remove. * linux/sparc/arch_regs.h: Remove. * linux/sparc/arch_rt_sigframe.c: Remove. * linux/sparc64/arch_regs.h: Remove. * linux/tile/arch_regs.h: Remove. * linux/tile/arch_rt_sigframe.c: Remove. * linux/xtensa/arch_rt_sigframe.c: Remove. * Makefile.am (EXTRA_DIST): Remove them, add linux/arch_rt_sigframe.c.
2018-12-04 22:31:41 +00:00
if (!umove_or_printaddr(tcp, addr, &frame)) {
unsigned int mask[NSIG_BYTES / sizeof(int)];
mask[0] = frame.mask;
memcpy(mask + 1, frame.extramask, sizeof(frame.extramask));
tprintsigmask_addr("{mask=", mask);
tprints("}");
}
}
#undef PERSONALITY_WORDSIZE
#undef SIZEOF_STRUCT_PT_REGS
#undef SIZEOF_STRUCT_SPARC_STACKF