mirror of
https://github.com/golang/go
synced 2024-11-25 00:17:58 -07:00
runtime: make StackSystem part of StackGuard
Fixes #1779 R=rsc CC=golang-dev https://golang.org/cl/4543052
This commit is contained in:
parent
e69b9ddd42
commit
b701cf3332
@ -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)
|
|||||||
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)
|
|||||||
// 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)
|
|||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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:
|
|||||||
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*);
|
|||||||
|
|
||||||
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.
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
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 {
|
|||||||
|
|
||||||
// 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 {
|
|||||||
|
|
||||||
// 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,
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user