From 0578e03b85d046cebf658fe2751efa986fec6f04 Mon Sep 17 00:00:00 2001 From: David du Colombier <0intro@gmail.com> Date: Fri, 14 Feb 2014 22:27:47 +0100 Subject: 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://codereview.appspot.com/64140043 --- src/pkg/runtime/sys_plan9_386.s | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) (limited to 'src') diff --git a/src/pkg/runtime/sys_plan9_386.s b/src/pkg/runtime/sys_plan9_386.s index bed0f7ebe..2513af9cb 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. -- cgit v1.2.1