diff options
author | Andreas Schwab <schwab@linux-m68k.org> | 2012-11-01 20:10:39 -0500 |
---|---|---|
committer | Ryan S. Arnold <rsa@linux.vnet.ibm.com> | 2012-11-01 20:10:39 -0500 |
commit | d6cffd3ec0b21914424d7e6e6b4c688f3b8b3fcd (patch) | |
tree | a8b77f77b54a1dd6dcf9d145874897adc4d9bb47 | |
parent | b3563932f85d60bb0d38b0a5f3b8f4abc133f890 (diff) | |
download | glibc-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-- | ChangeLog | 5 | ||||
-rw-r--r-- | sysdeps/unix/sysv/linux/powerpc/powerpc64/makecontext.S | 30 |
2 files changed, 20 insertions, 15 deletions
@@ -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 |