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:
parent
b3563932f8
commit
d6cffd3ec0
@ -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.
|
||||||
|
@ -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
|
||||||
|
Loading…
x
Reference in New Issue
Block a user