github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/sys_freebsd_riscv64.s (about) 1 // Copyright 2022 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, 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_sigaction 416 41 #define SYS_thr_exit 431 42 #define SYS_thr_self 432 43 #define SYS_thr_kill 433 44 #define SYS__umtx_op 454 45 #define SYS_thr_new 455 46 #define SYS_mmap 477 47 #define SYS_cpuset_getaffinity 487 48 #define SYS_pipe2 542 49 #define SYS_kevent 560 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 MOV addr+0(FP), A0 57 MOVW mode+8(FP), A1 58 MOVW val+12(FP), A2 59 MOV uaddr1+16(FP), A3 60 MOV ut+24(FP), A4 61 MOV $SYS__umtx_op, T0 62 ECALL 63 BEQ T0, ZERO, ok 64 NEG A0, A0 65 ok: 66 MOVW A0, ret+32(FP) 67 RET 68 69 // func thr_new(param *thrparam, size int32) int32 70 TEXT runtime·thr_new(SB),NOSPLIT,$0 71 MOV param+0(FP), A0 72 MOVW size+8(FP), A1 73 MOV $SYS_thr_new, T0 74 ECALL 75 BEQ T0, ZERO, ok 76 NEG A0, A0 77 ok: 78 MOVW A0, ret+16(FP) 79 RET 80 81 // func thr_start() 82 TEXT runtime·thr_start(SB),NOSPLIT,$0 83 // set up g 84 MOV m_g0(A0), g 85 MOV A0, g_m(g) 86 CALL emptyfunc<>(SB) // fault if stack check is wrong 87 CALL runtime·mstart(SB) 88 89 WORD $0 // crash 90 RET 91 92 // func exit(code int32) 93 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4 94 MOVW code+0(FP), A0 95 MOV $SYS_exit, T0 96 ECALL 97 WORD $0 // crash 98 99 // func exitThread(wait *atomic.Uint32) 100 TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8 101 MOV wait+0(FP), A0 102 // We're done using the stack. 103 FENCE 104 MOVW ZERO, (A0) 105 FENCE 106 MOV $0, A0 // exit code 107 MOV $SYS_thr_exit, T0 108 ECALL 109 JMP 0(PC) 110 111 // func open(name *byte, mode, perm int32) int32 112 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 113 MOV name+0(FP), A0 114 MOVW mode+8(FP), A1 115 MOVW perm+12(FP), A2 116 MOV $SYS_open, T0 117 ECALL 118 BEQ T0, ZERO, ok 119 MOV $-1, A0 120 ok: 121 MOVW A0, ret+16(FP) 122 RET 123 124 // func closefd(fd int32) int32 125 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12 126 MOVW fd+0(FP), A0 127 MOV $SYS_close, T0 128 ECALL 129 BEQ T0, ZERO, ok 130 MOV $-1, A0 131 ok: 132 MOVW A0, ret+8(FP) 133 RET 134 135 // func pipe2(flags int32) (r, w int32, errno int32) 136 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 137 MOV $r+8(FP), A0 138 MOVW flags+0(FP), A1 139 MOV $SYS_pipe2, T0 140 ECALL 141 BEQ T0, ZERO, ok 142 NEG A0, A0 143 ok: 144 MOVW A0, errno+16(FP) 145 RET 146 147 // func write1(fd uintptr, p unsafe.Pointer, n int32) int32 148 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28 149 MOV fd+0(FP), A0 150 MOV p+8(FP), A1 151 MOVW n+16(FP), A2 152 MOV $SYS_write, T0 153 ECALL 154 BEQ T0, ZERO, ok 155 NEG A0, A0 156 ok: 157 MOVW A0, ret+24(FP) 158 RET 159 160 // func read(fd int32, p unsafe.Pointer, n int32) int32 161 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28 162 MOVW fd+0(FP), A0 163 MOV p+8(FP), A1 164 MOVW n+16(FP), A2 165 MOV $SYS_read, T0 166 ECALL 167 BEQ T0, ZERO, ok 168 NEG A0, A0 169 ok: 170 MOVW A0, ret+24(FP) 171 RET 172 173 // func usleep(usec uint32) 174 TEXT runtime·usleep(SB),NOSPLIT,$24-4 175 MOVWU usec+0(FP), A0 176 MOV $1000, A1 177 MUL A1, A0, A0 178 MOV $1000000000, A1 179 DIV A1, A0, A2 180 MOV A2, 8(X2) 181 REM A1, A0, A3 182 MOV A3, 16(X2) 183 ADD $8, X2, A0 184 MOV ZERO, A1 185 MOV $SYS_nanosleep, T0 186 ECALL 187 RET 188 189 // func thr_self() thread 190 TEXT runtime·thr_self(SB),NOSPLIT,$8-8 191 MOV $ptr-8(SP), A0 // arg 1 &8(SP) 192 MOV $SYS_thr_self, T0 193 ECALL 194 MOV ptr-8(SP), A0 195 MOV A0, ret+0(FP) 196 RET 197 198 // func thr_kill(t thread, sig int) 199 TEXT runtime·thr_kill(SB),NOSPLIT,$0-16 200 MOV tid+0(FP), A0 // arg 1 pid 201 MOV sig+8(FP), A1 // arg 2 sig 202 MOV $SYS_thr_kill, T0 203 ECALL 204 RET 205 206 // func raiseproc(sig uint32) 207 TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0 208 MOV $SYS_getpid, T0 209 ECALL 210 // arg 1 pid - already in A0 211 MOVW sig+0(FP), A1 // arg 2 212 MOV $SYS_kill, T0 213 ECALL 214 RET 215 216 // func setitimer(mode int32, new, old *itimerval) 217 TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24 218 MOVW mode+0(FP), A0 219 MOV new+8(FP), A1 220 MOV old+16(FP), A2 221 MOV $SYS_setitimer, T0 222 ECALL 223 RET 224 225 // func fallback_walltime() (sec int64, nsec int32) 226 TEXT runtime·fallback_walltime(SB),NOSPLIT,$24-12 227 MOV $CLOCK_REALTIME, A0 228 MOV $8(X2), A1 229 MOV $SYS_clock_gettime, T0 230 ECALL 231 MOV 8(X2), T0 // sec 232 MOVW 16(X2), T1 // nsec 233 MOV T0, sec+0(FP) 234 MOVW T1, nsec+8(FP) 235 RET 236 237 // func fallback_nanotime() int64 238 TEXT runtime·fallback_nanotime(SB),NOSPLIT,$24-8 239 MOV $CLOCK_MONOTONIC, A0 240 MOV $8(X2), A1 241 MOV $SYS_clock_gettime, T0 242 ECALL 243 MOV 8(X2), T0 // sec 244 MOV 16(X2), T1 // nsec 245 246 // sec is in T0, nsec in T1 247 // return nsec in T0 248 MOV $1000000000, T2 249 MUL T2, T0 250 ADD T1, T0 251 252 MOV T0, ret+0(FP) 253 RET 254 255 // func asmSigaction(sig uintptr, new, old *sigactiont) int32 256 TEXT runtime·asmSigaction(SB),NOSPLIT|NOFRAME,$0 257 MOV sig+0(FP), A0 // arg 1 sig 258 MOV new+8(FP), A1 // arg 2 act 259 MOV old+16(FP), A2 // arg 3 oact 260 MOV $SYS_sigaction, T0 261 ECALL 262 BEQ T0, ZERO, ok 263 MOV $-1, A0 264 ok: 265 MOVW A0, ret+24(FP) 266 RET 267 268 // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) 269 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 270 MOVW sig+8(FP), A0 271 MOV info+16(FP), A1 272 MOV ctx+24(FP), A2 273 MOV fn+0(FP), T1 274 JALR RA, T1 275 RET 276 277 // func sigtramp(signo, ureg, ctxt unsafe.Pointer) 278 TEXT runtime·sigtramp(SB),NOSPLIT,$64 279 MOVW A0, 8(X2) 280 MOV A1, 16(X2) 281 MOV A2, 24(X2) 282 283 // this might be called in external code context, 284 // where g is not set. 285 MOVBU runtime·iscgo(SB), A0 286 BEQ A0, ZERO, ok 287 CALL runtime·load_g(SB) 288 ok: 289 MOV $runtime·sigtrampgo(SB), A0 290 JALR RA, A0 291 RET 292 293 // func mmap(addr uintptr, n uintptr, prot int, flags int, fd int, off int64) (ret uintptr, err error) 294 TEXT runtime·mmap(SB),NOSPLIT|NOFRAME,$0 295 MOV addr+0(FP), A0 296 MOV n+8(FP), A1 297 MOVW prot+16(FP), A2 298 MOVW flags+20(FP), A3 299 MOVW fd+24(FP), A4 300 MOVW off+28(FP), A5 301 MOV $SYS_mmap, T0 302 ECALL 303 BNE T0, ZERO, fail 304 MOV A0, p+32(FP) 305 MOV ZERO, err+40(FP) 306 RET 307 fail: 308 MOV ZERO, p+32(FP) 309 MOV A0, err+40(FP) 310 RET 311 312 // func munmap(addr uintptr, n uintptr) (err error) 313 TEXT runtime·munmap(SB),NOSPLIT|NOFRAME,$0 314 MOV addr+0(FP), A0 315 MOV n+8(FP), A1 316 MOV $SYS_munmap, T0 317 ECALL 318 BNE T0, ZERO, fail 319 RET 320 fail: 321 WORD $0 // crash 322 323 // func madvise(addr unsafe.Pointer, n uintptr, flags int32) int32 324 TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0 325 MOV addr+0(FP), A0 326 MOV n+8(FP), A1 327 MOVW flags+16(FP), A2 328 MOV $SYS_madvise, T0 329 ECALL 330 BEQ T0, ZERO, ok 331 MOV $-1, A0 332 ok: 333 MOVW A0, ret+24(FP) 334 RET 335 336 // func sysctl(mib *uint32, miblen uint32, out *byte, size *uintptr, dst *byte, ndst uintptr) int32 337 TEXT runtime·sysctl(SB),NOSPLIT,$0 338 MOV mib+0(FP), A0 339 MOV miblen+8(FP), A1 340 MOV out+16(FP), A2 341 MOV size+24(FP), A3 342 MOV dst+32(FP), A4 343 MOV ndst+40(FP), A5 344 MOV $SYS___sysctl, T0 345 ECALL 346 BEQ T0, ZERO, ok 347 NEG A0, A0 348 ok: 349 MOVW A0, ret+48(FP) 350 RET 351 352 // func sigaltstack(new, old *stackt) 353 TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 354 MOV new+0(FP), A0 355 MOV old+8(FP), A1 356 MOV $SYS_sigaltstack, T0 357 ECALL 358 BNE T0, ZERO, fail 359 RET 360 fail: 361 WORD $0 // crash 362 363 // func osyield() 364 TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0 365 MOV $SYS_sched_yield, T0 366 ECALL 367 RET 368 369 // func sigprocmask(how int32, new, old *sigset) 370 TEXT runtime·sigprocmask(SB),NOSPLIT|NOFRAME,$0-24 371 MOVW how+0(FP), A0 372 MOV new+8(FP), A1 373 MOV old+16(FP), A2 374 MOV $SYS_sigprocmask, T0 375 ECALL 376 BNE T0, ZERO, fail 377 RET 378 fail: 379 WORD $0 // crash 380 381 382 // func cpuset_getaffinity(level int, which int, id int64, size int, mask *byte) int32 383 TEXT runtime·cpuset_getaffinity(SB),NOSPLIT|NOFRAME,$0-44 384 MOV level+0(FP), A0 385 MOV which+8(FP), A1 386 MOV id+16(FP), A2 387 MOV size+24(FP), A3 388 MOV mask+32(FP), A4 389 MOV $SYS_cpuset_getaffinity, T0 390 ECALL 391 BEQ T0, ZERO, ok 392 MOV $-1, A0 393 ok: 394 MOVW A0, ret+40(FP) 395 RET 396 397 // func kqueue() int32 398 TEXT runtime·kqueue(SB),NOSPLIT|NOFRAME,$0 399 MOV $SYS_kqueue, T0 400 ECALL 401 BEQ T0, ZERO, ok 402 MOV $-1, A0 403 ok: 404 MOVW A0, ret+0(FP) 405 RET 406 407 // func kevent(kq int, ch unsafe.Pointer, nch int, ev unsafe.Pointer, nev int, ts *Timespec) (n int, err error) 408 TEXT runtime·kevent(SB),NOSPLIT,$0 409 MOVW kq+0(FP), A0 410 MOV ch+8(FP), A1 411 MOVW nch+16(FP), A2 412 MOV ev+24(FP), A3 413 MOVW nev+32(FP), A4 414 MOV ts+40(FP), A5 415 MOV $SYS_kevent, T0 416 ECALL 417 BEQ T0, ZERO, ok 418 NEG A0, A0 419 ok: 420 MOVW A0, ret+48(FP) 421 RET 422 423 // func closeonexec(fd int32) 424 TEXT runtime·closeonexec(SB),NOSPLIT|NOFRAME,$0 425 MOVW fd+0(FP), A0 426 MOV $F_SETFD, A1 427 MOV $FD_CLOEXEC, A2 428 MOV $SYS_fcntl, T0 429 ECALL 430 RET 431 432 // func getCntxct() uint32 433 TEXT runtime·getCntxct(SB),NOSPLIT|NOFRAME,$0 434 RDTIME A0 435 MOVW A0, ret+0(FP) 436 RET