From: David du Colombier <0intro@gmail.com> Date: Fri, 14 Feb 2014 21:27:47 +0000 (+0100) Subject: runtime: fix "invalid address in sys call" on Plan 9 X-Git-Tag: go1.3beta1~691 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=56872f02f0f69f32d4d919e4cacee9672e7a5a97;p=gostls13.git runtime: fix "invalid address in sys call" on Plan 9 Rfork is not splitting the stack when creating a new thread, so the parent and child are executing on the same stack. However, if the parent returns and keeps executing before the child can read the arguments from the parent stack, the child will not see the right arguments. The solution is to load the needed pieces from the parent stack into register before INT $64. Thanks to Russ Cox for the explanation. LGTM=rsc R=rsc CC=ality, golang-codereviews https://golang.org/cl/64140043 --- diff --git a/src/pkg/runtime/sys_plan9_386.s b/src/pkg/runtime/sys_plan9_386.s index bed0f7ebe0..2513af9cba 100644 --- a/src/pkg/runtime/sys_plan9_386.s +++ b/src/pkg/runtime/sys_plan9_386.s @@ -81,6 +81,10 @@ TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0 TEXT runtime·rfork(SB),NOSPLIT,$0 MOVL $19, AX // rfork + MOVL stack+8(SP), CX + MOVL mm+12(SP), BX // m + MOVL gg+16(SP), DX // g + MOVL fn+20(SP), SI // fn INT $64 // In parent, return. @@ -88,13 +92,7 @@ TEXT runtime·rfork(SB),NOSPLIT,$0 JEQ 2(PC) RET - // In child on old stack. - MOVL mm+12(SP), BX // m - MOVL gg+16(SP), DX // g - MOVL fn+20(SP), SI // fn - // set SP to be on the new child stack - MOVL stack+8(SP), CX MOVL CX, SP // Initialize m, g.