This patch to libgo records the top of the g0 goroutine stack correctly
when not using -fsplit-stack.  Without this patch the garbage collector
would scan beyond the top of the stack when looking at the g0 stack,
which could cause segmentation violations.  Bootstrapped and ran Go
testsuite on x86_64-unknown-linux-gnu.  Committed to mainline.

Ian

diff -r 971ec6345e64 libgo/runtime/proc.c
--- a/libgo/runtime/proc.c	Fri Feb 10 07:50:54 2012 -0800
+++ b/libgo/runtime/proc.c	Fri Feb 10 07:52:48 2012 -0800
@@ -909,7 +909,9 @@
 	__splitstack_getcontext(&g->stack_context[0]);
 #else
 	g->gcinitial_sp = ∓
-	g->gcstack_size = StackMin;
+	// Setting gcstack_size to 0 is a marker meaning that gcinitial_sp
+	// is the top of the stack, not the bottom.
+	g->gcstack_size = 0;
 	g->gcnext_sp = ∓
 #endif
 	getcontext(&g->context);
@@ -1267,6 +1269,8 @@
 #else
 		sp = newg->gcinitial_sp;
 		spsize = newg->gcstack_size;
+		if(spsize == 0)
+			runtime_throw("bad spsize in __go_go");
 		newg->gcnext_sp = sp;
 #endif
 	} else {

Reply via email to