use crate::{GuestPhysAddr, PartitionId, PhysAddr};
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(transparent)]
pub struct OwnedRegionId(u64);
impl OwnedRegionId {
#[must_use]
pub const fn new(id: u64) -> Self {
Self(id)
}
#[must_use]
pub const fn as_u64(self) -> u64 {
self.0
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash)]
#[repr(u8)]
pub enum MemoryTier {
Hot = 0,
Warm = 1,
Cold = 2,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub struct RegionPolicy {
pub read: bool,
pub write: bool,
pub execute: bool,
}
impl RegionPolicy {
pub const READ_ONLY: Self = Self {
read: true,
write: false,
execute: false,
};
pub const READ_WRITE: Self = Self {
read: true,
write: true,
execute: false,
};
}
#[derive(Debug, Clone, Copy)]
pub struct RegionPlacementWeights {
pub left: u16,
pub right: u16,
}
#[derive(Debug, Clone, Copy)]
pub struct MemoryRegion {
pub id: OwnedRegionId,
pub owner: PartitionId,
pub guest_base: GuestPhysAddr,
pub host_base: PhysAddr,
pub page_count: u32,
pub tier: MemoryTier,
pub policy: RegionPolicy,
}