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}