github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/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 "zasm_GOOS_GOARCH.h" 10 11 // Exit the entire program (like C exit) 12 TEXT runtime·exit(SB),7,$-4 13 MOVL $1, AX 14 INT $0x80 15 MOVL $0xf1, 0xf1 // crash 16 RET 17 18 TEXT runtime·exit1(SB),7,$8 19 MOVL $0, 0(SP) 20 MOVL $0, 4(SP) // arg 1 - notdead 21 MOVL $302, AX // sys___threxit 22 INT $0x80 23 JAE 2(PC) 24 MOVL $0xf1, 0xf1 // crash 25 RET 26 27 TEXT runtime·open(SB),7,$-4 28 MOVL $5, AX 29 INT $0x80 30 RET 31 32 TEXT runtime·close(SB),7,$-4 33 MOVL $6, AX 34 INT $0x80 35 RET 36 37 TEXT runtime·read(SB),7,$-4 38 MOVL $3, AX 39 INT $0x80 40 RET 41 42 TEXT runtime·write(SB),7,$-4 43 MOVL $4, AX // sys_write 44 INT $0x80 45 RET 46 47 TEXT runtime·usleep(SB),7,$20 48 MOVL $0, DX 49 MOVL usec+0(FP), AX 50 MOVL $1000000, CX 51 DIVL CX 52 MOVL AX, 12(SP) // tv_sec 53 MOVL $1000, AX 54 MULL DX 55 MOVL AX, 16(SP) // tv_nsec 56 57 MOVL $0, 0(SP) 58 LEAL 12(SP), AX 59 MOVL AX, 4(SP) // arg 1 - rqtp 60 MOVL $0, 8(SP) // arg 2 - rmtp 61 MOVL $240, AX // sys_nanosleep 62 INT $0x80 63 RET 64 65 TEXT runtime·raise(SB),7,$12 66 MOVL $299, AX // sys_getthrid 67 INT $0x80 68 MOVL $0, 0(SP) 69 MOVL AX, 4(SP) // arg 1 - pid 70 MOVL sig+0(FP), AX 71 MOVL AX, 8(SP) // arg 2 - signum 72 MOVL $37, AX // sys_kill 73 INT $0x80 74 RET 75 76 TEXT runtime·mmap(SB),7,$36 77 LEAL arg0+0(FP), SI 78 LEAL 4(SP), DI 79 CLD 80 MOVSL // arg 1 - addr 81 MOVSL // arg 2 - len 82 MOVSL // arg 3 - prot 83 MOVSL // arg 4 - flags 84 MOVSL // arg 5 - fd 85 MOVL $0, AX 86 STOSL // arg 6 - pad 87 MOVSL // arg 7 - offset 88 MOVL $0, AX // top 32 bits of file offset 89 STOSL 90 MOVL $197, AX // sys_mmap 91 INT $0x80 92 RET 93 94 TEXT runtime·munmap(SB),7,$-4 95 MOVL $73, AX // sys_munmap 96 INT $0x80 97 JAE 2(PC) 98 MOVL $0xf1, 0xf1 // crash 99 RET 100 101 TEXT runtime·madvise(SB),7,$-4 102 MOVL $75, AX // sys_madvise 103 INT $0x80 104 JAE 2(PC) 105 MOVL $0xf1, 0xf1 // crash 106 RET 107 108 TEXT runtime·setitimer(SB),7,$-4 109 MOVL $83, AX 110 INT $0x80 111 RET 112 113 // func now() (sec int64, nsec int32) 114 TEXT time·now(SB), 7, $32 115 MOVL $232, AX 116 LEAL 12(SP), BX 117 MOVL $0, 4(SP) 118 MOVL BX, 8(SP) 119 INT $0x80 120 MOVL 12(SP), AX // sec 121 MOVL 16(SP), BX // nsec 122 123 // sec is in AX, nsec in BX 124 MOVL AX, sec+0(FP) 125 MOVL $0, sec+4(FP) 126 MOVL BX, nsec+8(FP) 127 RET 128 129 // int64 nanotime(void) so really 130 // void nanotime(int64 *nsec) 131 TEXT runtime·nanotime(SB),7,$32 132 MOVL $232, AX 133 LEAL 12(SP), BX 134 MOVL $0, 4(SP) 135 MOVL BX, 8(SP) 136 INT $0x80 137 MOVL 12(SP), AX // sec 138 MOVL 16(SP), BX // nsec 139 140 // sec is in AX, nsec in BX 141 // convert to DX:AX nsec 142 MOVL $1000000000, CX 143 MULL CX 144 ADDL BX, AX 145 ADCL $0, DX 146 147 MOVL ret+0(FP), DI 148 MOVL AX, 0(DI) 149 MOVL DX, 4(DI) 150 RET 151 152 TEXT runtime·sigaction(SB),7,$-4 153 MOVL $46, AX // sys_sigaction 154 INT $0x80 155 JAE 2(PC) 156 MOVL $0xf1, 0xf1 // crash 157 RET 158 159 TEXT runtime·sigprocmask(SB),7,$-4 160 MOVL $48, AX // sys_sigprocmask 161 INT $0x80 162 JAE 2(PC) 163 MOVL $0xf1, 0xf1 // crash 164 MOVL AX, oset+0(FP) 165 RET 166 167 TEXT runtime·sigtramp(SB),7,$44 168 get_tls(CX) 169 170 // check that m exists 171 MOVL m(CX), BX 172 CMPL BX, $0 173 JNE 5(PC) 174 MOVL signo+0(FP), BX 175 MOVL BX, 0(SP) 176 CALL runtime·badsignal(SB) 177 RET 178 179 // save g 180 MOVL g(CX), DI 181 MOVL DI, 20(SP) 182 183 // g = m->gsignal 184 MOVL m_gsignal(BX), BX 185 MOVL BX, g(CX) 186 187 // copy arguments for call to sighandler 188 MOVL signo+0(FP), BX 189 MOVL BX, 0(SP) 190 MOVL info+4(FP), BX 191 MOVL BX, 4(SP) 192 MOVL context+8(FP), BX 193 MOVL BX, 8(SP) 194 MOVL DI, 12(SP) 195 196 CALL runtime·sighandler(SB) 197 198 // restore g 199 get_tls(CX) 200 MOVL 20(SP), BX 201 MOVL BX, g(CX) 202 203 // call sigreturn 204 MOVL context+8(FP), AX 205 MOVL $0, 0(SP) // syscall gap 206 MOVL AX, 4(SP) // arg 1 - sigcontext 207 MOVL $103, AX // sys_sigreturn 208 INT $0x80 209 MOVL $0xf1, 0xf1 // crash 210 RET 211 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 MOVL params+4(FP), AX 217 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 MOVL SI, 8(CX) 226 MOVL $1234, 12(CX) 227 228 MOVL $0, 0(SP) // syscall gap 229 MOVL params+4(FP), AX 230 MOVL AX, 4(SP) // arg 1 - param 231 MOVL psize+8(FP), AX 232 MOVL AX, 8(SP) // arg 2 - psize 233 MOVL $8, AX // sys___tfork 234 INT $0x80 235 236 // Return if tfork syscall failed. 237 JCC 5(PC) 238 NEGL AX 239 MOVL ret+0(FP), DX 240 MOVL AX, 0(DX) 241 RET 242 243 // In parent, return. 244 CMPL AX, $0 245 JEQ 4(PC) 246 MOVL ret+0(FP), DX 247 MOVL AX, 0(DX) 248 RET 249 250 // Paranoia: check that SP is as we expect. 251 MOVL 12(SP), BP 252 CMPL BP, $1234 253 JEQ 2(PC) 254 INT $3 255 256 // Reload registers. 257 MOVL 0(SP), BX // m 258 MOVL 4(SP), DX // g 259 MOVL 8(SP), SI // fn 260 261 // Set FS to point at m->tls. 262 LEAL m_tls(BX), BP 263 PUSHAL // save registers 264 PUSHL BP 265 CALL runtime·settls(SB) 266 POPL AX 267 POPAL 268 269 // Now segment is established. Initialize m, g. 270 get_tls(AX) 271 MOVL DX, g(AX) 272 MOVL BX, m(AX) 273 274 CALL runtime·stackcheck(SB) // smashes AX, CX 275 MOVL 0(DX), DX // paranoia; check they are not nil 276 MOVL 0(BX), BX 277 278 // More paranoia; check that stack splitting code works. 279 PUSHAL 280 CALL runtime·emptyfunc(SB) 281 POPAL 282 283 // Call fn. 284 CALL SI 285 286 CALL runtime·exit1(SB) 287 MOVL $0x1234, 0x1005 288 RET 289 290 TEXT runtime·sigaltstack(SB),7,$-8 291 MOVL $288, AX // sys_sigaltstack 292 MOVL new+4(SP), BX 293 MOVL old+8(SP), CX 294 INT $0x80 295 CMPL AX, $0xfffff001 296 JLS 2(PC) 297 INT $3 298 RET 299 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 MOVL AX, 0(SP) 304 CALL runtime·settls(SB) 305 RET 306 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 ADDL $8, CX 311 MOVL $0, 0(SP) // syscall gap 312 MOVL CX, 4(SP) // arg 1 - tcb 313 MOVL $329, AX // sys___set_tcb 314 INT $0x80 315 JCC 2(PC) 316 MOVL $0xf1, 0xf1 // crash 317 RET 318 319 TEXT runtime·osyield(SB),7,$-4 320 MOVL $298, AX // sys_sched_yield 321 INT $0x80 322 RET 323 324 TEXT runtime·thrsleep(SB),7,$-4 325 MOVL $300, AX // sys___thrsleep 326 INT $0x80 327 RET 328 329 TEXT runtime·thrwakeup(SB),7,$-4 330 MOVL $301, AX // sys___thrwakeup 331 INT $0x80 332 RET 333 334 TEXT runtime·sysctl(SB),7,$28 335 LEAL arg0+0(FP), SI 336 LEAL 4(SP), DI 337 CLD 338 MOVSL // arg 1 - name 339 MOVSL // arg 2 - namelen 340 MOVSL // arg 3 - oldp 341 MOVSL // arg 4 - oldlenp 342 MOVSL // arg 5 - newp 343 MOVSL // arg 6 - newlen 344 MOVL $202, AX // sys___sysctl 345 INT $0x80 346 JCC 3(PC) 347 NEGL AX 348 RET 349 MOVL $0, AX 350 RET 351 352 GLOBL runtime·tlsoffset(SB),$4