From: Rich Felker Date: Mon, 25 Apr 2016 23:37:06 +0000 (-0400) Subject: fix thread structure/dtv-pointer corruption on powerpc X-Git-Tag: v1.1.15~67 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=be999f7a54e81656ea0409030205177327a7450c;p=musl 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. --- diff --git a/src/thread/powerpc/clone.s b/src/thread/powerpc/clone.s index dc5c74c6..a57dbcce 100644 --- a/src/thread/powerpc/clone.s +++ b/src/thread/powerpc/clone.s @@ -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