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=\
print.$O\
rune.$O\
proc.$O\
stack.$O\
string.$O\
symtab.$O\
sys_file.$O\
......
......@@ -567,6 +567,7 @@ oldstack(void)
Stktop *top;
uint32 siz2;
byte *sp;
uint64 oldsp, oldpc, oldbase, oldguard;
// printf("oldstack m->cret=%p\n", m->cret);
......@@ -581,15 +582,36 @@ oldstack(void)
mcpy(top->oldsp+16, sp, siz2);
}
// call no more functions after this point - stackguard disagrees with SP
m->curg->stackbase = top->oldbase;
m->curg->stackguard = top->oldguard;
m->morestack.SP = top->oldsp+8;
m->morestack.PC = (byte*)(*(uint64*)(top->oldsp+8));
oldsp = (uint64)top->oldsp + 8;
oldpc = *(uint64*)(top->oldsp + 8);
oldbase = (uint64)top->oldbase;
oldguard = (uint64)top->oldguard;
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);
}
void
lessstack(void)
{
g = m->g0;
setspgoto(m->sched.SP, oldstack, nil);
}
void
newstack(void)
{
......@@ -611,7 +633,7 @@ newstack(void)
if(siz1 < 4096)
siz1 = 4096;
stk = mal(siz1 + 1024);
stk = stackalloc(siz1 + 1024);
stk += 512;
top = (Stktop*)(stk+siz1-sizeof(*top));
......@@ -658,3 +680,4 @@ sys·morestack(uint64 u)
*(int32*)234 = 123; // never return
}
......@@ -42,7 +42,7 @@ TEXT _rt0_amd64(SB),7,$-8
CALL sys·newproc(SB)
POPQ AX
POPQ AX
// start this M
CALL mstart(SB)
......@@ -89,10 +89,10 @@ TEXT gosave(SB), 7, $0
* 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
MOVQ AX, 16(R14) // save AX in m->cret
MOVQ $oldstack(SB), AX
MOVQ $lessstack(SB), AX
JMP AX
// gogo, returning 2nd arg instead of 1
......
......@@ -277,6 +277,8 @@ G* malg(int32);
void minit(void);
Func* findfunc(uint64);
int32 funcline(Func*, uint64);
void* stackalloc(uint32);
void stackfree(void*);
/*
* 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