fix thread structure/dtv-pointer corruption on powerpc

per the powerpc psabi, offset 4 of the stack at call time belongs to
the callee and is used for spilling lr (return address). in addition,
offset 0 on the stack must contain a pointer to the previous stack
frame, or a null pointer for the initial stack frame of a thread.
__clone failed to setup any stack frame on the new thread's stack,
thereby allowing the start function it called to clobber offset 4 of
the new thread's struct __pthread, which contains the dtv pointer.

add code to setup a proper stack frame and align the stack pointer to
a multiple of 16 (also an abi requirement) if it was not already
aligned.
This commit is contained in:
Rich Felker 2016-04-25 19:37:06 -04:00
parent e7d05c7894
commit be999f7a54
1 changed files with 5 additions and 0 deletions

View File

@ -22,6 +22,11 @@ stw 31, 4(1)
mr 30, 3
mr 31, 6
# create initial stack frame for new thread
clrrwi 4, 4, 4
li 0, 0
stwu 0, -16(4)
#move c into first arg
mr 3, 5
#mr 4, 4