]> git.ipfire.org Git - thirdparty/glibc.git/blobdiff - sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
Prefer https to http for gnu.org and fsf.org URLs
[thirdparty/glibc.git] / sysdeps / unix / sysv / linux / powerpc / powerpc32 / swapcontext-common.S
index 77c982242a9b74683c80a3268c87cce14d8e8e33..9e2739fbb9611a80cd22ad340df209d91cce3380 100644 (file)
@@ -1,5 +1,5 @@
 /* Save current context and jump to a new context.
-   Copyright (C) 2005, 2006, 2008 Free Software Foundation, Inc.
+   Copyright (C) 2005-2019 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., 51 Franklin Street, Fifth Floor, Boston MA
-   02110-1301 USA.  */
+   License along with the GNU C Library; if not, see
+   <https://www.gnu.org/licenses/>.  */
 
 /* This is the common implementation of setcontext for powerpc32.
-   It not complete in itself should be included in to a framework that 
+   It not complete in itself should be included in to a framework that
    defines:
      __CONTEXT_FUNC_NAME
    and if appropriate:
      __CONTEXT_ENABLE_FPRS
      __CONTEXT_ENABLE_VRS
-   Any archecture that implements the Vector unit is assumed to also 
+   Any architecture that implements the Vector unit is assumed to also
    implement the floating unit.  */
 
 /* Stack frame offsets.  */
@@ -51,7 +50,7 @@ ENTRY(__CONTEXT_FUNC_NAME)
        stw     r0,_UC_GREGS+(PT_R0*4)(r3)
        mflr    r0
        stw     r2,_UC_GREGS+(PT_R2*4)(r3)
-       stw     r4,_UC_GREGS+(PT_R4*4)(r3)                      
+       stw     r4,_UC_GREGS+(PT_R4*4)(r3)
 /* Set the callers LR_SAVE, and the ucontext LR and NIP to the callers
    return address.  */
        stw     r0,_UC_GREGS+(PT_LNK*4)(r3)
@@ -85,7 +84,7 @@ ENTRY(__CONTEXT_FUNC_NAME)
        stw     r29,_UC_GREGS+(PT_R29*4)(r3)
        stw     r30,_UC_GREGS+(PT_R30*4)(r3)
        stw     r31,_UC_GREGS+(PT_R31*4)(r3)
-       
+
 /* Save the value of R1.  We had to push the stack before we
    had the address of uc_reg_space.  So compute the address of
    the callers stack pointer and save it as R1.  */
@@ -146,27 +145,22 @@ ENTRY(__CONTEXT_FUNC_NAME)
 
 # ifdef PIC
        mflr    r8
-#  ifdef HAVE_ASM_PPC_REL16
-       bcl     20,31,1f
-1:     mflr    r7
-       addis   r7,r7,_GLOBAL_OFFSET_TABLE_-1b@ha
-       addi    r7,r7,_GLOBAL_OFFSET_TABLE_-1b@l
-#  else
-       bl      _GLOBAL_OFFSET_TABLE_@local-4
-       mflr    r7
-#  endif
+#  define got_label GENERATE_GOT_LABEL (__CONTEXT_FUNC_NAME)
+       SETUP_GOT_ACCESS(r7,got_label)
+       addis   r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@ha
+       addi    r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@l
 #  ifdef SHARED
        lwz     r7,_rtld_global_ro@got(r7)
        mtlr    r8
-       lwz     r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7)
+       lwz     r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7)
 #  else
        lwz     r7,_dl_hwcap@got(r7)
        mtlr    r8
-       lwz     r7,4(r7)
+       lwz     r7,LOWORD(r7)
 #  endif
 # else
-       lis     r7,(_dl_hwcap+4)@ha
-       lwz     r7,(_dl_hwcap+4)@l(r7)
+       lis     r7,(_dl_hwcap+LOWORD)@ha
+       lwz     r7,(_dl_hwcap+LOWORD)@l(r7)
 # endif
 
 # ifdef __CONTEXT_ENABLE_VRS
@@ -174,10 +168,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
 
        la      r10,(_UC_VREGS)(r3)
        la      r9,(_UC_VREGS+16)(r3)
-       
+
 /*     beq     L(no_vec)*/
        beq     2f
-/* address of the combined VSCR/VSAVE quadword.  */    
+/* address of the combined VSCR/VSAVE quadword.  */
        la      r8,(_UC_VREGS+512)(r3)
 
 /* Save the vector registers */
@@ -194,7 +188,7 @@ ENTRY(__CONTEXT_FUNC_NAME)
        stvx  v3,0,r9
        addi  r10,r10,32
        addi  r9,r9,32
-       
+
        stvx    v0,0,r8
 
        stvx  v4,0,r10
@@ -266,14 +260,15 @@ ENTRY(__CONTEXT_FUNC_NAME)
        stvx  v30,0,r10
        stvx  v31,0,r9
        stw     r0,0(r8)
-       
+
 2: /*L(no_vec):*/
 # endif /* __CONTEXT_ENABLE_VRS */
 #endif /* __CONTEXT_ENABLE_FPRS */
 
 /* Restore ucontext (parm1) from stack.  */
        lwz     r12,_FRAME_PARM_SAVE1(r1)
-       li      r4,0
+       lwz     r4,_FRAME_PARM_SAVE2(r1)
+       addi    r4,r4,_UC_SIGMASK
        stw     r3,_UC_REGS_PTR(r12)
        addi    r5,r12,_UC_SIGMASK
        li      r3,SIG_SETMASK
@@ -281,48 +276,28 @@ ENTRY(__CONTEXT_FUNC_NAME)
        cmpwi   r3,0
        bne     3f      /* L(error_exit) */
 
-       /*
-        * If the new ucontext refers to the point where we were interrupted
-        * by a signal, we have to use the rt_sigreturn system call to
-        * return to the context so we get both LR and CTR restored.
-        *
-        * Otherwise, the context we are restoring is either just after
-        * a procedure call (getcontext/swapcontext) or at the beginning
-        * of a procedure call (makecontext), so we don't need to restore
-        * r0, xer, ctr.  We don't restore r2 since it will be used as
-        * the TLS pointer.
-        */
        lwz     r4,_FRAME_PARM_SAVE2(r1)
        lwz     r31,_UC_REGS_PTR(r4)
-       lwz     r0,_UC_GREGS+(PT_MSR*4)(r31)
-       cmpwi   r0,0
-       bne     4f      /* L(do_sigret) */
 
 #ifdef __CONTEXT_ENABLE_FPRS
 # ifdef __CONTEXT_ENABLE_VRS
 
 #  ifdef PIC
        mflr    r8
-#   ifdef HAVE_ASM_PPC_REL16
-       bcl     20,31,5f
-5:     mflr    r7
-       addis   r7,r7,_GLOBAL_OFFSET_TABLE_-5b@ha
-       addi    r7,r7,_GLOBAL_OFFSET_TABLE_-5b@l
-#   else
-       bl      _GLOBAL_OFFSET_TABLE_@local-4
-       mflr    r7
-#   endif
+       SETUP_GOT_ACCESS(r7,got_label)
+       addis   r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@ha
+       addi    r7,r7,_GLOBAL_OFFSET_TABLE_-got_label@l
        mtlr    r8
 #   ifdef SHARED
        lwz     r7,_rtld_global_ro@got(r7)
-       lwz     r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+4(r7)
+       lwz     r7,RTLD_GLOBAL_RO_DL_HWCAP_OFFSET+LOWORD(r7)
 #   else
        lwz     r7,_dl_hwcap@got(r7)
-       lwz     r7,4(r7)
+       lwz     r7,LOWORD(r7)
 #   endif
 #  else
-       lis     r7,(_dl_hwcap+4)@ha
-       lwz     r7,(_dl_hwcap+4)@l(r7)
+       lis     r7,(_dl_hwcap+LOWORD)@ha
+       lwz     r7,(_dl_hwcap+LOWORD)@l(r7)
 #  endif
        andis.  r7,r7,(PPC_FEATURE_HAS_ALTIVEC >> 16)
        la      r10,(_UC_VREGS)(r31)
@@ -428,8 +403,10 @@ ENTRY(__CONTEXT_FUNC_NAME)
        lfd     fp0,_UC_FREGS+(0*8)(r31)
 # ifdef _ARCH_PWR6
        /* Use the extended four-operand version of the mtfsf insn.  */
-       mtfsf  0xff,fp0,1,0
+       mtfsf   0xff,fp31,1,0
 # else
+       .machine push
+       .machine "power6"
        /* Availability of DFP indicates a 64-bit FPSCR.  */
        andi.   r6,r7,PPC_FEATURE_HAS_DFP
        beq     7f
@@ -438,7 +415,7 @@ ENTRY(__CONTEXT_FUNC_NAME)
        b       8f
        /* Continue to operate on the FPSCR as if it were 32-bits.  */
 7:     mtfsf   0xff,fp31
-8:
+8:     .machine pop
 #endif /* _ARCH_PWR6 */
        lfd     fp1,_UC_FREGS+(1*8)(r31)
        lfd     fp2,_UC_FREGS+(2*8)(r31)
@@ -514,18 +491,11 @@ ENTRY(__CONTEXT_FUNC_NAME)
        lwz     r31,_UC_GREGS+(PT_R31*4)(r31)
 
        bctr
-       
+
 3:/*L(error_exit):*/
        lwz     r0,_FRAME_LR_SAVE+16(r1)
        addi    r1,r1,16
        mtlr    r0
        blr
-       
-4:/*L(do_sigret):*/
-       addi    r1,r4,-0xd0
-       li      r0,SYS_ify(rt_sigreturn)
-       sc
-       /* NOTREACHED */
 
 END(__CONTEXT_FUNC_NAME)
-