use arch::x86_64::memory::Frame; pub struct Entry(u64); impl Entry { pub fn is_unused(&self) -> bool { self.0 == 0 } pub fn set_unused(&mut self) { self.0 = 0; } pub fn flags(&self) -> EntryFlags { EntryFlags::from_bits_truncate(self.0) } pub fn pointed_frame(&self) -> Option { if self.flags().contains(PRESENT) { Some(Frame::containing_address( self.0 as usize & 0x000fffff_fffff000 )) } else { None } } pub fn set(&mut self, frame: Frame, flags: EntryFlags) { // Frame physical address must be page-aligned and smaller than 2^52 assert!(frame.start_address() & !0x000fffff_fffff000 == 0); self.0 = (frame.start_address() as u64) | flags.bits(); } } bitflags! { pub struct EntryFlags: u64 { const PRESENT = 1 << 0; const WRITABLE = 1 << 1; const USER_ACCESSIBLE = 1 << 2; const WRITE_THROUGH = 1 << 3; const NO_CACHE = 1 << 4; const ACCESSED = 1 << 5; const DIRTY = 1 << 6; const HUGE_PAGE = 1 << 7; const GLOBAL = 1 << 8; const NO_EXECUTE = 1 << 63; } }