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