aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoseph Myers <joseph@codesourcery.com>2017-01-16 21:34:48 +0000
committerJoseph Myers <joseph@codesourcery.com>2017-01-16 21:34:48 +0000
commitb040e1b0842c35ab444e8502db6ae59389d1e3d5 (patch)
tree0a16223224cd1a2defdfb03773bec88883ab87af
parent502697713f4f129b602d7213253a9982ee1989f1 (diff)
downloadglibc-b040e1b0842c35ab444e8502db6ae59389d1e3d5.zip
glibc-b040e1b0842c35ab444e8502db6ae59389d1e3d5.tar.gz
glibc-b040e1b0842c35ab444e8502db6ae59389d1e3d5.tar.bz2
Make soft-float powerpc swapcontext restore the signal mask (bug 21045).
The soft-float powerpc version of swapcontext does not restore the signal mask, resulting in stdlib/tst-setcontext2 failing: after getcontext after setcontext after swapcontext FAIL: SIGUSR2 is blocked after swapcontext. This patch fixes this by adjusting the arguments passed to __sigprocmask so that it restores the saved signal mask as well as saving the existing one. (For hard-float, this code is only used for a compat symbol, not for the current version of swapcontext.) Tested for soft-float powerpc. [BZ #21045] * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S (__CONTEXT_FUNC_NAME): Pass address of signal mask to be restored to __sigprocmask.
-rw-r--r--ChangeLog7
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S3
2 files changed, 9 insertions, 1 deletions
diff --git a/ChangeLog b/ChangeLog
index 9498803..66ce72b 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+2017-01-16 Joseph Myers <joseph@codesourcery.com>
+
+ [BZ #21045]
+ * sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
+ (__CONTEXT_FUNC_NAME): Pass address of signal mask to be restored
+ to __sigprocmask.
+
2017-01-16 Chris Metcalf <cmetcalf@mellanox.com>
* sysdeps/tile/tilegx/memchr.c (__memchr): Handle pointer
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
index a0bcbf1..6696d54 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc32/swapcontext-common.S
@@ -271,7 +271,8 @@ ENTRY(__CONTEXT_FUNC_NAME)
/* 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