]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
powerpc: Remove rt_sigreturn usage on context function
authorAdhemerval Zanella <adhemerval.zanella@linaro.org>
Fri, 15 Feb 2019 13:55:16 +0000 (11:55 -0200)
committerAdhemerval Zanella <adhemerval.zanella@linaro.org>
Wed, 17 Apr 2019 18:14:41 +0000 (15:14 -0300)
As described in a recent glibc thread [1], the rt_sigreturn syscall
on setcontext and swapcontext is not used on default use and its
intention is no really supported since neither setcontext nor
swapcontext are async-signal-safe.

Checked on powerpc64-linux-gnu and powerpc-linux-gnu.

* sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S:
Remove rt_sigreturn call.
* sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:
Likewise.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S: Likewie.
* sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: Likewise.

[1] https://sourceware.org/ml/libc-alpha/2019-02/msg00367.html

ChangeLog
sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S
sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S
sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S

index 663770e03a97e9b6a8385b1636d06aeaa0e908d2..41c1a7ec030d1716ee64782667cfd1605036d5d9 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,12 @@
 2019-04-17  Adhemerval Zanella  <adhemerval.zanella@linaro.org>
 
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/setcontext-common.S:
+       Remove rt_sigreturn call.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S:
+       Likewise.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/setcontext.S: Likewie.
+       * sysdeps/unix/sysv/linux/powerpc/powerpc64/swapcontext.S: Likewise.
+
        * support/Makefile (libsupport-routines): Add support_subprocess,
        xposix_spawn, xposix_spawn_file_actions_addclose, and
        xposix_spawn_file_actions_adddup2.
index 68c6321a9d3695b430947ed741d096ef9a67bc9c..47235dd0cb7199827a55880e7cc4a74570bf5330 100644 (file)
@@ -47,21 +47,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
        cfi_offset(r31,-4)
        lwz     r31,_UC_REGS_PTR(r3)
 
-       /*
-        * If this 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     r0,_UC_GREGS+(PT_MSR*4)(r31)
-       cmpwi   r0,0
-       bne     4f      /* L(do_sigret) */
-
        /* Restore the signal mask */
        li      r5,0
        addi    r4,r3,_UC_SIGMASK
@@ -296,11 +281,4 @@ ENTRY(__CONTEXT_FUNC_NAME)
        mtlr    r0
        blr
 
-
-4: /* L(do_sigret): */
-       addi    r1,r3,-0xd0
-       li      r0,SYS_ify(rt_sigreturn)
-       sc
-       /* NOTREACHED */
-
 END (__CONTEXT_FUNC_NAME)
index 0ef0ad7e35437e9dea578542df93b6c606991c97..e0fd2496153ade2392f1a2d748e376a511184b53 100644 (file)
@@ -280,23 +280,6 @@ 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
 
@@ -520,10 +503,4 @@ ENTRY(__CONTEXT_FUNC_NAME)
        mtlr    r0
        blr
 
-4:/*L(do_sigret):*/
-       addi    r1,r4,-0xd0
-       li      r0,SYS_ify(rt_sigreturn)
-       sc
-       /* NOTREACHED */
-
 END(__CONTEXT_FUNC_NAME)
index 4e3ab6647aa2052be6f138b37f11a9d032d1b4f1..d311a22c581f00a2f83f54eec52823ebd606999b 100644 (file)
@@ -46,20 +46,6 @@ ENTRY(__novec_setcontext)
   cfi_adjust_cfa_offset (128)
   mr    r31,r3
 
-/*
- * If this 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
- * msr and ctr.  We don't restore r13 since it will be used as
- * the TLS pointer.  */
-  ld     r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
-  cmpdi r0,0
-  bne    L(nv_do_sigret)
-
   li    r5,0
   addi  r4,r3,UCONTEXT_SIGMASK
   li    r3,SIG_SETMASK
@@ -200,22 +186,6 @@ L(nv_error_exit):
   mtlr r0
        ld   r31,-8(r1)
   blr
-
-  /* At this point we assume that the ucontext was created by a
-     rt_signal and we should use rt_sigreturn to restore the original
-     state.  As of the 2.4.21 kernel the ucontext is the first thing
-     (offset 0) in the rt_signal frame and rt_sigreturn expects the
-     ucontext address in R1.  Normally the rt-signal trampoline handles
-     this by popping dummy frame before the rt_signal syscall.  In our
-     case the stack may not be in its original (signal handler return with
-     R1 pointing at the dummy frame) state.  We do have the ucontext
-     address in R3, so simply copy R3 to R1 before the syscall.  */
-L(nv_do_sigret):
-  mr   r1,r3,
-  li   r0,SYS_ify(rt_sigreturn)
-  sc
-  /* No return.  */
-
 PSEUDO_END(__novec_setcontext)
 
 compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3)
@@ -235,20 +205,6 @@ ENTRY(__setcontext)
   cfi_adjust_cfa_offset (128)
   mr    r31,r3
 
-/*
- * If this 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
- * msr and ctr.  We don't restore r13 since it will be used as
- * the TLS pointer.  */
-  ld     r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
-  cmpdi r0,0
-  bne    L(do_sigret)
-
   li    r5,0
   addi  r4,r3,UCONTEXT_SIGMASK
   li    r3,SIG_SETMASK
@@ -493,21 +449,6 @@ L(error_exit):
        ld   r31,-8(r1)
   blr
 
-  /* At this point we assume that the ucontext was created by a
-     rt_signal and we should use rt_sigreturn to restore the original
-     state.  As of the 2.4.21 kernel the ucontext is the first thing
-     (offset 0) in the rt_signal frame and rt_sigreturn expects the
-     ucontext address in R1.  Normally the rt-signal trampoline handles
-     this by popping dummy frame before the rt_signal syscall.  In our
-     case the stack may not be in its original (signal handler return with
-     R1 pointing at the dummy frame) state.  We do have the ucontext
-     address in R3, so simply copy R3 to R1 before the syscall.  */
-L(do_sigret):
-  mr   r1,r3,
-  li   r0,SYS_ify(rt_sigreturn)
-  sc
-  /* No return.  */
-
 PSEUDO_END(__setcontext)
 
 versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4)
index af5b108e8cab0bac37782bda6cc226e6fe5bc9d1..6d07b1c36b77e7e3ca113a4d2a4f393071bd8dd9 100644 (file)
@@ -149,20 +149,6 @@ ENTRY(__novec_swapcontext)
   cmpdi  r3,0
   bne   L(nv_error_exit)
 
-/*
- * If this 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
- * msr and ctr.  We don't restore r13 since it will be used as
- * the TLS pointer.  */
-  ld     r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
-  cmpdi r0,0
-  bne    L(nv_do_sigret)
-
   ld   r8,.LC__dl_hwcap@toc(r2)
 # ifdef SHARED
 /* Load _rtld-global._dl_hwcap.  */
@@ -288,21 +274,6 @@ L(nv_error_exit):
   ld    r31,-8(r1)
   blr
 
-  /* At this point we assume that the ucontext was created by a
-     rt_signal and we should use rt_sigreturn to restore the original
-     state.  As of the 2.4.21 kernel the ucontext is the first thing
-     (offset 0) in the rt_signal frame and rt_sigreturn expects the
-     ucontext address in R1.  Normally the rt-signal trampoline handles
-     this by popping dummy frame before the rt_signal syscall.  In our
-     case the stack may not be in its original (signal handler return with
-     R1 pointing at the dummy frame) state.  We do have the ucontext
-     address in R3, so simply copy R3 to R1 before the syscall.  */
-L(nv_do_sigret):
-  mr   r1,r3,
-  li   r0,SYS_ify(rt_sigreturn)
-  sc
-  /* No return.  */
-
 PSEUDO_END(__novec_swapcontext)
 
 compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3)
@@ -535,20 +506,6 @@ L(has_no_vec):
   cmpdi  r3,0
   bne   L(error_exit)
 
-/*
- * If this 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
- * msr and ctr.  We don't restore r13 since it will be used as
- * the TLS pointer.  */
-  ld     r0,(SIGCONTEXT_GP_REGS+(PT_MSR*8))(r31)
-  cmpdi r0,0
-  bne    L(do_sigret)
-
   ld    r8,.LC__dl_hwcap@toc(r2)
   ld    r10,(SIGCONTEXT_V_REGS_PTR)(r31)
 # ifdef SHARED
@@ -777,21 +734,6 @@ L(error_exit):
   ld    r31,-8(r1)
   blr
 
-  /* At this point we assume that the ucontext was created by a
-     rt_signal and we should use rt_sigreturn to restore the original
-     state.  As of the 2.4.21 kernel the ucontext is the first thing
-     (offset 0) in the rt_signal frame and rt_sigreturn expects the
-     ucontext address in R1.  Normally the rt-signal trampoline handles
-     this by popping dummy frame before the rt_signal syscall.  In our
-     case the stack may not be in its original (signal handler return with
-     R1 pointing at the dummy frame) state.  We do have the ucontext
-     address in R3, so simply copy R3 to R1 before the syscall.  */
-L(do_sigret):
-  mr   r1,r3,
-  li   r0,SYS_ify(rt_sigreturn)
-  sc
-  /* No return.  */
-
 PSEUDO_END(__swapcontext)
 
 versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)