// 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 "go_asm.h" #include "go_tls.h" #include "textflag.h" // setldt(int entry, int address, int limit) TEXT runtime·setldt(SB),NOSPLIT,$0 RET TEXT runtime·open(SB),NOSPLIT,$0 MOVL $14, AX INT $64 MOVL AX, ret+12(FP) RET TEXT runtime·pread(SB),NOSPLIT,$0 MOVL $50, AX INT $64 MOVL AX, ret+20(FP) RET TEXT runtime·pwrite(SB),NOSPLIT,$0 MOVL $51, AX INT $64 MOVL AX, ret+20(FP) RET // int32 _seek(int64*, int32, int64, int32) TEXT _seek<>(SB),NOSPLIT,$0 MOVL $39, AX INT $64 RET TEXT runtime·seek(SB),NOSPLIT,$24 LEAL ret+16(FP), AX MOVL fd+0(FP), BX MOVL offset_lo+4(FP), CX MOVL offset_hi+8(FP), DX MOVL whence+12(FP), SI MOVL AX, 0(SP) MOVL BX, 4(SP) MOVL CX, 8(SP) MOVL DX, 12(SP) MOVL SI, 16(SP) CALL _seek<>(SB) CMPL AX, $0 JGE 3(PC) MOVL $-1, ret_lo+16(FP) MOVL $-1, ret_hi+20(FP) RET TEXT runtime·closefd(SB),NOSPLIT,$0 MOVL $4, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·exits(SB),NOSPLIT,$0 MOVL $8, AX INT $64 RET TEXT runtime·brk_(SB),NOSPLIT,$0 MOVL $24, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·sleep(SB),NOSPLIT,$0 MOVL $17, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·plan9_semacquire(SB),NOSPLIT,$0 MOVL $37, AX INT $64 MOVL AX, ret+8(FP) RET TEXT runtime·plan9_tsemacquire(SB),NOSPLIT,$0 MOVL $52, AX INT $64 MOVL AX, ret+8(FP) RET TEXT nsec<>(SB),NOSPLIT,$0 MOVL $53, AX INT $64 RET TEXT runtime·nsec(SB),NOSPLIT,$8 LEAL ret+4(FP), AX MOVL AX, 0(SP) CALL nsec<>(SB) CMPL AX, $0 JGE 3(PC) MOVL $-1, ret_lo+4(FP) MOVL $-1, ret_hi+8(FP) RET // func now() (sec int64, nsec int32) TEXT time·now(SB),NOSPLIT,$8-12 CALL runtime·nanotime(SB) MOVL 0(SP), AX MOVL 4(SP), DX MOVL $1000000000, CX DIVL CX MOVL AX, sec+0(FP) MOVL $0, sec+4(FP) MOVL DX, nsec+8(FP) RET TEXT runtime·notify(SB),NOSPLIT,$0 MOVL $28, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·noted(SB),NOSPLIT,$0 MOVL $29, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·plan9_semrelease(SB),NOSPLIT,$0 MOVL $38, AX INT $64 MOVL AX, ret+8(FP) RET TEXT runtime·rfork(SB),NOSPLIT,$0 MOVL $19, AX INT $64 MOVL AX, ret+4(FP) RET TEXT runtime·tstart_plan9(SB),NOSPLIT,$0 MOVL newm+0(FP), CX MOVL m_g0(CX), DX // Layout new m scheduler stack on os stack. MOVL SP, AX MOVL AX, (g_stack+stack_hi)(DX) SUBL $(64*1024), AX // stack size MOVL AX, (g_stack+stack_lo)(DX) MOVL AX, g_stackguard0(DX) MOVL AX, g_stackguard1(DX) // Initialize procid from TOS struct. MOVL _tos(SB), AX MOVL 48(AX), AX MOVL AX, m_procid(CX) // save pid as m->procid // Finally, initialize g. get_tls(BX) MOVL DX, g(BX) CALL runtime·stackcheck(SB) // smashes AX, CX CALL runtime·mstart(SB) MOVL $0x1234, 0x1234 // not reached RET // void sigtramp(void *ureg, int8 *note) TEXT runtime·sigtramp(SB),NOSPLIT,$0 get_tls(AX) // check that g exists MOVL g(AX), BX CMPL BX, $0 JNE 3(PC) CALL runtime·badsignal2(SB) // will exit RET // save args MOVL ureg+4(SP), CX MOVL note+8(SP), DX // change stack MOVL g_m(BX), BX MOVL m_gsignal(BX), BP MOVL (g_stack+stack_hi)(BP), BP MOVL BP, SP // make room for args and g SUBL $24, SP // save g MOVL g(AX), BP MOVL BP, 20(SP) // g = m->gsignal MOVL m_gsignal(BX), DI MOVL DI, g(AX) // load args and call sighandler MOVL CX, 0(SP) MOVL DX, 4(SP) MOVL BP, 8(SP) CALL runtime·sighandler(SB) MOVL 12(SP), AX // restore g get_tls(BX) MOVL 20(SP), BP MOVL BP, g(BX) // call noted(AX) MOVL AX, 0(SP) CALL runtime·noted(SB) RET // Only used by the 64-bit runtime. TEXT runtime·setfpmasks(SB),NOSPLIT,$0 RET #define ERRMAX 128 /* from os_plan9.h */ // void errstr(int8 *buf, int32 len) TEXT errstr<>(SB),NOSPLIT,$0 MOVL $41, AX INT $64 RET // func errstr() string // Only used by package syscall. // Grab error string due to a syscall made // in entersyscall mode, without going // through the allocator (issue 4994). // See ../syscall/asm_plan9_386.s:/·Syscall/ TEXT runtime·errstr(SB),NOSPLIT,$8-8 get_tls(AX) MOVL g(AX), BX MOVL g_m(BX), BX MOVL m_errstr(BX), CX MOVL CX, 0(SP) MOVL $ERRMAX, 4(SP) CALL errstr<>(SB) CALL runtime·findnull(SB) MOVL 4(SP), AX MOVL AX, ret_len+4(FP) MOVL 0(SP), AX MOVL AX, ret_base+0(FP) RET