@@ -4,9 +4,6 @@ pub mod result;
4
4
5
5
use result:: Result ;
6
6
7
- #[ cfg( feature = "riscv-pac-macros" ) ]
8
- pub use riscv_pac_macros:: * ;
9
-
10
7
/// Trait for enums of target-specific exception numbers.
11
8
///
12
9
/// 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 {
136
133
#[ cfg( test) ]
137
134
mod test {
138
135
use super :: * ;
136
+ use crate :: result:: Error ;
139
137
140
- #[ derive( Clone , Copy , Debug , Eq , PartialEq , ExceptionNumber ) ]
141
- #[ repr( u16 ) ]
138
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
142
139
enum Exception {
143
140
E1 = 1 ,
144
141
E3 = 3 ,
145
142
}
146
143
147
- #[ derive( Clone , Copy , Debug , Eq , PartialEq , InterruptNumber ) ]
148
- #[ repr( u16 ) ]
144
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
149
145
enum Interrupt {
150
146
I1 = 1 ,
151
147
I2 = 2 ,
152
148
I4 = 4 ,
153
149
}
154
150
155
- #[ derive( Clone , Copy , Debug , Eq , PartialEq , PriorityNumber ) ]
156
- #[ repr( u8 ) ]
151
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
157
152
enum Priority {
158
153
P0 = 0 ,
159
154
P1 = 1 ,
160
155
P2 = 2 ,
161
156
P3 = 3 ,
162
157
}
163
158
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 ,
170
164
}
171
165
172
166
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 ;
174
168
175
169
#[ inline]
176
- fn number ( self ) -> u16 {
170
+ fn number ( self ) -> usize {
177
171
self as _
178
172
}
179
173
180
174
#[ 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) ) ,
189
180
}
190
181
}
191
182
}
192
183
193
184
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 ;
195
186
196
187
#[ inline]
197
- fn number ( self ) -> u16 {
188
+ fn number ( self ) -> usize {
198
189
self as _
199
190
}
200
191
201
192
#[ 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) ) ,
208
199
}
209
200
}
210
201
}
@@ -218,31 +209,32 @@ mod test {
218
209
}
219
210
220
211
#[ 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 _ ) ) ,
227
219
}
228
220
}
229
221
}
230
222
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 ;
233
225
234
226
#[ inline]
235
227
fn number ( self ) -> u16 {
236
228
self as _
237
229
}
238
230
239
231
#[ 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 _ ) ) ,
246
238
}
247
239
}
248
240
}
@@ -252,11 +244,11 @@ mod test {
252
244
assert_eq ! ( Exception :: E1 . number( ) , 1 ) ;
253
245
assert_eq ! ( Exception :: E3 . number( ) , 3 ) ;
254
246
255
- assert_eq ! ( Exception :: from_number( 0 ) , Err ( 0 ) ) ;
247
+ assert_eq ! ( Exception :: from_number( 0 ) , Err ( Error :: InvalidVariant ( 0 ) ) ) ;
256
248
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 ) ) ) ;
258
250
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 ) ) ) ;
260
252
}
261
253
262
254
#[ test]
@@ -265,12 +257,12 @@ mod test {
265
257
assert_eq ! ( Interrupt :: I2 . number( ) , 2 ) ;
266
258
assert_eq ! ( Interrupt :: I4 . number( ) , 4 ) ;
267
259
268
- assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
260
+ assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( Error :: InvalidVariant ( 0 ) ) ) ;
269
261
assert_eq ! ( Interrupt :: from_number( 1 ) , Ok ( Interrupt :: I1 ) ) ;
270
262
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 ) ) ) ;
272
264
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 ) ) ) ;
274
266
}
275
267
276
268
#[ test]
@@ -284,7 +276,7 @@ mod test {
284
276
assert_eq ! ( Priority :: from_number( 1 ) , Ok ( Priority :: P1 ) ) ;
285
277
assert_eq ! ( Priority :: from_number( 2 ) , Ok ( Priority :: P2 ) ) ;
286
278
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 ) ) ) ;
288
280
}
289
281
290
282
#[ test]
@@ -296,6 +288,6 @@ mod test {
296
288
assert_eq ! ( HartId :: from_number( 0 ) , Ok ( HartId :: H0 ) ) ;
297
289
assert_eq ! ( HartId :: from_number( 1 ) , Ok ( HartId :: H1 ) ) ;
298
290
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 ) ) ) ;
300
292
}
301
293
}
0 commit comments