Skip to content

Commit 15602e8

Browse files
committed
runtime/internal/syscall, syscall: replace RawSyscall6 with runtime implementation on linux
For #51087 Change-Id: I75a1bdeb5089454595f5ca04765a9c6e45cf9bd5 Reviewed-on: https://go-review.googlesource.com/c/go/+/388475 Run-TryBot: Michael Pratt <[email protected]> Reviewed-by: Cherry Mui <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent 1de1c0d commit 15602e8

11 files changed

+33
-209
lines changed

src/runtime/internal/syscall/syscall_linux.go

+27
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,35 @@
55
// Package syscall provides the syscall primitives required for the runtime.
66
package syscall
77

8+
import (
9+
_ "unsafe" // for go:linkname
10+
)
11+
812
// TODO(https://go.dev/issue/51087): This package is incomplete and currently
913
// only contains very minimal support for Linux.
1014

1115
// Syscall6 calls system call number 'num' with arguments a1-6.
1216
func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr)
17+
18+
// syscall_RawSyscall6 is a push linkname to export Syscall6 as
19+
// syscall.RawSyscall6.
20+
//
21+
// //go:uintptrkeepalive because the uintptr argument may be converted pointers
22+
// that need to be kept alive in the caller (this is implied for Syscall6 since
23+
// it has no body).
24+
//
25+
// //go:nosplit because stack copying does not account for uintptrkeepalive, so
26+
// the stack must not grow. Stack copying cannot blindly assume that all
27+
// uintptr arguments are pointers, because some values may look like pointers,
28+
// but not really be pointers, and adjusting their value would break the call.
29+
//
30+
// This is a separate wrapper because we can't export one function as two
31+
// names. The assembly implementations name themselves Syscall6 would not be
32+
// affected by a linkname.
33+
//
34+
//go:uintptrkeepalive
35+
//go:nosplit
36+
//go:linkname syscall_RawSyscall6 syscall.RawSyscall6
37+
func syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) {
38+
return Syscall6(num, a1, a2, a3, a4, a5, a6)
39+
}

src/syscall/asm_linux_386.s

-23
Original file line numberDiff line numberDiff line change
@@ -87,29 +87,6 @@ ok1:
8787
MOVL $0, err+24(FP)
8888
RET
8989

90-
// func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
91-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
92-
MOVL trap+0(FP), AX // syscall entry
93-
MOVL a1+4(FP), BX
94-
MOVL a2+8(FP), CX
95-
MOVL a3+12(FP), DX
96-
MOVL a4+16(FP), SI
97-
MOVL a5+20(FP), DI
98-
MOVL a6+24(FP), BP
99-
INVOKE_SYSCALL
100-
CMPL AX, $0xfffff001
101-
JLS ok2
102-
MOVL $-1, r1+28(FP)
103-
MOVL $0, r2+32(FP)
104-
NEGL AX
105-
MOVL AX, err+36(FP)
106-
RET
107-
ok2:
108-
MOVL AX, r1+28(FP)
109-
MOVL DX, r2+32(FP)
110-
MOVL $0, err+36(FP)
111-
RET
112-
11390
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
11491
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
11592
MOVL trap+0(FP), AX // syscall entry

src/syscall/asm_linux_amd64.s

-23
Original file line numberDiff line numberDiff line change
@@ -84,29 +84,6 @@ ok1:
8484
MOVQ $0, err+48(FP)
8585
RET
8686

87-
// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
88-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
89-
MOVQ a1+8(FP), DI
90-
MOVQ a2+16(FP), SI
91-
MOVQ a3+24(FP), DX
92-
MOVQ a4+32(FP), R10
93-
MOVQ a5+40(FP), R8
94-
MOVQ a6+48(FP), R9
95-
MOVQ trap+0(FP), AX // syscall entry
96-
SYSCALL
97-
CMPQ AX, $0xfffffffffffff001
98-
JLS ok2
99-
MOVQ $-1, r1+56(FP)
100-
MOVQ $0, r2+64(FP)
101-
NEGQ AX
102-
MOVQ AX, err+72(FP)
103-
RET
104-
ok2:
105-
MOVQ AX, r1+56(FP)
106-
MOVQ DX, r2+64(FP)
107-
MOVQ $0, err+72(FP)
108-
RET
109-
11087
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
11188
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
11289
MOVQ a1+8(FP), DI

src/syscall/asm_linux_arm.s

-28
Original file line numberDiff line numberDiff line change
@@ -70,34 +70,6 @@ ok6:
7070
BL runtime·exitsyscall(SB)
7171
RET
7272

73-
// func RawSyscall6(trap uintptr, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr);
74-
// Actually RawSyscall5 but the rest of the code expects it to be named RawSyscall6.
75-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-40
76-
MOVW trap+0(FP), R7 // syscall entry
77-
MOVW a1+4(FP), R0
78-
MOVW a2+8(FP), R1
79-
MOVW a3+12(FP), R2
80-
MOVW a4+16(FP), R3
81-
MOVW a5+20(FP), R4
82-
MOVW a6+24(FP), R5
83-
SWI $0
84-
MOVW $0xfffff001, R6
85-
CMP R6, R0
86-
BLS ok2
87-
MOVW $-1, R1
88-
MOVW R1, r1+28(FP)
89-
MOVW $0, R2
90-
MOVW R2, r2+32(FP)
91-
RSB $0, R0, R0
92-
MOVW R0, err+36(FP)
93-
RET
94-
ok2:
95-
MOVW R0, r1+28(FP)
96-
MOVW R1, r2+32(FP)
97-
MOVW $0, R0
98-
MOVW R0, err+36(FP)
99-
RET
100-
10173
#define SYS__LLSEEK 140 /* from zsysnum_linux_arm.go */
10274
// func seek(fd int, offset int64, whence int) (newoffset int64, errno int)
10375
// Implemented in assembly to avoid allocation when

src/syscall/asm_linux_arm64.s

-23
Original file line numberDiff line numberDiff line change
@@ -80,29 +80,6 @@ ok:
8080
MOVD ZR, err+48(FP) // errno
8181
RET
8282

83-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
84-
MOVD a1+8(FP), R0
85-
MOVD a2+16(FP), R1
86-
MOVD a3+24(FP), R2
87-
MOVD a4+32(FP), R3
88-
MOVD a5+40(FP), R4
89-
MOVD a6+48(FP), R5
90-
MOVD trap+0(FP), R8 // syscall entry
91-
SVC
92-
CMN $4095, R0
93-
BCC ok
94-
MOVD $-1, R4
95-
MOVD R4, r1+56(FP) // r1
96-
MOVD ZR, r2+64(FP) // r2
97-
NEG R0, R0
98-
MOVD R0, err+72(FP) // errno
99-
RET
100-
ok:
101-
MOVD R0, r1+56(FP) // r1
102-
MOVD R1, r2+64(FP) // r2
103-
MOVD ZR, err+72(FP) // errno
104-
RET
105-
10683
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
10784
TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32
10885
MOVD a1+8(FP), R0

src/syscall/asm_linux_mips64x.s

-21
Original file line numberDiff line numberDiff line change
@@ -80,27 +80,6 @@ ok1:
8080
MOVV R0, err+48(FP) // errno
8181
RET
8282

83-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
84-
MOVV a1+8(FP), R4
85-
MOVV a2+16(FP), R5
86-
MOVV a3+24(FP), R6
87-
MOVV a4+32(FP), R7
88-
MOVV a5+40(FP), R8
89-
MOVV a6+48(FP), R9
90-
MOVV trap+0(FP), R2 // syscall entry
91-
SYSCALL
92-
BEQ R7, ok2
93-
MOVV $-1, R1
94-
MOVV R1, r1+56(FP) // r1
95-
MOVV R0, r2+64(FP) // r2
96-
MOVV R2, err+72(FP) // errno
97-
RET
98-
ok2:
99-
MOVV R2, r1+56(FP) // r1
100-
MOVV R3, r2+64(FP) // r2
101-
MOVV R0, err+72(FP) // errno
102-
RET
103-
10483
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
10584
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
10685
MOVV a1+8(FP), R4

src/syscall/asm_linux_mipsx.s

-23
Original file line numberDiff line numberDiff line change
@@ -115,29 +115,6 @@ ok1:
115115
MOVW R0, err+24(FP) // errno
116116
RET
117117

118-
TEXT ·RawSyscall6(SB),NOSPLIT,$20-40
119-
MOVW a1+4(FP), R4
120-
MOVW a2+8(FP), R5
121-
MOVW a3+12(FP), R6
122-
MOVW a4+16(FP), R7
123-
MOVW a5+20(FP), R8
124-
MOVW a6+24(FP), R9
125-
MOVW R8, 16(R29)
126-
MOVW R9, 20(R29)
127-
MOVW trap+0(FP), R2 // syscall entry
128-
SYSCALL
129-
BEQ R7, ok2
130-
MOVW $-1, R1
131-
MOVW R1, r1+28(FP) // r1
132-
MOVW R0, r2+32(FP) // r2
133-
MOVW R2, err+36(FP) // errno
134-
RET
135-
ok2:
136-
MOVW R2, r1+28(FP) // r1
137-
MOVW R3, r2+32(FP) // r2
138-
MOVW R0, err+36(FP) // errno
139-
RET
140-
141118
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
142119
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
143120
MOVW a1+4(FP), R4

src/syscall/asm_linux_ppc64x.s

-21
Original file line numberDiff line numberDiff line change
@@ -80,27 +80,6 @@ ok1:
8080
MOVD R0, err+48(FP) // errno
8181
RET
8282

83-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
84-
MOVD a1+8(FP), R3
85-
MOVD a2+16(FP), R4
86-
MOVD a3+24(FP), R5
87-
MOVD a4+32(FP), R6
88-
MOVD a5+40(FP), R7
89-
MOVD a6+48(FP), R8
90-
MOVD trap+0(FP), R9 // syscall entry
91-
SYSCALL R9
92-
BVC ok2
93-
MOVD $-1, R4
94-
MOVD R4, r1+56(FP) // r1
95-
MOVD R0, r2+64(FP) // r2
96-
MOVD R3, err+72(FP) // errno
97-
RET
98-
ok2:
99-
MOVD R3, r1+56(FP) // r1
100-
MOVD R0, r2+64(FP) // r2
101-
MOVD R0, err+72(FP) // errno
102-
RET
103-
10483
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
10584
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
10685
MOVD a1+8(FP), R3

src/syscall/asm_linux_riscv64.s

-24
Original file line numberDiff line numberDiff line change
@@ -80,30 +80,6 @@ err:
8080
MOV A0, err+48(FP) // errno
8181
RET
8282

83-
// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
84-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
85-
MOV a1+8(FP), A0
86-
MOV a2+16(FP), A1
87-
MOV a3+24(FP), A2
88-
MOV a4+32(FP), A3
89-
MOV a5+40(FP), A4
90-
MOV a6+48(FP), A5
91-
MOV trap+0(FP), A7 // syscall entry
92-
ECALL
93-
MOV $-4096, T0
94-
BLTU T0, A0, err
95-
MOV A0, r1+56(FP) // r1
96-
MOV A1, r2+64(FP) // r2
97-
MOV ZERO, err+72(FP) // errno
98-
RET
99-
err:
100-
MOV $-1, T0
101-
MOV T0, r1+56(FP) // r1
102-
MOV ZERO, r2+64(FP) // r2
103-
SUB A0, ZERO, A0
104-
MOV A0, err+72(FP) // errno
105-
RET
106-
10783
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
10884
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
10985
MOV a1+8(FP), A0

src/syscall/asm_linux_s390x.s

-23
Original file line numberDiff line numberDiff line change
@@ -83,29 +83,6 @@ ok1:
8383
MOVD $0, err+48(FP) // errno
8484
RET
8585

86-
// func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, err uintptr)
87-
TEXT ·RawSyscall6(SB),NOSPLIT,$0-80
88-
MOVD a1+8(FP), R2
89-
MOVD a2+16(FP), R3
90-
MOVD a3+24(FP), R4
91-
MOVD a4+32(FP), R5
92-
MOVD a5+40(FP), R6
93-
MOVD a6+48(FP), R7
94-
MOVD trap+0(FP), R1 // syscall entry
95-
SYSCALL
96-
MOVD $0xfffffffffffff001, R8
97-
CMPUBLT R2, R8, ok2
98-
MOVD $-1, r1+56(FP)
99-
MOVD $0, r2+64(FP)
100-
NEG R2, R2
101-
MOVD R2, err+72(FP) // errno
102-
RET
103-
ok2:
104-
MOVD R2, r1+56(FP)
105-
MOVD R3, r2+64(FP)
106-
MOVD $0, err+72(FP) // errno
107-
RET
108-
10986
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
11087
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
11188
MOVD $0, R2

src/syscall/syscall_linux.go

+6
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,12 @@ import (
1919
func Syscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
2020
func Syscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
2121
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
22+
23+
// N.B. RawSyscall6 is provided via linkname by runtime/internal/syscall.
24+
//
25+
// Errno is uintptr and thus compatible with the runtime/internal/syscall
26+
// definition.
27+
2228
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
2329

2430
func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)

0 commit comments

Comments
 (0)