]> granicus.if.org Git - musl/commitdiff
fix thread structure/dtv-pointer corruption on powerpc
authorRich Felker <dalias@aerifal.cx>
Mon, 25 Apr 2016 23:37:06 +0000 (19:37 -0400)
committerRich Felker <dalias@aerifal.cx>
Mon, 25 Apr 2016 23:37:06 +0000 (19:37 -0400)
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.

src/thread/powerpc/clone.s

index dc5c74c6464a8fd600f6a0b2e6e882c939711c54..a57dbcced8f357c13db3ac23e727823a5597da05 100644 (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