hv1_emulator/
locked_page.rs

1// Copyright (c) Microsoft Corporation.
2// Licensed under the MIT License.
3
4use guestmem::GuestMemory;
5use guestmem::LockedPages;
6use guestmem::Page;
7use std::ops::Deref;
8
9pub(crate) struct LockedPage {
10    page: LockedPages,
11}
12
13impl LockedPage {
14    pub fn new(guest_memory: &GuestMemory, gpn: u64) -> Result<Self, guestmem::GuestMemoryError> {
15        let page = match guest_memory.lock_gpns(false, &[gpn]) {
16            Ok(it) => it,
17            Err(err) => {
18                tracelimit::error_ratelimited!(
19                    gpn,
20                    err = &err as &dyn std::error::Error,
21                    "Failed to lock page"
22                );
23                return Err(err);
24            }
25        };
26        assert!(page.pages().len() == 1);
27        Ok(Self { page })
28    }
29}
30
31impl Deref for LockedPage {
32    type Target = Page;
33
34    fn deref(&self) -> &Self::Target {
35        self.page.pages()[0]
36    }
37}