arcbox_hypervisor/
memory.rs1use std::fmt;
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)]
7pub struct GuestAddress(pub u64);
8
9impl GuestAddress {
10 #[must_use]
12 pub const fn new(addr: u64) -> Self {
13 Self(addr)
14 }
15
16 #[must_use]
18 pub const fn raw(&self) -> u64 {
19 self.0
20 }
21
22 #[must_use]
24 pub const fn offset(&self, offset: u64) -> Self {
25 Self(self.0 + offset)
26 }
27
28 #[must_use]
30 pub const fn align_up(&self, alignment: u64) -> Self {
31 let mask = alignment - 1;
32 Self((self.0 + mask) & !mask)
33 }
34
35 #[must_use]
37 pub const fn align_down(&self, alignment: u64) -> Self {
38 let mask = alignment - 1;
39 Self(self.0 & !mask)
40 }
41
42 #[must_use]
44 pub const fn is_aligned(&self, alignment: u64) -> bool {
45 self.0 & (alignment - 1) == 0
46 }
47}
48
49impl fmt::Display for GuestAddress {
50 fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
51 write!(f, "{:#x}", self.0)
52 }
53}
54
55impl From<u64> for GuestAddress {
56 fn from(addr: u64) -> Self {
57 Self(addr)
58 }
59}
60
61impl From<GuestAddress> for u64 {
62 fn from(addr: GuestAddress) -> Self {
63 addr.0
64 }
65}
66
67#[derive(Debug, Clone)]
69pub struct MemoryRegion {
70 pub guest_addr: GuestAddress,
72 pub size: u64,
74 pub host_addr: Option<*mut u8>,
76 pub read_only: bool,
78}
79
80impl MemoryRegion {
81 #[must_use]
83 pub const fn new(guest_addr: GuestAddress, size: u64) -> Self {
84 Self {
85 guest_addr,
86 size,
87 host_addr: None,
88 read_only: false,
89 }
90 }
91
92 #[must_use]
94 pub const fn end(&self) -> GuestAddress {
95 GuestAddress(self.guest_addr.0 + self.size)
96 }
97
98 #[must_use]
100 pub const fn contains(&self, addr: GuestAddress) -> bool {
101 addr.0 >= self.guest_addr.0 && addr.0 < self.guest_addr.0 + self.size
102 }
103
104 #[must_use]
106 pub const fn contains_range(&self, addr: GuestAddress, size: u64) -> bool {
107 addr.0 >= self.guest_addr.0 && addr.0 + size <= self.guest_addr.0 + self.size
108 }
109}
110
111unsafe impl Send for MemoryRegion {}
114unsafe impl Sync for MemoryRegion {}
115
116pub const PAGE_SIZE: u64 = 4096;
118
119pub const LARGE_PAGE_SIZE: u64 = 2 * 1024 * 1024;
121
122pub const HUGE_PAGE_SIZE: u64 = 1024 * 1024 * 1024;