devmgr/
lib.rs

1use twizzler::{
2    collections::vec::{VecObject, VecObjectAlloc},
3    marker::Invariant,
4    object::Object,
5};
6use twizzler_rt_abi::{
7    error::TwzError,
8    object::{MapFlags, ObjID},
9};
10
11#[repr(C)]
12#[derive(Clone, Copy, Debug)]
13pub struct DriverSpec {
14    pub supported: Supported,
15}
16
17#[repr(C)]
18#[derive(Clone, Copy, Debug)]
19pub enum Supported {
20    PcieClass(u8, u8, u8),
21    Vendor(u16, u16),
22}
23
24#[repr(C)]
25#[derive(Clone, Copy, Debug)]
26pub struct OwnedDevice {
27    pub id: ObjID,
28}
29
30unsafe impl Invariant for OwnedDevice {}
31
32pub fn get_devices(spec: DriverSpec) -> Result<VecObject<OwnedDevice, VecObjectAlloc>, TwzError> {
33    let devcomp = monitor_api::CompartmentHandle::lookup("devmgr")?;
34    let get_devices = unsafe {
35        devcomp
36            .dynamic_gate::<(DriverSpec,), ObjID>("get_devices")
37            .unwrap()
38    };
39    let id = (get_devices)(spec)?;
40    Ok(VecObject::from(Object::map(id, MapFlags::READ)?))
41}