github.com/x04/go/src@v0.0.0-20200202162449-3d481ceb3525/runtime/sys_freebsd_arm64.s (about) 1 // Copyright 2019 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 // 6 // System calls and other sys.stuff for arm64, FreeBSD 7 // /usr/src/sys/kern/syscalls.master for syscall numbers. 8 // 9 10 #include "go_asm.h" 11 #include "go_tls.h" 12 #include "textflag.h" 13 14 #define CLOCK_REALTIME 0 15 #define CLOCK_MONOTONIC 4 16 #define FD_CLOEXEC 1 17 #define F_SETFD 2 18 #define F_GETFL 3 19 #define F_SETFL 4 20 #define O_NONBLOCK 4 21 22 #define SYS_exit 1 23 #define SYS_read 3 24 #define SYS_write 4 25 #define SYS_open 5 26 #define SYS_close 6 27 #define SYS_getpid 20 28 #define SYS_kill 37 29 #define SYS_sigaltstack 53 30 #define SYS_munmap 73 31 #define SYS_madvise 75 32 #define SYS_setitimer 83 33 #define SYS_fcntl 92 34 #define SYS___sysctl 202 35 #define SYS_nanosleep 240 36 #define SYS_clock_gettime 232 37 #define SYS_sched_yield 331 38 #define SYS_sigprocmask 340 39 #define SYS_kqueue 362 40 #define SYS_kevent 363 41 #define SYS_sigaction 416 42 #define SYS_thr_exit 431 43 #define SYS_thr_self 432 44 #define SYS_thr_kill 433 45 #define SYS__umtx_op 454 46 #define SYS_thr_new 455 47 #define SYS_mmap 477 48 #define SYS_cpuset_getaffinity 487 49 #define SYS_pipe2 542 50 51 TEXT emptyfunc<>(SB),0,$0-0 52 RET 53 54 // func sys_umtx_op(addr *uint32, mode int32, val uint32, uaddr1 uintptr, ut *umtx_time) int32 55 TEXT runtime·sys_umtx_op(SB),NOSPLIT,$0 56 MOVD addr+0(FP), R0 57 MOVW mode+8(FP), R1 58 MOVW val+12(FP), R2 59 MOVD uaddr1+16(FP), R3 60 MOVD ut+24(FP), R4 61 MOVD $SYS__umtx_op, R8 62 SVC 63 MOVW R0, ret+32(FP) 64 RET 65 66 // func thr_new(param *thrparam, size int32) int32 67 TEXT runtime·thr_new(SB),NOSPLIT,$0 68 MOVD param+0(FP), R0 69 MOVW size+8(FP), R1 70 MOVD $SYS_thr_new, R8 71 SVC 72 MOVW R0, ret+16(FP) 73 RET 74 75 // func thr_start() 76 TEXT runtime·thr_start(SB),NOSPLIT,$0 77 // set up g 78 MOVD m_g0(R0), g 79 MOVD R0, g_m(g) 80 BL emptyfunc<>(SB) // fault if stack check is wrong 81 BL runtime·mstart(SB) 82 83 MOVD $2, R8 // crash (not reached) 84 MOVD R8, (R8) 85 RET 86 87 // func exit(code int32) 88 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4 89 MOVW code+0(FP), R0 90 MOVD $SYS_exit, R8 91 SVC 92 MOVD $0, R0 93 MOVD R0, (R0) 94 95 // func exitThread(wait *uint32) 96 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8 97 MOVD wait+0(FP), R0 98 // We're done using the stack. 99 MOVW $0, R1 100 STLRW R1, (R0) 101 MOVW $0, R0 102 MOVD $SYS_thr_exit, R8 103 SVC 104 JMP 0(PC) 105 106 // func open(name *byte, mode, perm int32) int32 107 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 108 MOVD name+0(FP), R0 109 MOVW mode+8(FP), R1 110 MOVW perm+12(FP), R2 111 MOVD $SYS_open, R8 112 SVC 113 BCC ok 114 MOVW $-1, R0 115 ok: 116 MOVW R0, ret+16(FP) 117 RET 118 119 // func closefd(fd int32) int32 120 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12 121 MOVW fd+0(FP), R0 122 MOVD $SYS_close, R8 123 SVC 124 BCC ok 125 MOVW $-1, R0 126 ok: 127 MOVW R0, ret+8(FP) 128 RET 129 130 // func pipe() (r, w int32, errno int32) 131 TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12 132 MOVD $r+0(FP), R0 133 MOVW $0, R1 134 MOVD $SYS_pipe2, R8 135 SVC 136 BCC ok 137 NEG R0, R0 138 ok: 139 MOVW R0, errno+8(FP) 140 RET 141 142 // func pipe2(flags int32) (r, w int32, errno int32) 143 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 144 MOVD $r+8(FP), R0 145 MOVW flags+0(FP), R1 146 MOVD $SYS_pipe2, R8 147 SVC 148 BCC ok 149 NEG R0, R0 150 ok: 151 MOVW R0, errno+16(FP) 152 RET 153 154 // func write1(fd uintptr, p unsafe.Pointer, n int32) int32 155 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28 156 MOVD fd+0(FP), R0 157 MOVD p+8(FP), R1 158 MOVW n+16(FP), R2 159 MOVD $SYS_write, R8 160 SVC 161 BCC ok 162 NEG R0, R0 // caller expects negative errno 163 ok: 164 MOVW R0, ret+24(FP) 165 RET 166 167 // func read(fd int32, p unsafe.Pointer, n int32) int32 168 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28 169 MOVW fd+0(FP), R0 170 MOVD p+8(FP), R1 171 MOVW n+16(FP), R2 172 MOVD $SYS_read, R8 173 SVC 174 BCC ok 175 NEG R0, R0 // caller expects negative errno 176 ok: 177 MOVW R0, ret+24(FP) 178 RET 179 180 // func usleep(usec uint32) 181 TEXT runtime·usleep(SB),NOSPLIT,$24-4 182 MOVWU usec+0(FP), R3 183 MOVD R3, R5 184 MOVW $1000000, R4 185 UDIV R4, R3 186 MOVD R3, 8(RSP) 187 MUL R3, R4 188 SUB R4, R5 189 MOVW $1000, R4 190 MUL R4, R5 191 MOVD R5, 16(RSP) 192 193 // nanosleep(&ts, 0) 194 ADD $8, RSP, R0 195 MOVD $0, R1 196 MOVD $SYS_nanosleep, R8 197 SVC 198 RET 199 200 // func thr_self() thread 201 TEXT runtime·thr_self(SB),NOSPLIT,$8-8 202 MOVD $ptr-8(SP), R0 // arg 1 &8(SP) 203 MOVD $SYS_thr_self, R8 204 SVC 205 MOVD ptr-8(SP), R0 206 MOVD R0, ret+0(FP) 207 RET 208 209 // func thr_kill(t thread, sig int) 210 TEXT runtime·thr_kill(SB),NOSPLIT,$0-16 211 MOVD tid+0(FP), R0 // arg 1 pid 212 MOVD sig+8(FP), R1 // arg 2 sig 213 MOVD $SYS_thr_kill, R8 214 SVC 215 RET 216 217 // func raiseproc(sig uint32) 218 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0 219 MOVD $SYS_getpid, R8 220 SVC 221 MOVW sig+0(FP), R1 222 MOVD $SYS_kill, R8 223 SVC 224 RET 225 226 // func setitimer(mode int32, new, old *itimerval) 227 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24 228 MOVW mode+0(FP), R0 229 MOVD new+8(FP), R1 230 MOVD old+16(FP), R2 231 MOVD $SYS_setitimer, R8 232 SVC 233 RET 234 235 // func fallback_walltime() (sec int64, nsec int32) 236 TEXT runtime·fallback_walltime(SB),NOSPLIT,$24-12 237 MOVW $CLOCK_REALTIME, R0 238 MOVD $8(RSP), R1 239 MOVD $SYS_clock_gettime, R8 240 SVC 241 MOVD 8(RSP), R0 // sec 242 MOVW 16(RSP), R1 // nsec 243 MOVD R0, sec+0(FP) 244 MOVW R1, nsec+8(FP) 245 RET 246 247 // func fallback_nanotime() int64 248 TEXT runtime·fallback_nanotime(SB),NOSPLIT,$24-8 249 MOVD $CLOCK_MONOTONIC, R0 250 MOVD $8(RSP), R1 251 MOVD $SYS_clock_gettime, R8 252 SVC 253 MOVD 8(RSP), R0 // sec 254 MOVW 16(RSP), R2 // nsec 255 256 // sec is in R0, nsec in R2 257 // return nsec in R2 258 MOVD $1000000000, R3 259 MUL R3, R0 260 ADD R2, R0 261 262 MOVD R0, ret+0(FP) 263 RET 264 265 // func asmSigaction(sig uintptr, new, old *sigactiont) int32 266 TEXT runtime·asmSigaction(SB),NOSPLIT|NOFRAME,$0 267 MOVD sig+0(FP), R0 // arg 1 sig 268 MOVD new+8(FP), R1 // arg 2 act 269 MOVD old+16(FP), R2 // arg 3 oact 270 MOVD $SYS_sigaction, R8 271 SVC 272 BCC ok 273 MOVW $-1, R0 274 ok: 275 MOVW R0, ret+24(FP) 276 RET 277 278 // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) 279 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 280 MOVW sig+8(FP), R0 281 MOVD info+16(FP), R1 282 MOVD ctx+24(FP), R2 283 MOVD fn+0(FP), R11 284 BL (R11) 285 RET 286 287 // func sigtramp() 288 TEXT runtime·sigtramp(SB),NOSPLIT,$192 289 // Save callee-save registers in the case of signal forwarding. 290 // Please refer to https://golang.org/issue/31827 . 291 MOVD R19, 8*4(RSP) 292 MOVD R20, 8*5(RSP) 293 MOVD R21, 8*6(RSP) 294 MOVD R22, 8*7(RSP) 295 MOVD R23, 8*8(RSP) 296 MOVD R24, 8*9(RSP) 297 MOVD R25, 8*10(RSP) 298 MOVD R26, 8*11(RSP) 299 MOVD R27, 8*12(RSP) 300 MOVD g, 8*13(RSP) 301 MOVD R29, 8*14(RSP) 302 FMOVD F8, 8*15(RSP) 303 FMOVD F9, 8*16(RSP) 304 FMOVD F10, 8*17(RSP) 305 FMOVD F11, 8*18(RSP) 306 FMOVD F12, 8*19(RSP) 307 FMOVD F13, 8*20(RSP) 308 FMOVD F14, 8*21(RSP) 309 FMOVD F15, 8*22(RSP) 310 311 // this might be called in external code context, 312 // where g is not set. 313 // first save R0, because runtime·load_g will clobber it 314 MOVW R0, 8(RSP) 315 MOVBU runtime·iscgo(SB), R0 316 CMP $0, R0 317 BEQ 2(PC) 318 BL runtime·load_g(SB) 319 320 MOVD R1, 16(RSP) 321 MOVD R2, 24(RSP) 322 MOVD $runtime·sigtrampgo(SB), R0 323 BL (R0) 324 325 // Restore callee-save registers. 326 MOVD 8*4(RSP), R19 327 MOVD 8*5(RSP), R20 328 MOVD 8*6(RSP), R21 329 MOVD 8*7(RSP), R22 330 MOVD 8*8(RSP), R23 331 MOVD 8*9(RSP), R24 332 MOVD 8*10(RSP), R25 333 MOVD 8*11(RSP), R26 334 MOVD 8*12(RSP), R27 335 MOVD 8*13(RSP), g 336 MOVD 8*14(RSP), R29 337 FMOVD 8*15(RSP), F8 338 FMOVD 8*16(RSP), F9 339 FMOVD 8*17(RSP), F10 340 FMOVD 8*18(RSP), F11 341 FMOVD 8*19(RSP), F12 342 FMOVD 8*20(RSP), F13 343 FMOVD 8*21(RSP), F14 344 FMOVD 8*22(RSP), F15 345 346 RET 347 348 // func mmap(addr uintptr, n uintptr, prot int, flags int, fd int, off int64) (ret uintptr, err error) 349 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0 350 MOVD addr+0(FP), R0 351 MOVD n+8(FP), R1 352 MOVW prot+16(FP), R2 353 MOVW flags+20(FP), R3 354 MOVW fd+24(FP), R4 355 MOVW off+28(FP), R5 356 MOVD $SYS_mmap, R8 357 SVC 358 BCS fail 359 MOVD R0, p+32(FP) 360 MOVD $0, err+40(FP) 361 RET 362 fail: 363 MOVD $0, p+32(FP) 364 MOVD R0, err+40(FP) 365 RET 366 367 // func munmap(addr uintptr, n uintptr) (err error) 368 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0 369 MOVD addr+0(FP), R0 370 MOVD n+8(FP), R1 371 MOVD $SYS_munmap, R8 372 SVC 373 BCS fail 374 RET 375 fail: 376 MOVD $0, R0 377 MOVD R0, (R0) // crash 378 379 // func madvise(addr unsafe.Pointer, n uintptr, flags int32) int32 380 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0 381 MOVD addr+0(FP), R0 382 MOVD n+8(FP), R1 383 MOVW flags+16(FP), R2 384 MOVD $SYS_madvise, R8 385 SVC 386 BCC ok 387 MOVW $-1, R0 388 ok: 389 MOVW R0, ret+24(FP) 390 RET 391 392 // func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 393 TEXT runtime·sysctl(SB),NOSPLIT,$0 394 MOVD mib+0(FP), R0 395 MOVD miblen+8(FP), R1 396 MOVD out+16(FP), R2 397 MOVD size+24(FP), R3 398 MOVD dst+32(FP), R4 399 MOVD ndst+40(FP), R5 400 MOVD $SYS___sysctl, R8 401 SVC 402 BCC ok 403 NEG R0, R0 404 ok: 405 MOVW R0, ret+48(FP) 406 RET 407 408 // func sigaltstack(new, old *stackt) 409 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 410 MOVD new+0(FP), R0 411 MOVD old+8(FP), R1 412 MOVD $SYS_sigaltstack, R8 413 SVC 414 BCS fail 415 RET 416 fail: 417 MOVD $0, R0 418 MOVD R0, (R0) // crash 419 420 // func osyield() 421 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0 422 MOVD $SYS_sched_yield, R8 423 SVC 424 RET 425 426 // func sigprocmask(how int32, new, old *sigset) 427 TEXT runtime·sigprocmask(SB),NOSPLIT|NOFRAME,$0-24 428 MOVW how+0(FP), R0 429 MOVD new+8(FP), R1 430 MOVD old+16(FP), R2 431 MOVD $SYS_sigprocmask, R8 432 SVC 433 BCS fail 434 RET 435 fail: 436 MOVD $0, R0 437 MOVD R0, (R0) // crash 438 439 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32 440 TEXT runtime·cpuset_getaffinity(SB),NOSPLIT|NOFRAME,$0-44 441 MOVD level+0(FP), R0 442 MOVD which+8(FP), R1 443 MOVD id+16(FP), R2 444 MOVD size+24(FP), R3 445 MOVD mask+32(FP), R4 446 MOVD $SYS_cpuset_getaffinity, R8 447 SVC 448 BCC ok 449 MOVW $-1, R0 450 ok: 451 MOVW R0, ret+40(FP) 452 RET 453 454 // func kqueue() int32 455 TEXT runtime·kqueue(SB),NOSPLIT|NOFRAME,$0 456 MOVD $SYS_kqueue, R8 457 SVC 458 BCC ok 459 MOVW $-1, R0 460 ok: 461 MOVW R0, ret+0(FP) 462 RET 463 464 // func kevent(kq int, ch unsafe.Pointer, nch int, ev unsafe.Pointer, nev int, ts *Timespec) (n int, err error) 465 TEXT runtime·kevent(SB),NOSPLIT,$0 466 MOVW kq+0(FP), R0 467 MOVD ch+8(FP), R1 468 MOVW nch+16(FP), R2 469 MOVD ev+24(FP), R3 470 MOVW nev+32(FP), R4 471 MOVD ts+40(FP), R5 472 MOVD $SYS_kevent, R8 473 SVC 474 BCC ok 475 NEG R0, R0 476 ok: 477 MOVW R0, ret+48(FP) 478 RET 479 480 // func closeonexec(fd int32) 481 TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0 482 MOVW fd+0(FP), R0 483 MOVD $F_SETFD, R1 484 MOVD $FD_CLOEXEC, R2 485 MOVD $SYS_fcntl, R8 486 SVC 487 RET 488 489 // func runtime·setNonblock(fd int32) 490 TEXT runtime·setNonblock(SB),NOSPLIT,$0-4 491 MOVW fd+0(FP), R0 492 MOVD $F_GETFL, R1 493 MOVD $0, R2 494 MOVD $SYS_fcntl, R8 495 SVC 496 ORR $O_NONBLOCK, R0, R2 497 MOVW fd+0(FP), R0 498 MOVW $F_SETFL, R1 499 MOVW $SYS_fcntl, R7 500 SVC 501 RET 502 503 // func getCntxct(physical bool) uint32 504 TEXT runtime·getCntxct(SB),NOSPLIT,$0 505 MOVB physical+0(FP), R0 506 CMP $0, R0 507 BEQ 3(PC) 508 509 // get CNTPCT (Physical Count Register) into R0 510 MRS CNTPCT_EL0, R0 // SIGILL 511 B 2(PC) 512 513 // get CNTVCT (Virtual Count Register) into R0 514 MRS CNTVCT_EL0, R0 515 516 MOVW R0, ret+8(FP) 517 RET 518 519 // func getisar0() uint64 520 TEXT runtime·getisar0(SB),NOSPLIT,$0 521 // get Instruction Set Attributes 0 into R0 522 MRS ID_AA64ISAR0_EL1, R0 523 MOVD R0, ret+0(FP) 524 RET 525 526 // func getisar1() uint64 527 TEXT runtime·getisar1(SB),NOSPLIT,$0 528 // get Instruction Set Attributes 1 into R0 529 MRS ID_AA64ISAR1_EL1, R0 530 MOVD R0, ret+0(FP) 531 RET 532 533 // func getpfr0() uint64 534 TEXT runtime·getpfr0(SB),NOSPLIT,$0 535 // get Processor Feature Register 0 into R0 536 MRS ID_AA64PFR0_EL1, R0 537 MOVD R0, ret+0(FP) 538 RET