vmm_core/
vmtime_unit.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4//! [`StateUnit`] support for [`VmTimeKeeper`].
5
6use inspect::InspectMut;
7use mesh::Receiver;
8use state_unit::StateRequest;
9use state_unit::StateUnit;
10use vmcore::save_restore::RestoreError;
11use vmcore::save_restore::SaveError;
12use vmcore::save_restore::SavedStateBlob;
13use vmcore::vmtime::VmTimeKeeper;
14
15#[derive(InspectMut)]
16#[inspect(transparent)]
17struct KeeperUnit<'a>(#[inspect(mut)] &'a mut VmTimeKeeper);
18
19impl StateUnit for KeeperUnit<'_> {
20    async fn start(&mut self) {
21        self.0.start().await;
22    }
23
24    async fn stop(&mut self) {
25        self.0.stop().await;
26    }
27
28    async fn reset(&mut self) -> anyhow::Result<()> {
29        self.0.reset().await;
30        Ok(())
31    }
32
33    async fn save(&mut self) -> Result<Option<SavedStateBlob>, SaveError> {
34        Ok(Some(SavedStateBlob::new(self.0.save())))
35    }
36
37    async fn restore(&mut self, state: SavedStateBlob) -> Result<(), RestoreError> {
38        self.0.restore(state.parse()?).await;
39        Ok(())
40    }
41}
42
43/// Runs the VM time keeper, responding to state changes from `recv`, until
44/// `recv` is closed.
45pub async fn run_vmtime(keeper: &mut VmTimeKeeper, recv: Receiver<StateRequest>) {
46    state_unit::run_unit(KeeperUnit(keeper), recv).await;
47}