embedded_shadow/shadow/
kernel.rs

1#![allow(unsafe_code)]
2
3use crate::{
4    AccessPolicy, PersistTrigger, policy::PersistPolicy, storage::ShadowStorageBase,
5    view::KernelView,
6};
7
8pub struct KernelShadow<'a, const TS: usize, const BS: usize, const BC: usize, AP, PP, PT, PK, SS>
9where
10    AP: AccessPolicy,
11    PP: PersistPolicy<PK>,
12    PT: PersistTrigger<PK>,
13    bitmaps::BitsImpl<BC>: bitmaps::Bits,
14{
15    storage: &'a ShadowStorageBase<TS, BS, BC, AP, PP, PT, PK, SS>,
16}
17
18impl<'a, const TS: usize, const BS: usize, const BC: usize, AP, PP, PT, PK, SS>
19    KernelShadow<'a, TS, BS, BC, AP, PP, PT, PK, SS>
20where
21    AP: AccessPolicy,
22    PP: PersistPolicy<PK>,
23    PT: PersistTrigger<PK>,
24    bitmaps::BitsImpl<BC>: bitmaps::Bits,
25{
26    pub(crate) fn new(storage: &'a ShadowStorageBase<TS, BS, BC, AP, PP, PT, PK, SS>) -> Self {
27        Self { storage }
28    }
29
30    pub fn with_view<R>(&self, f: impl FnOnce(&mut KernelView<TS, BS, BC>) -> R) -> R {
31        critical_section::with(|_| self.with_view_unchecked(f))
32    }
33
34    pub fn with_view_unchecked<R>(&self, f: impl FnOnce(&mut KernelView<TS, BS, BC>) -> R) -> R {
35        let table = unsafe { &mut *self.storage.table.get() };
36        let mut view = KernelView::new(table);
37        f(&mut view)
38    }
39}