os/mm/page_table/
page_table_entry.rs1#![allow(dead_code)]
6use crate::mm::address::Ppn;
7
8bitflags::bitflags! {
9 #[derive(Debug, Clone, Copy, PartialEq, Eq)]
10 pub struct UniversalPTEFlag: usize {
13
14 const VALID = 1 << 0; const READABLE = 1 << 1; const WRITEABLE = 1 << 2; const EXECUTABLE = 1 << 3; const USER_ACCESSIBLE = 1 << 4; const GLOBAL = 1 << 5; const ACCESSED = 1 << 6; const DIRTY = 1 << 7; #[allow(dead_code)] const HUGE = 1 << 8; }
28}
29
30impl UniversalPTEFlag {
31 pub const fn user_read() -> Self {
33 Self::VALID
34 .union(Self::READABLE)
35 .union(Self::USER_ACCESSIBLE)
36 }
37
38 pub const fn user_rw() -> Self {
40 Self::VALID
41 .union(Self::READABLE)
42 .union(Self::WRITEABLE)
43 .union(Self::USER_ACCESSIBLE)
44 }
45
46 pub const fn user_rx() -> Self {
48 Self::VALID
49 .union(Self::READABLE)
50 .union(Self::EXECUTABLE)
51 .union(Self::USER_ACCESSIBLE)
52 }
53
54 pub const fn kernel_rw() -> Self {
56 Self::VALID.union(Self::READABLE).union(Self::WRITEABLE)
57 }
58
59 pub const fn kernel_r() -> Self {
61 Self::VALID.union(Self::READABLE)
62 }
63
64 pub const fn kernel_rx() -> Self {
66 Self::VALID.union(Self::READABLE).union(Self::EXECUTABLE)
67 }
68}
69
70pub trait UniversalConvertableFlag {
72 fn from_universal(flag: UniversalPTEFlag) -> Self;
74 fn to_universal(&self) -> UniversalPTEFlag;
76}
77
78pub trait PageTableEntry {
80 type Bits;
82
83 fn from_bits(bits: Self::Bits) -> Self;
85 fn to_bits(&self) -> Self::Bits;
87 fn empty() -> Self;
89 fn new_leaf(ppn: Ppn, flags: UniversalPTEFlag) -> Self;
91 fn new_table(ppn: Ppn) -> Self;
93
94 fn is_valid(&self) -> bool;
96 fn is_huge(&self) -> bool;
98 fn is_empty(&self) -> bool;
100
101 fn ppn(&self) -> Ppn;
103 fn flags(&self) -> UniversalPTEFlag;
105
106 fn set_ppn(&mut self, ppn: Ppn);
108 fn set_flags(&mut self, flags: UniversalPTEFlag);
110 fn clear(&mut self);
112
113 fn remove_flags(&mut self, flags: UniversalPTEFlag);
116
117 fn add_flags(&mut self, flags: UniversalPTEFlag);
120}