twizzler_abi/syscall/
handle.rs1use 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#[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 pub struct NewHandleFlags: u64 {
33 }
34}
35
36bitflags! {
37 pub struct UnbindHandleFlags: u64 {
39 }
40}
41
42pub 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
54pub 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}