]> Cypherpunks repositories - gostls13.git/commitdiff
runtime/internal/syscall: use ABIInternal for Syscall6 on loong64
authorGuoqi Chen <chenguoqi@loongson.cn>
Tue, 22 Aug 2023 11:50:03 +0000 (19:50 +0800)
committerGopher Robot <gobot@golang.org>
Tue, 21 Nov 2023 19:26:27 +0000 (19:26 +0000)
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>

src/runtime/internal/syscall/asm_linux_loong64.s

index d6a33f90a70a27e0370b8c046485b13827b4b4de..11c5bc2468d5c0cb2cfd30b2f350f3d09cc90b6c 100644 (file)
@@ -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