aboutsummaryrefslogtreecommitdiff
path: root/src/runtime/internal
diff options
context:
space:
mode:
authorGuoqi Chen <chenguoqi@loongson.cn>2023-08-22 19:50:03 +0800
committerGopher Robot <gobot@golang.org>2023-11-21 19:26:27 +0000
commit2e77b51df5b9f7753f500c6cbba8f0dab5bf2250 (patch)
tree331428a270fe776a07f39d57754d235a292487e2 /src/runtime/internal
parentb3b442449b0b979a035b5a26b8e62d8f6158fa69 (diff)
downloadgo-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/runtime/internal')
-rw-r--r--src/runtime/internal/syscall/asm_linux_loong64.s41
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