PowerPC: Fix uc_link == NULL handling for makecontex.
authorAndreas Schwab <schwab@linux-m68k.org>
Fri, 2 Nov 2012 01:10:39 +0000 (20:10 -0500)
committerRyan S. Arnold <rsa@linux.vnet.ibm.com>
Fri, 2 Nov 2012 01:10:39 +0000 (20:10 -0500)
If the function registered with makecontext returns with a NULL context
link the process should exit with zero, not non-zero.

ChangeLog
sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S

index b2f40c3..0600968 100644 (file)
--- 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.
index ded2a35..0939a65 100644 (file)
@@ -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