xref: /aosp_15_r20/external/crosvm/io_uring/src/syscalls.rs (revision bb4ee6a4ae7042d18b07a98463b9c8b875e44b39)
1 // Copyright 2020 The ChromiumOS Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4 
5 use std::io::Error;
6 use std::os::unix::io::RawFd;
7 use std::ptr::null_mut;
8 
9 use libc::c_int;
10 use libc::c_long;
11 use libc::c_uint;
12 use libc::c_void;
13 use libc::syscall;
14 use libc::SYS_io_uring_enter;
15 use libc::SYS_io_uring_register;
16 use libc::SYS_io_uring_setup;
17 
18 use crate::bindings::*;
19 
20 /// Returns the system error as the result;
21 pub type Result<T> = std::result::Result<T, c_int>;
22 
io_uring_setup(num_entries: usize, params: &io_uring_params) -> Result<RawFd>23 pub unsafe fn io_uring_setup(num_entries: usize, params: &io_uring_params) -> Result<RawFd> {
24     let ret = syscall(
25         SYS_io_uring_setup as c_long,
26         num_entries as c_int,
27         params as *const _,
28     );
29     if ret < 0 {
30         return Err(Error::last_os_error().raw_os_error().unwrap());
31     }
32     Ok(ret as RawFd)
33 }
34 
io_uring_enter(fd: RawFd, to_submit: u64, to_wait: u64, flags: u32) -> Result<()>35 pub unsafe fn io_uring_enter(fd: RawFd, to_submit: u64, to_wait: u64, flags: u32) -> Result<()> {
36     let ret = syscall(
37         SYS_io_uring_enter as c_long,
38         fd,
39         to_submit as c_int,
40         to_wait as c_int,
41         flags as c_int,
42         null_mut::<*mut c_void>(),
43     );
44     if ret < 0 {
45         return Err(Error::last_os_error().raw_os_error().unwrap());
46     }
47     Ok(())
48 }
49 
io_uring_register( fd: RawFd, opcode: u32, args: *const c_void, nr_args: u32, ) -> Result<()>50 pub unsafe fn io_uring_register(
51     fd: RawFd,
52     opcode: u32,
53     args: *const c_void,
54     nr_args: u32,
55 ) -> Result<()> {
56     let ret = syscall(
57         SYS_io_uring_register as c_long,
58         fd,
59         opcode as c_uint,
60         args,
61         nr_args as c_uint,
62     );
63     if ret < 0 {
64         return Err(Error::last_os_error().raw_os_error().unwrap());
65     }
66     Ok(())
67 }
68