diff options
| author | Michael Pratt <mpratt@google.com> | 2022-02-24 16:35:06 -0500 |
|---|---|---|
| committer | Michael Pratt <mpratt@google.com> | 2022-04-21 18:06:56 +0000 |
| commit | 15602e88658a9dd43cec4220e01ef408d273f028 (patch) | |
| tree | 73fed5c55f3aecd7d8bef1e36fdf040b3c8e5d2a /src/runtime/internal | |
| parent | 1de1c0d10df18f4fda46aff82aadd9edfba2b751 (diff) | |
| download | go-15602e88658a9dd43cec4220e01ef408d273f028.tar.xz | |
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 <mpratt@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
TryBot-Result: Gopher Robot <gobot@golang.org>
Diffstat (limited to 'src/runtime/internal')
| -rw-r--r-- | src/runtime/internal/syscall/syscall_linux.go | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/src/runtime/internal/syscall/syscall_linux.go b/src/runtime/internal/syscall/syscall_linux.go index 06d5f21e7c..7f268e8fba 100644 --- a/src/runtime/internal/syscall/syscall_linux.go +++ b/src/runtime/internal/syscall/syscall_linux.go @@ -5,8 +5,35 @@ // Package syscall provides the syscall primitives required for the runtime. package syscall +import ( + _ "unsafe" // for go:linkname +) + // TODO(https://go.dev/issue/51087): This package is incomplete and currently // only contains very minimal support for Linux. // Syscall6 calls system call number 'num' with arguments a1-6. func Syscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) + +// syscall_RawSyscall6 is a push linkname to export Syscall6 as +// syscall.RawSyscall6. +// +// //go:uintptrkeepalive because the uintptr argument may be converted pointers +// that need to be kept alive in the caller (this is implied for Syscall6 since +// it has no body). +// +// //go:nosplit because stack copying does not account for uintptrkeepalive, so +// the stack must not grow. Stack copying cannot blindly assume that all +// uintptr arguments are pointers, because some values may look like pointers, +// but not really be pointers, and adjusting their value would break the call. +// +// This is a separate wrapper because we can't export one function as two +// names. The assembly implementations name themselves Syscall6 would not be +// affected by a linkname. +// +//go:uintptrkeepalive +//go:nosplit +//go:linkname syscall_RawSyscall6 syscall.RawSyscall6 +func syscall_RawSyscall6(num, a1, a2, a3, a4, a5, a6 uintptr) (r1, r2, errno uintptr) { + return Syscall6(num, a1, a2, a3, a4, a5, a6) +} |
