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