aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndreas Schwab <schwab@linux-m68k.org>2012-11-01 20:10:39 -0500
committerRyan S. Arnold <rsa@linux.vnet.ibm.com>2012-11-01 20:10:39 -0500
commitd6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd (patch)
treea8b77f77b54a1dd6dcf9d145874897adc4d9bb47
parentb3563932f85d60bb0d38b0a5f3b8f4abc133f890 (diff)
downloadglibc-d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd.tar
glibc-d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd.tar.gz
glibc-d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd.tar.bz2
glibc-d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd.zip
PowerPC: Fix uc_link == NULL handling for makecontex.
If the function registered with makecontext returns with a NULL context link the process should exit with zero, not non-zero.
-rw-r--r--ChangeLog5
-rw-r--r--sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S30
2 files changed, 20 insertions, 15 deletions
diff --git a/ChangeLog b/ChangeLog
index b2f40c367a..0600968d6a 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2012-11-01 Andreas Schwab <schwab@linux-m68k.org>
+
+ * sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S: If the
+ function returns with a NULL context exit with zero.
+
2012-11-01 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
* sysdeps/powerpc/Makefile (cflags): Remove -mnew-mnemonics.
diff --git a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
index ded2a35e01..0939a6539b 100644
--- a/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
+++ b/sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S
@@ -134,26 +134,26 @@ L(noparms):
'makecontext' call. If the pointer is NULL the process must
terminate. */
L(exitcode):
- /* Recover the ucontext and TOC from the dummy frame. */
- ld r1,FRAME_BACKCHAIN(r1) /* Unstack the parameter save area frame. */
- ld r3,FRAME_PARM1_SAVE(r1)
- ld r2,FRAME_TOC_SAVE(r1)
- ld r3,UCONTEXT_LINK(r3) /* Load the resume context. */
- cmpdi r3,0
- beq L(BADSTATUS)
+ /* Recover the ucontext and TOC from the dummy frame. */
+ ld r1,FRAME_BACKCHAIN(r1) /* Unstack the parameter save area frame. */
+ ld r3,FRAME_PARM1_SAVE(r1)
+ ld r2,FRAME_TOC_SAVE(r1)
+ ld r3,UCONTEXT_LINK(r3) /* Load the resume context. */
+ cmpdi r3,0
+ beq L(do_exit)
bl JUMPTARGET(__setcontext)
nop
-
-L(BADSTATUS):
-/* If setcontext returns (which can happen if the syscall fails) we will
- exit the program with error status (-1). */
- li r3,-1
+ /* If setcontext returns (which can happen if the syscall fails) we will
+ exit the program with error status (-1). */
+ li r3,-1
+L(do_exit):
#ifdef SHARED
- b JUMPTARGET(__GI_exit);
+ b JUMPTARGET(__GI_exit);
#else
- b JUMPTARGET(exit);
- nop
+ b JUMPTARGET(exit);
+ nop
#endif
+ b L(do_exit)
/* The address of the exit code is in the link register. Store the lr
in the ucontext as LNK so the target function will return to our