#![no_std]
#![allow(clippy::missing_safety_doc)]
use core::ffi::c_void;
use core::ptr::null_mut;
use io_uring_header::{
io_uring_cqe, io_uring_params, io_uring_sqe, IORING_FEAT_SINGLE_MMAP, IORING_OFF_SQES,
IORING_OFF_SQ_RING,
};
use map_err::{map_ptr, map_val};
use szof::szty;
const PROT_READ: i32 = 0x1;
const PROT_WRITE: i32 = 0x2;
const MAP_SHARED: i32 = 0x1;
const MAP_POPULATE: i32 = 0x8000;
pub unsafe fn mmap_sq_cq(fd: i32, params: &io_uring_params) -> Result<(*mut c_void, usize), i32> {
if params.features & IORING_FEAT_SINGLE_MMAP == 0 {
return Err(-38);
}
let sq_len = params.sq_off.array as usize + (params.sq_entries as usize * szty!(u32));
let cq_len = params.cq_off.cqes as usize + (params.cq_entries as usize * szty!(io_uring_cqe));
let len = sq_len.max(cq_len);
let ptr = map_ptr(io_uring_syscall::mmap(
null_mut(),
len,
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE,
fd,
IORING_OFF_SQ_RING as isize,
))?;
Ok((ptr, len))
}
pub unsafe fn mmap_sqe(fd: i32, params: &io_uring_params) -> Result<(*mut c_void, usize), i32> {
let len = params.sq_entries as usize * szty!(io_uring_sqe);
let ptr = map_ptr(io_uring_syscall::mmap(
null_mut(),
len,
PROT_READ | PROT_WRITE,
MAP_SHARED | MAP_POPULATE,
fd,
IORING_OFF_SQES as isize,
))?;
Ok((ptr, len))
}
pub unsafe fn munmap(addr: *mut c_void, len: usize) -> Result<(), i32> {
map_val(io_uring_syscall::munmap(addr, len))?;
Ok(())
}