vmm_core/
platform_resolvers.rs1use crate::partition_unit::Halt;
5use power_resources::PowerRequest;
6use power_resources::PowerRequestClient;
7use power_resources::PowerRequestHandleKind;
8use std::convert::Infallible;
9use std::sync::Arc;
10use vm_resource::PlatformResource;
11use vm_resource::ResolveResource;
12use vmm_core_defs::HaltReason;
13
14pub struct HaltResolver(pub Arc<Halt>);
16
17impl ResolveResource<PowerRequestHandleKind, PlatformResource> for HaltResolver {
18 type Output = PowerRequestClient;
19 type Error = Infallible;
20
21 fn resolve(
22 &self,
23 _resource: PlatformResource,
24 _input: (),
25 ) -> Result<Self::Output, Self::Error> {
26 let halt = self.0.clone();
27 Ok((move |request: PowerRequest| match request {
28 PowerRequest::PowerOff => halt.halt(HaltReason::PowerOff),
29 PowerRequest::Reset => halt.halt(HaltReason::Reset),
30 PowerRequest::Hibernate => halt.halt(HaltReason::Hibernate),
31 PowerRequest::TripleFault { vp } => halt.halt(HaltReason::TripleFault {
32 vp,
33 registers: None,
34 }),
35 })
36 .into())
37 }
38}