]> Cypherpunks.ru repositories - gostls13.git/commitdiff
internal/poll, syscall: convert writev to direct libc call on openbsd (except mips64)
authorTobias Klauser <tklauser@distanz.ch>
Tue, 6 Sep 2022 22:50:53 +0000 (00:50 +0200)
committerBenny Siegert <bsiegert@gmail.com>
Fri, 9 Sep 2022 16:24:04 +0000 (16:24 +0000)
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>
src/internal/poll/fd_writev_libc.go [moved from src/internal/poll/fd_writev_darwin.go with 83% similarity]
src/internal/poll/fd_writev_unix.go
src/syscall/syscall_openbsd.go
src/syscall/zsyscall_openbsd_386.go
src/syscall/zsyscall_openbsd_386.s
src/syscall/zsyscall_openbsd_amd64.go
src/syscall/zsyscall_openbsd_amd64.s
src/syscall/zsyscall_openbsd_arm.go
src/syscall/zsyscall_openbsd_arm.s
src/syscall/zsyscall_openbsd_arm64.go
src/syscall/zsyscall_openbsd_arm64.s

similarity index 83%
rename from src/internal/poll/fd_writev_darwin.go
rename to src/internal/poll/fd_writev_libc.go
index b5b8998df8cae13e33b4cbdaa2394a8ccc32d9e0..e427e624810e9cb63d6c7b4965601af13751524f 100644 (file)
@@ -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)
index aa96d104c89bf1f3125e7c984f10e611ca9b01b5..005638b06f2adf4d581607def7c28470b70b5243 100644 (file)
@@ -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
 
index 75217344df12511bb3b5a2414196441219decfdd..ba67ab1a57a27fd8f3a4a38149473ec19779c626 100644 (file)
@@ -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)
index f7986d5ea5c94a95c3dd82d763cc10911e0af4d6..b60af1743d891dd62343b26e410987131c7e80df 100644 (file)
@@ -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)
index e2c58625bb3b1ce845871a0ad8d9b24bfa983bf1..a77d931e8a768cb12aaadf432a75a45caac02349 100644 (file)
@@ -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
index 605443d8904370ebad92fb8c2a39165bde919d66..8b3e81e6bd36f2491575962e0d6cdbeb02019204 100644 (file)
@@ -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)
index 964c9ed9e1236d853a01a0449d88be5ae0e89e7a..d13e9c0782fb057aed5859d9576a9f674eceb87e 100644 (file)
@@ -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
index 0f2312fbc407bb341091fa14ba1534fcdd7ad9d0..42d57812b25d30e379932663c9be592cd564f12e 100644 (file)
@@ -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)
index 5975780edb272b93dd97de690ab79aaeea27ca6b..34ae794ee1fc3e27ead7b2041a4f3675af38f0b6 100644 (file)
@@ -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
index 1367e2aba9ee74de01c42967540e8857fa316805..7a5a2c0c819e42f0b1319ab614222b241b0a1930 100644 (file)
@@ -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)
index 2c4a0b0faf57d3a0434aa2006059eb895d933d89..20a79e433b25b3c6a46cc9105cefc436c220df35 100644 (file)
@@ -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