1use crate::{GuestPhysAddr, PartitionId, PhysAddr};
4
5#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
7#[repr(transparent)]
8pub struct OwnedRegionId(u64);
9
10impl OwnedRegionId {
11 #[must_use]
13 pub const fn new(id: u64) -> Self {
14 Self(id)
15 }
16
17 #[must_use]
19 pub const fn as_u64(self) -> u64 {
20 self.0
21 }
22}
23
24#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
26#[repr(u8)]
27pub enum MemoryTier {
28 Hot = 0,
30 Warm = 1,
32 Cold = 2,
34}
35
36#[derive(Debug, Clone, Copy, PartialEq, Eq)]
38pub struct RegionPolicy {
39 pub read: bool,
41 pub write: bool,
43 pub execute: bool,
45}
46
47impl RegionPolicy {
48 pub const READ_ONLY: Self = Self {
50 read: true,
51 write: false,
52 execute: false,
53 };
54
55 pub const READ_WRITE: Self = Self {
57 read: true,
58 write: true,
59 execute: false,
60 };
61}
62
63#[derive(Debug, Clone, Copy)]
65pub struct RegionPlacementWeights {
66 pub left: u16,
68 pub right: u16,
70}
71
72#[derive(Debug, Clone, Copy)]
74pub struct MemoryRegion {
75 pub id: OwnedRegionId,
77 pub owner: PartitionId,
79 pub guest_base: GuestPhysAddr,
81 pub host_base: PhysAddr,
83 pub page_count: u32,
85 pub tier: MemoryTier,
87 pub policy: RegionPolicy,
89}