/// 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 { 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 } } }