1
1
//! satp register
2
2
3
+ use crate :: result:: { Error , Result } ;
4
+
3
5
/// satp register
4
6
#[ derive( Clone , Copy , Debug ) ]
5
7
pub struct Satp {
@@ -105,6 +107,28 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
105
107
_write ( bits) ;
106
108
}
107
109
110
+ /// Attempts to set the register to corresponding page table mode, physical page number and address space id.
111
+ #[ inline]
112
+ #[ cfg( target_pointer_width = "32" ) ]
113
+ pub unsafe fn try_set ( mode : Mode , asid : usize , ppn : usize ) -> Result < ( ) > {
114
+ if asid != asid & 0x1FF {
115
+ Err ( Error :: InvalidValue {
116
+ field : "asid" ,
117
+ value : asid,
118
+ bitmask : 0x1FF ,
119
+ } )
120
+ } else if ppn != ppn & 0x3F_FFFF {
121
+ Err ( Error :: InvalidValue {
122
+ field : "ppn" ,
123
+ value : ppn,
124
+ bitmask : 0x3F_FFFF ,
125
+ } )
126
+ } else {
127
+ let bits = ( mode as usize ) << 31 | ( asid << 22 ) | ppn;
128
+ _try_write ( bits)
129
+ }
130
+ }
131
+
108
132
/// Sets the register to corresponding page table mode, physical page number and address space id.
109
133
#[ inline]
110
134
#[ cfg( target_pointer_width = "64" ) ]
@@ -114,3 +138,25 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
114
138
let bits = ( mode as usize ) << 60 | ( asid << 44 ) | ppn;
115
139
_write ( bits) ;
116
140
}
141
+
142
+ /// Sets the register to corresponding page table mode, physical page number and address space id.
143
+ #[ inline]
144
+ #[ cfg( target_pointer_width = "64" ) ]
145
+ pub unsafe fn try_set ( mode : Mode , asid : usize , ppn : usize ) -> Result < ( ) > {
146
+ if asid != asid & 0xFFFF {
147
+ Err ( Error :: InvalidValue {
148
+ field : "asid" ,
149
+ value : asid,
150
+ bitmask : 0xFFFF ,
151
+ } )
152
+ } else if ppn != ppn & 0xFFF_FFFF_FFFF {
153
+ Err ( Error :: InvalidValue {
154
+ field : "ppn" ,
155
+ value : ppn,
156
+ bitmask : 0xFFF_FFFF_FFFF ,
157
+ } )
158
+ } else {
159
+ let bits = ( mode as usize ) << 60 | ( asid << 44 ) | ppn;
160
+ _try_write ( bits)
161
+ }
162
+ }
0 commit comments