paging_mode.rs 831 B

1234567891011121314151617181920212223242526272829303132333435363738
  1. use super::{RawPageTable, PTE};
  2. use crate::{
  3. address::{Addr as _, VAddr},
  4. paging::PFN,
  5. };
  6. pub trait PagingMode {
  7. type Entry: PTE;
  8. type RawTable<'a>: RawPageTable<'a, Entry = Self::Entry>;
  9. const LEVELS: &'static [PageTableLevel];
  10. const KERNEL_ROOT_TABLE_PFN: PFN;
  11. }
  12. #[derive(Clone, Copy, PartialOrd, PartialEq)]
  13. pub struct PageTableLevel(usize, usize);
  14. impl PageTableLevel {
  15. pub const fn new(nth_bit: usize, len: usize) -> Self {
  16. Self(nth_bit, len)
  17. }
  18. pub const fn nth_bit(self) -> usize {
  19. self.0
  20. }
  21. pub const fn len(self) -> usize {
  22. self.1
  23. }
  24. pub const fn max_index(self) -> u16 {
  25. (1 << self.len()) - 1
  26. }
  27. pub fn index_of(self, vaddr: VAddr) -> u16 {
  28. ((vaddr.addr() >> self.nth_bit()) & ((1 << self.len()) - 1)) as u16
  29. }
  30. }