blob: af9de3cbff29bb6ea6a8de51281cddea49bbf9b5 [file] [log] [blame]
/// Flags to be passed to the MapMemory struct.
/// Note that it is an error to have memory be
/// writable and not readable.
#[derive(Copy, PartialEq, Eq, Clone, PartialOrd, Ord, Hash, Debug)]
#[stable(feature = "rust1", since = "1.0.0")]
pub struct MemoryFlags {
bits: usize,
}
impl MemoryFlags {
/// Free this memory
#[stable(feature = "rust1", since = "1.0.0")]
pub const FREE: Self = Self { bits: 0b0000_0000 };
/// Immediately allocate this memory. Otherwise it will
/// be demand-paged. This is implicitly set when `phys`
/// is not 0.
#[stable(feature = "rust1", since = "1.0.0")]
pub const RESERVE: Self = Self { bits: 0b0000_0001 };
/// Allow the CPU to read from this page.
#[stable(feature = "rust1", since = "1.0.0")]
pub const R: Self = Self { bits: 0b0000_0010 };
/// Allow the CPU to write to this page.
#[stable(feature = "rust1", since = "1.0.0")]
pub const W: Self = Self { bits: 0b0000_0100 };
/// Allow the CPU to execute from this page.
#[stable(feature = "rust1", since = "1.0.0")]
pub const X: Self = Self { bits: 0b0000_1000 };
#[stable(feature = "rust1", since = "1.0.0")]
pub fn bits(&self) -> usize {
self.bits
}
#[stable(feature = "rust1", since = "1.0.0")]
pub fn from_bits(raw: usize) -> Option<MemoryFlags> {
if raw > 16 { None } else { Some(MemoryFlags { bits: raw }) }
}
#[stable(feature = "rust1", since = "1.0.0")]
pub fn is_empty(&self) -> bool {
self.bits == 0
}
#[stable(feature = "rust1", since = "1.0.0")]
pub fn empty() -> MemoryFlags {
MemoryFlags { bits: 0 }
}
#[stable(feature = "rust1", since = "1.0.0")]
pub fn all() -> MemoryFlags {
MemoryFlags { bits: 15 }
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::fmt::Binary for MemoryFlags {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::fmt::Binary::fmt(&self.bits, f)
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::fmt::Octal for MemoryFlags {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::fmt::Octal::fmt(&self.bits, f)
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::fmt::LowerHex for MemoryFlags {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::fmt::LowerHex::fmt(&self.bits, f)
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::fmt::UpperHex for MemoryFlags {
fn fmt(&self, f: &mut core::fmt::Formatter<'_>) -> core::fmt::Result {
core::fmt::UpperHex::fmt(&self.bits, f)
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitOr for MemoryFlags {
type Output = Self;
/// Returns the union of the two sets of flags.
#[inline]
fn bitor(self, other: MemoryFlags) -> Self {
Self { bits: self.bits | other.bits }
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitOrAssign for MemoryFlags {
/// Adds the set of flags.
#[inline]
fn bitor_assign(&mut self, other: Self) {
self.bits |= other.bits;
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitXor for MemoryFlags {
type Output = Self;
/// Returns the left flags, but with all the right flags toggled.
#[inline]
fn bitxor(self, other: Self) -> Self {
Self { bits: self.bits ^ other.bits }
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitXorAssign for MemoryFlags {
/// Toggles the set of flags.
#[inline]
fn bitxor_assign(&mut self, other: Self) {
self.bits ^= other.bits;
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitAnd for MemoryFlags {
type Output = Self;
/// Returns the intersection between the two sets of flags.
#[inline]
fn bitand(self, other: Self) -> Self {
Self { bits: self.bits & other.bits }
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::BitAndAssign for MemoryFlags {
/// Disables all flags disabled in the set.
#[inline]
fn bitand_assign(&mut self, other: Self) {
self.bits &= other.bits;
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::Sub for MemoryFlags {
type Output = Self;
/// Returns the set difference of the two sets of flags.
#[inline]
fn sub(self, other: Self) -> Self {
Self { bits: self.bits & !other.bits }
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::SubAssign for MemoryFlags {
/// Disables all flags enabled in the set.
#[inline]
fn sub_assign(&mut self, other: Self) {
self.bits &= !other.bits;
}
}
#[stable(feature = "rust1", since = "1.0.0")]
impl core::ops::Not for MemoryFlags {
type Output = Self;
/// Returns the complement of this set of flags.
#[inline]
fn not(self) -> Self {
Self { bits: !self.bits } & MemoryFlags { bits: 15 }
}
}