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.
This commit is contained in:
Andreas Schwab 2012-11-01 20:10:39 -05:00 committed by Ryan S. Arnold
parent b3563932f8
commit d6cffd3ec0
2 changed files with 20 additions and 15 deletions

View File

@ -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> 2012-11-01 Tulio Magno Quites Machado Filho <tuliom@linux.vnet.ibm.com>
* sysdeps/powerpc/Makefile (cflags): Remove -mnew-mnemonics. * sysdeps/powerpc/Makefile (cflags): Remove -mnew-mnemonics.

View File

@ -134,26 +134,26 @@ L(noparms):
'makecontext' call. If the pointer is NULL the process must 'makecontext' call. If the pointer is NULL the process must
terminate. */ terminate. */
L(exitcode): L(exitcode):
/* Recover the ucontext and TOC from the dummy frame. */ /* Recover the ucontext and TOC from the dummy frame. */
ld r1,FRAME_BACKCHAIN(r1) /* Unstack the parameter save area frame. */ ld r1,FRAME_BACKCHAIN(r1) /* Unstack the parameter save area frame. */
ld r3,FRAME_PARM1_SAVE(r1) ld r3,FRAME_PARM1_SAVE(r1)
ld r2,FRAME_TOC_SAVE(r1) ld r2,FRAME_TOC_SAVE(r1)
ld r3,UCONTEXT_LINK(r3) /* Load the resume context. */ ld r3,UCONTEXT_LINK(r3) /* Load the resume context. */
cmpdi r3,0 cmpdi r3,0
beq L(BADSTATUS) beq L(do_exit)
bl JUMPTARGET(__setcontext) bl JUMPTARGET(__setcontext)
nop nop
/* If setcontext returns (which can happen if the syscall fails) we will
L(BADSTATUS): exit the program with error status (-1). */
/* If setcontext returns (which can happen if the syscall fails) we will li r3,-1
exit the program with error status (-1). */ L(do_exit):
li r3,-1
#ifdef SHARED #ifdef SHARED
b JUMPTARGET(__GI_exit); b JUMPTARGET(__GI_exit);
#else #else
b JUMPTARGET(exit); b JUMPTARGET(exit);
nop nop
#endif #endif
b L(do_exit)
/* The address of the exit code is in the link register. Store the lr /* 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 in the ucontext as LNK so the target function will return to our