@@ -28,7 +28,7 @@ pub(crate) static PHYSICAL_ADDRESS_MASK: AtomicU64 = AtomicU64::new(0x000f_ffff_
28
28
#[ derive( Clone ) ]
29
29
#[ repr( transparent) ]
30
30
pub struct PageTableEntry {
31
- pub ( crate ) entry : u64 ,
31
+ entry : u64 ,
32
32
}
33
33
34
34
impl PageTableEntry {
@@ -50,6 +50,18 @@ impl PageTableEntry {
50
50
self . entry = 0 ;
51
51
}
52
52
53
+ /// Returns the flags of this entry.
54
+ #[ inline]
55
+ pub fn flags ( & self ) -> PageTableFlags {
56
+ PageTableFlags :: from_bits_retain ( self . entry & Self :: physical_address_mask ( ) )
57
+ }
58
+
59
+ /// Returns the physical address mapped by this entry, might be zero.
60
+ #[ inline]
61
+ pub fn addr ( & self ) -> PhysAddr {
62
+ PhysAddr :: new ( self . entry & Self :: physical_address_mask ( ) )
63
+ }
64
+
53
65
/// Returns the physical frame mapped by this entry.
54
66
///
55
67
/// Returns the following errors:
@@ -68,12 +80,6 @@ impl PageTableEntry {
68
80
}
69
81
}
70
82
71
- /// Sets the flags of this entry.
72
- #[ inline]
73
- pub fn set_flags ( & mut self , flags : PageTableFlags ) {
74
- self . entry = self . addr ( ) . as_u64 ( ) | flags. bits ( ) ;
75
- }
76
-
77
83
/// Map the entry to the specified physical address with the specified flags.
78
84
#[ inline]
79
85
pub fn set_addr ( & mut self , addr : PhysAddr , flags : PageTableFlags ) {
@@ -87,37 +93,28 @@ impl PageTableEntry {
87
93
assert ! ( !flags. contains( PageTableFlags :: HUGE_PAGE ) ) ;
88
94
self . set_addr ( frame. start_address ( ) , flags)
89
95
}
90
- }
91
96
92
- #[ cfg( feature = "dynamic_flags" ) ]
93
- impl PageTableEntry {
94
- /// Returns the physical address mapped by this entry, might be zero.
97
+ /// Sets the flags of this entry.
95
98
#[ inline]
96
- pub fn addr ( & self ) -> PhysAddr {
97
- PhysAddr :: new ( self . entry & PHYSICAL_ADDRESS_MASK . load ( Ordering :: Relaxed ) )
99
+ pub fn set_flags ( & mut self , flags : PageTableFlags ) {
100
+ self . entry = self . addr ( ) . as_u64 ( ) | flags . bits ( ) ;
98
101
}
102
+ }
99
103
100
- /// Returns the flags of this entry.
101
- #[ inline]
102
- pub fn flags ( & self ) -> PageTableFlags {
103
- PageTableFlags :: from_bits_retain (
104
- self . entry & !PHYSICAL_ADDRESS_MASK . load ( Ordering :: Relaxed ) ,
105
- )
104
+ #[ cfg( feature = "dynamic_flags" ) ]
105
+ impl PageTableEntry {
106
+ #[ inline( always) ]
107
+ fn physical_address_mask ( ) -> u64 {
108
+ PHYSICAL_ADDRESS_MASK . load ( Ordering :: Relaxed )
106
109
}
107
110
}
108
111
109
112
#[ cfg( not( feature = "dynamic_flags" ) ) ]
110
113
impl PageTableEntry {
111
- /// Returns the physical address mapped by this entry, might be zero.
112
- #[ inline]
113
- pub fn addr ( & self ) -> PhysAddr {
114
- PhysAddr :: new ( self . entry & 0x000f_ffff_ffff_f000u64 )
115
- }
116
-
117
- /// Returns the flags of this entry.
118
- #[ inline]
119
- pub fn flags ( & self ) -> PageTableFlags {
120
- PageTableFlags :: from_bits_truncate ( self . entry )
114
+ #[ inline( always) ]
115
+ #[ rustversion:: attr( since( 1.61 ) , const ) ]
116
+ fn physical_address_mask ( ) -> u64 {
117
+ 0x000f_ffff_ffff_f000u64
121
118
}
122
119
}
123
120
0 commit comments