mirror of
https://sourceware.org/git/glibc.git
synced 2025-07-30 22:43:12 +03:00
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:
@ -1,5 +1,12 @@
|
|||||||
2019-04-17 Adhemerval Zanella <adhemerval.zanella@linaro.org>
|
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,
|
* support/Makefile (libsupport-routines): Add support_subprocess,
|
||||||
xposix_spawn, xposix_spawn_file_actions_addclose, and
|
xposix_spawn, xposix_spawn_file_actions_addclose, and
|
||||||
xposix_spawn_file_actions_adddup2.
|
xposix_spawn_file_actions_adddup2.
|
||||||
|
@ -47,21 +47,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
|
|||||||
cfi_offset(r31,-4)
|
cfi_offset(r31,-4)
|
||||||
lwz r31,_UC_REGS_PTR(r3)
|
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 */
|
/* Restore the signal mask */
|
||||||
li r5,0
|
li r5,0
|
||||||
addi r4,r3,_UC_SIGMASK
|
addi r4,r3,_UC_SIGMASK
|
||||||
@ -296,11 +281,4 @@ ENTRY(__CONTEXT_FUNC_NAME)
|
|||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
|
|
||||||
4: /* L(do_sigret): */
|
|
||||||
addi r1,r3,-0xd0
|
|
||||||
li r0,SYS_ify(rt_sigreturn)
|
|
||||||
sc
|
|
||||||
/* NOTREACHED */
|
|
||||||
|
|
||||||
END (__CONTEXT_FUNC_NAME)
|
END (__CONTEXT_FUNC_NAME)
|
||||||
|
@ -280,23 +280,6 @@ ENTRY(__CONTEXT_FUNC_NAME)
|
|||||||
cmpwi r3,0
|
cmpwi r3,0
|
||||||
bne 3f /* L(error_exit) */
|
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_FPRS
|
||||||
# ifdef __CONTEXT_ENABLE_VRS
|
# ifdef __CONTEXT_ENABLE_VRS
|
||||||
|
|
||||||
@ -520,10 +503,4 @@ ENTRY(__CONTEXT_FUNC_NAME)
|
|||||||
mtlr r0
|
mtlr r0
|
||||||
blr
|
blr
|
||||||
|
|
||||||
4:/*L(do_sigret):*/
|
|
||||||
addi r1,r4,-0xd0
|
|
||||||
li r0,SYS_ify(rt_sigreturn)
|
|
||||||
sc
|
|
||||||
/* NOTREACHED */
|
|
||||||
|
|
||||||
END(__CONTEXT_FUNC_NAME)
|
END(__CONTEXT_FUNC_NAME)
|
||||||
|
@ -46,20 +46,6 @@ ENTRY(__novec_setcontext)
|
|||||||
cfi_adjust_cfa_offset (128)
|
cfi_adjust_cfa_offset (128)
|
||||||
mr r31,r3
|
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
|
li r5,0
|
||||||
addi r4,r3,UCONTEXT_SIGMASK
|
addi r4,r3,UCONTEXT_SIGMASK
|
||||||
li r3,SIG_SETMASK
|
li r3,SIG_SETMASK
|
||||||
@ -200,22 +186,6 @@ L(nv_error_exit):
|
|||||||
mtlr r0
|
mtlr r0
|
||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
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)
|
PSEUDO_END(__novec_setcontext)
|
||||||
|
|
||||||
compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3)
|
compat_symbol (libc, __novec_setcontext, setcontext, GLIBC_2_3)
|
||||||
@ -235,20 +205,6 @@ ENTRY(__setcontext)
|
|||||||
cfi_adjust_cfa_offset (128)
|
cfi_adjust_cfa_offset (128)
|
||||||
mr r31,r3
|
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
|
li r5,0
|
||||||
addi r4,r3,UCONTEXT_SIGMASK
|
addi r4,r3,UCONTEXT_SIGMASK
|
||||||
li r3,SIG_SETMASK
|
li r3,SIG_SETMASK
|
||||||
@ -493,21 +449,6 @@ L(error_exit):
|
|||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
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)
|
PSEUDO_END(__setcontext)
|
||||||
|
|
||||||
versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4)
|
versioned_symbol (libc, __setcontext, setcontext, GLIBC_2_3_4)
|
||||||
|
@ -149,20 +149,6 @@ ENTRY(__novec_swapcontext)
|
|||||||
cmpdi r3,0
|
cmpdi r3,0
|
||||||
bne L(nv_error_exit)
|
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)
|
ld r8,.LC__dl_hwcap@toc(r2)
|
||||||
# ifdef SHARED
|
# ifdef SHARED
|
||||||
/* Load _rtld-global._dl_hwcap. */
|
/* Load _rtld-global._dl_hwcap. */
|
||||||
@ -288,21 +274,6 @@ L(nv_error_exit):
|
|||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
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)
|
PSEUDO_END(__novec_swapcontext)
|
||||||
|
|
||||||
compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3)
|
compat_symbol (libc, __novec_swapcontext, swapcontext, GLIBC_2_3)
|
||||||
@ -535,20 +506,6 @@ L(has_no_vec):
|
|||||||
cmpdi r3,0
|
cmpdi r3,0
|
||||||
bne L(error_exit)
|
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 r8,.LC__dl_hwcap@toc(r2)
|
||||||
ld r10,(SIGCONTEXT_V_REGS_PTR)(r31)
|
ld r10,(SIGCONTEXT_V_REGS_PTR)(r31)
|
||||||
# ifdef SHARED
|
# ifdef SHARED
|
||||||
@ -777,21 +734,6 @@ L(error_exit):
|
|||||||
ld r31,-8(r1)
|
ld r31,-8(r1)
|
||||||
blr
|
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)
|
PSEUDO_END(__swapcontext)
|
||||||
|
|
||||||
versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)
|
versioned_symbol (libc, __swapcontext, swapcontext, GLIBC_2_3_4)
|
||||||
|
Reference in New Issue
Block a user