github.com/dannin/go@v0.0.0-20161031215817-d35dfd405eaa/src/runtime/sys_openbsd_386.s (about) 1 // Copyright 2009 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 // System calls and other sys.stuff for 386, OpenBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "go_asm.h" 10 #include "go_tls.h" 11 #include "textflag.h" 12 13 #define CLOCK_MONOTONIC $3 14 15 // Exit the entire program (like C exit) 16 TEXT runtime·exit(SB),NOSPLIT,$-4 17 MOVL $1, AX 18 INT $0x80 19 MOVL $0xf1, 0xf1 // crash 20 RET 21 22 TEXT runtime·exit1(SB),NOSPLIT,$8 23 MOVL $0, 0(SP) 24 MOVL $0, 4(SP) // arg 1 - notdead 25 MOVL $302, AX // sys___threxit 26 INT $0x80 27 JAE 2(PC) 28 MOVL $0xf1, 0xf1 // crash 29 RET 30 31 TEXT runtime·open(SB),NOSPLIT,$-4 32 MOVL $5, AX 33 INT $0x80 34 JAE 2(PC) 35 MOVL $-1, AX 36 MOVL AX, ret+12(FP) 37 RET 38 39 TEXT runtime·closefd(SB),NOSPLIT,$-4 40 MOVL $6, AX 41 INT $0x80 42 JAE 2(PC) 43 MOVL $-1, AX 44 MOVL AX, ret+4(FP) 45 RET 46 47 TEXT runtime·read(SB),NOSPLIT,$-4 48 MOVL $3, AX 49 INT $0x80 50 JAE 2(PC) 51 MOVL $-1, AX 52 MOVL AX, ret+12(FP) 53 RET 54 55 TEXT runtime·write(SB),NOSPLIT,$-4 56 MOVL $4, AX // sys_write 57 INT $0x80 58 JAE 2(PC) 59 MOVL $-1, AX 60 MOVL AX, ret+12(FP) 61 RET 62 63 TEXT runtime·usleep(SB),NOSPLIT,$24 64 MOVL $0, DX 65 MOVL usec+0(FP), AX 66 MOVL $1000000, CX 67 DIVL CX 68 MOVL AX, 12(SP) // tv_sec - l32 69 MOVL $0, 16(SP) // tv_sec - h32 70 MOVL $1000, AX 71 MULL DX 72 MOVL AX, 20(SP) // tv_nsec 73 74 MOVL $0, 0(SP) 75 LEAL 12(SP), AX 76 MOVL AX, 4(SP) // arg 1 - rqtp 77 MOVL $0, 8(SP) // arg 2 - rmtp 78 MOVL $91, AX // sys_nanosleep 79 INT $0x80 80 RET 81 82 TEXT runtime·raise(SB),NOSPLIT,$12 83 MOVL $299, AX // sys_getthrid 84 INT $0x80 85 MOVL $0, 0(SP) 86 MOVL AX, 4(SP) // arg 1 - pid 87 MOVL sig+0(FP), AX 88 MOVL AX, 8(SP) // arg 2 - signum 89 MOVL $37, AX // sys_kill 90 INT $0x80 91 RET 92 93 TEXT runtime·raiseproc(SB),NOSPLIT,$12 94 MOVL $20, AX // sys_getpid 95 INT $0x80 96 MOVL $0, 0(SP) 97 MOVL AX, 4(SP) // arg 1 - pid 98 MOVL sig+0(FP), AX 99 MOVL AX, 8(SP) // arg 2 - signum 100 MOVL $37, AX // sys_kill 101 INT $0x80 102 RET 103 104 TEXT runtime·mmap(SB),NOSPLIT,$36 105 LEAL addr+0(FP), SI 106 LEAL 4(SP), DI 107 CLD 108 MOVSL // arg 1 - addr 109 MOVSL // arg 2 - len 110 MOVSL // arg 3 - prot 111 MOVSL // arg 4 - flags 112 MOVSL // arg 5 - fd 113 MOVL $0, AX 114 STOSL // arg 6 - pad 115 MOVSL // arg 7 - offset 116 MOVL $0, AX // top 32 bits of file offset 117 STOSL 118 MOVL $197, AX // sys_mmap 119 INT $0x80 120 MOVL AX, ret+24(FP) 121 RET 122 123 TEXT runtime·munmap(SB),NOSPLIT,$-4 124 MOVL $73, AX // sys_munmap 125 INT $0x80 126 JAE 2(PC) 127 MOVL $0xf1, 0xf1 // crash 128 RET 129 130 TEXT runtime·madvise(SB),NOSPLIT,$-4 131 MOVL $75, AX // sys_madvise 132 INT $0x80 133 JAE 2(PC) 134 MOVL $0xf1, 0xf1 // crash 135 RET 136 137 TEXT runtime·setitimer(SB),NOSPLIT,$-4 138 MOVL $69, AX 139 INT $0x80 140 RET 141 142 // func now() (sec int64, nsec int32) 143 TEXT time·now(SB), NOSPLIT, $32 144 LEAL 12(SP), BX 145 MOVL $0, 4(SP) // arg 1 - clock_id 146 MOVL BX, 8(SP) // arg 2 - tp 147 MOVL $87, AX // sys_clock_gettime 148 INT $0x80 149 150 MOVL 12(SP), AX // sec - l32 151 MOVL AX, sec+0(FP) 152 MOVL 16(SP), AX // sec - h32 153 MOVL AX, sec+4(FP) 154 155 MOVL 20(SP), BX // nsec 156 MOVL BX, nsec+8(FP) 157 RET 158 159 // int64 nanotime(void) so really 160 // void nanotime(int64 *nsec) 161 TEXT runtime·nanotime(SB),NOSPLIT,$32 162 LEAL 12(SP), BX 163 MOVL CLOCK_MONOTONIC, 4(SP) // arg 1 - clock_id 164 MOVL BX, 8(SP) // arg 2 - tp 165 MOVL $87, AX // sys_clock_gettime 166 INT $0x80 167 168 MOVL 16(SP), CX // sec - h32 169 IMULL $1000000000, CX 170 171 MOVL 12(SP), AX // sec - l32 172 MOVL $1000000000, BX 173 MULL BX // result in dx:ax 174 175 MOVL 20(SP), BX // nsec 176 ADDL BX, AX 177 ADCL CX, DX // add high bits with carry 178 179 MOVL AX, ret_lo+0(FP) 180 MOVL DX, ret_hi+4(FP) 181 RET 182 183 TEXT runtime·sigaction(SB),NOSPLIT,$-4 184 MOVL $46, AX // sys_sigaction 185 INT $0x80 186 JAE 2(PC) 187 MOVL $0xf1, 0xf1 // crash 188 RET 189 190 TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$-4 191 MOVL $48, AX // sys_sigprocmask 192 INT $0x80 193 JAE 2(PC) 194 MOVL $0xf1, 0xf1 // crash 195 MOVL AX, ret+8(FP) 196 RET 197 198 TEXT runtime·sigfwd(SB),NOSPLIT,$12-16 199 MOVL sig+4(FP), AX 200 MOVL AX, 0(SP) 201 MOVL info+8(FP), AX 202 MOVL AX, 4(SP) 203 MOVL ctx+12(FP), AX 204 MOVL AX, 8(SP) 205 MOVL fn+0(FP), AX 206 CALL AX 207 RET 208 209 TEXT runtime·sigtramp(SB),NOSPLIT,$12 210 MOVL signo+0(FP), BX 211 MOVL BX, 0(SP) 212 MOVL info+4(FP), BX 213 MOVL BX, 4(SP) 214 MOVL context+8(FP), BX 215 MOVL BX, 8(SP) 216 CALL runtime·sigtrampgo(SB) 217 RET 218 219 // int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); 220 TEXT runtime·tfork(SB),NOSPLIT,$12 221 222 // Copy mp, gp and fn from the parent stack onto the child stack. 223 MOVL param+0(FP), AX 224 MOVL 8(AX), CX // tf_stack 225 SUBL $16, CX 226 MOVL CX, 8(AX) 227 MOVL mm+8(FP), SI 228 MOVL SI, 0(CX) 229 MOVL gg+12(FP), SI 230 MOVL SI, 4(CX) 231 MOVL fn+16(FP), SI 232 MOVL SI, 8(CX) 233 MOVL $1234, 12(CX) 234 235 MOVL $0, 0(SP) // syscall gap 236 MOVL param+0(FP), AX 237 MOVL AX, 4(SP) // arg 1 - param 238 MOVL psize+4(FP), AX 239 MOVL AX, 8(SP) // arg 2 - psize 240 MOVL $8, AX // sys___tfork 241 INT $0x80 242 243 // Return if tfork syscall failed. 244 JCC 4(PC) 245 NEGL AX 246 MOVL AX, ret+20(FP) 247 RET 248 249 // In parent, return. 250 CMPL AX, $0 251 JEQ 3(PC) 252 MOVL AX, ret+20(FP) 253 RET 254 255 // Paranoia: check that SP is as we expect. 256 MOVL 12(SP), BP 257 CMPL BP, $1234 258 JEQ 2(PC) 259 INT $3 260 261 // Reload registers. 262 MOVL 0(SP), BX // m 263 MOVL 4(SP), DX // g 264 MOVL 8(SP), SI // fn 265 266 // Set FS to point at m->tls. 267 LEAL m_tls(BX), BP 268 PUSHAL // save registers 269 PUSHL BP 270 CALL runtime·settls(SB) 271 POPL AX 272 POPAL 273 274 // Now segment is established. Initialize m, g. 275 get_tls(AX) 276 MOVL DX, g(AX) 277 MOVL BX, g_m(DX) 278 279 CALL runtime·stackcheck(SB) // smashes AX, CX 280 MOVL 0(DX), DX // paranoia; check they are not nil 281 MOVL 0(BX), BX 282 283 // More paranoia; check that stack splitting code works. 284 PUSHAL 285 CALL runtime·emptyfunc(SB) 286 POPAL 287 288 // Call fn. 289 CALL SI 290 291 CALL runtime·exit1(SB) 292 MOVL $0x1234, 0x1005 293 RET 294 295 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 296 MOVL $288, AX // sys_sigaltstack 297 MOVL new+0(FP), BX 298 MOVL old+4(FP), CX 299 INT $0x80 300 CMPL AX, $0xfffff001 301 JLS 2(PC) 302 INT $3 303 RET 304 305 TEXT runtime·setldt(SB),NOSPLIT,$4 306 // Under OpenBSD we set the GS base instead of messing with the LDT. 307 MOVL tls0+4(FP), AX 308 MOVL AX, 0(SP) 309 CALL runtime·settls(SB) 310 RET 311 312 TEXT runtime·settls(SB),NOSPLIT,$8 313 // adjust for ELF: wants to use -4(GS) for g 314 MOVL tlsbase+0(FP), CX 315 ADDL $4, CX 316 MOVL $0, 0(SP) // syscall gap 317 MOVL CX, 4(SP) // arg 1 - tcb 318 MOVL $329, AX // sys___set_tcb 319 INT $0x80 320 JCC 2(PC) 321 MOVL $0xf1, 0xf1 // crash 322 RET 323 324 TEXT runtime·osyield(SB),NOSPLIT,$-4 325 MOVL $298, AX // sys_sched_yield 326 INT $0x80 327 RET 328 329 TEXT runtime·thrsleep(SB),NOSPLIT,$-4 330 MOVL $94, AX // sys___thrsleep 331 INT $0x80 332 MOVL AX, ret+20(FP) 333 RET 334 335 TEXT runtime·thrwakeup(SB),NOSPLIT,$-4 336 MOVL $301, AX // sys___thrwakeup 337 INT $0x80 338 MOVL AX, ret+8(FP) 339 RET 340 341 TEXT runtime·sysctl(SB),NOSPLIT,$28 342 LEAL mib+0(FP), SI 343 LEAL 4(SP), DI 344 CLD 345 MOVSL // arg 1 - name 346 MOVSL // arg 2 - namelen 347 MOVSL // arg 3 - oldp 348 MOVSL // arg 4 - oldlenp 349 MOVSL // arg 5 - newp 350 MOVSL // arg 6 - newlen 351 MOVL $202, AX // sys___sysctl 352 INT $0x80 353 JCC 4(PC) 354 NEGL AX 355 MOVL AX, ret+24(FP) 356 RET 357 MOVL $0, AX 358 MOVL AX, ret+24(FP) 359 RET 360 361 // int32 runtime·kqueue(void); 362 TEXT runtime·kqueue(SB),NOSPLIT,$0 363 MOVL $269, AX 364 INT $0x80 365 JAE 2(PC) 366 NEGL AX 367 MOVL AX, ret+0(FP) 368 RET 369 370 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 371 TEXT runtime·kevent(SB),NOSPLIT,$0 372 MOVL $72, AX // sys_kevent 373 INT $0x80 374 JAE 2(PC) 375 NEGL AX 376 MOVL AX, ret+24(FP) 377 RET 378 379 // int32 runtime·closeonexec(int32 fd); 380 TEXT runtime·closeonexec(SB),NOSPLIT,$32 381 MOVL $92, AX // sys_fcntl 382 // 0(SP) is where the caller PC would be; kernel skips it 383 MOVL fd+0(FP), BX 384 MOVL BX, 4(SP) // fd 385 MOVL $2, 8(SP) // F_SETFD 386 MOVL $1, 12(SP) // FD_CLOEXEC 387 INT $0x80 388 JAE 2(PC) 389 NEGL AX 390 RET 391 392 GLOBL runtime·tlsoffset(SB),NOPTR,$4