diff options
Diffstat (limited to 'src/pkg/runtime/plan9/386')
-rw-r--r-- | src/pkg/runtime/plan9/386/defs.h | 2 | ||||
-rw-r--r-- | src/pkg/runtime/plan9/386/rt0.s | 32 | ||||
-rw-r--r-- | src/pkg/runtime/plan9/386/signal.c | 24 | ||||
-rw-r--r-- | src/pkg/runtime/plan9/386/sys.s | 82 |
4 files changed, 140 insertions, 0 deletions
diff --git a/src/pkg/runtime/plan9/386/defs.h b/src/pkg/runtime/plan9/386/defs.h new file mode 100644 index 000000000..58fd9d94d --- /dev/null +++ b/src/pkg/runtime/plan9/386/defs.h @@ -0,0 +1,2 @@ +// nothing to see here +#define tos_pid 48 diff --git a/src/pkg/runtime/plan9/386/rt0.s b/src/pkg/runtime/plan9/386/rt0.s new file mode 100644 index 000000000..b56c8b325 --- /dev/null +++ b/src/pkg/runtime/plan9/386/rt0.s @@ -0,0 +1,32 @@ +// Copyright 2010 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. + +TEXT _rt0_386_plan9(SB),7, $0 + MOVL AX, _tos(SB) + + // move arguments down to make room for + // m and g at top of stack, right before Tos. + MOVL SP, SI + SUBL $8, SP + MOVL SP, DI + + MOVL AX, CX + SUBL SI, CX + CLD + REP; MOVSB + + // adjust argv + SUBL SI, DI + MOVL newargc+0(SP), CX + LEAL newargv+4(SP), BP +argv_fix: + ADDL DI, 0(BP) + ADDL $4, BP + LOOP argv_fix + + JMP _rt0_386(SB) + +DATA runtime·isplan9(SB)/4, $1 +GLOBL runtime·isplan9(SB), $4 +GLOBL _tos(SB), $4 diff --git a/src/pkg/runtime/plan9/386/signal.c b/src/pkg/runtime/plan9/386/signal.c new file mode 100644 index 000000000..364fd1c41 --- /dev/null +++ b/src/pkg/runtime/plan9/386/signal.c @@ -0,0 +1,24 @@ +// Copyright 2010 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" + +void +runtime·gettime(int64*, int32*) +{ +} + +String +runtime·signame(int32) +{ + return runtime·emptystring; +} + +void +runtime·resetcpuprofiler(int32 hz) +{ + // TODO: Enable profiling interrupts. + + m->profilehz = hz; +} diff --git a/src/pkg/runtime/plan9/386/sys.s b/src/pkg/runtime/plan9/386/sys.s new file mode 100644 index 000000000..1cb570b68 --- /dev/null +++ b/src/pkg/runtime/plan9/386/sys.s @@ -0,0 +1,82 @@ +// Copyright 2010 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 "defs.h" +#include "386/asm.h" + +// setldt(int entry, int address, int limit) +TEXT runtime·setldt(SB),7,$0 + RET + +TEXT runtime·open(SB),7,$0 + MOVL $14, AX + INT $64 + RET + +TEXT runtime·write(SB),7,$0 + MOVL $20, AX + INT $64 + RET + +TEXT runtime·exits(SB),7,$0 + MOVL $8, AX + INT $64 + RET + +TEXT runtime·brk_(SB),7,$0 + MOVL $24, AX + INT $64 + RET + +TEXT runtime·plan9_semacquire(SB),7,$0 + MOVL $37, AX + INT $64 + RET + +TEXT runtime·plan9_semrelease(SB),7,$0 + MOVL $38, AX + INT $64 + RET + +TEXT runtime·rfork(SB),7,$0 + MOVL $19, AX // rfork + INT $64 + + // In parent, return. + CMPL AX, $0 + JEQ 2(PC) + RET + + // In child on old stack. + MOVL mm+12(SP), BX // m + MOVL gg+16(SP), DX // g + MOVL fn+20(SP), SI // fn + + // set SP to be on the new child stack + MOVL stack+8(SP), CX + MOVL CX, SP + + // Initialize m, g. + get_tls(AX) + MOVL DX, g(AX) + MOVL BX, m(AX) + + // Initialize AX from _tos->pid + MOVL _tos(SB), AX + MOVL tos_pid(AX), AX + MOVL AX, m_procid(BX) // save pid as m->procid + + CALL runtime·stackcheck(SB) // smashes AX, CX + + MOVL 0(DX), DX // paranoia; check they are not nil + MOVL 0(BX), BX + + // more paranoia; check that stack splitting code works + PUSHAL + CALL runtime·emptyfunc(SB) + POPAL + + CALL SI // fn() + CALL runtime·exit(SB) + RET |