]> Cypherpunks.ru repositories - gostls13.git/commitdiff
syscall, runtime/internal/syscall: zero r2 before mips linux syscalls
authorRongrong <rongrong@oss.cipunited.com>
Mon, 21 Nov 2022 06:05:40 +0000 (14:05 +0800)
committerMeng Zhuo <mzh@golangcn.org>
Thu, 24 Nov 2022 04:12:23 +0000 (04:12 +0000)
All mips variant perform syscalls similarly. R2 (v0) holds r1 and R3
(v1) holds r2 of a syscall. The latter is only used by 2-ret syscalls.
A 1-ret syscall would not touch R3 but keeps it as is, making r2 be a
random value. Always reset it to 0 before SYSCALL to fix the issue.

Fixes #56426

Change-Id: Ie49965c0c3c224c4a895703ac659205cd040ff56
Reviewed-on: https://go-review.googlesource.com/c/go/+/452975
TryBot-Result: Gopher Robot <gobot@golang.org>
Run-TryBot: Meng Zhuo <mzh@golangcn.org>
Reviewed-by: Austin Clements <austin@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
Reviewed-by: Meng Zhuo <mzh@golangcn.org>
src/runtime/internal/syscall/asm_linux_mips64x.s
src/runtime/internal/syscall/asm_linux_mipsx.s
src/syscall/asm_linux_mips64x.s
src/syscall/asm_linux_mipsx.s

index 0e88a2d8acd3762360bc629b552422ef969d7b00..6b7c5246895795f5767de01999710af110d4a35b 100644 (file)
@@ -15,6 +15,7 @@ TEXT ·Syscall6(SB),NOSPLIT,$0-80
        MOVV    a4+32(FP), R7
        MOVV    a5+40(FP), R8
        MOVV    a6+48(FP), R9
+       MOVV    R0, R3  // reset R3 to 0 as 1-ret SYSCALL keeps it
        SYSCALL
        BEQ     R7, ok
        MOVV    $-1, R1
index 050029eaa1399219838fe94af06f3a413af0ccfc..561310f8a1c7846ad645bd8c0b7497e8363acbf2 100644 (file)
@@ -20,6 +20,7 @@ TEXT ·Syscall6(SB),NOSPLIT,$20-40
        MOVW    a6+24(FP), R9
        MOVW    R8, 16(R29)
        MOVW    R9, 20(R29)
+       MOVW    R0, R3  // reset R3 to 0 as 1-ret SYSCALL keeps it
        SYSCALL
        BEQ     R7, ok
        MOVW    $-1, R1
index ceafeb6b013b1352ea2f437c4d54dd94dc309010..6c7a6bc16fbf3b989ac8cf59a1ee6b6f390edba6 100644 (file)
@@ -38,7 +38,8 @@ TEXT ·rawSyscallNoError(SB),NOSPLIT,$0-48
        MOVV    R0, R8
        MOVV    R0, R9
        MOVV    trap+0(FP), R2  // syscall entry
+       MOVV    R0, R3  // reset R3 to zero as 1-ret SYSCALL keeps it
        SYSCALL
-       MOVV    R2, r1+32(FP)
-       MOVV    R3, r2+40(FP)
+       MOVV    R2, r1+32(FP)   // r1
+       MOVV    R3, r2+40(FP)   // r2
        RET
index 3e5e8b113977954b7ee456929b87842e56e8fa25..99f0154d1bb4f92e97a19ac2cc0810dc5adabba8 100644 (file)
@@ -29,6 +29,7 @@ TEXT ·Syscall9(SB),NOSPLIT,$28-52
        MOVW    R10, 24(R29)
        MOVW    R11, 28(R29)
        MOVW    trap+0(FP), R2  // syscall entry
+       MOVW    R0, R3  // reset R3 to zero as 1-ret SYSCALL keeps it
        SYSCALL
        BEQ     R7, ok9
        MOVW    $-1, R1
@@ -66,6 +67,7 @@ TEXT ·rawSyscallNoError(SB),NOSPLIT,$20-24
        MOVW    a2+8(FP), R5
        MOVW    a3+12(FP), R6
        MOVW    trap+0(FP), R2  // syscall entry
+       MOVW    R0, R3  // reset R3 to zero as 1-ret SYSCALL keeps it
        SYSCALL
        MOVW    R2, r1+16(FP)   // r1
        MOVW    R3, r2+20(FP)   // r2