github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_freebsd_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, FreeBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "zasm_GOOS_GOARCH.h" 10 11 TEXT runtime·sys_umtx_op(SB),7,$-4 12 MOVL $454, AX 13 INT $0x80 14 RET 15 16 TEXT runtime·thr_new(SB),7,$-4 17 MOVL $455, AX 18 INT $0x80 19 RET 20 21 TEXT runtime·thr_start(SB),7,$0 22 MOVL mm+0(FP), AX 23 MOVL m_g0(AX), BX 24 LEAL m_tls(AX), BP 25 MOVL 0(BP), DI 26 ADDL $7, DI 27 PUSHAL 28 PUSHL $32 29 PUSHL BP 30 PUSHL DI 31 CALL runtime·setldt(SB) 32 POPL AX 33 POPL AX 34 POPL AX 35 POPAL 36 get_tls(CX) 37 MOVL BX, g(CX) 38 39 MOVL AX, m(CX) 40 CALL runtime·stackcheck(SB) // smashes AX 41 CALL runtime·mstart(SB) 42 43 MOVL 0, AX // crash (not reached) 44 45 // Exit the entire program (like C exit) 46 TEXT runtime·exit(SB),7,$-4 47 MOVL $1, AX 48 INT $0x80 49 MOVL $0xf1, 0xf1 // crash 50 RET 51 52 TEXT runtime·exit1(SB),7,$-4 53 MOVL $431, AX 54 INT $0x80 55 JAE 2(PC) 56 MOVL $0xf1, 0xf1 // crash 57 RET 58 59 TEXT runtime·open(SB),7,$-4 60 MOVL $5, AX 61 INT $0x80 62 RET 63 64 TEXT runtime·close(SB),7,$-4 65 MOVL $6, AX 66 INT $0x80 67 RET 68 69 TEXT runtime·read(SB),7,$-4 70 MOVL $3, AX 71 INT $0x80 72 RET 73 74 TEXT runtime·write(SB),7,$-4 75 MOVL $4, AX 76 INT $0x80 77 RET 78 79 TEXT runtime·getrlimit(SB),7,$-4 80 MOVL $194, AX 81 INT $0x80 82 RET 83 84 TEXT runtime·raise(SB),7,$16 85 // thr_self(&8(SP)) 86 LEAL 8(SP), AX 87 MOVL AX, 4(SP) 88 MOVL $432, AX 89 INT $0x80 90 // thr_kill(self, SIGPIPE) 91 MOVL 8(SP), AX 92 MOVL AX, 4(SP) 93 MOVL sig+0(FP), AX 94 MOVL AX, 8(SP) 95 MOVL $433, AX 96 INT $0x80 97 RET 98 99 TEXT runtime·mmap(SB),7,$32 100 LEAL arg0+0(FP), SI 101 LEAL 4(SP), DI 102 CLD 103 MOVSL 104 MOVSL 105 MOVSL 106 MOVSL 107 MOVSL 108 MOVSL 109 MOVL $0, AX // top 32 bits of file offset 110 STOSL 111 MOVL $477, AX 112 INT $0x80 113 RET 114 115 TEXT runtime·munmap(SB),7,$-4 116 MOVL $73, AX 117 INT $0x80 118 JAE 2(PC) 119 MOVL $0xf1, 0xf1 // crash 120 RET 121 122 TEXT runtime·madvise(SB),7,$-4 123 MOVL $75, AX // madvise 124 INT $0x80 125 // ignore failure - maybe pages are locked 126 RET 127 128 TEXT runtime·setitimer(SB), 7, $-4 129 MOVL $83, AX 130 INT $0x80 131 RET 132 133 // func now() (sec int64, nsec int32) 134 TEXT time·now(SB), 7, $32 135 MOVL $232, AX 136 LEAL 12(SP), BX 137 MOVL $0, 4(SP) 138 MOVL BX, 8(SP) 139 INT $0x80 140 MOVL 12(SP), AX // sec 141 MOVL 16(SP), BX // nsec 142 143 // sec is in AX, nsec in BX 144 MOVL AX, sec+0(FP) 145 MOVL $0, sec+4(FP) 146 MOVL BX, nsec+8(FP) 147 RET 148 149 // int64 nanotime(void) so really 150 // void nanotime(int64 *nsec) 151 TEXT runtime·nanotime(SB), 7, $32 152 MOVL $232, AX 153 LEAL 12(SP), BX 154 MOVL $0, 4(SP) 155 MOVL BX, 8(SP) 156 INT $0x80 157 MOVL 12(SP), AX // sec 158 MOVL 16(SP), BX // nsec 159 160 // sec is in AX, nsec in BX 161 // convert to DX:AX nsec 162 MOVL $1000000000, CX 163 MULL CX 164 ADDL BX, AX 165 ADCL $0, DX 166 167 MOVL ret+0(FP), DI 168 MOVL AX, 0(DI) 169 MOVL DX, 4(DI) 170 RET 171 172 173 TEXT runtime·sigaction(SB),7,$-4 174 MOVL $416, AX 175 INT $0x80 176 JAE 2(PC) 177 MOVL $0xf1, 0xf1 // crash 178 RET 179 180 TEXT runtime·sigtramp(SB),7,$44 181 get_tls(CX) 182 183 // check that m exists 184 MOVL m(CX), BX 185 CMPL BX, $0 186 JNE 5(PC) 187 MOVL signo+0(FP), BX 188 MOVL BX, 0(SP) 189 CALL runtime·badsignal(SB) 190 RET 191 192 // save g 193 MOVL g(CX), DI 194 MOVL DI, 20(SP) 195 196 // g = m->gsignal 197 MOVL m_gsignal(BX), BX 198 MOVL BX, g(CX) 199 200 // copy arguments for call to sighandler 201 MOVL signo+0(FP), BX 202 MOVL BX, 0(SP) 203 MOVL info+4(FP), BX 204 MOVL BX, 4(SP) 205 MOVL context+8(FP), BX 206 MOVL BX, 8(SP) 207 MOVL DI, 12(SP) 208 209 CALL runtime·sighandler(SB) 210 211 // restore g 212 get_tls(CX) 213 MOVL 20(SP), BX 214 MOVL BX, g(CX) 215 216 // call sigreturn 217 MOVL context+8(FP), AX 218 MOVL $0, 0(SP) // syscall gap 219 MOVL AX, 4(SP) 220 MOVL $417, AX // sigreturn(ucontext) 221 INT $0x80 222 MOVL $0xf1, 0xf1 // crash 223 RET 224 225 TEXT runtime·sigaltstack(SB),7,$0 226 MOVL $53, AX 227 INT $0x80 228 JAE 2(PC) 229 MOVL $0xf1, 0xf1 // crash 230 RET 231 232 TEXT runtime·usleep(SB),7,$20 233 MOVL $0, DX 234 MOVL usec+0(FP), AX 235 MOVL $1000000, CX 236 DIVL CX 237 MOVL AX, 12(SP) // tv_sec 238 MOVL $1000, AX 239 MULL DX 240 MOVL AX, 16(SP) // tv_nsec 241 242 MOVL $0, 0(SP) 243 LEAL 12(SP), AX 244 MOVL AX, 4(SP) // arg 1 - rqtp 245 MOVL $0, 8(SP) // arg 2 - rmtp 246 MOVL $240, AX // sys_nanosleep 247 INT $0x80 248 RET 249 250 /* 251 descriptor entry format for system call 252 is the native machine format, ugly as it is: 253 254 2-byte limit 255 3-byte base 256 1-byte: 0x80=present, 0x60=dpl<<5, 0x1F=type 257 1-byte: 0x80=limit is *4k, 0x40=32-bit operand size, 258 0x0F=4 more bits of limit 259 1 byte: 8 more bits of base 260 261 int i386_get_ldt(int, union ldt_entry *, int); 262 int i386_set_ldt(int, const union ldt_entry *, int); 263 264 */ 265 266 // setldt(int entry, int address, int limit) 267 TEXT runtime·setldt(SB),7,$32 268 MOVL address+4(FP), BX // aka base 269 // see comment in sys_linux_386.s; freebsd is similar 270 ADDL $0x8, BX 271 272 // set up data_desc 273 LEAL 16(SP), AX // struct data_desc 274 MOVL $0, 0(AX) 275 MOVL $0, 4(AX) 276 277 MOVW BX, 2(AX) 278 SHRL $16, BX 279 MOVB BX, 4(AX) 280 SHRL $8, BX 281 MOVB BX, 7(AX) 282 283 MOVW $0xffff, 0(AX) 284 MOVB $0xCF, 6(AX) // 32-bit operand, 4k limit unit, 4 more bits of limit 285 286 MOVB $0xF2, 5(AX) // r/w data descriptor, dpl=3, present 287 288 // call i386_set_ldt(entry, desc, 1) 289 MOVL $0xffffffff, 0(SP) // auto-allocate entry and return in AX 290 MOVL AX, 4(SP) 291 MOVL $1, 8(SP) 292 CALL runtime·i386_set_ldt(SB) 293 294 // compute segment selector - (entry*8+7) 295 SHLL $3, AX 296 ADDL $7, AX 297 MOVW AX, GS 298 RET 299 300 TEXT runtime·i386_set_ldt(SB),7,$16 301 LEAL args+0(FP), AX // 0(FP) == 4(SP) before SP got moved 302 MOVL $0, 0(SP) // syscall gap 303 MOVL $1, 4(SP) 304 MOVL AX, 8(SP) 305 MOVL $165, AX 306 INT $0x80 307 CMPL AX, $0xfffff001 308 JLS 2(PC) 309 INT $3 310 RET 311 312 TEXT runtime·sysctl(SB),7,$28 313 LEAL arg0+0(FP), SI 314 LEAL 4(SP), DI 315 CLD 316 MOVSL // arg 1 - name 317 MOVSL // arg 2 - namelen 318 MOVSL // arg 3 - oldp 319 MOVSL // arg 4 - oldlenp 320 MOVSL // arg 5 - newp 321 MOVSL // arg 6 - newlen 322 MOVL $202, AX // sys___sysctl 323 INT $0x80 324 JCC 3(PC) 325 NEGL AX 326 RET 327 MOVL $0, AX 328 RET 329 330 TEXT runtime·osyield(SB),7,$-4 331 MOVL $331, AX // sys_sched_yield 332 INT $0x80 333 RET 334 335 TEXT runtime·sigprocmask(SB),7,$16 336 MOVL $0, 0(SP) // syscall gap 337 MOVL $3, 4(SP) // arg 1 - how (SIG_SETMASK) 338 MOVL args+0(FP), AX 339 MOVL AX, 8(SP) // arg 2 - set 340 MOVL args+4(FP), AX 341 MOVL AX, 12(SP) // arg 3 - oset 342 MOVL $340, AX // sys_sigprocmask 343 INT $0x80 344 JAE 2(PC) 345 MOVL $0xf1, 0xf1 // crash 346 RET 347 348 GLOBL runtime·tlsoffset(SB),$4