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 @@ ...@@ -32,23 +32,10 @@
#include "l.h" #include "l.h"
#include "../ld/lib.h" #include "../ld/lib.h"
#include "../../pkg/runtime/stack.h"
static void xfol(Prog*, Prog**); 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* Prog*
brchain(Prog *p) brchain(Prog *p)
{ {
......
...@@ -714,7 +714,7 @@ runtime·oldstack(void) ...@@ -714,7 +714,7 @@ runtime·oldstack(void)
goid = old.gobuf.g->goid; // fault if g is bad, before gogo goid = old.gobuf.g->goid; // fault if g is bad, before gogo
if(old.free != 0) if(old.free != 0)
runtime·stackfree(g1->stackguard - StackGuard - StackSystem, old.free); runtime·stackfree(g1->stackguard - StackGuard, old.free);
g1->stackbase = old.stackbase; g1->stackbase = old.stackbase;
g1->stackguard = old.stackguard; g1->stackguard = old.stackguard;
...@@ -756,7 +756,7 @@ runtime·newstack(void) ...@@ -756,7 +756,7 @@ runtime·newstack(void)
// the new Stktop* is necessary to unwind, but // the new Stktop* is necessary to unwind, but
// we don't need to create a new segment. // we don't need to create a new segment.
top = (Stktop*)(m->morebuf.sp - sizeof(*top)); top = (Stktop*)(m->morebuf.sp - sizeof(*top));
stk = g1->stackguard - StackGuard - StackSystem; stk = g1->stackguard - StackGuard;
free = 0; free = 0;
} else { } else {
// allocate new segment. // allocate new segment.
...@@ -785,7 +785,7 @@ runtime·newstack(void) ...@@ -785,7 +785,7 @@ runtime·newstack(void)
g1->ispanic = false; g1->ispanic = false;
g1->stackbase = (byte*)top; g1->stackbase = (byte*)top;
g1->stackguard = stk + StackGuard + StackSystem; g1->stackguard = stk + StackGuard;
sp = (byte*)top; sp = (byte*)top;
if(argsize > 0) { if(argsize > 0) {
...@@ -834,7 +834,7 @@ runtime·malg(int32 stacksize) ...@@ -834,7 +834,7 @@ runtime·malg(int32 stacksize)
g->param = nil; g->param = nil;
} }
newg->stack0 = stk; newg->stack0 = stk;
newg->stackguard = stk + StackSystem + StackGuard; newg->stackguard = stk + StackGuard;
newg->stackbase = stk + StackSystem + stacksize - sizeof(Stktop); newg->stackbase = stk + StackSystem + stacksize - sizeof(Stktop);
runtime·memclr(newg->stackbase, sizeof(Stktop)); runtime·memclr(newg->stackbase, sizeof(Stktop));
} }
...@@ -880,7 +880,7 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc) ...@@ -880,7 +880,7 @@ runtime·newproc1(byte *fn, byte *argp, int32 narg, int32 nret, void *callerpc)
if((newg = gfget()) != nil){ if((newg = gfget()) != nil){
newg->status = Gwaiting; newg->status = Gwaiting;
if(newg->stackguard - StackGuard - StackSystem != newg->stack0) if(newg->stackguard - StackGuard != newg->stack0)
runtime·throw("invalid stack in newg"); runtime·throw("invalid stack in newg");
} else { } else {
newg = runtime·malg(StackMin); newg = runtime·malg(StackMin);
...@@ -1165,7 +1165,7 @@ nomatch: ...@@ -1165,7 +1165,7 @@ nomatch:
static void static void
gfput(G *g) gfput(G *g)
{ {
if(g->stackguard - StackGuard - StackSystem != g->stack0) if(g->stackguard - StackGuard != g->stack0)
runtime·throw("invalid stack in gfput"); runtime·throw("invalid stack in gfput");
g->schedlink = runtime·sched.gfree; g->schedlink = runtime·sched.gfree;
runtime·sched.gfree = g; runtime·sched.gfree = g;
......
...@@ -597,17 +597,3 @@ int32 runtime·chancap(Hchan*); ...@@ -597,17 +597,3 @@ int32 runtime·chancap(Hchan*);
void runtime·ifaceE2I(struct InterfaceType*, Eface, Iface*); 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. ...@@ -53,6 +53,16 @@ functions to make sure that this limit cannot be violated.
*/ */
enum { 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 // The amount of extra stack to allocate beyond the size
// needed for the single frame that triggered the split. // needed for the single frame that triggered the split.
StackExtra = 1024, StackExtra = 1024,
...@@ -73,7 +83,7 @@ enum { ...@@ -73,7 +83,7 @@ enum {
// The stack guard is a pointer this many bytes above the // The stack guard is a pointer this many bytes above the
// bottom of the stack. // bottom of the stack.
StackGuard = 256, StackGuard = 256 + StackSystem,
// After a stack split check the SP is allowed to be this // After a stack split check the SP is allowed to be this
// many bytes below the stack guard. This saves an instruction // many bytes below the stack guard. This saves an instruction
...@@ -82,5 +92,5 @@ enum { ...@@ -82,5 +92,5 @@ enum {
// The maximum number of bytes that a chain of NOSPLIT // The maximum number of bytes that a chain of NOSPLIT
// functions can use. // 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