Home | History | Annotate | Download | only in runtime
      1 // Copyright 2010 The Go Authors. All rights reserved.
      2 // Use of this source code is governed by a BSD-style
      3 // license that can be found in the LICENSE file.
      4 
      5 #include "go_asm.h"
      6 #include "go_tls.h"
      7 #include "textflag.h"
      8 
      9 // setldt(int entry, int address, int limit)
     10 TEXT runtimesetldt(SB),NOSPLIT,$0
     11 	RET
     12 
     13 TEXT runtimeopen(SB),NOSPLIT,$0
     14 	MOVL    $14, AX
     15 	INT     $64
     16 	MOVL	AX, ret+12(FP)
     17 	RET
     18 
     19 TEXT runtimepread(SB),NOSPLIT,$0
     20 	MOVL    $50, AX
     21 	INT     $64
     22 	MOVL	AX, ret+20(FP)
     23 	RET
     24 
     25 TEXT runtimepwrite(SB),NOSPLIT,$0
     26 	MOVL    $51, AX
     27 	INT     $64
     28 	MOVL	AX, ret+20(FP)
     29 	RET
     30 
     31 // int32 _seek(int64*, int32, int64, int32)
     32 TEXT _seek<>(SB),NOSPLIT,$0
     33 	MOVL	$39, AX
     34 	INT	$64
     35 	RET
     36 
     37 TEXT runtimeseek(SB),NOSPLIT,$24
     38 	LEAL	ret+16(FP), AX
     39 	MOVL	fd+0(FP), BX
     40 	MOVL	offset_lo+4(FP), CX
     41 	MOVL	offset_hi+8(FP), DX
     42 	MOVL	whence+12(FP), SI
     43 	MOVL	AX, 0(SP)
     44 	MOVL	BX, 4(SP)
     45 	MOVL	CX, 8(SP)
     46 	MOVL	DX, 12(SP)
     47 	MOVL	SI, 16(SP)
     48 	CALL	_seek<>(SB)
     49 	CMPL	AX, $0
     50 	JGE	3(PC)
     51 	MOVL	$-1, ret_lo+16(FP)
     52 	MOVL	$-1, ret_hi+20(FP)
     53 	RET
     54 
     55 TEXT runtimeclosefd(SB),NOSPLIT,$0
     56 	MOVL	$4, AX
     57 	INT	$64
     58 	MOVL	AX, ret+4(FP)
     59 	RET
     60 
     61 TEXT runtimeexits(SB),NOSPLIT,$0
     62 	MOVL    $8, AX
     63 	INT     $64
     64 	RET
     65 
     66 TEXT runtimebrk_(SB),NOSPLIT,$0
     67 	MOVL    $24, AX
     68 	INT     $64
     69 	MOVL	AX, ret+4(FP)
     70 	RET
     71 
     72 TEXT runtimesleep(SB),NOSPLIT,$0
     73 	MOVL    $17, AX
     74 	INT     $64
     75 	MOVL	AX, ret+4(FP)
     76 	RET
     77 
     78 TEXT runtimeplan9_semacquire(SB),NOSPLIT,$0
     79 	MOVL	$37, AX
     80 	INT	$64
     81 	MOVL	AX, ret+8(FP)
     82 	RET
     83 
     84 TEXT runtimeplan9_tsemacquire(SB),NOSPLIT,$0
     85 	MOVL	$52, AX
     86 	INT	$64
     87 	MOVL	AX, ret+8(FP)
     88 	RET
     89 
     90 TEXT nsec<>(SB),NOSPLIT,$0
     91 	MOVL	$53, AX
     92 	INT	$64
     93 	RET
     94 
     95 TEXT runtimensec(SB),NOSPLIT,$8
     96 	LEAL	ret+4(FP), AX
     97 	MOVL	AX, 0(SP)
     98 	CALL	nsec<>(SB)
     99 	CMPL	AX, $0
    100 	JGE	3(PC)
    101 	MOVL	$-1, ret_lo+4(FP)
    102 	MOVL	$-1, ret_hi+8(FP)
    103 	RET
    104 
    105 // func walltime() (sec int64, nsec int32)
    106 TEXT runtimewalltime(SB),NOSPLIT,$8-12
    107 	CALL	runtimenanotime(SB)
    108 	MOVL	0(SP), AX
    109 	MOVL	4(SP), DX
    110 
    111 	MOVL	$1000000000, CX
    112 	DIVL	CX
    113 	MOVL	AX, sec_lo+0(FP)
    114 	MOVL	$0, sec_hi+4(FP)
    115 	MOVL	DX, nsec+8(FP)
    116 	RET
    117 
    118 TEXT runtimenotify(SB),NOSPLIT,$0
    119 	MOVL	$28, AX
    120 	INT	$64
    121 	MOVL	AX, ret+4(FP)
    122 	RET
    123 
    124 TEXT runtimenoted(SB),NOSPLIT,$0
    125 	MOVL	$29, AX
    126 	INT	$64
    127 	MOVL	AX, ret+4(FP)
    128 	RET
    129 
    130 TEXT runtimeplan9_semrelease(SB),NOSPLIT,$0
    131 	MOVL	$38, AX
    132 	INT	$64
    133 	MOVL	AX, ret+8(FP)
    134 	RET
    135 
    136 TEXT runtimerfork(SB),NOSPLIT,$0
    137 	MOVL	$19, AX
    138 	INT	$64
    139 	MOVL	AX, ret+4(FP)
    140 	RET
    141 
    142 TEXT runtimetstart_plan9(SB),NOSPLIT,$4
    143 	MOVL	newm+0(FP), CX
    144 	MOVL	m_g0(CX), DX
    145 
    146 	// Layout new m scheduler stack on os stack.
    147 	MOVL	SP, AX
    148 	MOVL	AX, (g_stack+stack_hi)(DX)
    149 	SUBL	$(64*1024), AX		// stack size
    150 	MOVL	AX, (g_stack+stack_lo)(DX)
    151 	MOVL	AX, g_stackguard0(DX)
    152 	MOVL	AX, g_stackguard1(DX)
    153 
    154 	// Initialize procid from TOS struct.
    155 	MOVL	_tos(SB), AX
    156 	MOVL	48(AX), AX
    157 	MOVL	AX, m_procid(CX)	// save pid as m->procid
    158 
    159 	// Finally, initialize g.
    160 	get_tls(BX)
    161 	MOVL	DX, g(BX)
    162 
    163 	CALL	runtimestackcheck(SB)	// smashes AX, CX
    164 	CALL	runtimemstart(SB)
    165 
    166 	// Exit the thread.
    167 	MOVL	$0, 0(SP)
    168 	CALL	runtimeexits(SB)
    169 	JMP	0(PC)
    170 
    171 // void sigtramp(void *ureg, int8 *note)
    172 TEXT runtimesigtramp(SB),NOSPLIT,$0
    173 	get_tls(AX)
    174 
    175 	// check that g exists
    176 	MOVL	g(AX), BX
    177 	CMPL	BX, $0
    178 	JNE	3(PC)
    179 	CALL	runtimebadsignal2(SB) // will exit
    180 	RET
    181 
    182 	// save args
    183 	MOVL	ureg+0(FP), CX
    184 	MOVL	note+4(FP), DX
    185 
    186 	// change stack
    187 	MOVL	g_m(BX), BX
    188 	MOVL	m_gsignal(BX), BP
    189 	MOVL	(g_stack+stack_hi)(BP), BP
    190 	MOVL	BP, SP
    191 
    192 	// make room for args and g
    193 	SUBL	$24, SP
    194 
    195 	// save g
    196 	MOVL	g(AX), BP
    197 	MOVL	BP, 20(SP)
    198 
    199 	// g = m->gsignal
    200 	MOVL	m_gsignal(BX), DI
    201 	MOVL	DI, g(AX)
    202 
    203 	// load args and call sighandler
    204 	MOVL	CX, 0(SP)
    205 	MOVL	DX, 4(SP)
    206 	MOVL	BP, 8(SP)
    207 
    208 	CALL	runtimesighandler(SB)
    209 	MOVL	12(SP), AX
    210 
    211 	// restore g
    212 	get_tls(BX)
    213 	MOVL	20(SP), BP
    214 	MOVL	BP, g(BX)
    215 
    216 	// call noted(AX)
    217 	MOVL	AX, 0(SP)
    218 	CALL	runtimenoted(SB)
    219 	RET
    220 
    221 // Only used by the 64-bit runtime.
    222 TEXT runtimesetfpmasks(SB),NOSPLIT,$0
    223 	RET
    224 
    225 #define ERRMAX 128	/* from os_plan9.h */
    226 
    227 // void errstr(int8 *buf, int32 len)
    228 TEXT errstr<>(SB),NOSPLIT,$0
    229 	MOVL    $41, AX
    230 	INT     $64
    231 	RET
    232 
    233 // func errstr() string
    234 // Only used by package syscall.
    235 // Grab error string due to a syscall made
    236 // in entersyscall mode, without going
    237 // through the allocator (issue 4994).
    238 // See ../syscall/asm_plan9_386.s:/Syscall/
    239 TEXT runtimeerrstr(SB),NOSPLIT,$8-8
    240 	get_tls(AX)
    241 	MOVL	g(AX), BX
    242 	MOVL	g_m(BX), BX
    243 	MOVL	(m_mOS+mOS_errstr)(BX), CX
    244 	MOVL	CX, 0(SP)
    245 	MOVL	$ERRMAX, 4(SP)
    246 	CALL	errstr<>(SB)
    247 	CALL	runtimefindnull(SB)
    248 	MOVL	4(SP), AX
    249 	MOVL	AX, ret_len+4(FP)
    250 	MOVL	0(SP), AX
    251 	MOVL	AX, ret_base+0(FP)
    252 	RET
    253