@@ -4,9 +4,6 @@ pub mod result;
44
55use result:: Result ;
66
7- #[ cfg( feature = "riscv-pac-macros" ) ]
8- pub use riscv_pac_macros:: * ;
9-
107/// Trait for enums of target-specific exception numbers.
118///
129/// This trait should be implemented by a peripheral access crate (PAC) on its enum of available
@@ -136,75 +133,69 @@ pub unsafe trait HartIdNumber: Copy {
136133#[ cfg( test) ]
137134mod test {
138135 use super :: * ;
136+ use crate :: result:: Error ;
139137
140- #[ derive( Clone , Copy , Debug , Eq , PartialEq , ExceptionNumber ) ]
141- #[ repr( u16 ) ]
138+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
142139 enum Exception {
143140 E1 = 1 ,
144141 E3 = 3 ,
145142 }
146143
147- #[ derive( Clone , Copy , Debug , Eq , PartialEq , InterruptNumber ) ]
148- #[ repr( u16 ) ]
144+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
149145 enum Interrupt {
150146 I1 = 1 ,
151147 I2 = 2 ,
152148 I4 = 4 ,
153149 }
154150
155- #[ derive( Clone , Copy , Debug , Eq , PartialEq , PriorityNumber ) ]
156- #[ repr( u8 ) ]
151+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
157152 enum Priority {
158153 P0 = 0 ,
159154 P1 = 1 ,
160155 P2 = 2 ,
161156 P3 = 3 ,
162157 }
163158
164- #[ derive( Clone , Copy , Debug , Eq , PartialEq , HartIdNumber ) ]
165- #[ repr( u16 ) ]
166- enum Context {
167- C0 = 0 ,
168- C1 = 1 ,
169- C2 = 2 ,
159+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
160+ enum HartId {
161+ H0 = 0 ,
162+ H1 = 1 ,
163+ H2 = 2 ,
170164 }
171165
172166 unsafe impl ExceptionNumber for Exception {
173- const MAX_EXCEPTION_NUMBER : u16 = Self :: E3 as u16 ;
167+ const MAX_EXCEPTION_NUMBER : usize = Self :: E3 as usize ;
174168
175169 #[ inline]
176- fn number ( self ) -> u16 {
170+ fn number ( self ) -> usize {
177171 self as _
178172 }
179173
180174 #[ inline]
181- fn from_number ( number : u16 ) -> Result < Self > {
182- if number > Self :: MAX_EXCEPTION_NUMBER || number == 0 {
183- Err ( number)
184- } else if number == 1 || number == 3 {
185- // SAFETY: valid exception number
186- Ok ( unsafe { core:: mem:: transmute ( number) } )
187- } else {
188- Err ( number)
175+ fn from_number ( number : usize ) -> Result < Self > {
176+ match number {
177+ 1 => Ok ( Exception :: E1 ) ,
178+ 3 => Ok ( Exception :: E3 ) ,
179+ _ => Err ( Error :: InvalidVariant ( number) ) ,
189180 }
190181 }
191182 }
192183
193184 unsafe impl InterruptNumber for Interrupt {
194- const MAX_INTERRUPT_NUMBER : u16 = Self :: I4 as u16 ;
185+ const MAX_INTERRUPT_NUMBER : usize = Self :: I4 as usize ;
195186
196187 #[ inline]
197- fn number ( self ) -> u16 {
188+ fn number ( self ) -> usize {
198189 self as _
199190 }
200191
201192 #[ inline]
202- fn from_number ( number : u16 ) -> Result < Self > {
203- if number > Self :: MAX_INTERRUPT_NUMBER || number == 0 {
204- Err ( number )
205- } else {
206- // SAFETY: valid interrupt number
207- Ok ( unsafe { core :: mem :: transmute ( number) } )
193+ fn from_number ( number : usize ) -> Result < Self > {
194+ match number {
195+ 1 => Ok ( Interrupt :: I1 ) ,
196+ 2 => Ok ( Interrupt :: I2 ) ,
197+ 4 => Ok ( Interrupt :: I4 ) ,
198+ _ => Err ( Error :: InvalidVariant ( number) ) ,
208199 }
209200 }
210201 }
@@ -218,31 +209,32 @@ mod test {
218209 }
219210
220211 #[ inline]
221- fn from_number ( number : u8 ) -> Result < Self , u8 > {
222- if number > Self :: MAX_PRIORITY_NUMBER {
223- Err ( number)
224- } else {
225- // SAFETY: valid priority number
226- Ok ( unsafe { core:: mem:: transmute ( number) } )
212+ fn from_number ( number : u8 ) -> Result < Self > {
213+ match number {
214+ 0 => Ok ( Priority :: P0 ) ,
215+ 1 => Ok ( Priority :: P1 ) ,
216+ 2 => Ok ( Priority :: P2 ) ,
217+ 3 => Ok ( Priority :: P3 ) ,
218+ _ => Err ( Error :: InvalidVariant ( number as _ ) ) ,
227219 }
228220 }
229221 }
230222
231- unsafe impl HartIdNumber for Context {
232- const MAX_HART_ID_NUMBER : u16 = Self :: C2 as u16 ;
223+ unsafe impl HartIdNumber for HartId {
224+ const MAX_HART_ID_NUMBER : u16 = Self :: H2 as u16 ;
233225
234226 #[ inline]
235227 fn number ( self ) -> u16 {
236228 self as _
237229 }
238230
239231 #[ inline]
240- fn from_number ( number : u16 ) -> Result < Self , u16 > {
241- if number > Self :: MAX_HART_ID_NUMBER {
242- Err ( number )
243- } else {
244- // SAFETY: valid context number
245- Ok ( unsafe { core :: mem :: transmute ( number) } )
232+ fn from_number ( number : u16 ) -> Result < Self > {
233+ match number {
234+ 0 => Ok ( HartId :: H0 ) ,
235+ 1 => Ok ( HartId :: H1 ) ,
236+ 2 => Ok ( HartId :: H2 ) ,
237+ _ => Err ( Error :: InvalidVariant ( number as _ ) ) ,
246238 }
247239 }
248240 }
@@ -252,11 +244,11 @@ mod test {
252244 assert_eq ! ( Exception :: E1 . number( ) , 1 ) ;
253245 assert_eq ! ( Exception :: E3 . number( ) , 3 ) ;
254246
255- assert_eq ! ( Exception :: from_number( 0 ) , Err ( 0 ) ) ;
247+ assert_eq ! ( Exception :: from_number( 0 ) , Err ( Error :: InvalidVariant ( 0 ) ) ) ;
256248 assert_eq ! ( Exception :: from_number( 1 ) , Ok ( Exception :: E1 ) ) ;
257- assert_eq ! ( Exception :: from_number( 2 ) , Err ( 2 ) ) ;
249+ assert_eq ! ( Exception :: from_number( 2 ) , Err ( Error :: InvalidVariant ( 2 ) ) ) ;
258250 assert_eq ! ( Exception :: from_number( 3 ) , Ok ( Exception :: E3 ) ) ;
259- assert_eq ! ( Exception :: from_number( 4 ) , Err ( 4 ) ) ;
251+ assert_eq ! ( Exception :: from_number( 4 ) , Err ( Error :: InvalidVariant ( 4 ) ) ) ;
260252 }
261253
262254 #[ test]
@@ -265,12 +257,12 @@ mod test {
265257 assert_eq ! ( Interrupt :: I2 . number( ) , 2 ) ;
266258 assert_eq ! ( Interrupt :: I4 . number( ) , 4 ) ;
267259
268- assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
260+ assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( Error :: InvalidVariant ( 0 ) ) ) ;
269261 assert_eq ! ( Interrupt :: from_number( 1 ) , Ok ( Interrupt :: I1 ) ) ;
270262 assert_eq ! ( Interrupt :: from_number( 2 ) , Ok ( Interrupt :: I2 ) ) ;
271- assert_eq ! ( Interrupt :: from_number( 3 ) , Err ( 3 ) ) ;
263+ assert_eq ! ( Interrupt :: from_number( 3 ) , Err ( Error :: InvalidVariant ( 3 ) ) ) ;
272264 assert_eq ! ( Interrupt :: from_number( 4 ) , Ok ( Interrupt :: I4 ) ) ;
273- assert_eq ! ( Interrupt :: from_number( 5 ) , Err ( 5 ) ) ;
265+ assert_eq ! ( Interrupt :: from_number( 5 ) , Err ( Error :: InvalidVariant ( 5 ) ) ) ;
274266 }
275267
276268 #[ test]
@@ -284,7 +276,7 @@ mod test {
284276 assert_eq ! ( Priority :: from_number( 1 ) , Ok ( Priority :: P1 ) ) ;
285277 assert_eq ! ( Priority :: from_number( 2 ) , Ok ( Priority :: P2 ) ) ;
286278 assert_eq ! ( Priority :: from_number( 3 ) , Ok ( Priority :: P3 ) ) ;
287- assert_eq ! ( Priority :: from_number( 4 ) , Err ( 4 ) ) ;
279+ assert_eq ! ( Priority :: from_number( 4 ) , Err ( Error :: InvalidVariant ( 4 ) ) ) ;
288280 }
289281
290282 #[ test]
@@ -296,6 +288,6 @@ mod test {
296288 assert_eq ! ( HartId :: from_number( 0 ) , Ok ( HartId :: H0 ) ) ;
297289 assert_eq ! ( HartId :: from_number( 1 ) , Ok ( HartId :: H1 ) ) ;
298290 assert_eq ! ( HartId :: from_number( 2 ) , Ok ( HartId :: H2 ) ) ;
299- assert_eq ! ( HartId :: from_number( 3 ) , Err ( 3 ) ) ;
291+ assert_eq ! ( HartId :: from_number( 3 ) , Err ( Error :: InvalidVariant ( 3 ) ) ) ;
300292 }
301293}
0 commit comments