# Copyright 2018 syzkaller project authors. All rights reserved.
# Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file.

include <uapi/linux/aio_abi.h>

resource io_ctx[intptr]

io_setup(n int32, ctx ptr[out, io_ctx])
io_destroy(ctx io_ctx)
io_getevents(ctx io_ctx, min_nr intptr, nr len[events], events ptr[out, array[io_event]], timeout ptr[in, timespec, opt])
io_pgetevents(ctx io_ctx, min_nr intptr, nr len[events], events ptr[out, array[io_event]], timeout ptr[in, timespec, opt], usig ptr[in, sigset_size, opt])
# NEED: kernel identifies requets by address, so pointers passed to io_submit need to be forwarded to io_cancel somehow.
io_submit(ctx io_ctx, nr len[iocbpp], iocbpp ptr[in, array[ptr[in, iocb]]])
io_cancel(ctx io_ctx, iocb ptr[in, iocb], res ptr[out, io_event])

lio_opcode = IOCB_CMD_PREAD, IOCB_CMD_PWRITE, IOCB_CMD_FSYNC, IOCB_CMD_FDSYNC, IOCB_CMD_NOOP, IOCB_CMD_PREADV, IOCB_CMD_PWRITEV, IOCB_CMD_POLL
iocb_flags = 0, IOCB_FLAG_RESFD, IOCB_FLAG_IOPRIO

io_event {
	data	int64
	obj	int64
	res	int64
	res2	int64
}

iocb {
	aio_data	const[0, int64]
	aio_key		const[0, int32]
	aio_rw_flags	const[0, int32]
	aio_lio_opcode	flags[lio_opcode, int16]
	aio_reqprio	int16
	aio_fildes	fd
	aio_buf		ptr64[inout, array[int8]]
	aio_nbytes	len[aio_buf, int64]
	aio_offset	int64
	aio_reserved2	const[0, int64]
	aio_flags	flags[iocb_flags, int32]
	aio_resfd	fd_event[opt]
}
