| 1234567891011121314151617181920212223242526272829303132333435363738 |
- use super::{RawPageTable, PTE};
- use crate::{
- address::{Addr as _, VAddr},
- paging::PFN,
- };
- pub trait PagingMode {
- type Entry: PTE;
- type RawTable<'a>: RawPageTable<'a, Entry = Self::Entry>;
- const LEVELS: &'static [PageTableLevel];
- const KERNEL_ROOT_TABLE_PFN: PFN;
- }
- #[derive(Clone, Copy, PartialOrd, PartialEq)]
- pub struct PageTableLevel(usize, usize);
- impl PageTableLevel {
- pub const fn new(nth_bit: usize, len: usize) -> Self {
- Self(nth_bit, len)
- }
- pub const fn nth_bit(self) -> usize {
- self.0
- }
- pub const fn len(self) -> usize {
- self.1
- }
- pub const fn max_index(self) -> u16 {
- (1 << self.len()) - 1
- }
- pub fn index_of(self, vaddr: VAddr) -> u16 {
- ((vaddr.addr() >> self.nth_bit()) & ((1 << self.len()) - 1)) as u16
- }
- }
|