xen/core/
memory_access.rs

1use xen_sys::{
2    xenmem_access_t_XENMEM_access_default, xenmem_access_t_XENMEM_access_n,
3    xenmem_access_t_XENMEM_access_n2rwx, xenmem_access_t_XENMEM_access_r,
4    xenmem_access_t_XENMEM_access_r_pw, xenmem_access_t_XENMEM_access_rw,
5    xenmem_access_t_XENMEM_access_rwx, xenmem_access_t_XENMEM_access_rx,
6    xenmem_access_t_XENMEM_access_rx2rw, xenmem_access_t_XENMEM_access_w,
7    xenmem_access_t_XENMEM_access_wx, xenmem_access_t_XENMEM_access_x,
8};
9
10bitflags::bitflags! {
11    #[derive(Debug, Default, Clone, Copy, PartialEq, Eq)]
12    pub struct MemoryAccess: u8 {
13        const NONE      = xenmem_access_t_XENMEM_access_n as u8; // 0b00000000
14        const R         = xenmem_access_t_XENMEM_access_r as u8; // 0b00000001;
15        const W         = xenmem_access_t_XENMEM_access_w as u8; // 0b00000010;
16        const X         = xenmem_access_t_XENMEM_access_x as u8; // 0b00000100;
17        const RW        = xenmem_access_t_XENMEM_access_rw as u8; // Self::R.bits() | Self::W.bits();
18        const WX        = xenmem_access_t_XENMEM_access_wx as u8; // Self::W.bits() | Self::X.bits();
19        const RX        = xenmem_access_t_XENMEM_access_rx as u8; // Self::R.bits() | Self::X.bits();
20        const RWX       = xenmem_access_t_XENMEM_access_rwx as u8; // Self::R.bits() | Self::W.bits() | Self::X.bits();
21
22        const RX2RW     = xenmem_access_t_XENMEM_access_rx2rw as u8;
23        const N2RWX     = xenmem_access_t_XENMEM_access_n2rwx as u8;
24        const R_PW      = xenmem_access_t_XENMEM_access_r_pw as u8;
25
26        const DEFAULT   = xenmem_access_t_XENMEM_access_default as u8;
27    }
28}
29
30impl std::fmt::Display for MemoryAccess {
31    fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
32        let mut result = [b'-'; 3];
33
34        if self.contains(MemoryAccess::R) {
35            result[0] = b'r';
36        }
37        if self.contains(MemoryAccess::W) {
38            result[1] = b'w';
39        }
40        if self.contains(MemoryAccess::X) {
41            result[2] = b'x';
42        }
43
44        // SAFETY: The `result` array is always valid UTF-8.
45        f.write_str(unsafe { std::str::from_utf8_unchecked(&result) })
46    }
47}