]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/powerpc/powerpc64/getcontext.S
Update copyright dates with scripts/update-copyrights.
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc64 / getcontext.S
index 13f2039766ff89726ce776bbbbe53526ac90d0c5..390739d67b462795c1b04ab4ed25da941e296a30 100644 (file)
@@ -1,5 +1,5 @@
 /* Save current context.
-   Copyright (C) 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 2002-2015 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
+   <http://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)
@@ -124,7 +124,7 @@ ENTRY(__novec_getcontext)
   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)
@@ -133,18 +133,8 @@ ENTRY(__novec_getcontext)
   addi  r5,r3,UCONTEXT_SIGMASK
   li  r4,0
   li  r3,SIG_BLOCK
-  bl  JUMPTARGET(sigprocmask)
+  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
@@ -165,16 +155,19 @@ compat_symbol (libc, __novec_getcontext, getcontext, GLIBC_2_3)
 #endif
        .section ".text"
 
+       .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)
@@ -260,27 +253,28 @@ ENTRY(__getcontext)
   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
@@ -328,8 +322,8 @@ ENTRY(__getcontext)
   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
@@ -362,11 +356,6 @@ ENTRY(__getcontext)
   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
@@ -377,23 +366,13 @@ L(has_no_vec):
    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)
+  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