serial_debugcon/
resolver.rs1use crate::SerialDebugcon;
7use async_trait::async_trait;
8use chipset_device_resources::ResolveChipsetDeviceHandleParams;
9use chipset_device_resources::ResolvedChipsetDevice;
10use serial_core::resources::ResolveSerialBackendParams;
11use serial_debugcon_resources::SerialDebugconDeviceHandle;
12use thiserror::Error;
13use vm_resource::AsyncResolveResource;
14use vm_resource::ResolveError;
15use vm_resource::ResourceResolver;
16use vm_resource::declare_static_async_resolver;
17use vm_resource::kind::ChipsetDeviceHandleKind;
18
19pub struct SerialDebugconResolver;
21
22declare_static_async_resolver! {
23 SerialDebugconResolver,
24 (ChipsetDeviceHandleKind, SerialDebugconDeviceHandle),
25}
26
27#[expect(missing_docs)]
29#[derive(Debug, Error)]
30pub enum ResolveDebugconError {
31 #[error("failed to resolve io backend")]
32 ResolveBackend(#[source] ResolveError),
33}
34
35#[async_trait]
36impl AsyncResolveResource<ChipsetDeviceHandleKind, SerialDebugconDeviceHandle>
37 for SerialDebugconResolver
38{
39 type Output = ResolvedChipsetDevice;
40 type Error = ResolveDebugconError;
41
42 async fn resolve(
43 &self,
44 resolver: &ResourceResolver,
45 resource: SerialDebugconDeviceHandle,
46 input: ResolveChipsetDeviceHandleParams<'_>,
47 ) -> Result<Self::Output, Self::Error> {
48 let io = resolver
49 .resolve(
50 resource.io,
51 ResolveSerialBackendParams {
52 driver: Box::new(input.task_driver_source.simple()),
53 _async_trait_workaround: &(),
54 },
55 )
56 .await
57 .map_err(ResolveDebugconError::ResolveBackend)?;
58
59 let device = SerialDebugcon::new(resource.port, io.0.into_io());
60 Ok(device.into())
61 }
62}