github.com/x04/go/src@v0.0.0-20200202162449-3d481ceb3525/runtime/sys_linux_riscv64.s (about) 1 // Copyright 2015 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 riscv64, Linux 7 // 8 9 #include "textflag.h" 10 #include "go_asm.h" 11 12 #define AT_FDCWD -100 13 14 #define SYS_brk 214 15 #define SYS_clock_gettime 113 16 #define SYS_clone 220 17 #define SYS_close 57 18 #define SYS_connect 203 19 #define SYS_epoll_create1 20 20 #define SYS_epoll_ctl 21 21 #define SYS_epoll_pwait 22 22 #define SYS_exit 93 23 #define SYS_exit_group 94 24 #define SYS_faccessat 48 25 #define SYS_fcntl 25 26 #define SYS_futex 98 27 #define SYS_getpid 172 28 #define SYS_getrlimit 163 29 #define SYS_gettid 178 30 #define SYS_gettimeofday 169 31 #define SYS_kill 129 32 #define SYS_madvise 233 33 #define SYS_mincore 232 34 #define SYS_mmap 222 35 #define SYS_munmap 215 36 #define SYS_nanosleep 101 37 #define SYS_openat 56 38 #define SYS_pipe2 59 39 #define SYS_pselect6 72 40 #define SYS_read 63 41 #define SYS_rt_sigaction 134 42 #define SYS_rt_sigprocmask 135 43 #define SYS_rt_sigreturn 139 44 #define SYS_sched_getaffinity 123 45 #define SYS_sched_yield 124 46 #define SYS_setitimer 103 47 #define SYS_sigaltstack 132 48 #define SYS_socket 198 49 #define SYS_tgkill 131 50 #define SYS_tkill 130 51 #define SYS_write 64 52 53 #define FENCE WORD $0x0ff0000f 54 55 // func exit(code int32) 56 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4 57 MOVW code+0(FP), A0 58 MOV $SYS_exit_group, A7 59 ECALL 60 RET 61 62 // func exitThread(wait *uint32) 63 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8 64 MOV wait+0(FP), A0 65 // We're done using the stack. 66 FENCE 67 MOVW ZERO, (A0) 68 FENCE 69 MOV $0, A0 // exit code 70 MOV $SYS_exit, A7 71 ECALL 72 JMP 0(PC) 73 74 // func open(name *byte, mode, perm int32) int32 75 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 76 MOV $AT_FDCWD, A0 77 MOV name+0(FP), A1 78 MOVW mode+8(FP), A2 79 MOVW perm+12(FP), A3 80 MOV $SYS_openat, A7 81 ECALL 82 MOV $-4096, T0 83 BGEU T0, A0, 2(PC) 84 MOV $-1, A0 85 MOVW A0, ret+16(FP) 86 RET 87 88 // func closefd(fd int32) int32 89 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12 90 MOVW fd+0(FP), A0 91 MOV $SYS_close, A7 92 ECALL 93 MOV $-4096, T0 94 BGEU T0, A0, 2(PC) 95 MOV $-1, A0 96 MOVW A0, ret+8(FP) 97 RET 98 99 // func write1(fd uintptr, p unsafe.Pointer, n int32) int32 100 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28 101 MOV fd+0(FP), A0 102 MOV p+8(FP), A1 103 MOVW n+16(FP), A2 104 MOV $SYS_write, A7 105 ECALL 106 MOVW A0, ret+24(FP) 107 RET 108 109 // func read(fd int32, p unsafe.Pointer, n int32) int32 110 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28 111 MOVW fd+0(FP), A0 112 MOV p+8(FP), A1 113 MOVW n+16(FP), A2 114 MOV $SYS_read, A7 115 ECALL 116 MOVW A0, ret+24(FP) 117 RET 118 119 // func pipe() (r, w int32, errno int32) 120 TEXT runtime·pipe(SB),NOSPLIT|NOFRAME,$0-12 121 MOV $r+0(FP), A0 122 MOV ZERO, A1 123 MOV $SYS_pipe2, A7 124 ECALL 125 MOVW A0, errno+8(FP) 126 RET 127 128 // func pipe2(flags int32) (r, w int32, errno int32) 129 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 130 MOV $r+8(FP), A0 131 MOVW flags+0(FP), A1 132 MOV $SYS_pipe2, A7 133 ECALL 134 MOVW A0, errno+16(FP) 135 RET 136 137 // func getrlimit(kind int32, limit unsafe.Pointer) int32 138 TEXT runtime·getrlimit(SB),NOSPLIT|NOFRAME,$0-20 139 MOVW kind+0(FP), A0 140 MOV limit+8(FP), A1 141 MOV $SYS_getrlimit, A7 142 ECALL 143 MOVW A0, ret+16(FP) 144 RET 145 146 // func usleep(usec uint32) 147 TEXT runtime·usleep(SB),NOSPLIT,$24-4 148 MOVWU usec+0(FP), A0 149 MOV $1000, A1 150 MUL A1, A0, A0 151 MOV $1000000000, A1 152 DIV A1, A0, A2 153 MOV A2, 8(X2) 154 REM A1, A0, A3 155 MOV A3, 16(X2) 156 ADD $8, X2, A0 157 MOV ZERO, A1 158 MOV $SYS_nanosleep, A7 159 ECALL 160 RET 161 162 // func gettid() uint32 163 TEXT runtime·gettid(SB),NOSPLIT,$0-4 164 MOV $SYS_gettid, A7 165 ECALL 166 MOVW A0, ret+0(FP) 167 RET 168 169 // func raise(sig uint32) 170 TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0 171 MOV $SYS_gettid, A7 172 ECALL 173 // arg 1 tid - already in A0 174 MOVW sig+0(FP), A1 // arg 2 175 MOV $SYS_tkill, A7 176 ECALL 177 RET 178 179 // func raiseproc(sig uint32) 180 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0 181 MOV $SYS_getpid, A7 182 ECALL 183 // arg 1 pid - already in A0 184 MOVW sig+0(FP), A1 // arg 2 185 MOV $SYS_kill, A7 186 ECALL 187 RET 188 189 // func getpid() int 190 TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8 191 MOV $SYS_getpid, A7 192 ECALL 193 MOV A0, ret+0(FP) 194 RET 195 196 // func tgkill(tgid, tid, sig int) 197 TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24 198 MOV tgid+0(FP), A0 199 MOV tid+8(FP), A1 200 MOV sig+16(FP), A2 201 MOV $SYS_tgkill, A7 202 ECALL 203 RET 204 205 // func setitimer(mode int32, new, old *itimerval) 206 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24 207 MOVW mode+0(FP), A0 208 MOV new+8(FP), A1 209 MOV old+16(FP), A2 210 MOV $SYS_setitimer, A7 211 ECALL 212 RET 213 214 // func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32 215 TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28 216 MOV addr+0(FP), A0 217 MOV n+8(FP), A1 218 MOV dst+16(FP), A2 219 MOV $SYS_mincore, A7 220 ECALL 221 MOVW A0, ret+24(FP) 222 RET 223 224 // func walltime1() (sec int64, nsec int32) 225 TEXT runtime·walltime1(SB),NOSPLIT,$24-12 226 MOV $0, A0 // CLOCK_REALTIME 227 MOV $8(X2), A1 228 MOV $SYS_clock_gettime, A7 229 ECALL 230 MOV 8(X2), T0 // sec 231 MOV 16(X2), T1 // nsec 232 MOV T0, sec+0(FP) 233 MOVW T1, nsec+8(FP) 234 RET 235 236 // func nanotime1() int64 237 TEXT runtime·nanotime1(SB),NOSPLIT,$24-8 238 MOV $1, A0 // CLOCK_MONOTONIC 239 MOV $8(X2), A1 240 MOV $SYS_clock_gettime, A7 241 ECALL 242 MOV 8(X2), T0 // sec 243 MOV 16(X2), T1 // nsec 244 // sec is in T0, nsec in T1 245 // return nsec in T0 246 MOV $1000000000, T2 247 MUL T2, T0 248 ADD T1, T0 249 MOV T0, ret+0(FP) 250 RET 251 252 // func rtsigprocmask(how int32, new, old *sigset, size int32) 253 TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28 254 MOVW how+0(FP), A0 255 MOV new+8(FP), A1 256 MOV old+16(FP), A2 257 MOVW size+24(FP), A3 258 MOV $SYS_rt_sigprocmask, A7 259 ECALL 260 MOV $-4096, T0 261 BLTU A0, T0, 2(PC) 262 WORD $0 // crash 263 RET 264 265 // func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32 266 TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36 267 MOV sig+0(FP), A0 268 MOV new+8(FP), A1 269 MOV old+16(FP), A2 270 MOV size+24(FP), A3 271 MOV $SYS_rt_sigaction, A7 272 ECALL 273 MOVW A0, ret+32(FP) 274 RET 275 276 // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) 277 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 278 MOVW sig+8(FP), A0 279 MOV info+16(FP), A1 280 MOV ctx+24(FP), A2 281 MOV fn+0(FP), T1 282 JALR RA, T1 283 RET 284 285 // func sigtramp(signo, ureg, ctxt unsafe.Pointer) 286 TEXT runtime·sigtramp(SB),NOSPLIT,$64 287 MOVW A0, 8(X2) 288 MOV A1, 16(X2) 289 MOV A2, 24(X2) 290 291 // this might be called in external code context, 292 // where g is not set. 293 MOVBU runtime·iscgo(SB), A0 294 BEQ A0, ZERO, 2(PC) 295 CALL runtime·load_g(SB) 296 297 MOV $runtime·sigtrampgo(SB), A0 298 JALR RA, A0 299 RET 300 301 // func cgoSigtramp() 302 TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 303 MOV $runtime·sigtramp(SB), T1 304 JALR ZERO, T1 305 306 // func mmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (p unsafe.Pointer, err int) 307 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0 308 MOV addr+0(FP), A0 309 MOV n+8(FP), A1 310 MOVW prot+16(FP), A2 311 MOVW flags+20(FP), A3 312 MOVW fd+24(FP), A4 313 MOVW off+28(FP), A5 314 MOV $SYS_mmap, A7 315 ECALL 316 MOV $-4096, T0 317 BGEU T0, A0, 5(PC) 318 SUB A0, ZERO, A0 319 MOV ZERO, p+32(FP) 320 MOV A0, err+40(FP) 321 RET 322 ok: 323 MOV A0, p+32(FP) 324 MOV ZERO, err+40(FP) 325 RET 326 327 // func munmap(addr unsafe.Pointer, n uintptr) 328 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0 329 MOV addr+0(FP), A0 330 MOV n+8(FP), A1 331 MOV $SYS_munmap, A7 332 ECALL 333 MOV $-4096, T0 334 BLTU A0, T0, 2(PC) 335 WORD $0 // crash 336 RET 337 338 // func madvise(addr unsafe.Pointer, n uintptr, flags int32) 339 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0 340 MOV addr+0(FP), A0 341 MOV n+8(FP), A1 342 MOVW flags+16(FP), A2 343 MOV $SYS_madvise, A7 344 ECALL 345 MOVW A0, ret+24(FP) 346 RET 347 348 // func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 349 TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0 350 MOV addr+0(FP), A0 351 MOVW op+8(FP), A1 352 MOVW val+12(FP), A2 353 MOV ts+16(FP), A3 354 MOV addr2+24(FP), A4 355 MOVW val3+32(FP), A5 356 MOV $SYS_futex, A7 357 ECALL 358 MOVW A0, ret+40(FP) 359 RET 360 361 // func clone(flags int32, stk, mp, gp, fn unsafe.Pointer) int32 362 TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0 363 MOVW flags+0(FP), A0 364 MOV stk+8(FP), A1 365 366 // Copy mp, gp, fn off parent stack for use by child. 367 MOV mp+16(FP), T0 368 MOV gp+24(FP), T1 369 MOV fn+32(FP), T2 370 371 MOV T0, -8(A1) 372 MOV T1, -16(A1) 373 MOV T2, -24(A1) 374 MOV $1234, T0 375 MOV T0, -32(A1) 376 377 MOV $SYS_clone, A7 378 ECALL 379 380 // In parent, return. 381 BEQ ZERO, A0, child 382 MOVW ZERO, ret+40(FP) 383 RET 384 385 child: 386 // In child, on new stack. 387 MOV -32(X2), T0 388 MOV $1234, A0 389 BEQ A0, T0, good 390 WORD $0 // crash 391 392 good: 393 // Initialize m->procid to Linux tid 394 MOV $SYS_gettid, A7 395 ECALL 396 397 MOV -24(X2), T2 // fn 398 MOV -16(X2), T1 // g 399 MOV -8(X2), T0 // m 400 401 BEQ ZERO, T0, nog 402 BEQ ZERO, T1, nog 403 404 MOV A0, m_procid(T0) 405 406 // In child, set up new stack 407 MOV T0, g_m(T1) 408 MOV T1, g 409 410 nog: 411 // Call fn 412 JALR RA, T2 413 414 // It shouldn't return. If it does, exit this thread. 415 MOV $111, A0 416 MOV $SYS_exit, A7 417 ECALL 418 JMP -3(PC) // keep exiting 419 420 // func sigaltstack(new, old *stackt) 421 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 422 MOV new+0(FP), A0 423 MOV old+8(FP), A1 424 MOV $SYS_sigaltstack, A7 425 ECALL 426 MOV $-4096, T0 427 BLTU A0, T0, 2(PC) 428 WORD $0 // crash 429 RET 430 431 // func osyield() 432 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0 433 MOV $SYS_sched_yield, A7 434 ECALL 435 RET 436 437 // func sched_getaffinity(pid, len uintptr, buf *uintptr) int32 438 TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0 439 MOV pid+0(FP), A0 440 MOV len+8(FP), A1 441 MOV buf+16(FP), A2 442 MOV $SYS_sched_getaffinity, A7 443 ECALL 444 MOV A0, ret+24(FP) 445 RET 446 447 // func epollcreate(size int32) int32 448 TEXT runtime·epollcreate(SB),NOSPLIT|NOFRAME,$0 449 MOV $0, A0 450 MOV $SYS_epoll_create1, A7 451 ECALL 452 MOVW A0, ret+8(FP) 453 RET 454 455 // func epollcreate1(flags int32) int32 456 TEXT runtime·epollcreate1(SB),NOSPLIT|NOFRAME,$0 457 MOVW flags+0(FP), A0 458 MOV $SYS_epoll_create1, A7 459 ECALL 460 MOVW A0, ret+8(FP) 461 RET 462 463 // func epollctl(epfd, op, fd int32, ev *epollevent) int32 464 TEXT runtime·epollctl(SB),NOSPLIT|NOFRAME,$0 465 MOVW epfd+0(FP), A0 466 MOVW op+4(FP), A1 467 MOVW fd+8(FP), A2 468 MOV ev+16(FP), A3 469 MOV $SYS_epoll_ctl, A7 470 ECALL 471 MOVW A0, ret+24(FP) 472 RET 473 474 // func epollwait(epfd int32, ev *epollevent, nev, timeout int32) int32 475 TEXT runtime·epollwait(SB),NOSPLIT|NOFRAME,$0 476 MOVW epfd+0(FP), A0 477 MOV ev+8(FP), A1 478 MOVW nev+16(FP), A2 479 MOVW timeout+20(FP), A3 480 MOV $0, A4 481 MOV $SYS_epoll_pwait, A7 482 ECALL 483 MOVW A0, ret+24(FP) 484 RET 485 486 // func closeonexec(int32) 487 TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0 488 MOVW fd+0(FP), A0 // fd 489 MOV $2, A1 // F_SETFD 490 MOV $1, A2 // FD_CLOEXEC 491 MOV $SYS_fcntl, A7 492 ECALL 493 RET 494 495 // func runtime·setNonblock(int32 fd) 496 TEXT runtime·setNonblock(SB),NOSPLIT|NOFRAME,$0-4 497 MOVW fd+0(FP), A0 // fd 498 MOV $3, A1 // F_GETFL 499 MOV $0, A2 500 MOV $SYS_fcntl, A7 501 ECALL 502 MOV $0x800, A2 // O_NONBLOCK 503 OR A0, A2 504 MOVW fd+0(FP), A0 // fd 505 MOV $4, A1 // F_SETFL 506 MOV $SYS_fcntl, A7 507 ECALL 508 RET 509 510 // func sbrk0() uintptr 511 TEXT runtime·sbrk0(SB),NOSPLIT,$0-8 512 // Implemented as brk(NULL). 513 MOV $0, A0 514 MOV $SYS_brk, A7 515 ECALL 516 MOVW A0, ret+0(FP) 517 RET