github.com/xushiwei/go@v0.0.0-20130601165731-2b9d83f45bc9/src/pkg/runtime/sys_openbsd_amd64.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 AMD64, OpenBSD 6 // /usr/src/sys/kern/syscalls.master for syscall numbers. 7 // 8 9 #include "zasm_GOOS_GOARCH.h" 10 11 // int64 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); 12 TEXT runtime·tfork(SB),7,$32 13 14 // Copy mp, gp and fn off parent stack for use by child. 15 MOVQ mm+16(FP), R8 16 MOVQ gg+24(FP), R9 17 MOVQ fn+32(FP), R12 18 19 MOVQ param+0(FP), DI 20 MOVQ psize+8(FP), SI 21 MOVL $8, AX // sys___tfork 22 SYSCALL 23 24 // Return if tfork syscall failed. 25 JCC 3(PC) 26 NEGQ AX 27 RET 28 29 // In parent, return. 30 CMPL AX, $0 31 JEQ 2(PC) 32 RET 33 34 // Set FS to point at m->tls. 35 LEAQ m_tls(R8), DI 36 CALL runtime·settls(SB) 37 38 // In child, set up new stack. 39 get_tls(CX) 40 MOVQ R8, m(CX) 41 MOVQ R9, g(CX) 42 CALL runtime·stackcheck(SB) 43 44 // Call fn 45 CALL R12 46 47 // It shouldn't return. If it does, exit 48 MOVQ $0, DI // arg 1 - notdead 49 MOVL $302, AX // sys___threxit 50 SYSCALL 51 JMP -3(PC) // keep exiting 52 53 TEXT runtime·osyield(SB),7,$0 54 MOVL $298, AX // sys_sched_yield 55 SYSCALL 56 RET 57 58 TEXT runtime·thrsleep(SB),7,$0 59 MOVQ 8(SP), DI // arg 1 - ident 60 MOVL 16(SP), SI // arg 2 - clock_id 61 MOVQ 24(SP), DX // arg 3 - tp 62 MOVQ 32(SP), R10 // arg 4 - lock 63 MOVQ 40(SP), R8 // arg 5 - abort 64 MOVL $300, AX // sys___thrsleep 65 SYSCALL 66 RET 67 68 TEXT runtime·thrwakeup(SB),7,$0 69 MOVQ 8(SP), DI // arg 1 - ident 70 MOVL 16(SP), SI // arg 2 - n 71 MOVL $301, AX // sys___thrwakeup 72 SYSCALL 73 RET 74 75 // Exit the entire program (like C exit) 76 TEXT runtime·exit(SB),7,$-8 77 MOVL 8(SP), DI // arg 1 - exit status 78 MOVL $1, AX // sys_exit 79 SYSCALL 80 MOVL $0xf1, 0xf1 // crash 81 RET 82 83 TEXT runtime·exit1(SB),7,$-8 84 MOVQ $0, DI // arg 1 - notdead 85 MOVL $302, AX // sys___threxit 86 SYSCALL 87 MOVL $0xf1, 0xf1 // crash 88 RET 89 90 TEXT runtime·open(SB),7,$-8 91 MOVQ 8(SP), DI // arg 1 pathname 92 MOVL 16(SP), SI // arg 2 flags 93 MOVL 20(SP), DX // arg 3 mode 94 MOVL $5, AX 95 SYSCALL 96 RET 97 98 TEXT runtime·close(SB),7,$-8 99 MOVL 8(SP), DI // arg 1 fd 100 MOVL $6, AX 101 SYSCALL 102 RET 103 104 TEXT runtime·read(SB),7,$-8 105 MOVL 8(SP), DI // arg 1 fd 106 MOVQ 16(SP), SI // arg 2 buf 107 MOVL 24(SP), DX // arg 3 count 108 MOVL $3, AX 109 SYSCALL 110 RET 111 112 TEXT runtime·write(SB),7,$-8 113 MOVL 8(SP), DI // arg 1 - fd 114 MOVQ 16(SP), SI // arg 2 - buf 115 MOVL 24(SP), DX // arg 3 - nbyte 116 MOVL $4, AX // sys_write 117 SYSCALL 118 RET 119 120 TEXT runtime·usleep(SB),7,$16 121 MOVL $0, DX 122 MOVL usec+0(FP), AX 123 MOVL $1000000, CX 124 DIVL CX 125 MOVQ AX, 0(SP) // tv_sec 126 MOVL $1000, AX 127 MULL DX 128 MOVQ AX, 8(SP) // tv_nsec 129 130 MOVQ SP, DI // arg 1 - rqtp 131 MOVQ $0, SI // arg 2 - rmtp 132 MOVL $240, AX // sys_nanosleep 133 SYSCALL 134 RET 135 136 TEXT runtime·raise(SB),7,$16 137 MOVL $299, AX // sys_getthrid 138 SYSCALL 139 MOVQ AX, DI // arg 1 - pid 140 MOVL sig+0(FP), SI // arg 2 - signum 141 MOVL $37, AX // sys_kill 142 SYSCALL 143 RET 144 145 TEXT runtime·setitimer(SB),7,$-8 146 MOVL 8(SP), DI // arg 1 - which 147 MOVQ 16(SP), SI // arg 2 - itv 148 MOVQ 24(SP), DX // arg 3 - oitv 149 MOVL $83, AX // sys_setitimer 150 SYSCALL 151 RET 152 153 // func now() (sec int64, nsec int32) 154 TEXT time·now(SB), 7, $32 155 MOVQ $0, DI // arg 1 - clock_id 156 LEAQ 8(SP), SI // arg 2 - tp 157 MOVL $232, AX // sys_clock_gettime 158 SYSCALL 159 MOVL 8(SP), AX // sec 160 MOVQ 16(SP), DX // nsec 161 162 // sec is in AX, nsec in DX 163 MOVQ AX, sec+0(FP) 164 MOVL DX, nsec+8(FP) 165 RET 166 167 TEXT runtime·nanotime(SB),7,$32 168 MOVQ $0, DI // arg 1 - clock_id 169 LEAQ 8(SP), SI // arg 2 - tp 170 MOVL $232, AX // sys_clock_gettime 171 SYSCALL 172 MOVL 8(SP), AX // sec 173 MOVQ 16(SP), DX // nsec 174 175 // sec is in AX, nsec in DX 176 // return nsec in AX 177 IMULQ $1000000000, AX 178 ADDQ DX, AX 179 RET 180 181 TEXT runtime·sigaction(SB),7,$-8 182 MOVL 8(SP), DI // arg 1 - signum 183 MOVQ 16(SP), SI // arg 2 - nsa 184 MOVQ 24(SP), DX // arg 3 - osa 185 MOVL $46, AX 186 SYSCALL 187 JCC 2(PC) 188 MOVL $0xf1, 0xf1 // crash 189 RET 190 191 TEXT runtime·sigprocmask(SB),7,$0 192 MOVL 8(SP), DI // arg 1 - how 193 MOVL 12(SP), SI // arg 2 - set 194 MOVL $48, AX // sys_sigprocmask 195 SYSCALL 196 JCC 2(PC) 197 MOVL $0xf1, 0xf1 // crash 198 MOVL AX, oset+0(FP) // Return oset 199 RET 200 201 TEXT runtime·sigtramp(SB),7,$64 202 get_tls(BX) 203 204 // check that m exists 205 MOVQ m(BX), BP 206 CMPQ BP, $0 207 JNE 4(PC) 208 MOVQ DI, 0(SP) 209 CALL runtime·badsignal(SB) 210 RET 211 212 // save g 213 MOVQ g(BX), R10 214 MOVQ R10, 40(SP) 215 216 // g = m->signal 217 MOVQ m_gsignal(BP), BP 218 MOVQ BP, g(BX) 219 220 MOVQ DI, 0(SP) 221 MOVQ SI, 8(SP) 222 MOVQ DX, 16(SP) 223 MOVQ R10, 24(SP) 224 225 CALL runtime·sighandler(SB) 226 227 // restore g 228 get_tls(BX) 229 MOVQ 40(SP), R10 230 MOVQ R10, g(BX) 231 RET 232 233 TEXT runtime·mmap(SB),7,$0 234 MOVQ 8(SP), DI // arg 1 - addr 235 MOVQ 16(SP), SI // arg 2 - len 236 MOVL 24(SP), DX // arg 3 - prot 237 MOVL 28(SP), R10 // arg 4 - flags 238 MOVL 32(SP), R8 // arg 5 - fd 239 MOVQ 36(SP), R9 240 SUBQ $16, SP 241 MOVQ R9, 8(SP) // arg 7 - offset (passed on stack) 242 MOVQ $0, R9 // arg 6 - pad 243 MOVL $197, AX 244 SYSCALL 245 ADDQ $16, SP 246 RET 247 248 TEXT runtime·munmap(SB),7,$0 249 MOVQ 8(SP), DI // arg 1 - addr 250 MOVQ 16(SP), SI // arg 2 - len 251 MOVL $73, AX // sys_munmap 252 SYSCALL 253 JCC 2(PC) 254 MOVL $0xf1, 0xf1 // crash 255 RET 256 257 TEXT runtime·madvise(SB),7,$0 258 MOVQ addr+0(FP), DI // arg 1 - addr 259 MOVQ len+8(FP), SI // arg 2 - len 260 MOVQ behav+16(FP), DX // arg 3 - behav 261 MOVQ $75, AX // sys_madvise 262 SYSCALL 263 // ignore failure - maybe pages are locked 264 RET 265 266 TEXT runtime·sigaltstack(SB),7,$-8 267 MOVQ new+8(SP), DI // arg 1 - nss 268 MOVQ old+16(SP), SI // arg 2 - oss 269 MOVQ $288, AX // sys_sigaltstack 270 SYSCALL 271 JCC 2(PC) 272 MOVL $0xf1, 0xf1 // crash 273 RET 274 275 // set tls base to DI 276 TEXT runtime·settls(SB),7,$0 277 // adjust for ELF: wants to use -16(FS) and -8(FS) for g and m 278 ADDQ $16, DI 279 MOVQ $329, AX // sys___settcb 280 SYSCALL 281 JCC 2(PC) 282 MOVL $0xf1, 0xf1 // crash 283 RET 284 285 TEXT runtime·sysctl(SB),7,$0 286 MOVQ 8(SP), DI // arg 1 - name 287 MOVL 16(SP), SI // arg 2 - namelen 288 MOVQ 24(SP), DX // arg 3 - oldp 289 MOVQ 32(SP), R10 // arg 4 - oldlenp 290 MOVQ 40(SP), R8 // arg 5 - newp 291 MOVQ 48(SP), R9 // arg 6 - newlen 292 MOVQ $202, AX // sys___sysctl 293 SYSCALL 294 JCC 3(PC) 295 NEGQ AX 296 RET 297 MOVL $0, AX 298 RET 299