#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)
 {
 
        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;
 
                // 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.
        g1->ispanic = false;
 
        g1->stackbase = (byte*)top;
-       g1->stackguard = stk + StackGuard + StackSystem;
+       g1->stackguard = stk + StackGuard;
 
        sp = (byte*)top;
        if(argsize > 0) {
                        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));
        }
 
        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);
 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;
 
 
 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
-};
-
 
  */
 
 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,
 
        // 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
 
        // The maximum number of bytes that a chain of NOSPLIT
        // functions can use.
-       StackLimit = StackGuard - StackSmall,
+       StackLimit = StackGuard - StackSystem - StackSmall,
 };