Commit b701cf33 authored by Alexey Borzenkov's avatar Alexey Borzenkov Committed by Russ Cox

runtime: make StackSystem part of StackGuard

Fixes #1779

R=rsc
CC=golang-dev
https://golang.org/cl/4543052
parent e69b9ddd
......@@ -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)
{
......
......@@ -714,7 +714,7 @@ runtime·oldstack(void)
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 @@ runtime·newstack(void)
// 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 @@ runtime·newstack(void)
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 @@ runtime·malg(int32 stacksize)
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 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc)
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 @@ nomatch:
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;
......
......@@ -597,17 +597,3 @@ int32 runtime·chancap(Hchan*);
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
};
......@@ -53,6 +53,16 @@ functions to make sure that this limit cannot be violated.
*/
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 @@ enum {
// 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 @@ enum {
// The maximum number of bytes that a chain of NOSPLIT
// functions can use.
StackLimit = StackGuard - StackSmall,
StackLimit = StackGuard - StackSystem - StackSmall,
};
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment