twizzler_abi/syscall/
handle.rs

1use bitflags::bitflags;
2use twizzler_rt_abi::{
3    error::{ArgumentError, TwzError},
4    Result,
5};
6
7use super::{convert_codes_to_result, twzerr, Syscall};
8use crate::{arch::syscall::raw_syscall, object::ObjID};
9
10/// Possible kernel handle types.
11#[derive(Debug, Copy, Clone, PartialEq, PartialOrd, Ord, Eq)]
12#[repr(u64)]
13pub enum HandleType {
14    VmContext = 0,
15    PagerQueue = 1,
16}
17
18impl TryFrom<u64> for HandleType {
19    type Error = TwzError;
20
21    fn try_from(value: u64) -> Result<Self> {
22        match value {
23            0 => Ok(Self::VmContext),
24            1 => Ok(Self::PagerQueue),
25            _ => Err(ArgumentError::InvalidArgument.into()),
26        }
27    }
28}
29
30bitflags! {
31    /// Flags to pass to [sys_new_handle].
32    pub struct NewHandleFlags: u64 {
33    }
34}
35
36bitflags! {
37    /// Flags to pass to [sys_unbind_handle].
38    pub struct UnbindHandleFlags: u64 {
39    }
40}
41
42/// Make a new handle object.
43pub fn sys_new_handle(objid: ObjID, handle_type: HandleType, flags: NewHandleFlags) -> Result<u64> {
44    let [hi, lo] = objid.parts();
45    let (code, val) = unsafe {
46        raw_syscall(
47            Syscall::NewHandle,
48            &[hi, lo, handle_type as u64, flags.bits()],
49        )
50    };
51    convert_codes_to_result(code, val, |c, _| c != 0, |_, v| v, twzerr)
52}
53
54/// Unbind an object from handle status.
55pub fn sys_unbind_handle(objid: ObjID, flags: UnbindHandleFlags) {
56    let [hi, lo] = objid.parts();
57    unsafe {
58        raw_syscall(Syscall::UnbindHandle, &[hi, lo, flags.bits()]);
59    }
60}