From: Xiaolin Zhao Date: Fri, 25 Oct 2024 03:16:18 +0000 (+0800) Subject: runtime: use ABIInternal on syscall and other sys.stuff for loong64 X-Git-Tag: go1.25rc1~866 X-Git-Url: http://www.git.cypherpunks.su/?a=commitdiff_plain;h=039b3ebeba63e22d1db1a4d1926e405b3110c198;p=gostls13.git runtime: use ABIInternal on syscall and other sys.stuff for loong64 Change-Id: I6b2942c413eab58c457980131022dace036cd76c Reviewed-on: https://go-review.googlesource.com/c/go/+/623475 Reviewed-by: Meidan Li LUCI-TryBot-Result: Go LUCI Reviewed-by: Michael Pratt Reviewed-by: David Chase Reviewed-by: abner chenc --- diff --git a/src/runtime/sys_linux_loong64.s b/src/runtime/sys_linux_loong64.s index 914da6c043..1121b3c991 100644 --- a/src/runtime/sys_linux_loong64.s +++ b/src/runtime/sys_linux_loong64.s @@ -47,66 +47,58 @@ #define SYS_timer_delete 111 // func exit(code int32) -TEXT runtime·exit(SB),NOSPLIT|NOFRAME,$0-4 - MOVW code+0(FP), R4 +TEXT runtime·exit(SB),NOSPLIT,$0 MOVV $SYS_exit_group, R11 SYSCALL RET // func exitThread(wait *atomic.Uint32) -TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0-8 - MOVV wait+0(FP), R19 +TEXT runtime·exitThread(SB),NOSPLIT|NOFRAME,$0 // We're done using the stack. DBAR $0x12 // StoreRelease barrier - MOVW R0, (R19) + MOVW R0, (R4) MOVW $0, R4 // exit code MOVV $SYS_exit, R11 SYSCALL JMP 0(PC) // func open(name *byte, mode, perm int32) int32 -TEXT runtime·open(SB),NOSPLIT|NOFRAME,$0-20 +TEXT runtime·open(SB),NOSPLIT,$0 + // before: + // R4: name, R5: mode, R6: perm + // after: + // R4: AT_FDCWD, R5: name, R6: mode, R7: perm + MOVW R6, R7 + MOVW R5, R6 + MOVV R4, R5 MOVW $AT_FDCWD, R4 // AT_FDCWD, so this acts like open - MOVV name+0(FP), R5 - MOVW mode+8(FP), R6 - MOVW perm+12(FP), R7 + MOVV $SYS_openat, R11 SYSCALL MOVW $-4096, R5 BGEU R5, R4, 2(PC) MOVW $-1, R4 - MOVW R4, ret+16(FP) RET // func closefd(fd int32) int32 -TEXT runtime·closefd(SB),NOSPLIT|NOFRAME,$0-12 - MOVW fd+0(FP), R4 +TEXT runtime·closefd(SB),NOSPLIT,$0 MOVV $SYS_close, R11 SYSCALL MOVW $-4096, R5 BGEU R5, R4, 2(PC) MOVW $-1, R4 - MOVW R4, ret+8(FP) RET // func write1(fd uintptr, p unsafe.Pointer, n int32) int32 -TEXT runtime·write1(SB),NOSPLIT|NOFRAME,$0-28 - MOVV fd+0(FP), R4 - MOVV p+8(FP), R5 - MOVW n+16(FP), R6 +TEXT runtime·write1(SB),NOSPLIT,$0 MOVV $SYS_write, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func read(fd int32, p unsafe.Pointer, n int32) int32 -TEXT runtime·read(SB),NOSPLIT|NOFRAME,$0-28 - MOVW fd+0(FP), R4 - MOVV p+8(FP), R5 - MOVW n+16(FP), R6 +TEXT runtime·read(SB),NOSPLIT,$0 MOVV $SYS_read, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func pipe2(flags int32) (r, w int32, errno int32) @@ -119,16 +111,15 @@ TEXT runtime·pipe2(SB),NOSPLIT|NOFRAME,$0-20 RET // func usleep(usec uint32) -TEXT runtime·usleep(SB),NOSPLIT,$16-4 - MOVWU usec+0(FP), R7 +TEXT runtime·usleep(SB),NOSPLIT,$16 MOVV $1000, R6 - MULVU R6, R7, R7 + MULVU R6, R4, R4 MOVV $1000000000, R6 - DIVVU R6, R7, R5 // ts->tv_sec - REMVU R6, R7, R4 // ts->tv_nsec + DIVVU R6, R4, R5 // ts->tv_sec + REMVU R6, R4, R8 // ts->tv_nsec MOVV R5, 8(R3) - MOVV R4, 16(R3) + MOVV R8, 16(R3) // nanosleep(&ts, 0) ADDV $8, R3, R4 @@ -138,14 +129,14 @@ TEXT runtime·usleep(SB),NOSPLIT,$16-4 RET // func gettid() uint32 -TEXT runtime·gettid(SB),NOSPLIT,$0-4 +TEXT runtime·gettid(SB),NOSPLIT,$0 MOVV $SYS_gettid, R11 SYSCALL - MOVW R4, ret+0(FP) RET // func raise(sig uint32) -TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0 +TEXT runtime·raise(SB),NOSPLIT,$0 + MOVW R4, R24 // backup sig MOVV $SYS_getpid, R11 SYSCALL MOVW R4, R23 @@ -153,87 +144,66 @@ TEXT runtime·raise(SB),NOSPLIT|NOFRAME,$0 SYSCALL MOVW R4, R5 // arg 2 tid MOVW R23, R4 // arg 1 pid - MOVW sig+0(FP), R6 // arg 3 + MOVW R24, R6 // arg 3 MOVV $SYS_tgkill, R11 SYSCALL RET // func raiseproc(sig uint32) -TEXT runtime·raiseproc(SB),NOSPLIT|NOFRAME,$0 +TEXT runtime·raiseproc(SB),NOSPLIT,$0 + MOVW R4, R24 // backup sig MOVV $SYS_getpid, R11 SYSCALL //MOVW R4, R4 // arg 1 pid - MOVW sig+0(FP), R5 // arg 2 + MOVW R24, R5 // arg 2 MOVV $SYS_kill, R11 SYSCALL RET // func getpid() int -TEXT ·getpid(SB),NOSPLIT|NOFRAME,$0-8 +TEXT ·getpid(SB),NOSPLIT,$0 MOVV $SYS_getpid, R11 SYSCALL - MOVV R4, ret+0(FP) RET // func tgkill(tgid, tid, sig int) -TEXT ·tgkill(SB),NOSPLIT|NOFRAME,$0-24 - MOVV tgid+0(FP), R4 - MOVV tid+8(FP), R5 - MOVV sig+16(FP), R6 +TEXT ·tgkill(SB),NOSPLIT,$0 MOVV $SYS_tgkill, R11 SYSCALL RET // func setitimer(mode int32, new, old *itimerval) -TEXT runtime·setitimer(SB),NOSPLIT|NOFRAME,$0-24 - MOVW mode+0(FP), R4 - MOVV new+8(FP), R5 - MOVV old+16(FP), R6 +TEXT runtime·setitimer(SB),NOSPLIT,$0 MOVV $SYS_setitimer, R11 SYSCALL RET // func timer_create(clockid int32, sevp *sigevent, timerid *int32) int32 -TEXT runtime·timer_create(SB),NOSPLIT,$0-28 - MOVW clockid+0(FP), R4 - MOVV sevp+8(FP), R5 - MOVV timerid+16(FP), R6 +TEXT runtime·timer_create(SB),NOSPLIT,$0 MOVV $SYS_timer_create, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func timer_settime(timerid int32, flags int32, new, old *itimerspec) int32 -TEXT runtime·timer_settime(SB),NOSPLIT,$0-28 - MOVW timerid+0(FP), R4 - MOVW flags+4(FP), R5 - MOVV new+8(FP), R6 - MOVV old+16(FP), R7 +TEXT runtime·timer_settime(SB),NOSPLIT,$0 MOVV $SYS_timer_settime, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func timer_delete(timerid int32) int32 -TEXT runtime·timer_delete(SB),NOSPLIT,$0-12 - MOVW timerid+0(FP), R4 +TEXT runtime·timer_delete(SB),NOSPLIT,$0 MOVV $SYS_timer_delete, R11 SYSCALL - MOVW R4, ret+8(FP) RET // func mincore(addr unsafe.Pointer, n uintptr, dst *byte) int32 -TEXT runtime·mincore(SB),NOSPLIT|NOFRAME,$0-28 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 - MOVV dst+16(FP), R6 +TEXT runtime·mincore(SB),NOSPLIT,$0 MOVV $SYS_mincore, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func walltime() (sec int64, nsec int32) -TEXT runtime·walltime(SB),NOSPLIT,$24-12 +TEXT runtime·walltime(SB),NOSPLIT,$24 MOVV R3, R23 // R23 is unchanged by C code MOVV R3, R25 @@ -289,7 +259,7 @@ nosaveg: JAL (R20) finish: - MOVV 0(R3), R7 // sec + MOVV 0(R3), R4 // sec MOVV 8(R3), R5 // nsec MOVV R23, R3 // restore SP @@ -303,8 +273,6 @@ finish: MOVV 8(R3), R25 MOVV R25, m_vdsoPC(R24) - MOVV R7, sec+0(FP) - MOVW R5, nsec+8(FP) RET fallback: @@ -313,7 +281,7 @@ fallback: JMP finish // func nanotime1() int64 -TEXT runtime·nanotime1(SB),NOSPLIT,$16-8 +TEXT runtime·nanotime1(SB),NOSPLIT,$24 MOVV R3, R23 // R23 is unchanged by C code MOVV R3, R25 @@ -387,8 +355,7 @@ finish: // return nsec in R7 MOVV $1000000000, R4 MULVU R4, R7, R7 - ADDVU R5, R7 - MOVV R7, ret+0(FP) + ADDVU R5, R7, R4 RET fallback: @@ -397,11 +364,7 @@ fallback: JMP finish // func rtsigprocmask(how int32, new, old *sigset, size int32) -TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28 - MOVW how+0(FP), R4 - MOVV new+8(FP), R5 - MOVV old+16(FP), R6 - MOVW size+24(FP), R7 +TEXT runtime·rtsigprocmask(SB),NOSPLIT,$0 MOVV $SYS_rt_sigprocmask, R11 SYSCALL MOVW $-4096, R5 @@ -410,22 +373,21 @@ TEXT runtime·rtsigprocmask(SB),NOSPLIT|NOFRAME,$0-28 RET // func rt_sigaction(sig uintptr, new, old *sigactiont, size uintptr) int32 -TEXT runtime·rt_sigaction(SB),NOSPLIT|NOFRAME,$0-36 - MOVV sig+0(FP), R4 - MOVV new+8(FP), R5 - MOVV old+16(FP), R6 - MOVV size+24(FP), R7 +TEXT runtime·rt_sigaction(SB),NOSPLIT,$0 MOVV $SYS_rt_sigaction, R11 SYSCALL - MOVW R4, ret+32(FP) RET // func sigfwd(fn uintptr, sig uint32, info *siginfo, ctx unsafe.Pointer) -TEXT runtime·sigfwd(SB),NOSPLIT,$0-32 - MOVW sig+8(FP), R4 - MOVV info+16(FP), R5 - MOVV ctx+24(FP), R6 - MOVV fn+0(FP), R20 +TEXT runtime·sigfwd(SB),NOSPLIT,$0 + // before: + // R4: fn, R5: sig, R6: info, R7: ctx + // after: + // R20: fn, R4: sig, R5: info, R6: ctx + MOVV R4, R20 + MOVV R5, R4 + MOVV R6, R5 + MOVV R7, R6 JAL (R20) RET @@ -458,48 +420,31 @@ TEXT runtime·cgoSigtramp(SB),NOSPLIT,$0 JMP runtime·sigtramp(SB) // func sysMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) (p unsafe.Pointer, err int) -TEXT runtime·sysMmap(SB),NOSPLIT|NOFRAME,$0 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 - MOVW prot+16(FP), R6 - MOVW flags+20(FP), R7 - MOVW fd+24(FP), R8 - MOVW off+28(FP), R9 - +TEXT runtime·sysMmap(SB),NOSPLIT,$0 MOVV $SYS_mmap, R11 SYSCALL MOVW $-4096, R5 BGEU R5, R4, ok - MOVV $0, p+32(FP) - SUBVU R4, R0, R4 - MOVV R4, err+40(FP) + SUBVU R4, R0, R5 + MOVV $0, R4 RET ok: - MOVV R4, p+32(FP) - MOVV $0, err+40(FP) + MOVV $0, R5 RET // Call the function stored in _cgo_mmap using the GCC calling convention. // This must be called on the system stack. // func callCgoMmap(addr unsafe.Pointer, n uintptr, prot, flags, fd int32, off uint32) uintptr -TEXT runtime·callCgoMmap(SB),NOSPLIT,$0 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 - MOVW prot+16(FP), R6 - MOVW flags+20(FP), R7 - MOVW fd+24(FP), R8 - MOVW off+28(FP), R9 +TEXT runtime·callCgoMmap(SB),NOSPLIT,$0 MOVV _cgo_mmap(SB), R13 SUBV $16, R3 // reserve 16 bytes for sp-8 where fp may be saved. JAL (R13) ADDV $16, R3 - MOVV R4, ret+32(FP) + MOVV R4, R4 RET // func sysMunmap(addr unsafe.Pointer, n uintptr) -TEXT runtime·sysMunmap(SB),NOSPLIT|NOFRAME,$0 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 +TEXT runtime·sysMunmap(SB),NOSPLIT,$0 MOVV $SYS_munmap, R11 SYSCALL MOVW $-4096, R5 @@ -510,9 +455,7 @@ TEXT runtime·sysMunmap(SB),NOSPLIT|NOFRAME,$0 // Call the function stored in _cgo_munmap using the GCC calling convention. // This must be called on the system stack. // func callCgoMunmap(addr unsafe.Pointer, n uintptr) -TEXT runtime·callCgoMunmap(SB),NOSPLIT,$0 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 +TEXT runtime·callCgoMunmap(SB),NOSPLIT,$0 MOVV _cgo_munmap(SB), R13 SUBV $16, R3 // reserve 16 bytes for sp-8 where fp may be saved. JAL (R13) @@ -520,38 +463,24 @@ TEXT runtime·callCgoMunmap(SB),NOSPLIT,$0 RET // func madvise(addr unsafe.Pointer, n uintptr, flags int32) -TEXT runtime·madvise(SB),NOSPLIT|NOFRAME,$0 - MOVV addr+0(FP), R4 - MOVV n+8(FP), R5 - MOVW flags+16(FP), R6 +TEXT runtime·madvise(SB),NOSPLIT,$0 MOVV $SYS_madvise, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func futex(addr unsafe.Pointer, op int32, val uint32, ts, addr2 unsafe.Pointer, val3 uint32) int32 -TEXT runtime·futex(SB),NOSPLIT|NOFRAME,$0 - MOVV addr+0(FP), R4 - MOVW op+8(FP), R5 - MOVW val+12(FP), R6 - MOVV ts+16(FP), R7 - MOVV addr2+24(FP), R8 - MOVW val3+32(FP), R9 +TEXT runtime·futex(SB),NOSPLIT,$0 MOVV $SYS_futex, R11 SYSCALL - MOVW R4, ret+40(FP) RET // int64 clone(int32 flags, void *stk, M *mp, G *gp, void (*fn)(void)); -TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0 - MOVW flags+0(FP), R4 - MOVV stk+8(FP), R5 - +TEXT runtime·clone(SB),NOSPLIT,$0 // Copy mp, gp, fn off parent stack for use by child. // Careful: Linux system call clobbers ???. - MOVV mp+16(FP), R23 - MOVV gp+24(FP), R24 - MOVV fn+32(FP), R25 + MOVV R6, R23 + MOVV R7, R24 + MOVV R8, R25 MOVV R23, -8(R5) MOVV R24, -16(R5) @@ -563,8 +492,7 @@ TEXT runtime·clone(SB),NOSPLIT|NOFRAME,$0 SYSCALL // In parent, return. - BEQ R4, 3(PC) - MOVW R4, ret+40(FP) + BEQ R4, 2(PC) RET // In child, on new stack. @@ -604,9 +532,7 @@ nog: JMP -3(PC) // keep exiting // func sigaltstack(new, old *stackt) -TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 - MOVV new+0(FP), R4 - MOVV old+8(FP), R5 +TEXT runtime·sigaltstack(SB),NOSPLIT,$0 MOVV $SYS_sigaltstack, R11 SYSCALL MOVW $-4096, R5 @@ -615,47 +541,45 @@ TEXT runtime·sigaltstack(SB),NOSPLIT|NOFRAME,$0 RET // func osyield() -TEXT runtime·osyield(SB),NOSPLIT|NOFRAME,$0 +TEXT runtime·osyield(SB),NOSPLIT,$0 MOVV $SYS_sched_yield, R11 SYSCALL RET // func sched_getaffinity(pid, len uintptr, buf *uintptr) int32 -TEXT runtime·sched_getaffinity(SB),NOSPLIT|NOFRAME,$0 - MOVV pid+0(FP), R4 - MOVV len+8(FP), R5 - MOVV buf+16(FP), R6 +TEXT runtime·sched_getaffinity(SB),NOSPLIT,$0 MOVV $SYS_sched_getaffinity, R11 SYSCALL - MOVW R4, ret+24(FP) RET // func sbrk0() uintptr -TEXT runtime·sbrk0(SB),NOSPLIT|NOFRAME,$0-8 +TEXT runtime·sbrk0(SB),NOSPLIT,$0 // Implemented as brk(NULL). MOVV $0, R4 MOVV $SYS_brk, R11 SYSCALL - MOVV R4, ret+0(FP) RET +// unimplemented, only needed for android; declared in stubs_linux.go TEXT runtime·access(SB),$0-20 - MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go + MOVV R0, 2(R0) MOVW R0, ret+16(FP) // for vet RET +// unimplemented, only needed for android; declared in stubs_linux.go TEXT runtime·connect(SB),$0-28 - MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go + MOVV R0, 2(R0) MOVW R0, ret+24(FP) // for vet RET +// unimplemented, only needed for android; declared in stubs_linux.go TEXT runtime·socket(SB),$0-20 - MOVV R0, 2(R0) // unimplemented, only needed for android; declared in stubs_linux.go + MOVV R0, 2(R0) MOVW R0, ret+16(FP) // for vet RET // func vgetrandom1(buf *byte, length uintptr, flags uint32, state uintptr, stateSize uintptr) int -TEXT runtime·vgetrandom1(SB),NOSPLIT,$16-48 +TEXT runtime·vgetrandom1(SB),NOSPLIT,$16 MOVV R3, R23 MOVV runtime·vdsoGetrandomSym(SB), R12