about summary refs log tree commit diff
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.gz
glibc-d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd.tar.xz
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