diff options
| author | Tobias Klauser <tklauser@distanz.ch> | 2022-09-07 00:50:53 +0200 |
|---|---|---|
| committer | Benny Siegert <bsiegert@gmail.com> | 2022-09-09 16:24:04 +0000 |
| commit | e2f602003bb81dc3385c488a6635e2504d0abfbd (patch) | |
| tree | e2c2fb07c45d7f6d2167b0f3456e33a0e8499a39 /src | |
| parent | 600db8a514600df0d3a11edc220ed7e2f51ca158 (diff) | |
| download | go-e2f602003bb81dc3385c488a6635e2504d0abfbd.tar.xz | |
internal/poll, syscall: convert writev to direct libc call on openbsd (except mips64)
Add and use a writev libc wrapper instead of using syscall(2).
Updates golang/go#36435
Change-Id: I3c67665388ac276d9ef36868e368e91efb92800e
Reviewed-on: https://go-review.googlesource.com/c/go/+/428776
Run-TryBot: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Joel Sing <joel@sing.id.au>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Benny Siegert <bsiegert@gmail.com>
Auto-Submit: Tobias Klauser <tobias.klauser@gmail.com>
Reviewed-by: Michael Knyszek <mknyszek@google.com>
Diffstat (limited to 'src')
| -rw-r--r-- | src/internal/poll/fd_writev_libc.go (renamed from src/internal/poll/fd_writev_darwin.go) | 4 | ||||
| -rw-r--r-- | src/internal/poll/fd_writev_unix.go | 2 | ||||
| -rw-r--r-- | src/syscall/syscall_openbsd.go | 1 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_386.go | 21 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_386.s | 2 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_amd64.go | 21 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_amd64.s | 2 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_arm.go | 21 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_arm.s | 2 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_arm64.go | 21 | ||||
| -rw-r--r-- | src/syscall/zsyscall_openbsd_arm64.s | 2 |
11 files changed, 95 insertions, 4 deletions
diff --git a/src/internal/poll/fd_writev_darwin.go b/src/internal/poll/fd_writev_libc.go index b5b8998df8..e427e62481 100644 --- a/src/internal/poll/fd_writev_darwin.go +++ b/src/internal/poll/fd_writev_libc.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build darwin +//go:build darwin || (openbsd && !mips64) package poll @@ -11,7 +11,5 @@ import ( _ "unsafe" // for go:linkname ) -// Implemented in syscall/syscall_darwin.go. -// //go:linkname writev syscall.writev func writev(fd int, iovecs []syscall.Iovec) (uintptr, error) diff --git a/src/internal/poll/fd_writev_unix.go b/src/internal/poll/fd_writev_unix.go index aa96d104c8..005638b06f 100644 --- a/src/internal/poll/fd_writev_unix.go +++ b/src/internal/poll/fd_writev_unix.go @@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style // license that can be found in the LICENSE file. -//go:build dragonfly || freebsd || linux || netbsd || openbsd +//go:build dragonfly || freebsd || linux || netbsd || (openbsd && mips64) package poll diff --git a/src/syscall/syscall_openbsd.go b/src/syscall/syscall_openbsd.go index 75217344df..ba67ab1a57 100644 --- a/src/syscall/syscall_openbsd.go +++ b/src/syscall/syscall_openbsd.go @@ -209,6 +209,7 @@ func Getfsstat(buf []Statfs_t, flags int) (n int, err error) { //sys Unlink(path string) (err error) //sys Unmount(path string, flags int) (err error) //sys write(fd int, p []byte) (n int, err error) +//sys writev(fd int, iovecs []Iovec) (n uintptr, err error) //sys mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) //sys munmap(addr uintptr, length uintptr) (err error) //sys utimensat(dirfd int, path string, times *[2]Timespec, flag int) (err error) diff --git a/src/syscall/zsyscall_openbsd_386.go b/src/syscall/zsyscall_openbsd_386.go index f7986d5ea5..b60af1743d 100644 --- a/src/syscall/zsyscall_openbsd_386.go +++ b/src/syscall/zsyscall_openbsd_386.go @@ -1610,6 +1610,27 @@ func libc_write_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func writev(fd int, iovecs []Iovec) (n uintptr, err error) { + var _p0 unsafe.Pointer + if len(iovecs) > 0 { + _p0 = unsafe.Pointer(&iovecs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall(abi.FuncPCABI0(libc_writev_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(iovecs))) + n = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_writev_trampoline() + +//go:cgo_import_dynamic libc_writev writev "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := syscall9(abi.FuncPCABI0(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos), uintptr(pos>>32), 0, 0) ret = uintptr(r0) diff --git a/src/syscall/zsyscall_openbsd_386.s b/src/syscall/zsyscall_openbsd_386.s index e2c58625bb..a77d931e8a 100644 --- a/src/syscall/zsyscall_openbsd_386.s +++ b/src/syscall/zsyscall_openbsd_386.s @@ -201,6 +201,8 @@ TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 JMP libc_write(SB) +TEXT ·libc_writev_trampoline(SB),NOSPLIT,$0-0 + JMP libc_writev(SB) TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_openbsd_amd64.go b/src/syscall/zsyscall_openbsd_amd64.go index 605443d890..8b3e81e6bd 100644 --- a/src/syscall/zsyscall_openbsd_amd64.go +++ b/src/syscall/zsyscall_openbsd_amd64.go @@ -1610,6 +1610,27 @@ func libc_write_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func writev(fd int, iovecs []Iovec) (n uintptr, err error) { + var _p0 unsafe.Pointer + if len(iovecs) > 0 { + _p0 = unsafe.Pointer(&iovecs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscallX(abi.FuncPCABI0(libc_writev_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(iovecs))) + n = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_writev_trampoline() + +//go:cgo_import_dynamic libc_writev writev "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := syscall6X(abi.FuncPCABI0(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) diff --git a/src/syscall/zsyscall_openbsd_amd64.s b/src/syscall/zsyscall_openbsd_amd64.s index 964c9ed9e1..d13e9c0782 100644 --- a/src/syscall/zsyscall_openbsd_amd64.s +++ b/src/syscall/zsyscall_openbsd_amd64.s @@ -201,6 +201,8 @@ TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 JMP libc_write(SB) +TEXT ·libc_writev_trampoline(SB),NOSPLIT,$0-0 + JMP libc_writev(SB) TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_openbsd_arm.go b/src/syscall/zsyscall_openbsd_arm.go index 0f2312fbc4..42d57812b2 100644 --- a/src/syscall/zsyscall_openbsd_arm.go +++ b/src/syscall/zsyscall_openbsd_arm.go @@ -1610,6 +1610,27 @@ func libc_write_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func writev(fd int, iovecs []Iovec) (n uintptr, err error) { + var _p0 unsafe.Pointer + if len(iovecs) > 0 { + _p0 = unsafe.Pointer(&iovecs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscall(abi.FuncPCABI0(libc_writev_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(iovecs))) + n = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_writev_trampoline() + +//go:cgo_import_dynamic libc_writev writev "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := syscall9(abi.FuncPCABI0(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), 0, uintptr(pos), uintptr(pos>>32), 0) ret = uintptr(r0) diff --git a/src/syscall/zsyscall_openbsd_arm.s b/src/syscall/zsyscall_openbsd_arm.s index 5975780edb..34ae794ee1 100644 --- a/src/syscall/zsyscall_openbsd_arm.s +++ b/src/syscall/zsyscall_openbsd_arm.s @@ -201,6 +201,8 @@ TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 JMP libc_write(SB) +TEXT ·libc_writev_trampoline(SB),NOSPLIT,$0-0 + JMP libc_writev(SB) TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 diff --git a/src/syscall/zsyscall_openbsd_arm64.go b/src/syscall/zsyscall_openbsd_arm64.go index 1367e2aba9..7a5a2c0c81 100644 --- a/src/syscall/zsyscall_openbsd_arm64.go +++ b/src/syscall/zsyscall_openbsd_arm64.go @@ -1610,6 +1610,27 @@ func libc_write_trampoline() // THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT +func writev(fd int, iovecs []Iovec) (n uintptr, err error) { + var _p0 unsafe.Pointer + if len(iovecs) > 0 { + _p0 = unsafe.Pointer(&iovecs[0]) + } else { + _p0 = unsafe.Pointer(&_zero) + } + r0, _, e1 := syscallX(abi.FuncPCABI0(libc_writev_trampoline), uintptr(fd), uintptr(_p0), uintptr(len(iovecs))) + n = uintptr(r0) + if e1 != 0 { + err = errnoErr(e1) + } + return +} + +func libc_writev_trampoline() + +//go:cgo_import_dynamic libc_writev writev "libc.so" + +// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT + func mmap(addr uintptr, length uintptr, prot int, flag int, fd int, pos int64) (ret uintptr, err error) { r0, _, e1 := syscall6X(abi.FuncPCABI0(libc_mmap_trampoline), uintptr(addr), uintptr(length), uintptr(prot), uintptr(flag), uintptr(fd), uintptr(pos)) ret = uintptr(r0) diff --git a/src/syscall/zsyscall_openbsd_arm64.s b/src/syscall/zsyscall_openbsd_arm64.s index 2c4a0b0faf..20a79e433b 100644 --- a/src/syscall/zsyscall_openbsd_arm64.s +++ b/src/syscall/zsyscall_openbsd_arm64.s @@ -201,6 +201,8 @@ TEXT ·libc_unmount_trampoline(SB),NOSPLIT,$0-0 JMP libc_unmount(SB) TEXT ·libc_write_trampoline(SB),NOSPLIT,$0-0 JMP libc_write(SB) +TEXT ·libc_writev_trampoline(SB),NOSPLIT,$0-0 + JMP libc_writev(SB) TEXT ·libc_mmap_trampoline(SB),NOSPLIT,$0-0 JMP libc_mmap(SB) TEXT ·libc_munmap_trampoline(SB),NOSPLIT,$0-0 |
