|
5 | 5 | // Package syscall provides the syscall primitives required for the runtime.
|
6 | 6 | package syscall
|
7 | 7 |
|
| 8 | +import ( |
| 9 | + _ "unsafe" // for go:linkname |
| 10 | +) |
| 11 | + |
8 | 12 | // TODO(https://go.dev/issue/51087): This package is incomplete and currently
|
9 | 13 | // only contains very minimal support for Linux.
|
10 | 14 |
|
11 | 15 | // Syscall6 calls system call number 'num' with arguments a1-6.
|
12 | 16 | 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 | +} |
0 commit comments