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