aboutsummaryrefslogtreecommitdiffstats
path: root/sys/linux
diff options
context:
space:
mode:
Diffstat (limited to 'sys/linux')
-rw-r--r--sys/linux/io_uring.txt333
-rw-r--r--sys/linux/io_uring_386.const66
-rw-r--r--sys/linux/io_uring_amd64.const66
-rw-r--r--sys/linux/io_uring_arm.const66
-rw-r--r--sys/linux/io_uring_arm64.const66
-rw-r--r--sys/linux/io_uring_mips64le.const66
-rw-r--r--sys/linux/io_uring_ppc64le.const66
-rw-r--r--sys/linux/io_uring_riscv64.const66
-rw-r--r--sys/linux/io_uring_s390x.const66
-rw-r--r--sys/linux/test/io_uring22
10 files changed, 857 insertions, 26 deletions
diff --git a/sys/linux/io_uring.txt b/sys/linux/io_uring.txt
index 9ce0eaef7..a2d384319 100644
--- a/sys/linux/io_uring.txt
+++ b/sys/linux/io_uring.txt
@@ -3,15 +3,21 @@
# See http://kernel.dk/io_uring.pdf
-# TODO: we don't write anything to the actual uring.
-# NEED: we somehow need to write the mmap-ed range after the mmap. vring needs something similar.
-
include <uapi/linux/io_uring.h>
+# For EPOLL_CTL_ADD, EPOLL_CTL_MOD, EPOLL_CTL_DEL
+include <uapi/linux/eventpoll.h>
resource fd_io_uring[fd]
+resource ring_ptr[int64]
+resource sqes_ptr[int64]
+resource ioring_personality_id[int16]
+
+# fs/io_uring.c
+define IORING_MAX_ENTRIES 32768
+define IORING_MAX_CQ_ENTRIES (2 * IORING_MAX_ENTRIES)
-io_uring_setup(entries int32[1:4096], params ptr[in, io_uring_params]) fd_io_uring
-io_uring_enter(fd fd_io_uring, to_submit int32, min_complete int32, flags flags[io_uring_enter_flags], sigmask ptr[in, sigset_t], size len[sigmask])
+io_uring_setup(entries int32[1:IORING_MAX_ENTRIES], params ptr[inout, io_uring_params]) fd_io_uring
+io_uring_enter(fd fd_io_uring, to_submit int32[0:IORING_MAX_ENTRIES], min_complete int32[0:IORING_MAX_CQ_ENTRIES], flags flags[io_uring_enter_flags], sigmask ptr[in, sigset_t], size len[sigmask])
io_uring_register$IORING_REGISTER_BUFFERS(fd fd_io_uring, opcode const[IORING_REGISTER_BUFFERS], arg ptr[in, array[iovec_out]], nr_args len[arg])
io_uring_register$IORING_UNREGISTER_BUFFERS(fd fd_io_uring, opcode const[IORING_UNREGISTER_BUFFERS], arg const[0], nr_args const[0])
io_uring_register$IORING_REGISTER_FILES(fd fd_io_uring, opcode const[IORING_REGISTER_FILES], arg ptr[in, array[fd]], nr_args len[arg])
@@ -19,40 +25,315 @@ io_uring_register$IORING_UNREGISTER_FILES(fd fd_io_uring, opcode const[IORING_UN
io_uring_register$IORING_REGISTER_EVENTFD(fd fd_io_uring, opcode const[IORING_REGISTER_EVENTFD], arg ptr[in, fd_event], nr_args const[1])
io_uring_register$IORING_UNREGISTER_EVENTFD(fd fd_io_uring, opcode const[IORING_UNREGISTER_EVENTFD], arg const[0], nr_args const[0])
io_uring_register$IORING_REGISTER_FILES_UPDATE(fd fd_io_uring, opcode const[IORING_REGISTER_FILES_UPDATE], arg ptr[in, io_uring_files_update], nr_args len[arg:fds])
+io_uring_register$IORING_REGISTER_EVENTFD_ASYNC(fd fd_io_uring, opcode const[IORING_REGISTER_EVENTFD_ASYNC], arg ptr[in, fd_event], nr_args const[1])
+io_uring_register$IORING_REGISTER_PROBE(fd fd_io_uring, opcode const[IORING_REGISTER_PROBE], arg ptr[inout, io_uring_probe], nr_args len[arg:ops])
+io_uring_register$IORING_REGISTER_PERSONALITY(fd fd_io_uring, opcode const[IORING_REGISTER_PERSONALITY], arg const[0], nr_args const[0]) ioring_personality_id
+io_uring_register$IORING_UNREGISTER_PERSONALITY(fd fd_io_uring, opcode const[IORING_UNREGISTER_PERSONALITY], arg const[0], nr_args ioring_personality_id)
-mmap$IORING_OFF_SQ_RING(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_SQ_RING])
-mmap$IORING_OFF_CQ_RING(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_CQ_RING])
-mmap$IORING_OFF_SQES(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_SQES])
+# The mmap'ed area for SQ and CQ rings are really the same -- the difference is
+# accounted for with the usage of offsets.
+mmap$IORING_OFF_SQ_RING(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_SQ_RING]) ring_ptr
+mmap$IORING_OFF_CQ_RING(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_CQ_RING]) ring_ptr
+mmap$IORING_OFF_SQES(addr vma, len len[addr], prot flags[mmap_prot], flags flags[mmap_flags], fd fd_io_uring, offset const[IORING_OFF_SQES]) sqes_ptr
-io_uring_setup_flags = IORING_SETUP_IOPOLL, IORING_SETUP_SQPOLL, IORING_SETUP_SQ_AFF, IORING_SETUP_CQSIZE
+# If no flags are specified(0), the io_uring instance is setup for interrupt driven IO.
+io_uring_setup_flags = 0, IORING_SETUP_IOPOLL, IORING_SETUP_SQPOLL, IORING_SETUP_SQ_AFF, IORING_SETUP_CQSIZE, IORING_SETUP_CLAMP, IORING_SETUP_ATTACH_WQ
io_uring_enter_flags = IORING_ENTER_GETEVENTS, IORING_ENTER_SQ_WAKEUP
_ = __NR_mmap2
+# Once an io_uring is set up by calling io_uring_setup, the offsets to the member fields
+# to be used on the mmap'ed area are set in structs io_sqring_offsets and io_cqring_offsets.
+# Except io_sqring_offsets.array, the offsets are static while all depend on how struct io_rings
+# is organized in code. The offsets can be marked as resources in syzkaller descriptions but
+# this makes it difficult to generate correct programs by the fuzzer. Thus, the offsets are
+# hard-coded here (and in the executor).
+define SQ_HEAD_OFFSET 0
+define SQ_TAIL_OFFSET 64
+define SQ_RING_MASK_OFFSET 256
+define SQ_RING_ENTRIES_OFFSET 264
+define SQ_FLAGS_OFFSET 276
+define SQ_DROPPED_OFFSET 272
+define CQ_HEAD_OFFSET 128
+define CQ_TAIL_OFFSET 192
+define CQ_RING_MASK_OFFSET 260
+define CQ_RING_ENTRIES_OFFSET 268
+define CQ_RING_OVERFLOW_OFFSET 284
+define CQ_FLAGS_OFFSET 280
+
+# Notice all offsets are pointing to uint32 values. This is assumed for the
+io_uring_offsets = SQ_HEAD_OFFSET, SQ_TAIL_OFFSET, SQ_RING_MASK_OFFSET, SQ_RING_ENTRIES_OFFSET, SQ_FLAGS_OFFSET, SQ_DROPPED_OFFSET, CQ_HEAD_OFFSET, CQ_TAIL_OFFSET, CQ_RING_MASK_OFFSET, CQ_RING_ENTRIES_OFFSET, CQ_RING_OVERFLOW_OFFSET, CQ_FLAGS_OFFSET
+
+# Also, all values are int32, thus, set nbytes to 4.
+syz_memcpy_off$IO_URING_METADATA_GENERIC(ring_ptr ring_ptr, off flags[io_uring_offsets], src ptr[in, int32], src_off const[0], nbytes const[4])
+
+# The flags available are: IORING_SQ_NEED_WAKEUP (1) for sq, IORING_CQ_EVENTFD_DISABLED (1) for cq. Use int32[0:1] to represent possible values.
+io_uring_flags_offsets = SQ_FLAGS_OFFSET, CQ_FLAGS_OFFSET
+syz_memcpy_off$IO_URING_METADATA_FLAGS(ring_ptr ring_ptr, flag_off flags[io_uring_flags_offsets], src ptr[in, int32[0:1]], src_off const[0], nbytes const[4])
+
+io_uring_probe {
+ last_op const[0, int8]
+ ops_len const[0, int8]
+ resv const[0, int16]
+ resv2 array[const[0, int32], 3]
+ ops array[io_uring_probe_op, 0:IORING_OP_LAST]
+}
+
+io_uring_probe_op {
+ op const[0, int8]
+ resv const[0, int8]
+ flags const[0, int16]
+ resv2 const[0, int32]
+}
+
+io_uring_files_update {
+ offset int32
+ resv const[0, int32]
+ fds ptr64[in, array[fd]]
+}
+
+# NEED: part of fields are input here and part are output. We can't express this yet (#245).
io_uring_params {
+# sq_entries, cq_entries, features, wq_fd, sq_off, and cq_off are set by the kernel
sq_entries const[0, int32]
- cq_entries const[0, int32]
+ cq_entries int32[0:IORING_MAX_CQ_ENTRIES]
flags flags[io_uring_setup_flags, int32]
sq_thread_cpu int32[0:3]
sq_thread_idle int32[0:1000]
features const[0, int32]
- resv array[const[0, int32], 4]
- sq_off io_sqring_offsets
- cq_off io_sqring_offsets
+ wq_fd fd_io_uring[opt]
+ resv array[const[0, int32], 3]
+# We don't really use them (they are hard-coded). Thus, just pass some memory region of their size.
+ sq_off array[const[0, int32], 10]
+ cq_off array[const[0, int32], 10]
+}
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# Descriptions for sq_ring and cq_ring manipulation # # # # # # # # # # # # # #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+# Retrieve the cqe at the head of the cq_ring and advance the head. The only meaningful
+# resource contained within a cqe is by the completion of openat or openat2 calls,
+# which produce fd. If that is the case, returns the return value of those. Otherwise,
+# for other operations, returns an invalid fd (-1).
+syz_io_uring_complete(ring_ptr ring_ptr) fd
+
+# Submit sqe into the sq_ring
+syz_io_uring_submit(ring_ptr ring_ptr, sqes_ptr sqes_ptr, sqe ptr[in, io_uring_sqe_u], sqes_index int32)
+
+io_uring_sqe_u [
+ IORING_OP_NOP io_uring_sqe_nop
+ IORING_OP_READV io_uring_sqe_readv
+ IORING_OP_WRITEV io_uring_sqe_writev
+ IORING_OP_FSYNC io_uring_sqe_fsync
+ IORING_OP_READ_FIXED io_uring_sqe_read_fixed
+ IORING_OP_WRITE_FIXED io_uring_sqe_write_fixed
+ IORING_OP_POLL_ADD io_uring_sqe_poll_add
+ IORING_OP_POLL_REMOVE io_uring_sqe_poll_remove
+ IORING_OP_SYNC_FILE_RANGE io_uring_sqe_sync_file_range
+ IORING_OP_SENDMSG io_uring_sqe_sendmsg
+ IORING_OP_RECVMSG io_uring_sqe_recvmsg
+ IORING_OP_TIMEOUT io_uring_sqe_timeout
+ IORING_OP_TIMEOUT_REMOVE io_uring_sqe_timeout_remove
+ IORING_OP_ACCEPT io_uring_sqe_accept
+ IORING_OP_ASYNC_CANCEL io_uring_sqe_async_cancel
+ IORING_OP_LINK_TIMEOUT io_uring_sqe_link_timeout
+ IORING_OP_CONNECT io_uring_sqe_connect
+ IORING_OP_FALLOCATE io_uring_sqe_fallocate
+ IORING_OP_OPENAT io_uring_sqe_openat
+ IORING_OP_CLOSE io_uring_sqe_close
+ IORING_OP_FILES_UPDATE io_uring_sqe_files_update
+ IORING_OP_STATX io_uring_sqe_statx
+ IORING_OP_READ io_uring_sqe_read
+ IORING_OP_WRITE io_uring_sqe_write
+ IORING_OP_FADVISE io_uring_sqe_fadvise
+ IORING_OP_MADVISE io_uring_sqe_madvise
+ IORING_OP_SEND io_uring_sqe_send
+ IORING_OP_RECV io_uring_sqe_recv
+ IORING_OP_OPENAT2 io_uring_sqe_openat2
+ IORING_OP_EPOLL_CTL io_uring_sqe_epoll_ctl
+ IORING_OP_SPLICE io_uring_sqe_splice
+ IORING_OP_PROVIDE_BUFFERS io_uring_sqe_provide_buffers
+ IORING_OP_REMOVE_BUFFERS io_uring_sqe_remove_buffers
+ IORING_OP_TEE io_uring_sqe_tee
+]
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+# io_uring submission queue entry (io_uring_sqe) descriptions # # # # # # # # #
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+#
+# sqe type template
+#
+
+type io_uring_sqe_t[OP, IOPRIO, FD, OFF, ADDR, LEN, MISC_FLAGS, USER_DATA, MISC] {
+ opcode const[OP, int8]
+ flags flags[iosqe_flags, int8]
+ ioprio IOPRIO
+ fd FD
+ off OFF
+ addr ADDR
+ len LEN
+ misc_flags MISC_FLAGS
+ user_data flags[USER_DATA, int64]
+# This is a union of different possibilites with a padding at the end.
+ misc MISC
+} [size[SIZEOF_IO_URING_SQE]]
+
+define SIZEOF_IO_URING_SQE 64
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+#
+# Instantiation of sqes for each op
+#
+
+type io_uring_sqe_nop io_uring_sqe_t[IORING_OP_NOP, const[0, int16], const[0, int32], const[0, int64], const[0, int64], const[0, int32], const[0, int32], zero_flag, array[const[0, int64], 3]]
+
+io_uring_sqe_readv [
+ pass_iovec io_uring_sqe_t[IORING_OP_READV, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], ptr[in, array[iovec_out]], len[addr, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+ use_registered_buffer io_uring_sqe_t[IORING_OP_READV, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], const[0, int64], const[0, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, buf_index_personality_misc]
+]
+
+type io_uring_sqe_writev io_uring_sqe_t[IORING_OP_WRITEV, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], ptr[in, array[iovec_in]], len[addr, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, buf_index_personality_misc]
+type io_uring_sqe_fsync io_uring_sqe_t[IORING_OP_FSYNC, const[0, int16], fd_or_fixed_fd_index, const[0, int64], const[0, int64], const[0, int32], flags[io_uring_fsync_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_read_fixed io_uring_sqe_t[IORING_OP_READ_FIXED, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], int64, int32, flags[rwf_flags, int32], sqe_user_data_not_openat, buf_index_personality_misc]
+type io_uring_sqe_write_fixed io_uring_sqe_t[IORING_OP_WRITE_FIXED, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], int64, int32, flags[rwf_flags, int32], sqe_user_data_not_openat, buf_index_personality_misc]
+type io_uring_sqe_poll_add io_uring_sqe_t[IORING_OP_POLL_ADD, const[0, int16], fd_or_fixed_fd_index, const[0, int64], const[0, int64], const[0, int32], io_uring_sqe_poll_add_misc_flags, sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_poll_remove io_uring_sqe_t[IORING_OP_POLL_REMOVE, const[0, int16], const[0, int32], const[0, int64], flags[sqe_user_data, int64], const[0, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_sync_file_range io_uring_sqe_t[IORING_OP_SYNC_FILE_RANGE, const[0, int16], fd_or_fixed_fd_index, fileoff[int64], const[0, int64], int32, flags[sync_file_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_sendmsg io_uring_sqe_t[IORING_OP_SENDMSG, const[0, int16], sock, const[0, int64], ptr[in, send_msghdr], const[0, int32], flags[send_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_recvmsg io_uring_sqe_t[IORING_OP_RECVMSG, const[0, int16], sock, const[0, int64], ptr[inout, recv_msghdr], const[0, int32], flags[recv_flags, int32], sqe_user_data_not_openat, buf_group_personality_misc]
+type io_uring_sqe_timeout io_uring_sqe_t[IORING_OP_TIMEOUT, const[0, int16], const[0, int32], io_uring_timeout_completion_event_count, ptr[in, timespec], const[1, int32], flags[io_uring_timeout_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_timeout_remove io_uring_sqe_t[IORING_OP_TIMEOUT_REMOVE, const[0, int16], const[0, int32], const[0, int64], flags[sqe_user_data, int64], const[0, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_accept io_uring_sqe_t[IORING_OP_ACCEPT, const[0, int16], sock, ptr[inout, len[addr, int32]], ptr[out, sockaddr_storage, opt], const[0, int32], flags[accept_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_async_cancel io_uring_sqe_t[IORING_OP_ASYNC_CANCEL, const[0, int16], const[0, int32], const[0, int64], flags[sqe_user_data, int64], const[0, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_link_timeout io_uring_sqe_t[IORING_OP_LINK_TIMEOUT, const[0, int16], const[0, int32], const[0, int64], ptr[in, timespec], const[1, int32], flags[io_uring_timeout_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_connect io_uring_sqe_t[IORING_OP_CONNECT, const[0, int16], sock, len[addr, int32], ptr[in, sockaddr_storage], const[0, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_fallocate io_uring_sqe_t[IORING_OP_FALLOCATE, const[0, int16], fd_or_fixed_fd_index, fileoff[int64], const[0, int64], int32, const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_openat io_uring_sqe_t[IORING_OP_OPENAT, const[0, int16], fd_dir[opt], const[0, int64], ptr[in, filename], flags[open_mode, int32], flags[open_flags, int32], sqe_user_data_openat, personality_only_misc]
+type io_uring_sqe_close io_uring_sqe_t[IORING_OP_CLOSE, const[0, int16], fd, const[0, int64], const[0, int64], const[0, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_files_update io_uring_sqe_t[IORING_OP_FILES_UPDATE, const[0, int16], const[0, int32], fileoff[int64], ptr[in, array[fd]], len[addr, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_statx io_uring_sqe_t[IORING_OP_STATX, const[0, int16], fd_dir[opt], ptr[out, statx], ptr[in, filename], flags[statx_mask, int32], flags[statx_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+
+io_uring_sqe_read [
+ pass_buffer io_uring_sqe_t[IORING_OP_READ, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], buffer[out], bytesize[addr, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+ use_registered_buffer io_uring_sqe_t[IORING_OP_READ, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], const[0, int64], const[0, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, buf_index_personality_misc]
+]
+
+type io_uring_sqe_write io_uring_sqe_t[IORING_OP_WRITE, flags[ioprio_priorities, int16], fd_or_fixed_fd_index, fileoff[int64], buffer[in], bytesize[addr, int32], flags[rwf_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_fadvise io_uring_sqe_t[IORING_OP_FADVISE, const[0, int16], fd_or_fixed_fd_index, fileoff[int64], const[0, int64], int32, flags[fadvise_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_madvise io_uring_sqe_t[IORING_OP_MADVISE, const[0, int16], const[0, int32], const[0, int64], vma, len[addr, int32], flags[madvise_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+type io_uring_sqe_send io_uring_sqe_t[IORING_OP_SEND, const[0, int16], sock, const[0, int64], buffer[in], len[addr, int32], flags[send_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+
+io_uring_sqe_recv [
+ pass_buffer io_uring_sqe_t[IORING_OP_RECV, const[0, int16], sock, const[0, int64], buffer[inout], len[addr, int32], flags[recv_flags, int32], sqe_user_data_not_openat, personality_only_misc]
+ use_registered_buffer io_uring_sqe_t[IORING_OP_RECV, const[0, int16], sock, const[0, int64], const[0, int64], const[0, int32], flags[recv_flags, int32], sqe_user_data_not_openat, buf_group_personality_misc]
+]
+
+type io_uring_sqe_openat2 io_uring_sqe_t[IORING_OP_OPENAT2, const[0, int16], fd_dir[opt], ptr[in, open_how], ptr[in, filename], bytesize[off, int32], const[0, int32], sqe_user_data_openat, personality_only_misc]
+type io_uring_sqe_epoll_ctl_t[EPOLL_OP, EPOLL_EVENTS] io_uring_sqe_t[IORING_OP_EPOLL_CTL, const[0, int16], fd_epoll, EPOLL_EVENTS, fd, const[EPOLL_OP, int32], const[0, int32], sqe_user_data_not_openat, personality_only_misc]
+
+io_uring_sqe_epoll_ctl [
+ add io_uring_sqe_epoll_ctl_t[EPOLL_CTL_ADD, ptr[in, epoll_event]]
+ del io_uring_sqe_epoll_ctl_t[EPOLL_CTL_DEL, const[0, int64]]
+ mod io_uring_sqe_epoll_ctl_t[EPOLL_CTL_MOD, ptr[in, epoll_event]]
+]
+
+type io_uring_sqe_splice io_uring_sqe_t[IORING_OP_SPLICE, const[0, int16], fd_or_fixed_fd_index, fileoff[int64], io_uring_sqe_splice_off_in, int32, flags[splice_flags, int32], sqe_user_data_not_openat, io_uring_sqe_splice_misc]
+type io_uring_sqe_provide_buffers io_uring_sqe_t[IORING_OP_PROVIDE_BUFFERS, const[0, int16], int32, io_uring_bid[int64], buffer[in], int32, const[0, int32], sqe_user_data_not_openat, buf_group_personality_misc]
+type io_uring_sqe_remove_buffers io_uring_sqe_t[IORING_OP_PROVIDE_BUFFERS, const[0, int16], int32, const[0, int64], const[0, int64], const[0, int32], const[0, int32], sqe_user_data_not_openat, buf_group_personality_misc]
+type io_uring_sqe_tee io_uring_sqe_t[IORING_OP_TEE, const[0, int16], fd_or_fixed_fd_index, const[0, int64], const[0, int64], int32, flags[splice_flags, int32], sqe_user_data_not_openat, io_uring_sqe_tee_misc]
+
+# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
+
+#
+# Flags, enumerations, and misc fields of sqe ops
+#
+
+iosqe_flags = IOSQE_IO_DRAIN_BIT, IOSQE_IO_LINK_BIT, IOSQE_IO_HARDLINK_BIT, IOSQE_ASYNC_BIT, IOSQE_BUFFER_SELECT_BIT, IOSQE_FIXED_FILE_BIT
+
+fd_or_fixed_fd_index [
+ fd fd
+# Use the registered files (io_uring_register$IORING_REGISTER_FILES) when IOSQE_FIXED_FILE_BIT is set in sqe.
+# To ease collisions, limit the indices.
+ fd_index int32[0:10]
+]
+
+# 0 for normal file integrity sync, IORING_FSYNC_DATASYNC to provide data sync only semantics
+io_uring_fsync_flags = 0, IORING_FSYNC_DATASYNC
+
+# 0 for relative, IORING_TIMEOUT_ABS for absolute timeout value
+io_uring_timeout_flags = 0, IORING_TIMEOUT_ABS
+
+# The timeout condition is met when either the specific timeout expries, or the
+# specified number of events have completed. If not set, defaults to 1. Use a
+# limited range to allow utilization of this value to meet timeout condition besides
+# the timeout expiration.
+type io_uring_timeout_completion_event_count int64[0:10]
+
+# An already issued request can be attempted to be cancelled using ASYNC_CANCEL
+# operation. This operation identifies the operations using what's passed as
+# with user_data in their sqe. To ease collisions of ASYNC_CANCEL operation with
+# already submitted ones, use a limited range of values for user_data field.
+# Among all operations that can be achieved by submitting to the io_uring, only
+# openat and openat2 returns a useful resource (fd) that we can use for other
+# systemcalls. The resulting fds are returned within io_uring_cqe.res. The only way
+# to identify cqes for those operations is to keep track of their user data. Thus,
+# use a seperate set of sqe_user_data range for openat and openat2.
+sqe_user_data_not_openat = 0, 1
+sqe_user_data_openat = 0x12345, 0x23456
+sqe_user_data = 0, 1, 0x12345, 0x23456
+
+# The buffer id (bid) and the buffer group id (bgid) are registered using
+# IORING_OP_PROVIDE_BUFFERS. Use the ids in a limited range to ease collisions
+# with other operations.
+type io_uring_bid[T] T[0:3]
+type io_uring_bgid[T] T[0:3]
+
+zero_flag = 0
+
+io_uring_sqe_poll_add_misc_flags {
+ misc_flags flags[pollfd_events, int16]
+# 2 bytes of padding to fill what is left from the union of flags
+ fill_flags_union const[0, int16]
}
-io_sqring_offsets {
- head const[0, int32]
- tail const[0, int32]
- ring_mask const[0, int32]
- ring_entries const[0, int32]
- flags const[0, int32]
- dropped const[0, int32]
- array const[0, int32]
- resv1 const[0, int32]
- resv2 const[0, int64]
+io_uring_sqe_splice_off_in {
+ splice_off_in_unused const[0, int32]
+ splice_off_in fd
}
-io_uring_files_update {
- offset int32
- fds ptr[in, array[fd]]
+# Descriptions for MISC field of io_uring_sqe_t. The content for most are common
+# while there are a few specials.
+
+personality_only_misc {
+ buf_index_unused const[0, int16]
+ ioring_personality_id ioring_personality_id[opt]
+ pad_unused array[const[0, int8], 20]
+}
+
+buf_index_personality_misc {
+ buf_index io_uring_bid[int16]
+ ioring_personality_id ioring_personality_id[opt]
+ pad_unused array[const[0, int8], 20]
+}
+
+buf_group_personality_misc {
+ buf_group io_uring_bgid[int16]
+ ioring_personality_id ioring_personality_id[opt]
+ pad_unused array[const[0, int8], 20]
+}
+
+io_uring_sqe_splice_misc {
+ buf_unused const[0, int16]
+ ioring_personality_id ioring_personality_id[opt]
+ splice_fd_in fd
+ pad_unused array[const[0, int64], 2]
+}
+
+io_uring_sqe_tee_misc {
+ buf_unused const[0, int16]
+ ioring_personality_id ioring_personality_id[opt]
+ splice_fd_in fd
+ pad_unused array[const[0, int64], 2]
}
diff --git a/sys/linux/io_uring_386.const b/sys/linux/io_uring_386.const
index e740fc5fa..e689800e0 100644
--- a/sys/linux/io_uring_386.const
+++ b/sys/linux/io_uring_386.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_amd64.const b/sys/linux/io_uring_amd64.const
index 17cb79106..4666bae59 100644
--- a/sys/linux/io_uring_amd64.const
+++ b/sys/linux/io_uring_amd64.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_arm.const b/sys/linux/io_uring_arm.const
index e740fc5fa..e689800e0 100644
--- a/sys/linux/io_uring_arm.const
+++ b/sys/linux/io_uring_arm.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_arm64.const b/sys/linux/io_uring_arm64.const
index dda794af9..a3f60c7b6 100644
--- a/sys/linux/io_uring_arm64.const
+++ b/sys/linux/io_uring_arm64.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_mips64le.const b/sys/linux/io_uring_mips64le.const
index 98d413108..b7d68747e 100644
--- a/sys/linux/io_uring_mips64le.const
+++ b/sys/linux/io_uring_mips64le.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 5426
__NR_io_uring_register = 5427
__NR_io_uring_setup = 5425
diff --git a/sys/linux/io_uring_ppc64le.const b/sys/linux/io_uring_ppc64le.const
index c7afcaa57..c4e69d4d9 100644
--- a/sys/linux/io_uring_ppc64le.const
+++ b/sys/linux/io_uring_ppc64le.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_riscv64.const b/sys/linux/io_uring_riscv64.const
index dda794af9..a3f60c7b6 100644
--- a/sys/linux/io_uring_riscv64.const
+++ b/sys/linux/io_uring_riscv64.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/io_uring_s390x.const b/sys/linux/io_uring_s390x.const
index c7afcaa57..c4e69d4d9 100644
--- a/sys/linux/io_uring_s390x.const
+++ b/sys/linux/io_uring_s390x.const
@@ -1,20 +1,86 @@
# AUTOGENERATED FILE
+CQ_FLAGS_OFFSET = 280
+CQ_HEAD_OFFSET = 128
+CQ_RING_ENTRIES_OFFSET = 268
+CQ_RING_MASK_OFFSET = 260
+CQ_RING_OVERFLOW_OFFSET = 284
+CQ_TAIL_OFFSET = 192
+EPOLL_CTL_ADD = 1
+EPOLL_CTL_DEL = 2
+EPOLL_CTL_MOD = 3
IORING_ENTER_GETEVENTS = 1
IORING_ENTER_SQ_WAKEUP = 2
+IORING_FSYNC_DATASYNC = 1
+IORING_MAX_CQ_ENTRIES = 65536
+IORING_MAX_ENTRIES = 32768
IORING_OFF_CQ_RING = 134217728
IORING_OFF_SQES = 268435456
IORING_OFF_SQ_RING = 0
+IORING_OP_ACCEPT = 13
+IORING_OP_ASYNC_CANCEL = 14
+IORING_OP_CLOSE = 19
+IORING_OP_CONNECT = 16
+IORING_OP_EPOLL_CTL = 29
+IORING_OP_FADVISE = 24
+IORING_OP_FALLOCATE = 17
+IORING_OP_FILES_UPDATE = 20
+IORING_OP_FSYNC = 3
+IORING_OP_LAST = 34
+IORING_OP_LINK_TIMEOUT = 15
+IORING_OP_MADVISE = 25
+IORING_OP_NOP = 0
+IORING_OP_OPENAT = 18
+IORING_OP_OPENAT2 = 28
+IORING_OP_POLL_ADD = 6
+IORING_OP_POLL_REMOVE = 7
+IORING_OP_PROVIDE_BUFFERS = 31
+IORING_OP_READ = 22
+IORING_OP_READV = 1
+IORING_OP_READ_FIXED = 4
+IORING_OP_RECV = 27
+IORING_OP_RECVMSG = 10
+IORING_OP_SEND = 26
+IORING_OP_SENDMSG = 9
+IORING_OP_SPLICE = 30
+IORING_OP_STATX = 21
+IORING_OP_SYNC_FILE_RANGE = 8
+IORING_OP_TEE = 33
+IORING_OP_TIMEOUT = 11
+IORING_OP_TIMEOUT_REMOVE = 12
+IORING_OP_WRITE = 23
+IORING_OP_WRITEV = 2
+IORING_OP_WRITE_FIXED = 5
IORING_REGISTER_BUFFERS = 0
IORING_REGISTER_EVENTFD = 4
+IORING_REGISTER_EVENTFD_ASYNC = 7
IORING_REGISTER_FILES = 2
IORING_REGISTER_FILES_UPDATE = 6
+IORING_REGISTER_PERSONALITY = 9
+IORING_REGISTER_PROBE = 8
+IORING_SETUP_ATTACH_WQ = 32
+IORING_SETUP_CLAMP = 16
IORING_SETUP_CQSIZE = 8
IORING_SETUP_IOPOLL = 1
IORING_SETUP_SQPOLL = 2
IORING_SETUP_SQ_AFF = 4
+IORING_TIMEOUT_ABS = 1
IORING_UNREGISTER_BUFFERS = 1
IORING_UNREGISTER_EVENTFD = 5
IORING_UNREGISTER_FILES = 3
+IORING_UNREGISTER_PERSONALITY = 10
+IOSQE_ASYNC_BIT = 4
+IOSQE_BUFFER_SELECT_BIT = 5
+IOSQE_FIXED_FILE_BIT = 0
+IOSQE_IO_DRAIN_BIT = 1
+IOSQE_IO_HARDLINK_BIT = 3
+IOSQE_IO_LINK_BIT = 2
+SIZEOF_IO_URING_SQE = 64
+SQ_DROPPED_OFFSET = 272
+SQ_FLAGS_OFFSET = 276
+SQ_HEAD_OFFSET = 0
+SQ_RING_ENTRIES_OFFSET = 264
+SQ_RING_MASK_OFFSET = 256
+SQ_TAIL_OFFSET = 64
__NR_io_uring_enter = 426
__NR_io_uring_register = 427
__NR_io_uring_setup = 425
diff --git a/sys/linux/test/io_uring b/sys/linux/test/io_uring
new file mode 100644
index 000000000..3e28259d1
--- /dev/null
+++ b/sys/linux/test/io_uring
@@ -0,0 +1,22 @@
+# Create an io_uring instance
+r0 = io_uring_setup(0x1, &AUTO={0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, [0x0, 0x0, 0x0], [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0], [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]})
+
+# mmap the ring and the sqes
+r1 = mmap$IORING_OFF_SQ_RING(&(0x7f00000a0000)=nil, 0x184, 0x3, 0x8001, r0, AUTO)
+r2 = mmap$IORING_OFF_SQES(&(0x7f00000b0000)=nil, 0x40, 0x3, 0x8001, r0, AUTO)
+
+# Set IORING_CQ_EVENTFD_DISABLED. Has no side-effect for the test,
+# only tests syz_memcpy_off().
+syz_memcpy_off$IO_URING_METADATA_FLAGS(r1, 0x114, &AUTO=0x1, 0x0, AUTO)
+
+# Write an openat2 operation to the submission queue
+syz_io_uring_submit(r1, r2, &AUTO=@IORING_OP_OPENAT2={AUTO, 0x0, AUTO, 0xffffffffffffff9c, &AUTO={0x42, 0x0, 0x0}, &AUTO='./file1\x00', AUTO, AUTO, 0x12345, {AUTO, 0x0, [0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0]} }, 0x0)
+
+# Notify the kernel about the submission and wait until completion
+io_uring_enter(r0, 0x1, 0x1, 0x1, 0x0, 0x0)
+
+# Get the resulting fd from the completion queue
+r3 = syz_io_uring_complete(r1)
+
+# Close the file
+close(r3)