github.com/panjjo/go@v0.0.0-20161104043856-d62b31386338/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 fn+0(FP), AX 200 MOVL sig+4(FP), BX 201 MOVL info+8(FP), CX 202 MOVL ctx+12(FP), DX 203 MOVL SP, SI 204 SUBL $32, SP 205 ANDL $~15, SP // align stack: handler might be a C function 206 MOVL BX, 0(SP) 207 MOVL CX, 4(SP) 208 MOVL DX, 8(SP) 209 MOVL SI, 12(SP) // save SI: handler might be a Go function 210 CALL AX 211 MOVL 12(SP), AX 212 MOVL AX, SP 213 RET 214 215 TEXT runtime·sigtramp(SB),NOSPLIT,$12 216 MOVL signo+0(FP), BX 217 MOVL BX, 0(SP) 218 MOVL info+4(FP), BX 219 MOVL BX, 4(SP) 220 MOVL context+8(FP), BX 221 MOVL BX, 8(SP) 222 CALL runtime·sigtrampgo(SB) 223 RET 224 225 // int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); 226 TEXT runtime·tfork(SB),NOSPLIT,$12 227 228 // Copy mp, gp and fn from the parent stack onto the child stack. 229 MOVL param+0(FP), AX 230 MOVL 8(AX), CX // tf_stack 231 SUBL $16, CX 232 MOVL CX, 8(AX) 233 MOVL mm+8(FP), SI 234 MOVL SI, 0(CX) 235 MOVL gg+12(FP), SI 236 MOVL SI, 4(CX) 237 MOVL fn+16(FP), SI 238 MOVL SI, 8(CX) 239 MOVL $1234, 12(CX) 240 241 MOVL $0, 0(SP) // syscall gap 242 MOVL param+0(FP), AX 243 MOVL AX, 4(SP) // arg 1 - param 244 MOVL psize+4(FP), AX 245 MOVL AX, 8(SP) // arg 2 - psize 246 MOVL $8, AX // sys___tfork 247 INT $0x80 248 249 // Return if tfork syscall failed. 250 JCC 4(PC) 251 NEGL AX 252 MOVL AX, ret+20(FP) 253 RET 254 255 // In parent, return. 256 CMPL AX, $0 257 JEQ 3(PC) 258 MOVL AX, ret+20(FP) 259 RET 260 261 // Paranoia: check that SP is as we expect. 262 MOVL 12(SP), BP 263 CMPL BP, $1234 264 JEQ 2(PC) 265 INT $3 266 267 // Reload registers. 268 MOVL 0(SP), BX // m 269 MOVL 4(SP), DX // g 270 MOVL 8(SP), SI // fn 271 272 // Set FS to point at m->tls. 273 LEAL m_tls(BX), BP 274 PUSHAL // save registers 275 PUSHL BP 276 CALL runtime·settls(SB) 277 POPL AX 278 POPAL 279 280 // Now segment is established. Initialize m, g. 281 get_tls(AX) 282 MOVL DX, g(AX) 283 MOVL BX, g_m(DX) 284 285 CALL runtime·stackcheck(SB) // smashes AX, CX 286 MOVL 0(DX), DX // paranoia; check they are not nil 287 MOVL 0(BX), BX 288 289 // More paranoia; check that stack splitting code works. 290 PUSHAL 291 CALL runtime·emptyfunc(SB) 292 POPAL 293 294 // Call fn. 295 CALL SI 296 297 CALL runtime·exit1(SB) 298 MOVL $0x1234, 0x1005 299 RET 300 301 TEXT runtime·sigaltstack(SB),NOSPLIT,$-8 302 MOVL $288, AX // sys_sigaltstack 303 MOVL new+0(FP), BX 304 MOVL old+4(FP), CX 305 INT $0x80 306 CMPL AX, $0xfffff001 307 JLS 2(PC) 308 INT $3 309 RET 310 311 TEXT runtime·setldt(SB),NOSPLIT,$4 312 // Under OpenBSD we set the GS base instead of messing with the LDT. 313 MOVL tls0+4(FP), AX 314 MOVL AX, 0(SP) 315 CALL runtime·settls(SB) 316 RET 317 318 TEXT runtime·settls(SB),NOSPLIT,$8 319 // adjust for ELF: wants to use -4(GS) for g 320 MOVL tlsbase+0(FP), CX 321 ADDL $4, CX 322 MOVL $0, 0(SP) // syscall gap 323 MOVL CX, 4(SP) // arg 1 - tcb 324 MOVL $329, AX // sys___set_tcb 325 INT $0x80 326 JCC 2(PC) 327 MOVL $0xf1, 0xf1 // crash 328 RET 329 330 TEXT runtime·osyield(SB),NOSPLIT,$-4 331 MOVL $298, AX // sys_sched_yield 332 INT $0x80 333 RET 334 335 TEXT runtime·thrsleep(SB),NOSPLIT,$-4 336 MOVL $94, AX // sys___thrsleep 337 INT $0x80 338 MOVL AX, ret+20(FP) 339 RET 340 341 TEXT runtime·thrwakeup(SB),NOSPLIT,$-4 342 MOVL $301, AX // sys___thrwakeup 343 INT $0x80 344 MOVL AX, ret+8(FP) 345 RET 346 347 TEXT runtime·sysctl(SB),NOSPLIT,$28 348 LEAL mib+0(FP), SI 349 LEAL 4(SP), DI 350 CLD 351 MOVSL // arg 1 - name 352 MOVSL // arg 2 - namelen 353 MOVSL // arg 3 - oldp 354 MOVSL // arg 4 - oldlenp 355 MOVSL // arg 5 - newp 356 MOVSL // arg 6 - newlen 357 MOVL $202, AX // sys___sysctl 358 INT $0x80 359 JCC 4(PC) 360 NEGL AX 361 MOVL AX, ret+24(FP) 362 RET 363 MOVL $0, AX 364 MOVL AX, ret+24(FP) 365 RET 366 367 // int32 runtime·kqueue(void); 368 TEXT runtime·kqueue(SB),NOSPLIT,$0 369 MOVL $269, AX 370 INT $0x80 371 JAE 2(PC) 372 NEGL AX 373 MOVL AX, ret+0(FP) 374 RET 375 376 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 377 TEXT runtime·kevent(SB),NOSPLIT,$0 378 MOVL $72, AX // sys_kevent 379 INT $0x80 380 JAE 2(PC) 381 NEGL AX 382 MOVL AX, ret+24(FP) 383 RET 384 385 // int32 runtime·closeonexec(int32 fd); 386 TEXT runtime·closeonexec(SB),NOSPLIT,$32 387 MOVL $92, AX // sys_fcntl 388 // 0(SP) is where the caller PC would be; kernel skips it 389 MOVL fd+0(FP), BX 390 MOVL BX, 4(SP) // fd 391 MOVL $2, 8(SP) // F_SETFD 392 MOVL $1, 12(SP) // FD_CLOEXEC 393 INT $0x80 394 JAE 2(PC) 395 NEGL AX 396 RET 397 398 GLOBL runtime·tlsoffset(SB),NOPTR,$4