@@ -52,3 +52,56 @@ impl Mconfigptr {
5252 }
5353 }
5454}
55+
56+ #[ cfg( test) ]
57+ mod tests {
58+ use super :: * ;
59+
60+ #[ test]
61+ fn test_mconfigptr ( ) {
62+ #[ cfg( target_arch = "riscv32" ) ]
63+ const EXP_SHIFT : usize = 2 ;
64+ #[ cfg( not( target_arch = "riscv32" ) ) ]
65+ const EXP_SHIFT : usize = 3 ;
66+
67+ const EXP_MASK : usize = ( 1usize << EXP_SHIFT ) - 1 ;
68+
69+ assert_eq ! ( Mconfigptr :: ALIGN_SHIFT , EXP_SHIFT ) ;
70+ assert_eq ! ( Mconfigptr :: ALIGN_MASK , EXP_MASK ) ;
71+
72+ ( 1 ..usize:: BITS )
73+ . map ( |b| ( ( 1u128 << b) - 1 ) as usize )
74+ . for_each ( |ptr| {
75+ let mconfigptr = Mconfigptr :: from_bits ( ptr) ;
76+ assert_eq ! ( mconfigptr. bits( ) , ptr) ;
77+
78+ match mconfigptr. try_as_ptr ( ) {
79+ Ok ( cfg_ptr) => {
80+ assert_eq ! ( cfg_ptr, ptr as * const _) ;
81+ assert_eq ! ( mconfigptr. as_ptr( ) , ptr as * const _) ;
82+ }
83+ Err ( err) if ptr == 0 => assert_eq ! (
84+ err,
85+ Error :: InvalidFieldVariant {
86+ field: "mconfigptr" ,
87+ value: 0
88+ }
89+ ) ,
90+ Err ( err) => assert_eq ! (
91+ err,
92+ Error :: InvalidFieldValue {
93+ field: "mconfigptr" ,
94+ value: ptr,
95+ bitmask: !Mconfigptr :: ALIGN_MASK ,
96+ }
97+ ) ,
98+ }
99+
100+ let aligned_ptr = ptr << Mconfigptr :: ALIGN_SHIFT ;
101+ let aligned_mconfigptr = Mconfigptr :: from_bits ( aligned_ptr) ;
102+
103+ assert_eq ! ( aligned_mconfigptr. try_as_ptr( ) , Ok ( aligned_ptr as * const _) ) ;
104+ assert_eq ! ( aligned_mconfigptr. as_ptr( ) , aligned_ptr as * const _) ;
105+ } ) ;
106+ }
107+ }
0 commit comments