11//! satp register
22
3+ use crate :: result:: { Error , Result } ;
4+
35/// satp register
46#[ derive( Clone , Copy , Debug ) ]
57pub struct Satp {
@@ -105,6 +107,28 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
105107 _write ( bits) ;
106108}
107109
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+
108132/// Sets the register to corresponding page table mode, physical page number and address space id.
109133#[ inline]
110134#[ cfg( target_pointer_width = "64" ) ]
@@ -114,3 +138,25 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
114138 let bits = ( mode as usize ) << 60 | ( asid << 44 ) | ppn;
115139 _write ( bits) ;
116140}
141+
142+ /// Attempts to set 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