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