1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
/// VM execution mode requirements (kernel only, not in static call) that can be placed on instructions.
#[derive(Debug, Clone, Copy)]
pub struct ModeRequirements(pub(crate) u8);

impl ModeRequirements {
    /// Creates new requirements.
    pub const fn new(kernel_only: bool, cannot_use_in_static: bool) -> Self {
        Self((kernel_only as u8) | ((cannot_use_in_static as u8) << 1))
    }

    /// Creates default requirements that always hold.
    pub const fn none() -> Self {
        Self::new(false, false)
    }

    pub(crate) fn met(self, is_kernel: bool, is_static: bool) -> bool {
        let enabled_modes = u8::from(is_kernel) | (u8::from(!is_static) << 1);
        enabled_modes & self.0 == self.0
    }
}