runtime: make StackSystem part of StackGuard

Fixes #1779

R=rsc
CC=golang-dev
https://golang.org/cl/4543052
diff --git a/src/cmd/8l/pass.c b/src/cmd/8l/pass.c
index 28589b6..72ae043 100644
--- a/src/cmd/8l/pass.c
+++ b/src/cmd/8l/pass.c
@@ -32,23 +32,10 @@
 
 #include	"l.h"
 #include	"../ld/lib.h"
+#include "../../pkg/runtime/stack.h"
 
 static void xfol(Prog*, Prog**);
 
-// see ../../pkg/runtime/proc.c:/StackGuard
-enum
-{
-#ifdef __WINDOWS__
-	// use larger stacks to compensate for larger stack guard,
-	// needed for exception handling.
-	StackSmall = 256,
-	StackBig = 8192,
-#else
-	StackSmall = 128,
-	StackBig = 4096,
-#endif
-};
-
 Prog*
 brchain(Prog *p)
 {
diff --git a/src/pkg/runtime/proc.c b/src/pkg/runtime/proc.c
index 61faa15..c5af8b7 100644
--- a/src/pkg/runtime/proc.c
+++ b/src/pkg/runtime/proc.c
@@ -714,7 +714,7 @@
 	goid = old.gobuf.g->goid;	// fault if g is bad, before gogo
 
 	if(old.free != 0)
-		runtime·stackfree(g1->stackguard - StackGuard - StackSystem, old.free);
+		runtime·stackfree(g1->stackguard - StackGuard, old.free);
 	g1->stackbase = old.stackbase;
 	g1->stackguard = old.stackguard;
 
@@ -756,7 +756,7 @@
 		// the new Stktop* is necessary to unwind, but
 		// we don't need to create a new segment.
 		top = (Stktop*)(m->morebuf.sp - sizeof(*top));
-		stk = g1->stackguard - StackGuard - StackSystem;
+		stk = g1->stackguard - StackGuard;
 		free = 0;
 	} else {
 		// allocate new segment.
@@ -785,7 +785,7 @@
 	g1->ispanic = false;
 
 	g1->stackbase = (byte*)top;
-	g1->stackguard = stk + StackGuard + StackSystem;
+	g1->stackguard = stk + StackGuard;
 
 	sp = (byte*)top;
 	if(argsize > 0) {
@@ -834,7 +834,7 @@
 			g->param = nil;
 		}
 		newg->stack0 = stk;
-		newg->stackguard = stk + StackSystem + StackGuard;
+		newg->stackguard = stk + StackGuard;
 		newg->stackbase = stk + StackSystem + stacksize - sizeof(Stktop);
 		runtime·memclr(newg->stackbase, sizeof(Stktop));
 	}
@@ -880,7 +880,7 @@
 
 	if((newg = gfget()) != nil){
 		newg->status = Gwaiting;
-		if(newg->stackguard - StackGuard - StackSystem != newg->stack0)
+		if(newg->stackguard - StackGuard != newg->stack0)
 			runtime·throw("invalid stack in newg");
 	} else {
 		newg = runtime·malg(StackMin);
@@ -1165,7 +1165,7 @@
 static void
 gfput(G *g)
 {
-	if(g->stackguard - StackGuard - StackSystem != g->stack0)
+	if(g->stackguard - StackGuard != g->stack0)
 		runtime·throw("invalid stack in gfput");
 	g->schedlink = runtime·sched.gfree;
 	runtime·sched.gfree = g;
diff --git a/src/pkg/runtime/runtime.h b/src/pkg/runtime/runtime.h
index f9b404e..f2f8dcd 100644
--- a/src/pkg/runtime/runtime.h
+++ b/src/pkg/runtime/runtime.h
@@ -597,17 +597,3 @@
 
 void	runtime·ifaceE2I(struct InterfaceType*, Eface, Iface*);
 
-enum
-{
-	// StackSystem is a number of additional bytes to add
-	// to each stack below the usual guard area for OS-specific
-	// purposes like signal handling.
-	// TODO(rsc): This is only for Windows.  Can't Windows use
-	// a separate exception stack like every other operating system?
-#ifdef __WINDOWS__
-	StackSystem = 2048,
-#else
-	StackSystem = 0,
-#endif
-};
-
diff --git a/src/pkg/runtime/stack.h b/src/pkg/runtime/stack.h
index ebf0462..2b6b0e3 100644
--- a/src/pkg/runtime/stack.h
+++ b/src/pkg/runtime/stack.h
@@ -53,6 +53,16 @@
  */
 
 enum {
+	// StackSystem is a number of additional bytes to add
+	// to each stack below the usual guard area for OS-specific
+	// purposes like signal handling. Used on Windows because
+	// it does not use a separate stack.
+#ifdef __WINDOWS__
+	StackSystem = 2048,
+#else
+	StackSystem = 0,
+#endif
+
 	// The amount of extra stack to allocate beyond the size
 	// needed for the single frame that triggered the split.
 	StackExtra = 1024,
@@ -73,7 +83,7 @@
 
 	// The stack guard is a pointer this many bytes above the
 	// bottom of the stack.
-	StackGuard = 256,
+	StackGuard = 256 + StackSystem,
 
 	// After a stack split check the SP is allowed to be this
 	// many bytes below the stack guard.  This saves an instruction
@@ -82,5 +92,5 @@
 
 	// The maximum number of bytes that a chain of NOSPLIT
 	// functions can use.
-	StackLimit = StackGuard - StackSmall,
+	StackLimit = StackGuard - StackSystem - StackSmall,
 };