powerpc: Remove rt_sigreturn usage on context function

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
This commit is contained in:
Adhemerval Zanella 2019-02-15 11:55:16 -02:00
parent 0e16969129
commit ffe8a9a831
5 changed files with 7 additions and 162 deletions

View File

@ -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.

View 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)

View 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)

View 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)

View 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)