mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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
This commit is contained in:
parent
c7bab46d0f
commit
79e1db2da1
5 changed files with 54 additions and 9 deletions
|
|
@ -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)
|
||||||
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)
|
||||||
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)
|
||||||
|
|
||||||
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)
|
||||||
|
|
||||||
*(int32*)234 = 123; // never return
|
*(int32*)234 = 123; // never return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -42,7 +42,7 @@ TEXT _rt0_amd64(SB),7,$-8
|
||||||
CALL sys·newproc(SB)
|
CALL sys·newproc(SB)
|
||||||
POPQ AX
|
POPQ AX
|
||||||
POPQ AX
|
POPQ AX
|
||||||
|
|
||||||
// start this M
|
// start this M
|
||||||
CALL mstart(SB)
|
CALL mstart(SB)
|
||||||
|
|
||||||
|
|
@ -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);
|
||||||
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,
|
||||||
|
|
|
||||||
19
src/runtime/stack.c
Normal file
19
src/runtime/stack.c
Normal file
|
|
@ -0,0 +1,19 @@
|
||||||
|
// 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*)
|
||||||
|
{
|
||||||
|
}
|
||||||
Loading…
Add table
Add a link
Reference in a new issue