github.com/twelsh-aw/go/src@v0.0.0-20230516233729-a56fe86a7c81/runtime/sys_openbsd_mips64.s (about) 1 // Copyright 2020 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 mips64, OpenBSD 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 $3 16 17 // Exit the entire program (like C exit) 18 TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0 19 MOVW code+0(FP), R4 // arg 1 - status 20 MOVV $1, R2 // sys_exit 21 SYSCALL 22 BEQ R7, 3(PC) 23 MOVV $0, R2 // crash on syscall failure 24 MOVV R2, (R2) 25 RET 26 27 // func exitThread(wait *atomic.Uint32) 28 TEXT runtime·exitThread(SB),NOSPLIT,$0 29 MOVV wait+0(FP), R4 // arg 1 - notdead 30 MOVV $302, R2 // sys___threxit 31 SYSCALL 32 MOVV $0, R2 // crash on syscall failure 33 MOVV R2, (R2) 34 JMP 0(PC) 35 36 TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0 37 MOVV name+0(FP), R4 // arg 1 - path 38 MOVW mode+8(FP), R5 // arg 2 - mode 39 MOVW perm+12(FP), R6 // arg 3 - perm 40 MOVV $5, R2 // sys_open 41 SYSCALL 42 BEQ R7, 2(PC) 43 MOVW $-1, R2 44 MOVW R2, ret+16(FP) 45 RET 46 47 TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0 48 MOVW fd+0(FP), R4 // arg 1 - fd 49 MOVV $6, R2 // sys_close 50 SYSCALL 51 BEQ R7, 2(PC) 52 MOVW $-1, R2 53 MOVW R2, ret+8(FP) 54 RET 55 56 TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0 57 MOVW fd+0(FP), R4 // arg 1 - fd 58 MOVV p+8(FP), R5 // arg 2 - buf 59 MOVW n+16(FP), R6 // arg 3 - nbyte 60 MOVV $3, R2 // sys_read 61 SYSCALL 62 BEQ R7, 2(PC) 63 SUBVU R2, R0, R2 // caller expects negative errno 64 MOVW R2, ret+24(FP) 65 RET 66 67 // func pipe2(flags int32) (r, w int32, errno int32) 68 TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 69 MOVV $r+8(FP), R4 70 MOVW flags+0(FP), R5 71 MOVV $101, R2 // sys_pipe2 72 SYSCALL 73 BEQ R7, 2(PC) 74 SUBVU R2, R0, R2 // caller expects negative errno 75 MOVW R2, errno+16(FP) 76 RET 77 78 TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0 79 MOVV fd+0(FP), R4 // arg 1 - fd 80 MOVV p+8(FP), R5 // arg 2 - buf 81 MOVW n+16(FP), R6 // arg 3 - nbyte 82 MOVV $4, R2 // sys_write 83 SYSCALL 84 BEQ R7, 2(PC) 85 SUBVU R2, R0, R2 // caller expects negative errno 86 MOVW R2, ret+24(FP) 87 RET 88 89 TEXT runtime·usleep(SB),NOSPLIT,$24-4 90 MOVWU usec+0(FP), R3 91 MOVV R3, R5 92 MOVW $1000000, R4 93 DIVVU R4, R3 94 MOVV LO, R3 95 MOVV R3, 8(R29) // tv_sec 96 MOVW $1000, R4 97 MULVU R3, R4 98 MOVV LO, R4 99 SUBVU R4, R5 100 MOVV R5, 16(R29) // tv_nsec 101 102 ADDV $8, R29, R4 // arg 1 - rqtp 103 MOVV $0, R5 // arg 2 - rmtp 104 MOVV $91, R2 // sys_nanosleep 105 SYSCALL 106 RET 107 108 TEXT runtime·getthrid(SB),NOSPLIT,$0-4 109 MOVV $299, R2 // sys_getthrid 110 SYSCALL 111 MOVW R2, ret+0(FP) 112 RET 113 114 TEXT runtime·thrkill(SB),NOSPLIT,$0-16 115 MOVW tid+0(FP), R4 // arg 1 - tid 116 MOVV sig+8(FP), R5 // arg 2 - signum 117 MOVW $0, R6 // arg 3 - tcb 118 MOVV $119, R2 // sys_thrkill 119 SYSCALL 120 RET 121 122 TEXT runtime·raiseproc(SB),NOSPLIT,$0 123 MOVV $20, R4 // sys_getpid 124 SYSCALL 125 MOVV R2, R4 // arg 1 - pid 126 MOVW sig+0(FP), R5 // arg 2 - signum 127 MOVV $122, R2 // sys_kill 128 SYSCALL 129 RET 130 131 TEXT runtime·mmap(SB),NOSPLIT,$0 132 MOVV addr+0(FP), R4 // arg 1 - addr 133 MOVV n+8(FP), R5 // arg 2 - len 134 MOVW prot+16(FP), R6 // arg 3 - prot 135 MOVW flags+20(FP), R7 // arg 4 - flags 136 MOVW fd+24(FP), R8 // arg 5 - fd 137 MOVW $0, R9 // arg 6 - pad 138 MOVW off+28(FP), R10 // arg 7 - offset 139 MOVV $197, R2 // sys_mmap 140 SYSCALL 141 MOVV $0, R4 142 BEQ R7, 3(PC) 143 MOVV R2, R4 // if error, move to R4 144 MOVV $0, R2 145 MOVV R2, p+32(FP) 146 MOVV R4, err+40(FP) 147 RET 148 149 TEXT runtime·munmap(SB),NOSPLIT,$0 150 MOVV addr+0(FP), R4 // arg 1 - addr 151 MOVV n+8(FP), R5 // arg 2 - len 152 MOVV $73, R2 // sys_munmap 153 SYSCALL 154 BEQ R7, 3(PC) 155 MOVV $0, R2 // crash on syscall failure 156 MOVV R2, (R2) 157 RET 158 159 TEXT runtime·madvise(SB),NOSPLIT,$0 160 MOVV addr+0(FP), R4 // arg 1 - addr 161 MOVV n+8(FP), R5 // arg 2 - len 162 MOVW flags+16(FP), R6 // arg 2 - flags 163 MOVV $75, R2 // sys_madvise 164 SYSCALL 165 BEQ R7, 2(PC) 166 MOVW $-1, R2 167 MOVW R2, ret+24(FP) 168 RET 169 170 TEXT runtime·setitimer(SB),NOSPLIT,$0 171 MOVW mode+0(FP), R4 // arg 1 - mode 172 MOVV new+8(FP), R5 // arg 2 - new value 173 MOVV old+16(FP), R6 // arg 3 - old value 174 MOVV $69, R2 // sys_setitimer 175 SYSCALL 176 RET 177 178 // func walltime() (sec int64, nsec int32) 179 TEXT runtime·walltime(SB), NOSPLIT, $32 180 MOVW CLOCK_REALTIME, R4 // arg 1 - clock_id 181 MOVV $8(R29), R5 // arg 2 - tp 182 MOVV $87, R2 // sys_clock_gettime 183 SYSCALL 184 185 MOVV 8(R29), R4 // sec 186 MOVV 16(R29), R5 // nsec 187 MOVV R4, sec+0(FP) 188 MOVW R5, nsec+8(FP) 189 190 RET 191 192 // int64 nanotime1(void) so really 193 // void nanotime1(int64 *nsec) 194 TEXT runtime·nanotime1(SB),NOSPLIT,$32 195 MOVW CLOCK_MONOTONIC, R4 // arg 1 - clock_id 196 MOVV $8(R29), R5 // arg 2 - tp 197 MOVV $87, R2 // sys_clock_gettime 198 SYSCALL 199 200 MOVV 8(R29), R3 // sec 201 MOVV 16(R29), R5 // nsec 202 203 MOVV $1000000000, R4 204 MULVU R4, R3 205 MOVV LO, R3 206 ADDVU R5, R3 207 MOVV R3, ret+0(FP) 208 RET 209 210 TEXT runtime·sigaction(SB),NOSPLIT,$0 211 MOVW sig+0(FP), R4 // arg 1 - signum 212 MOVV new+8(FP), R5 // arg 2 - new sigaction 213 MOVV old+16(FP), R6 // arg 3 - old sigaction 214 MOVV $46, R2 // sys_sigaction 215 SYSCALL 216 BEQ R7, 3(PC) 217 MOVV $3, R2 // crash on syscall failure 218 MOVV R2, (R2) 219 RET 220 221 TEXT runtime·obsdsigprocmask(SB),NOSPLIT,$0 222 MOVW how+0(FP), R4 // arg 1 - mode 223 MOVW new+4(FP), R5 // arg 2 - new 224 MOVV $48, R2 // sys_sigprocmask 225 SYSCALL 226 BEQ R7, 3(PC) 227 MOVV $3, R2 // crash on syscall failure 228 MOVV R2, (R2) 229 MOVW R2, ret+8(FP) 230 RET 231 232 TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 233 MOVW sig+8(FP), R4 234 MOVV info+16(FP), R5 235 MOVV ctx+24(FP), R6 236 MOVV fn+0(FP), R25 // Must use R25, needed for PIC code. 237 CALL (R25) 238 RET 239 240 TEXT runtime·sigtramp(SB),NOSPLIT|TOPFRAME,$192 241 // initialize REGSB = PC&0xffffffff00000000 242 BGEZAL R0, 1(PC) 243 SRLV $32, R31, RSB 244 SLLV $32, RSB 245 246 // this might be called in external code context, 247 // where g is not set. 248 MOVB runtime·iscgo(SB), R1 249 BEQ R1, 2(PC) 250 JAL runtime·load_g(SB) 251 252 MOVW R4, 8(R29) 253 MOVV R5, 16(R29) 254 MOVV R6, 24(R29) 255 MOVV $runtime·sigtrampgo(SB), R1 256 JAL (R1) 257 RET 258 259 // int32 tfork(void *param, uintptr psize, M *mp, G *gp, void (*fn)(void)); 260 TEXT runtime·tfork(SB),NOSPLIT,$0 261 262 // Copy mp, gp and fn off parent stack for use by child. 263 MOVV mm+16(FP), R16 264 MOVV gg+24(FP), R17 265 MOVV fn+32(FP), R18 266 267 MOVV param+0(FP), R4 // arg 1 - param 268 MOVV psize+8(FP), R5 // arg 2 - psize 269 MOVV $8, R2 // sys___tfork 270 SYSCALL 271 272 // Return if syscall failed. 273 BEQ R7, 4(PC) 274 SUBVU R2, R0, R2 // caller expects negative errno 275 MOVW R2, ret+40(FP) 276 RET 277 278 // In parent, return. 279 BEQ R2, 3(PC) 280 MOVW $0, ret+40(FP) 281 RET 282 283 // Initialise m, g. 284 MOVV R17, g 285 MOVV R16, g_m(g) 286 287 // Call fn. 288 CALL (R18) 289 290 // fn should never return. 291 MOVV $2, R8 // crash if reached 292 MOVV R8, (R8) 293 RET 294 295 TEXT runtime·sigaltstack(SB),NOSPLIT,$0 296 MOVV new+0(FP), R4 // arg 1 - new sigaltstack 297 MOVV old+8(FP), R5 // arg 2 - old sigaltstack 298 MOVV $288, R2 // sys_sigaltstack 299 SYSCALL 300 BEQ R7, 3(PC) 301 MOVV $0, R8 // crash on syscall failure 302 MOVV R8, (R8) 303 RET 304 305 TEXT runtime·osyield(SB),NOSPLIT,$0 306 MOVV $298, R2 // sys_sched_yield 307 SYSCALL 308 RET 309 310 TEXT runtime·thrsleep(SB),NOSPLIT,$0 311 MOVV ident+0(FP), R4 // arg 1 - ident 312 MOVW clock_id+8(FP), R5 // arg 2 - clock_id 313 MOVV tsp+16(FP), R6 // arg 3 - tsp 314 MOVV lock+24(FP), R7 // arg 4 - lock 315 MOVV abort+32(FP), R8 // arg 5 - abort 316 MOVV $94, R2 // sys___thrsleep 317 SYSCALL 318 MOVW R2, ret+40(FP) 319 RET 320 321 TEXT runtime·thrwakeup(SB),NOSPLIT,$0 322 MOVV ident+0(FP), R4 // arg 1 - ident 323 MOVW n+8(FP), R5 // arg 2 - n 324 MOVV $301, R2 // sys___thrwakeup 325 SYSCALL 326 MOVW R2, ret+16(FP) 327 RET 328 329 TEXT runtime·sysctl(SB),NOSPLIT,$0 330 MOVV mib+0(FP), R4 // arg 1 - mib 331 MOVW miblen+8(FP), R5 // arg 2 - miblen 332 MOVV out+16(FP), R6 // arg 3 - out 333 MOVV size+24(FP), R7 // arg 4 - size 334 MOVV dst+32(FP), R8 // arg 5 - dest 335 MOVV ndst+40(FP), R9 // arg 6 - newlen 336 MOVV $202, R2 // sys___sysctl 337 SYSCALL 338 BEQ R7, 2(PC) 339 SUBVU R2, R0, R2 // caller expects negative errno 340 MOVW R2, ret+48(FP) 341 RET 342 343 // int32 runtime·kqueue(void); 344 TEXT runtime·kqueue(SB),NOSPLIT,$0 345 MOVV $269, R2 // sys_kqueue 346 SYSCALL 347 BEQ R7, 2(PC) 348 SUBVU R2, R0, R2 // caller expects negative errno 349 MOVW R2, ret+0(FP) 350 RET 351 352 // int32 runtime·kevent(int kq, Kevent *changelist, int nchanges, Kevent *eventlist, int nevents, Timespec *timeout); 353 TEXT runtime·kevent(SB),NOSPLIT,$0 354 MOVW kq+0(FP), R4 // arg 1 - kq 355 MOVV ch+8(FP), R5 // arg 2 - changelist 356 MOVW nch+16(FP), R6 // arg 3 - nchanges 357 MOVV ev+24(FP), R7 // arg 4 - eventlist 358 MOVW nev+32(FP), R8 // arg 5 - nevents 359 MOVV ts+40(FP), R9 // arg 6 - timeout 360 MOVV $72, R2 // sys_kevent 361 SYSCALL 362 BEQ R7, 2(PC) 363 SUBVU R2, R0, R2 // caller expects negative errno 364 MOVW R2, ret+48(FP) 365 RET 366 367 // func closeonexec(fd int32) 368 TEXT runtime·closeonexec(SB),NOSPLIT,$0 369 MOVW fd+0(FP), R4 // arg 1 - fd 370 MOVV $2, R5 // arg 2 - cmd (F_SETFD) 371 MOVV $1, R6 // arg 3 - arg (FD_CLOEXEC) 372 MOVV $92, R2 // sys_fcntl 373 SYSCALL 374 RET