diff options
| author | Guoqi Chen <chenguoqi@loongson.cn> | 2023-08-22 19:50:03 +0800 |
|---|---|---|
| committer | Gopher Robot <gobot@golang.org> | 2023-11-21 19:26:27 +0000 |
| commit | 2e77b51df5b9f7753f500c6cbba8f0dab5bf2250 (patch) | |
| tree | 331428a270fe776a07f39d57754d235a292487e2 /src | |
| parent | b3b442449b0b979a035b5a26b8e62d8f6158fa69 (diff) | |
| download | go-2e77b51df5b9f7753f500c6cbba8f0dab5bf2250.tar.xz | |
runtime/internal/syscall: use ABIInternal for Syscall6 on loong64
Updates #40724
Co-authored-by: Xiaolin Zhao <zhaoxiaolin@loongson.cn>
Change-Id: Ifcc2de35a797fd987a10f564206b14b54d736d1d
Reviewed-on: https://go-review.googlesource.com/c/go/+/521789
Auto-Submit: David Chase <drchase@google.com>
Reviewed-by: Meidan Li <limeidan@loongson.cn>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Run-TryBot: David Chase <drchase@google.com>
Reviewed-by: David Chase <drchase@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src')
| -rw-r--r-- | src/runtime/internal/syscall/asm_linux_loong64.s | 41 |
1 files changed, 40 insertions, 1 deletions
diff --git a/src/runtime/internal/syscall/asm_linux_loong64.s b/src/runtime/internal/syscall/asm_linux_loong64.s index d6a33f90a7..11c5bc2468 100644 --- a/src/runtime/internal/syscall/asm_linux_loong64.s +++ b/src/runtime/internal/syscall/asm_linux_loong64.s @@ -5,7 +5,32 @@ #include "textflag.h" // func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) -TEXT ·Syscall6(SB),NOSPLIT,$0-80 +// +// We need to convert to the syscall ABI. +// +// arg | ABIInternal | Syscall +// --------------------------- +// num | R4 | R11 +// a1 | R5 | R4 +// a2 | R6 | R5 +// a3 | R7 | R6 +// a4 | R8 | R7 +// a5 | R9 | R8 +// a6 | R10 | R9 +// +// r1 | R4 | R4 +// r2 | R5 | R5 +// err | R6 | part of R4 +TEXT ·Syscall6<ABIInternal>(SB),NOSPLIT,$0-80 +#ifdef GOEXPERIMENT_regabiargs + MOVV R4, R11 // syscall entry + MOVV R5, R4 + MOVV R6, R5 + MOVV R7, R6 + MOVV R8, R7 + MOVV R9, R8 + MOVV R10, R9 +#else MOVV num+0(FP), R11 // syscall entry MOVV a1+8(FP), R4 MOVV a2+16(FP), R5 @@ -13,7 +38,15 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80 MOVV a4+32(FP), R7 MOVV a5+40(FP), R8 MOVV a6+48(FP), R9 +#endif SYSCALL +#ifdef GOEXPERIMENT_regabiargs + MOVV R0, R5 // r2 is not used. Always set to 0. + MOVW $-4096, R12 + BGEU R12, R4, ok + SUBVU R4, R0, R6 // errno + MOVV $-1, R4 // r1 +#else MOVW $-4096, R12 BGEU R12, R4, ok MOVV $-1, R12 @@ -21,9 +54,15 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80 MOVV R0, r2+64(FP) SUBVU R4, R0, R4 MOVV R4, errno+72(FP) +#endif RET ok: +#ifdef GOEXPERIMENT_regabiargs + // r1 already in R4 + MOVV R0, R6 // errno +#else MOVV R4, r1+56(FP) MOVV R0, r2+64(FP) // r2 is not used. Always set to 0. MOVV R0, errno+72(FP) +#endif RET |
