summaryrefslogtreecommitdiff
path: root/src/pkg/runtime/sys_plan9_amd64.s
diff options
context:
space:
mode:
Diffstat (limited to 'src/pkg/runtime/sys_plan9_amd64.s')
-rw-r--r--src/pkg/runtime/sys_plan9_amd64.s208
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