]> Cypherpunks repositories - gostls13.git/commitdiff
runtime: fix "invalid address in sys call" on Plan 9
authorDavid du Colombier <0intro@gmail.com>
Fri, 14 Feb 2014 21:27:47 +0000 (22:27 +0100)
committerDavid du Colombier <0intro@gmail.com>
Fri, 14 Feb 2014 21:27:47 +0000 (22:27 +0100)
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

src/pkg/runtime/sys_plan9_386.s

index bed0f7ebe049c2600a7454f378729918d20e7672..2513af9cba038df0d372b0d414bda8bfa8b9b0b5 100644 (file)
@@ -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.