From 56872f02f0f69f32d4d919e4cacee9672e7a5a97 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 14 Feb 2014 22:27:47 +0100 Subject: [PATCH] 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 --- src/pkg/runtime/sys_plan9_386.s | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) 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. -- 2.48.1