Commit 79e1db2d authored by Russ Cox's avatar Russ Cox

add stub routines stackalloc() and stackfree().

run oldstack on g0's stack, just like newstack does,
so that oldstack can free the old stack.

R=r
DELTA=53  (44 added, 0 deleted, 9 changed)
OCL=20404
CL=20433
parent c7bab46d
...@@ -25,6 +25,7 @@ LIBOFILES=\ ...@@ -25,6 +25,7 @@ LIBOFILES=\
print.$O\ print.$O\
rune.$O\ rune.$O\
proc.$O\ proc.$O\
stack.$O\
string.$O\ string.$O\
symtab.$O\ symtab.$O\
sys_file.$O\ sys_file.$O\
......
...@@ -567,6 +567,7 @@ oldstack(void) ...@@ -567,6 +567,7 @@ oldstack(void)
Stktop *top; Stktop *top;
uint32 siz2; uint32 siz2;
byte *sp; byte *sp;
uint64 oldsp, oldpc, oldbase, oldguard;
// printf("oldstack m->cret=%p\n", m->cret); // printf("oldstack m->cret=%p\n", m->cret);
...@@ -581,15 +582,36 @@ oldstack(void) ...@@ -581,15 +582,36 @@ oldstack(void)
mcpy(top->oldsp+16, sp, siz2); mcpy(top->oldsp+16, sp, siz2);
} }
// call no more functions after this point - stackguard disagrees with SP oldsp = (uint64)top->oldsp + 8;
m->curg->stackbase = top->oldbase; oldpc = *(uint64*)(top->oldsp + 8);
m->curg->stackguard = top->oldguard; oldbase = (uint64)top->oldbase;
m->morestack.SP = top->oldsp+8; oldguard = (uint64)top->oldguard;
m->morestack.PC = (byte*)(*(uint64*)(top->oldsp+8));
stackfree((byte*)m->curg->stackguard - 512 - 160);
m->curg->stackbase = (byte*)oldbase;
m->curg->stackguard = (byte*)oldguard;
m->morestack.SP = (byte*)oldsp;
m->morestack.PC = (byte*)oldpc;
// These two lines must happen in sequence;
// once g has been changed, must switch to g's stack
// before calling any non-assembly functions.
// TODO(rsc): Perhaps make the new g a parameter
// to gogoret and setspgoto, so that g is never
// explicitly assigned to without also setting
// the stack pointer.
g = m->curg;
gogoret(&m->morestack, m->cret); gogoret(&m->morestack, m->cret);
} }
void
lessstack(void)
{
g = m->g0;
setspgoto(m->sched.SP, oldstack, nil);
}
void void
newstack(void) newstack(void)
{ {
...@@ -611,7 +633,7 @@ newstack(void) ...@@ -611,7 +633,7 @@ newstack(void)
if(siz1 < 4096) if(siz1 < 4096)
siz1 = 4096; siz1 = 4096;
stk = mal(siz1 + 1024); stk = stackalloc(siz1 + 1024);
stk += 512; stk += 512;
top = (Stktop*)(stk+siz1-sizeof(*top)); top = (Stktop*)(stk+siz1-sizeof(*top));
...@@ -658,3 +680,4 @@ sys·morestack(uint64 u) ...@@ -658,3 +680,4 @@ sys·morestack(uint64 u)
*(int32*)234 = 123; // never return *(int32*)234 = 123; // never return
} }
...@@ -89,10 +89,10 @@ TEXT gosave(SB), 7, $0 ...@@ -89,10 +89,10 @@ TEXT gosave(SB), 7, $0
* support for morestack * support for morestack
*/ */
// return point when leaving new stack. save AX, jmp to oldstack to switch back // return point when leaving new stack. save AX, jmp to lessstack to switch back
TEXT retfromnewstack(SB), 7, $0 TEXT retfromnewstack(SB), 7, $0
MOVQ AX, 16(R14) // save AX in m->cret MOVQ AX, 16(R14) // save AX in m->cret
MOVQ $oldstack(SB), AX MOVQ $lessstack(SB), AX
JMP AX JMP AX
// gogo, returning 2nd arg instead of 1 // gogo, returning 2nd arg instead of 1
......
...@@ -277,6 +277,8 @@ G* malg(int32); ...@@ -277,6 +277,8 @@ G* malg(int32);
void minit(void); void minit(void);
Func* findfunc(uint64); Func* findfunc(uint64);
int32 funcline(Func*, uint64); int32 funcline(Func*, uint64);
void* stackalloc(uint32);
void stackfree(void*);
/* /*
* mutual exclusion locks. in the uncontended case, * mutual exclusion locks. in the uncontended case,
......
// Copyright 2009 The Go Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
#include "runtime.h"
// Stubs for stack management.
// In a separate file so they can be overridden during testing of gc.
void*
stackalloc(uint32 n)
{
return mal(n);
}
void
stackfree(void*)
{
}
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