Skip to content

Commit f7b12ff

Browse files
committed
syscall: define RawSyscall in terms of RawSyscall6 on linux
For #51087 Change-Id: I63e07638507328efe33dbf7dd5f8a8b78890e037 Reviewed-on: https://go-review.googlesource.com/c/go/+/388476 Run-TryBot: Michael Pratt <[email protected]> Reviewed-by: Cherry Mui <[email protected]> TryBot-Result: Gopher Robot <[email protected]>
1 parent 15602e8 commit f7b12ff

10 files changed

+21
-194
lines changed

src/syscall/asm_linux_386.s

Lines changed: 0 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -65,28 +65,6 @@ ok6:
6565
CALL runtime·exitsyscall(SB)
6666
RET
6767

68-
// func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
69-
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
70-
MOVL trap+0(FP), AX // syscall entry
71-
MOVL a1+4(FP), BX
72-
MOVL a2+8(FP), CX
73-
MOVL a3+12(FP), DX
74-
MOVL $0, SI
75-
MOVL $0, DI
76-
INVOKE_SYSCALL
77-
CMPL AX, $0xfffff001
78-
JLS ok1
79-
MOVL $-1, r1+16(FP)
80-
MOVL $0, r2+20(FP)
81-
NEGL AX
82-
MOVL AX, err+24(FP)
83-
RET
84-
ok1:
85-
MOVL AX, r1+16(FP)
86-
MOVL DX, r2+20(FP)
87-
MOVL $0, err+24(FP)
88-
RET
89-
9068
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
9169
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
9270
MOVL trap+0(FP), AX // syscall entry

src/syscall/asm_linux_amd64.s

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -64,26 +64,6 @@ ok6:
6464
CALL runtime·exitsyscall<ABIInternal>(SB)
6565
RET
6666

67-
// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
68-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
69-
MOVQ a1+8(FP), DI
70-
MOVQ a2+16(FP), SI
71-
MOVQ a3+24(FP), DX
72-
MOVQ trap+0(FP), AX // syscall entry
73-
SYSCALL
74-
CMPQ AX, $0xfffffffffffff001
75-
JLS ok1
76-
MOVQ $-1, r1+32(FP)
77-
MOVQ $0, r2+40(FP)
78-
NEGQ AX
79-
MOVQ AX, err+48(FP)
80-
RET
81-
ok1:
82-
MOVQ AX, r1+32(FP)
83-
MOVQ DX, r2+40(FP)
84-
MOVQ $0, err+48(FP)
85-
RET
86-
8767
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8868
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
8969
MOVQ a1+8(FP), DI

src/syscall/asm_linux_arm.s

Lines changed: 0 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -102,30 +102,6 @@ okseek:
102102
BL runtime·exitsyscall(SB)
103103
RET
104104

105-
// func RawSyscall(trap uintptr, a1, a2, a3 uintptr) (r1, r2, err uintptr);
106-
TEXT ·RawSyscall(SB),NOSPLIT,$0-28
107-
MOVW trap+0(FP), R7 // syscall entry
108-
MOVW a1+4(FP), R0
109-
MOVW a2+8(FP), R1
110-
MOVW a3+12(FP), R2
111-
SWI $0
112-
MOVW $0xfffff001, R1
113-
CMP R1, R0
114-
BLS ok1
115-
MOVW $-1, R1
116-
MOVW R1, r1+16(FP)
117-
MOVW $0, R2
118-
MOVW R2, r2+20(FP)
119-
RSB $0, R0, R0
120-
MOVW R0, err+24(FP)
121-
RET
122-
ok1:
123-
MOVW R0, r1+16(FP)
124-
MOVW $0, R0
125-
MOVW R0, r2+20(FP)
126-
MOVW R0, err+24(FP)
127-
RET
128-
129105
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
130106
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
131107
MOVW trap+0(FP), R7 // syscall entry

src/syscall/asm_linux_arm64.s

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -57,29 +57,6 @@ ok:
5757
BL runtime·exitsyscall<ABIInternal>(SB)
5858
RET
5959

60-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
61-
MOVD a1+8(FP), R0
62-
MOVD a2+16(FP), R1
63-
MOVD a3+24(FP), R2
64-
MOVD $0, R3
65-
MOVD $0, R4
66-
MOVD $0, R5
67-
MOVD trap+0(FP), R8 // syscall entry
68-
SVC
69-
CMN $4095, R0
70-
BCC ok
71-
MOVD $-1, R4
72-
MOVD R4, r1+32(FP) // r1
73-
MOVD ZR, r2+40(FP) // r2
74-
NEG R0, R0
75-
MOVD R0, err+48(FP) // errno
76-
RET
77-
ok:
78-
MOVD R0, r1+32(FP) // r1
79-
MOVD R1, r2+40(FP) // r2
80-
MOVD ZR, err+48(FP) // errno
81-
RET
82-
8360
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8461
TEXT ·rawVforkSyscall(SB),NOSPLIT,$0-32
8562
MOVD a1+8(FP), R0

src/syscall/asm_linux_mips64x.s

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,6 @@ ok6:
5959
JAL runtime·exitsyscall(SB)
6060
RET
6161

62-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
63-
MOVV a1+8(FP), R4
64-
MOVV a2+16(FP), R5
65-
MOVV a3+24(FP), R6
66-
MOVV R0, R7
67-
MOVV R0, R8
68-
MOVV R0, R9
69-
MOVV trap+0(FP), R2 // syscall entry
70-
SYSCALL
71-
BEQ R7, ok1
72-
MOVV $-1, R1
73-
MOVV R1, r1+32(FP) // r1
74-
MOVV R0, r2+40(FP) // r2
75-
MOVV R2, err+48(FP) // errno
76-
RET
77-
ok1:
78-
MOVV R2, r1+32(FP) // r1
79-
MOVV R3, r2+40(FP) // r2
80-
MOVV R0, err+48(FP) // errno
81-
RET
82-
8362
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8463
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
8564
MOVV a1+8(FP), R4

src/syscall/asm_linux_mipsx.s

Lines changed: 0 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -97,24 +97,6 @@ ok9:
9797
JAL runtime·exitsyscall(SB)
9898
RET
9999

100-
TEXT ·RawSyscall(SB),NOSPLIT,$24-28
101-
MOVW a1+4(FP), R4
102-
MOVW a2+8(FP), R5
103-
MOVW a3+12(FP), R6
104-
MOVW trap+0(FP), R2 // syscall entry
105-
SYSCALL
106-
BEQ R7, ok1
107-
MOVW $-1, R1
108-
MOVW R1, r1+16(FP) // r1
109-
MOVW R0, r2+20(FP) // r2
110-
MOVW R2, err+24(FP) // errno
111-
RET
112-
ok1:
113-
MOVW R2, r1+16(FP) // r1
114-
MOVW R3, r2+20(FP) // r2
115-
MOVW R0, err+24(FP) // errno
116-
RET
117-
118100
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
119101
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-16
120102
MOVW a1+4(FP), R4

src/syscall/asm_linux_ppc64x.s

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,6 @@ ok6:
5959
BL runtime·exitsyscall<ABIInternal>(SB)
6060
RET
6161

62-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
63-
MOVD a1+8(FP), R3
64-
MOVD a2+16(FP), R4
65-
MOVD a3+24(FP), R5
66-
MOVD R0, R6
67-
MOVD R0, R7
68-
MOVD R0, R8
69-
MOVD trap+0(FP), R9 // syscall entry
70-
SYSCALL R9
71-
BVC ok1
72-
MOVD $-1, R4
73-
MOVD R4, r1+32(FP) // r1
74-
MOVD R0, r2+40(FP) // r2
75-
MOVD R3, err+48(FP) // errno
76-
RET
77-
ok1:
78-
MOVD R3, r1+32(FP) // r1
79-
MOVD R0, r2+40(FP) // r2
80-
MOVD R0, err+48(FP) // errno
81-
RET
82-
8362
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8463
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
8564
MOVD a1+8(FP), R3

src/syscall/asm_linux_riscv64.s

Lines changed: 0 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -59,27 +59,6 @@ err:
5959
CALL runtime·exitsyscall(SB)
6060
RET
6161

62-
// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
63-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
64-
MOV a1+8(FP), A0
65-
MOV a2+16(FP), A1
66-
MOV a3+24(FP), A2
67-
MOV trap+0(FP), A7 // syscall entry
68-
ECALL
69-
MOV $-4096, T0
70-
BLTU T0, A0, err
71-
MOV A0, r1+32(FP) // r1
72-
MOV A1, r2+40(FP) // r2
73-
MOV ZERO, err+48(FP) // errno
74-
RET
75-
err:
76-
MOV $-1, T0
77-
MOV T0, r1+32(FP) // r1
78-
MOV ZERO, r2+40(FP) // r2
79-
SUB A0, ZERO, A0
80-
MOV A0, err+48(FP) // errno
81-
RET
82-
8362
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8463
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
8564
MOV a1+8(FP), A0

src/syscall/asm_linux_s390x.s

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -60,29 +60,6 @@ ok6:
6060
BL runtime·exitsyscall(SB)
6161
RET
6262

63-
// func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2, err uintptr)
64-
TEXT ·RawSyscall(SB),NOSPLIT,$0-56
65-
MOVD a1+8(FP), R2
66-
MOVD a2+16(FP), R3
67-
MOVD a3+24(FP), R4
68-
MOVD $0, R5
69-
MOVD $0, R6
70-
MOVD $0, R7
71-
MOVD trap+0(FP), R1 // syscall entry
72-
SYSCALL
73-
MOVD $0xfffffffffffff001, R8
74-
CMPUBLT R2, R8, ok1
75-
MOVD $-1, r1+32(FP)
76-
MOVD $0, r2+40(FP)
77-
NEG R2, R2
78-
MOVD R2, err+48(FP) // errno
79-
RET
80-
ok1:
81-
MOVD R2, r1+32(FP)
82-
MOVD R3, r2+40(FP)
83-
MOVD $0, err+48(FP) // errno
84-
RET
85-
8663
// func rawVforkSyscall(trap, a1 uintptr) (r1, err uintptr)
8764
TEXT ·rawVforkSyscall(SB),NOSPLIT|NOFRAME,$0-32
8865
MOVD $0, R2

src/syscall/syscall_linux.go

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ import (
1818

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)
21-
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
2221

2322
// N.B. RawSyscall6 is provided via linkname by runtime/internal/syscall.
2423
//
@@ -27,6 +26,27 @@ func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno)
2726

2827
func RawSyscall6(trap, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2 uintptr, err Errno)
2928

29+
// N.B. For the Syscall functions below:
30+
//
31+
// //go:uintptrkeepalive because the uintptr argument may be converted pointers
32+
// that need to be kept alive in the caller (this is implied for RawSyscall6
33+
// since it has no body).
34+
//
35+
// //go:nosplit because stack copying does not account for uintptrkeepalive, so
36+
// the stack must not grow. Stack copying cannot blindly assume that all
37+
// uintptr arguments are pointers, because some values may look like pointers,
38+
// but not really be pointers, and adjusting their value would break the call.
39+
//
40+
// //go:linkname to ensure ABI wrappers are generated for external callers
41+
// (notably x/sys/unix assembly).
42+
43+
//go:uintptrkeepalive
44+
//go:nosplit
45+
//go:linkname RawSyscall
46+
func RawSyscall(trap, a1, a2, a3 uintptr) (r1, r2 uintptr, err Errno) {
47+
return RawSyscall6(trap, a1, a2, a3, 0, 0, 0)
48+
}
49+
3050
func rawSyscallNoError(trap, a1, a2, a3 uintptr) (r1, r2 uintptr)
3151

3252
/*

0 commit comments

Comments
 (0)