diff options
Diffstat (limited to 'src/pkg/runtime/sys_plan9_amd64.s')
-rw-r--r-- | src/pkg/runtime/sys_plan9_amd64.s | 208 |
1 files changed, 208 insertions, 0 deletions
diff --git a/src/pkg/runtime/sys_plan9_amd64.s b/src/pkg/runtime/sys_plan9_amd64.s new file mode 100644 index 000000000..b34f98a68 --- /dev/null +++ b/src/pkg/runtime/sys_plan9_amd64.s @@ -0,0 +1,208 @@ +// 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 "zasm_GOOS_GOARCH.h" + +// setldt(int entry, int address, int limit) +TEXT runtime·setldt(SB),7,$0 + RET + +TEXT runtime·open(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $14, BP + SYSCALL + RET + +TEXT runtime·pread(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $50, BP + SYSCALL + RET + +TEXT runtime·pwrite(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $51, BP + SYSCALL + RET + +// int32 _seek(int64*, int32, int64, int32) +TEXT _seek<>(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $39, BP + SYSCALL + RET + +// int64 seek(int32, int64, int32) +TEXT runtime·seek(SB),7,$56 + LEAQ new+48(SP), CX + MOVQ CX, 0(SP) + MOVQ fd+0(FP), CX + MOVQ CX, 8(SP) + MOVQ off+8(FP), CX + MOVQ CX, 16(SP) + MOVQ whence+16(FP), CX + MOVQ CX, 24(SP) + CALL _seek<>(SB) + CMPL AX, $0 + JGE 2(PC) + MOVQ $-1, new+48(SP) + MOVQ new+48(SP), AX + RET + +TEXT runtime·close(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $4, BP + SYSCALL + RET + +TEXT runtime·exits(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $8, BP + SYSCALL + RET + +TEXT runtime·brk_(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $24, BP + SYSCALL + RET + +TEXT runtime·sleep(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $17, BP + SYSCALL + RET + +TEXT runtime·plan9_semacquire(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $37, BP + SYSCALL + RET + +TEXT runtime·plan9_tsemacquire(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $52, BP + SYSCALL + RET + +TEXT runtime·notify(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $28, BP + SYSCALL + RET + +TEXT runtime·noted(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $29, BP + SYSCALL + RET + +TEXT runtime·plan9_semrelease(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $38, BP + SYSCALL + RET + +TEXT runtime·nanotime(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $60, BP + SYSCALL + RET + +TEXT runtime·rfork(SB),7,$0 + MOVQ $0x8000, AX + MOVQ $19, BP // rfork + SYSCALL + + // In parent, return. + CMPQ AX, $0 + JEQ 2(PC) + RET + + // In child on forked stack. + MOVQ mm+24(SP), BX // m + MOVQ gg+32(SP), DX // g + MOVQ fn+40(SP), SI // fn + + // set SP to be on the new child stack + MOVQ stack+16(SP), CX + MOVQ CX, SP + + // Initialize m, g. + get_tls(AX) + MOVQ DX, g(AX) + MOVQ BX, m(AX) + + // Initialize AX from pid in TLS. + MOVQ procid(AX), AX + MOVQ AX, m_procid(BX) // save pid as m->procid + + CALL runtime·stackcheck(SB) // smashes AX, CX + + MOVQ 0(DX), DX // paranoia; check they are not nil + MOVQ 0(BX), BX + + CALL SI // fn() + CALL runtime·exit(SB) + RET + +// This is needed by asm_amd64.s +TEXT runtime·settls(SB),7,$0 + RET + +// void sigtramp(void *ureg, int8 *note) +TEXT runtime·sigtramp(SB),7,$0 + get_tls(AX) + + // check that m exists + MOVQ m(AX), BX + CMPQ BX, $0 + JNE 3(PC) + CALL runtime·badsignal(SB) // will exit + RET + + // save args + MOVQ ureg+8(SP), CX + MOVQ note+16(SP), DX + + // change stack + MOVQ m_gsignal(BX), R10 + MOVQ g_stackbase(R10), BP + MOVQ BP, SP + + // make room for args and g + SUBQ $32, SP + + // save g + MOVQ g(AX), BP + MOVQ BP, 24(SP) + + // g = m->gsignal + MOVQ R10, g(AX) + + // load args and call sighandler + MOVQ CX, 0(SP) + MOVQ DX, 8(SP) + MOVQ BP, 16(SP) + + CALL runtime·sighandler(SB) + + // restore g + get_tls(BX) + MOVQ 24(SP), R10 + MOVQ R10, g(BX) + + // call noted(AX) + MOVQ AX, 0(SP) + CALL runtime·noted(SB) + RET + +TEXT runtime·setfpmasks(SB),7,$8 + STMXCSR 0(SP) + MOVL 0(SP), AX + ANDL $~0x3F, AX + ORL $(0x3F<<7), AX + MOVL AX, 0(SP) + LDMXCSR 0(SP) + RET |