vmm_core/
platform_resolvers.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use 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
14/// Platform power request resolver over [`Halt`].
15pub 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}