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.
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
mtlr r0
blr
-
-4: /* L(do_sigret): */
- addi r1,r3,-0xd0
- li r0,SYS_ify(rt_sigreturn)
- sc
- /* NOTREACHED */
-
END (__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
mtlr r0
blr
-4:/*L(do_sigret):*/
- addi r1,r4,-0xd0
- li r0,SYS_ify(rt_sigreturn)
- sc
- /* NOTREACHED */
-
END(__CONTEXT_FUNC_NAME)
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
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)
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
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)
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. */
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)
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
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)