/* Save current context.
- Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+ Copyright (C) 2002-2021 Free Software Foundation, Inc.
This file is part of the GNU C Library.
The GNU C Library is free software; you can redistribute it and/or
Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
- License along with the GNU C Library; if not, write to the Free
- Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
- 02111-1307 USA. */
+ License along with the GNU C Library; if not, see
+ <https://www.gnu.org/licenses/>. */
#include <sysdep.h>
#include <rtld-global-offsets.h>
#include <shlib-compat.h>
-#include "kernel-features.h"
#define __ASSEMBLY__
#include <asm/ptrace.h>
#if SHLIB_COMPAT (libc, GLIBC_2_3, GLIBC_2_3_4)
ENTRY(__novec_getcontext)
-#ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
+ CALL_MCOUNT 1
std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
mflr r0
std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
std r0,FRAME_LR_SAVE(r1)
+ cfi_offset (lr, FRAME_LR_SAVE)
std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
stdu r1,-128(r1)
+ cfi_adjust_cfa_offset (128)
std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
- stfd fp29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ stfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r3)
mffs fp0
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
li r3,SIG_BLOCK
bl JUMPTARGET(__sigprocmask)
nop
-#else
- /* If the kernel is not at least 2.4.21 then generate a ENOSYS stub. */
- mflr r0
- std r0,FRAME_LR_SAVE(r1)
- stdu r1,-128(r1)
- li r3,ENOSYS
- bl JUMPTARGET(__syscall_error)
- nop
- li r3,-1
-#endif
ld r0,128+FRAME_LR_SAVE(r1)
addi r1,r1,128
.machine "altivec"
ENTRY(__getcontext)
-#ifdef __ASSUME_NEW_RT_SIGRETURN_SYSCALL
+ CALL_MCOUNT 1
std r0,(SIGCONTEXT_GP_REGS+(PT_R0*8))(r3)
std r1,(SIGCONTEXT_GP_REGS+(PT_R1*8))(r3)
mflr r0
std r2,(SIGCONTEXT_GP_REGS+(PT_R2*8))(r3)
std r0,FRAME_LR_SAVE(r1)
+ cfi_offset (lr, FRAME_LR_SAVE)
std r0,(SIGCONTEXT_GP_REGS+(PT_LNK*8))(r3)
std r0,(SIGCONTEXT_GP_REGS+(PT_NIP*8))(r3)
stdu r1,-128(r1)
+ cfi_adjust_cfa_offset (128)
std r4,(SIGCONTEXT_GP_REGS+(PT_R4*8))(r3)
std r5,(SIGCONTEXT_GP_REGS+(PT_R5*8))(r3)
std r6,(SIGCONTEXT_GP_REGS+(PT_R6*8))(r3)
stfd fp26,(SIGCONTEXT_FP_REGS+(PT_R26*8))(r3)
stfd fp27,(SIGCONTEXT_FP_REGS+(PT_R27*8))(r3)
stfd fp28,(SIGCONTEXT_FP_REGS+(PT_R28*8))(r3)
- stfd fp29,(SIGCONTEXT_GP_REGS+(PT_R29*8))(r3)
+ stfd fp29,(SIGCONTEXT_FP_REGS+(PT_R29*8))(r3)
mffs fp0
stfd fp30,(SIGCONTEXT_FP_REGS+(PT_R30*8))(r3)
stfd fp31,(SIGCONTEXT_FP_REGS+(PT_R31*8))(r3)
stfd fp0,(SIGCONTEXT_FP_REGS+(32*8))(r3)
ld r5,.LC__dl_hwcap@toc(r2)
- li r10,0
# ifdef SHARED
/* Load _rtld-global._dl_hwcap. */
ld r5,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET(r5)
# else
ld r5,0(r5) /* Load extern _dl_hwcap. */
# endif
- andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
- beq L(has_no_vec)
-
la r10,(SIGCONTEXT_V_RESERVE+8)(r3)
la r9,(SIGCONTEXT_V_RESERVE+24)(r3)
+
+ andis. r5,r5,(PPC_FEATURE_HAS_ALTIVEC >> 16)
+
clrrdi r10,r10,4
+ beq L(has_no_vec)
clrrdi r9,r9,4
+ mr r5,r10 /* Capture *v_regs value in r5. */
stvx v0,0,r10
stvx v1,0,r9
addi r9,r9,32
stvx v18,0,r10
- stvx v11,0,r9
- addi r19,r10,32
+ stvx v19,0,r9
+ addi r10,r10,32
addi r9,r9,32
stvx v20,0,r10
addi r10,r10,32
addi r9,r9,32
- stvx v10,0,r10
- stvx v11,0,r9
- addi r10,r10,32
- addi r9,r9,32
-
mfvscr v0
mfspr r0,VRSAVE
stvx v0,0,r10
Store either a NULL or a quadword aligned pointer to the Vector register
array into *v_regs.
*/
- std r10,(SIGCONTEXT_V_REGS_PTR)(r3)
+ std r5,(SIGCONTEXT_V_REGS_PTR)(r3)
addi r5,r3,UCONTEXT_SIGMASK
li r4,0
li r3,SIG_BLOCK
bl JUMPTARGET(__sigprocmask)
nop
-#else
- /* If the kernel is not at least 2.4.21 then generate a ENOSYS stub. */
- mflr r0
- std r0,FRAME_LR_SAVE(r1)
- stdu r1,-128(r1)
- li r3,ENOSYS
- bl JUMPTARGET(__syscall_error)
- nop
- li r3,-1
-#endif
ld r0,128+FRAME_LR_SAVE(r1)
addi r1,r1,128