sys_openbsd_386.s 6.33 KB
Newer Older
1 2 3 4 5 6 7 8
// Copyright 2009 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.
//
// System calls and other sys.stuff for 386, OpenBSD
// /usr/src/sys/kern/syscalls.master for syscall numbers.
//

9
#include "zasm_GOOS_GOARCH.h"
10 11 12 13 14

// Exit the entire program (like C exit)
TEXT runtime·exit(SB),7,$-4
	MOVL	$1, AX
	INT	$0x80
15
	MOVL	$0xf1, 0xf1		// crash
16 17
	RET

18 19 20 21
TEXT runtime·exit1(SB),7,$8
	MOVL	$0, 0(SP)
	MOVL	$0, 4(SP)		// arg 1 - notdead
	MOVL	$302, AX		// sys___threxit
22 23
	INT	$0x80
	JAE	2(PC)
24
	MOVL	$0xf1, 0xf1		// crash
25 26
	RET

27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
TEXT runtime·open(SB),7,$-4
	MOVL	$5, AX
	INT	$0x80
	RET

TEXT runtime·close(SB),7,$-4
	MOVL	$6, AX
	INT	$0x80
	RET

TEXT runtime·read(SB),7,$-4
	MOVL	$3, AX
	INT	$0x80
	RET

42 43 44 45 46
TEXT runtime·write(SB),7,$-4
	MOVL	$4, AX			// sys_write
	INT	$0x80
	RET

47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
TEXT runtime·usleep(SB),7,$20
	MOVL	$0, DX
	MOVL	usec+0(FP), AX
	MOVL	$1000000, CX
	DIVL	CX
	MOVL	AX, 12(SP)		// tv_sec
	MOVL	$1000, AX
	MULL	DX
	MOVL	AX, 16(SP)		// tv_nsec

	MOVL	$0, 0(SP)
	LEAL	12(SP), AX
	MOVL	AX, 4(SP)		// arg 1 - rqtp
	MOVL	$0, 8(SP)		// arg 2 - rmtp
	MOVL	$240, AX		// sys_nanosleep
	INT	$0x80
	RET

65
TEXT runtime·raise(SB),7,$12
66
	MOVL	$299, AX		// sys_getthrid
67
	INT	$0x80
68 69
	MOVL	$0, 0(SP)
	MOVL	AX, 4(SP)		// arg 1 - pid
70 71
	MOVL	sig+0(FP), AX
	MOVL	AX, 8(SP)		// arg 2 - signum
72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87
	MOVL	$37, AX			// sys_kill
	INT	$0x80
	RET

TEXT runtime·mmap(SB),7,$36
	LEAL	arg0+0(FP), SI
	LEAL	4(SP), DI
	CLD
	MOVSL				// arg 1 - addr
	MOVSL				// arg 2 - len
	MOVSL				// arg 3 - prot
	MOVSL				// arg 4 - flags
	MOVSL				// arg 5 - fd
	MOVL	$0, AX
	STOSL				// arg 6 - pad
	MOVSL				// arg 7 - offset
Shenghou Ma's avatar
Shenghou Ma committed
88
	MOVL	$0, AX			// top 32 bits of file offset
89 90 91 92 93 94 95 96 97
	STOSL
	MOVL	$197, AX		// sys_mmap
	INT	$0x80
	RET

TEXT runtime·munmap(SB),7,$-4
	MOVL	$73, AX			// sys_munmap
	INT	$0x80
	JAE	2(PC)
98
	MOVL	$0xf1, 0xf1		// crash
99 100
	RET

101 102 103 104 105 106 107
TEXT runtime·madvise(SB),7,$-4
	MOVL	$75, AX			// sys_madvise
	INT	$0x80
	JAE	2(PC)
	MOVL	$0xf1, 0xf1		// crash
	RET

108 109 110 111 112
TEXT runtime·setitimer(SB),7,$-4
	MOVL	$83, AX
	INT	$0x80
	RET

113 114
// func now() (sec int64, nsec int32)
TEXT time·now(SB), 7, $32
115
	MOVL	$232, AX
116
	LEAL	12(SP), BX
117 118
	MOVL	$0, 4(SP)
	MOVL	BX, 8(SP)
119 120
	INT	$0x80
	MOVL	12(SP), AX		// sec
121
	MOVL	16(SP), BX		// nsec
122

123
	// sec is in AX, nsec in BX
124 125 126 127 128
	MOVL	AX, sec+0(FP)
	MOVL	$0, sec+4(FP)
	MOVL	BX, nsec+8(FP)
	RET

Russ Cox's avatar
Russ Cox committed
129 130 131
// int64 nanotime(void) so really
// void nanotime(int64 *nsec)
TEXT runtime·nanotime(SB),7,$32
132
	MOVL	$232, AX
133
	LEAL	12(SP), BX
134 135
	MOVL	$0, 4(SP)
	MOVL	BX, 8(SP)
136
	INT	$0x80
Russ Cox's avatar
Russ Cox committed
137
	MOVL	12(SP), AX		// sec
138
	MOVL	16(SP), BX		// nsec
Russ Cox's avatar
Russ Cox committed
139

140
	// sec is in AX, nsec in BX
Russ Cox's avatar
Russ Cox committed
141 142 143 144 145
	// convert to DX:AX nsec
	MOVL	$1000000000, CX
	MULL	CX
	ADDL	BX, AX
	ADCL	$0, DX
146

Russ Cox's avatar
Russ Cox committed
147 148 149
	MOVL	ret+0(FP), DI
	MOVL	AX, 0(DI)
	MOVL	DX, 4(DI)
150 151 152 153 154 155
	RET

TEXT runtime·sigaction(SB),7,$-4
	MOVL	$46, AX			// sys_sigaction
	INT	$0x80
	JAE	2(PC)
156
	MOVL	$0xf1, 0xf1		// crash
157 158
	RET

159 160 161 162
TEXT runtime·sigprocmask(SB),7,$-4
	MOVL	$48, AX			// sys_sigprocmask
	INT	$0x80
	JAE	2(PC)
163
	MOVL	$0xf1, 0xf1		// crash
164 165 166
	MOVL	AX, oset+0(FP)
	RET

167 168 169
TEXT runtime·sigtramp(SB),7,$44
	get_tls(CX)

170 171 172
	// check that m exists
	MOVL	m(CX), BX
	CMPL	BX, $0
173 174 175
	JNE	5(PC)
	MOVL	signo+0(FP), BX
	MOVL	BX, 0(SP)
176
	CALL	runtime·badsignal(SB)
177
	RET
178

179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208
	// save g
	MOVL	g(CX), DI
	MOVL	DI, 20(SP)
	
	// g = m->gsignal
	MOVL	m_gsignal(BX), BX
	MOVL	BX, g(CX)

	// copy arguments for call to sighandler
	MOVL	signo+0(FP), BX
	MOVL	BX, 0(SP)
	MOVL	info+4(FP), BX
	MOVL	BX, 4(SP)
	MOVL	context+8(FP), BX
	MOVL	BX, 8(SP)
	MOVL	DI, 12(SP)

	CALL	runtime·sighandler(SB)

	// restore g
	get_tls(CX)
	MOVL	20(SP), BX
	MOVL	BX, g(CX)
	
	// call sigreturn
	MOVL	context+8(FP), AX
	MOVL	$0, 0(SP)		// syscall gap
	MOVL	AX, 4(SP)		// arg 1 - sigcontext
	MOVL	$103, AX		// sys_sigreturn
	INT	$0x80
209
	MOVL	$0xf1, 0xf1		// crash
210 211
	RET

212
// int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void));
213
TEXT runtime·tfork(SB),7,$12
214

215
	// Copy mp, gp and fn from the parent stack onto the child stack.
216 217
	MOVL	params+4(FP), AX
	MOVL	8(AX), CX		// tf_stack
218
	SUBL	$16, CX
219
	MOVL	CX, 8(AX)
220
	MOVL	mm+12(FP), SI
221
	MOVL	SI, 0(CX)
222
	MOVL	gg+16(FP), SI
223
	MOVL	SI, 4(CX)
224
	MOVL	fn+20(FP), SI
225 226 227 228
	MOVL	SI, 8(CX)
	MOVL	$1234, 12(CX)

	MOVL	$0, 0(SP)		// syscall gap
229 230
	MOVL	params+4(FP), AX
	MOVL	AX, 4(SP)		// arg 1 - param
231 232 233
	MOVL	psize+8(FP), AX
	MOVL	AX, 8(SP)		// arg 2 - psize
	MOVL	$8, AX			// sys___tfork
234 235
	INT	$0x80

236 237
	// Return if tfork syscall failed.
	JCC	5(PC)
238
	NEGL	AX
239 240
	MOVL	ret+0(FP), DX
	MOVL	AX, 0(DX)
241 242 243 244
	RET

	// In parent, return.
	CMPL	AX, $0
245 246 247
	JEQ	4(PC)
	MOVL	ret+0(FP), DX
	MOVL	AX, 0(DX)
248 249 250 251 252 253 254 255
	RET

	// Paranoia: check that SP is as we expect.
	MOVL	12(SP), BP
	CMPL	BP, $1234
	JEQ	2(PC)
	INT	$3

256
	// Reload registers.
257 258 259 260
	MOVL	0(SP), BX		// m
	MOVL	4(SP), DX		// g
	MOVL	8(SP), SI		// fn

261
	// Set FS to point at m->tls.
262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277
	LEAL	m_tls(BX), BP
	PUSHAL				// save registers
	PUSHL	BP
	CALL	runtime·settls(SB)
	POPL	AX
	POPAL
	
	// Now segment is established.  Initialize m, g.
	get_tls(AX)
	MOVL	DX, g(AX)
	MOVL	BX, m(AX)

	CALL	runtime·stackcheck(SB)	// smashes AX, CX
	MOVL	0(DX), DX		// paranoia; check they are not nil
	MOVL	0(BX), BX

278
	// More paranoia; check that stack splitting code works.
279 280 281 282
	PUSHAL
	CALL	runtime·emptyfunc(SB)
	POPAL

283
	// Call fn.
284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299
	CALL	SI

	CALL	runtime·exit1(SB)
	MOVL	$0x1234, 0x1005
	RET

TEXT runtime·sigaltstack(SB),7,$-8
	MOVL	$288, AX		// sys_sigaltstack
	MOVL	new+4(SP), BX
	MOVL	old+8(SP), CX
	INT	$0x80
	CMPL	AX, $0xfffff001
	JLS	2(PC)
	INT	$3
	RET

300
TEXT runtime·setldt(SB),7,$4
301
	// Under OpenBSD we set the GS base instead of messing with the LDT.
302
	MOVL	tls0+4(FP), AX
303 304 305 306
	MOVL	AX, 0(SP)
	CALL	runtime·settls(SB)
	RET

307
TEXT runtime·settls(SB),7,$8
308
	// adjust for ELF: wants to use -8(GS) and -4(GS) for g and m
309
	MOVL	tlsbase+0(FP), CX
310 311
	ADDL	$8, CX
	MOVL	$0, 0(SP)		// syscall gap
312 313
	MOVL	CX, 4(SP)		// arg 1 - tcb
	MOVL	$329, AX		// sys___set_tcb
314 315
	INT	$0x80
	JCC	2(PC)
316
	MOVL	$0xf1, 0xf1		// crash
317 318 319 320 321 322 323
	RET

TEXT runtime·osyield(SB),7,$-4
	MOVL	$298, AX		// sys_sched_yield
	INT	$0x80
	RET

324
TEXT runtime·thrsleep(SB),7,$-4
325
	MOVL	$300, AX		// sys___thrsleep
326 327 328 329
	INT	$0x80
	RET

TEXT runtime·thrwakeup(SB),7,$-4
330
	MOVL	$301, AX		// sys___thrwakeup
331 332 333
	INT	$0x80
	RET

334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351
TEXT runtime·sysctl(SB),7,$28
	LEAL	arg0+0(FP), SI
	LEAL	4(SP), DI
	CLD
	MOVSL				// arg 1 - name
	MOVSL				// arg 2 - namelen
	MOVSL				// arg 3 - oldp
	MOVSL				// arg 4 - oldlenp
	MOVSL				// arg 5 - newp
	MOVSL				// arg 6 - newlen
	MOVL	$202, AX		// sys___sysctl
	INT	$0x80
	JCC	3(PC)
	NEGL	AX
	RET
	MOVL	$0, AX
	RET

352
GLOBL runtime·tlsoffset(SB),$4