diff --git a/src/internal/poll/fd_writev_libc.go b/src/internal/poll/fd_writev_libc.go
index e427e624810e9cb63d6c7b4965601af13751524f..7d59e6b641a29ce723b334f8234e791af4451068 100644
--- a/src/internal/poll/fd_writev_libc.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 || (openbsd && !mips64)
+//go:build aix || darwin || (openbsd && !mips64)
 
 package poll
 
diff --git a/src/internal/poll/iovec_unix.go b/src/internal/poll/iovec_unix.go
index c1500840ac243e09290fff84e770e9c3a58939af..3f2833e728dace621fe1239cb64a59233fb62036 100644
--- a/src/internal/poll/iovec_unix.go
+++ b/src/internal/poll/iovec_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 darwin || dragonfly || freebsd || linux || netbsd || openbsd
+//go:build aix || darwin || dragonfly || freebsd || linux || netbsd || openbsd
 
 package poll
 
diff --git a/src/internal/poll/writev.go b/src/internal/poll/writev.go
index 4086c705fdfa2bbfc9ed7abd5081b239328cbb5f..75c8b642b550fcab983b6ed229ba0171ec010f97 100644
--- a/src/internal/poll/writev.go
+++ b/src/internal/poll/writev.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 || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+//go:build unix
 
 package poll
 
@@ -30,8 +30,8 @@ func (fd *FD) Writev(v *[][]byte) (int64, error) {
 	// 1024 and this seems conservative enough for now. Darwin's
 	// UIO_MAXIOV also seems to be 1024.
 	maxVec := 1024
-	if runtime.GOOS == "solaris" {
-		// IOV_MAX is set to XOPEN_IOV_MAX on Solaris.
+	if runtime.GOOS == "aix" || runtime.GOOS == "solaris" {
+		// IOV_MAX is set to XOPEN_IOV_MAX on AIX and Solaris.
 		maxVec = 16
 	}
 
diff --git a/src/net/writev_test.go b/src/net/writev_test.go
index 81b14774f9535d147bce92788d31e6e3e3152472..c4efe9d2ae80d5acff887e7bbb435aadd3102165 100644
--- a/src/net/writev_test.go
+++ b/src/net/writev_test.go
@@ -153,7 +153,7 @@ func testBuffer_writeTo(t *testing.T, chunks int, useCopy bool) {
 
 		var wantSum int
 		switch runtime.GOOS {
-		case "android", "darwin", "ios", "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
+		case "aix", "android", "darwin", "ios", "dragonfly", "freebsd", "illumos", "linux", "netbsd", "openbsd", "solaris":
 			var wantMinCalls int
 			wantSum = want.Len()
 			v := chunks
diff --git a/src/net/writev_unix.go b/src/net/writev_unix.go
index 3318fc5f6f9b041a112bacb2f4b159f0a776c4f3..3b0325bf640359696516e80ae84b2aae1ec4803f 100644
--- a/src/net/writev_unix.go
+++ b/src/net/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 darwin || dragonfly || freebsd || linux || netbsd || openbsd || solaris
+//go:build unix
 
 package net
 
diff --git a/src/syscall/syscall_aix.go b/src/syscall/syscall_aix.go
index 45a4060f568416996216cf1a1790f7a25d732d59..807990f3c0c5f6ecc89c721a59789d1a079bcb0f 100644
--- a/src/syscall/syscall_aix.go
+++ b/src/syscall/syscall_aix.go
@@ -642,6 +642,7 @@ func PtraceDetach(pid int) (err error) { return ptrace64(PT_DETACH, int64(pid),
 //sys	Unlink(path string) (err error)
 //sysnb	Uname(buf *Utsname) (err error)
 //sys	write(fd int, p []byte) (n int, err error)
+//sys	writev(fd int, iovecs []Iovec) (n uintptr, err error)
 
 //sys	gettimeofday(tv *Timeval, tzp *Timezone) (err error)
 
diff --git a/src/syscall/zsyscall_aix_ppc64.go b/src/syscall/zsyscall_aix_ppc64.go
index 39838a42e651c1ac874136242b569f47239d9610..c9e2edea242b15959c1036deb77b9fbf82ed255e 100644
--- a/src/syscall/zsyscall_aix_ppc64.go
+++ b/src/syscall/zsyscall_aix_ppc64.go
@@ -96,6 +96,7 @@ import "unsafe"
 //go:cgo_import_dynamic libc_Unlink unlink "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_Uname uname "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_write write "libc.a/shr_64.o"
+//go:cgo_import_dynamic libc_writev writev "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_gettimeofday gettimeofday "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_mmap mmap "libc.a/shr_64.o"
 //go:cgo_import_dynamic libc_munmap munmap "libc.a/shr_64.o"
@@ -189,6 +190,7 @@ import "unsafe"
 //go:linkname libc_Unlink libc_Unlink
 //go:linkname libc_Uname libc_Uname
 //go:linkname libc_write libc_write
+//go:linkname libc_writev libc_writev
 //go:linkname libc_gettimeofday libc_gettimeofday
 //go:linkname libc_mmap libc_mmap
 //go:linkname libc_munmap libc_munmap
@@ -285,6 +287,7 @@ var (
 	libc_Unlink,
 	libc_Uname,
 	libc_write,
+	libc_writev,
 	libc_gettimeofday,
 	libc_mmap,
 	libc_munmap libcFunc
@@ -1381,6 +1384,21 @@ func write(fd int, p []byte) (n int, err error) {
 
 // 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 *Iovec
+	if len(iovecs) > 0 {
+		_p0 = &iovecs[0]
+	}
+	r0, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_writev)), 3, uintptr(fd), uintptr(unsafe.Pointer(_p0)), uintptr(len(iovecs)), 0, 0, 0)
+	n = uintptr(r0)
+	if e1 != 0 {
+		err = errnoErr(e1)
+	}
+	return
+}
+
+// THIS FILE IS GENERATED BY THE COMMAND AT THE TOP; DO NOT EDIT
+
 func gettimeofday(tv *Timeval, tzp *Timezone) (err error) {
 	_, _, e1 := syscall6(uintptr(unsafe.Pointer(&libc_gettimeofday)), 2, uintptr(unsafe.Pointer(tv)), uintptr(unsafe.Pointer(tzp)), 0, 0, 0, 0)
 	if e1 != 0 {