1
1
#![ no_std]
2
2
3
+ pub use riscv_pac_macros:: * ;
4
+
3
5
/// Trait for enums of target-specific exception numbers.
4
6
///
5
7
/// This trait should be implemented by a peripheral access crate (PAC) on its enum of available
@@ -133,23 +135,22 @@ pub unsafe trait HartIdNumber: Copy {
133
135
mod test {
134
136
use super :: * ;
135
137
136
- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
138
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , ExceptionNumber ) ]
137
139
#[ repr( u16 ) ]
138
140
enum Exception {
139
141
E1 = 1 ,
140
142
E3 = 3 ,
141
143
}
142
144
143
- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
145
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , InterruptNumber ) ]
144
146
#[ repr( u16 ) ]
145
147
enum Interrupt {
146
148
I1 = 1 ,
147
149
I2 = 2 ,
148
- I3 = 3 ,
149
150
I4 = 4 ,
150
151
}
151
152
152
- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
153
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , PriorityNumber ) ]
153
154
#[ repr( u8 ) ]
154
155
enum Priority {
155
156
P0 = 0 ,
@@ -158,118 +159,37 @@ mod test {
158
159
P3 = 3 ,
159
160
}
160
161
161
- #[ derive( Clone , Copy , Debug , Eq , PartialEq ) ]
162
+ #[ derive( Clone , Copy , Debug , Eq , PartialEq , HartIdNumber ) ]
162
163
#[ repr( u16 ) ]
163
- enum Context {
164
- C0 = 0 ,
165
- C1 = 1 ,
166
- C2 = 2 ,
167
- }
168
-
169
- unsafe impl ExceptionNumber for Exception {
170
- const MAX_EXCEPTION_NUMBER : u16 = Self :: E3 as u16 ;
171
-
172
- #[ inline]
173
- fn number ( self ) -> u16 {
174
- self as _
175
- }
176
-
177
- #[ inline]
178
- fn from_number ( number : u16 ) -> Result < Self , u16 > {
179
- if number > Self :: MAX_EXCEPTION_NUMBER || number == 0 {
180
- Err ( number)
181
- } else if number == 1 || number == 3 {
182
- // SAFETY: valid exception number
183
- Ok ( unsafe { core:: mem:: transmute ( number) } )
184
- } else {
185
- Err ( number)
186
- }
187
- }
188
- }
189
-
190
- unsafe impl InterruptNumber for Interrupt {
191
- const MAX_INTERRUPT_NUMBER : u16 = Self :: I4 as u16 ;
192
-
193
- #[ inline]
194
- fn number ( self ) -> u16 {
195
- self as _
196
- }
197
-
198
- #[ inline]
199
- fn from_number ( number : u16 ) -> Result < Self , u16 > {
200
- if number > Self :: MAX_INTERRUPT_NUMBER || number == 0 {
201
- Err ( number)
202
- } else {
203
- // SAFETY: valid interrupt number
204
- Ok ( unsafe { core:: mem:: transmute ( number) } )
205
- }
206
- }
207
- }
208
-
209
- unsafe impl PriorityNumber for Priority {
210
- const MAX_PRIORITY_NUMBER : u8 = Self :: P3 as u8 ;
211
-
212
- #[ inline]
213
- fn number ( self ) -> u8 {
214
- self as _
215
- }
216
-
217
- #[ inline]
218
- fn from_number ( number : u8 ) -> Result < Self , u8 > {
219
- if number > Self :: MAX_PRIORITY_NUMBER {
220
- Err ( number)
221
- } else {
222
- // SAFETY: valid priority number
223
- Ok ( unsafe { core:: mem:: transmute ( number) } )
224
- }
225
- }
226
- }
227
-
228
- unsafe impl HartIdNumber for Context {
229
- const MAX_HART_ID_NUMBER : u16 = Self :: C2 as u16 ;
230
-
231
- #[ inline]
232
- fn number ( self ) -> u16 {
233
- self as _
234
- }
235
-
236
- #[ inline]
237
- fn from_number ( number : u16 ) -> Result < Self , u16 > {
238
- if number > Self :: MAX_HART_ID_NUMBER {
239
- Err ( number)
240
- } else {
241
- // SAFETY: valid context number
242
- Ok ( unsafe { core:: mem:: transmute ( number) } )
243
- }
244
- }
164
+ enum HartId {
165
+ H0 = 0 ,
166
+ H1 = 1 ,
167
+ H2 = 2 ,
245
168
}
246
169
247
170
#[ test]
248
171
fn check_exception_enum ( ) {
249
172
assert_eq ! ( Exception :: E1 . number( ) , 1 ) ;
250
173
assert_eq ! ( Exception :: E3 . number( ) , 3 ) ;
251
174
252
- assert_eq ! ( Exception :: from_number( 1 ) , Ok ( Exception :: E1 ) ) ;
253
- assert_eq ! ( Exception :: from_number( 3 ) , Ok ( Exception :: E3 ) ) ;
254
-
255
175
assert_eq ! ( Exception :: from_number( 0 ) , Err ( 0 ) ) ;
176
+ assert_eq ! ( Exception :: from_number( 1 ) , Ok ( Exception :: E1 ) ) ;
256
177
assert_eq ! ( Exception :: from_number( 2 ) , Err ( 2 ) ) ;
178
+ assert_eq ! ( Exception :: from_number( 3 ) , Ok ( Exception :: E3 ) ) ;
257
179
assert_eq ! ( Exception :: from_number( 4 ) , Err ( 4 ) ) ;
258
180
}
259
181
260
182
#[ test]
261
183
fn check_interrupt_enum ( ) {
262
184
assert_eq ! ( Interrupt :: I1 . number( ) , 1 ) ;
263
185
assert_eq ! ( Interrupt :: I2 . number( ) , 2 ) ;
264
- assert_eq ! ( Interrupt :: I3 . number( ) , 3 ) ;
265
186
assert_eq ! ( Interrupt :: I4 . number( ) , 4 ) ;
266
187
188
+ assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
267
189
assert_eq ! ( Interrupt :: from_number( 1 ) , Ok ( Interrupt :: I1 ) ) ;
268
190
assert_eq ! ( Interrupt :: from_number( 2 ) , Ok ( Interrupt :: I2 ) ) ;
269
- assert_eq ! ( Interrupt :: from_number( 3 ) , Ok ( Interrupt :: I3 ) ) ;
191
+ assert_eq ! ( Interrupt :: from_number( 3 ) , Err ( 3 ) ) ;
270
192
assert_eq ! ( Interrupt :: from_number( 4 ) , Ok ( Interrupt :: I4 ) ) ;
271
-
272
- assert_eq ! ( Interrupt :: from_number( 0 ) , Err ( 0 ) ) ;
273
193
assert_eq ! ( Interrupt :: from_number( 5 ) , Err ( 5 ) ) ;
274
194
}
275
195
@@ -284,20 +204,18 @@ mod test {
284
204
assert_eq ! ( Priority :: from_number( 1 ) , Ok ( Priority :: P1 ) ) ;
285
205
assert_eq ! ( Priority :: from_number( 2 ) , Ok ( Priority :: P2 ) ) ;
286
206
assert_eq ! ( Priority :: from_number( 3 ) , Ok ( Priority :: P3 ) ) ;
287
-
288
207
assert_eq ! ( Priority :: from_number( 4 ) , Err ( 4 ) ) ;
289
208
}
290
209
291
210
#[ test]
292
- fn check_context_enum ( ) {
293
- assert_eq ! ( Context :: C0 . number( ) , 0 ) ;
294
- assert_eq ! ( Context :: C1 . number( ) , 1 ) ;
295
- assert_eq ! ( Context :: C2 . number( ) , 2 ) ;
296
-
297
- assert_eq ! ( Context :: from_number( 0 ) , Ok ( Context :: C0 ) ) ;
298
- assert_eq ! ( Context :: from_number( 1 ) , Ok ( Context :: C1 ) ) ;
299
- assert_eq ! ( Context :: from_number( 2 ) , Ok ( Context :: C2 ) ) ;
300
-
301
- assert_eq ! ( Context :: from_number( 3 ) , Err ( 3 ) ) ;
211
+ fn check_hart_id_enum ( ) {
212
+ assert_eq ! ( HartId :: H0 . number( ) , 0 ) ;
213
+ assert_eq ! ( HartId :: H1 . number( ) , 1 ) ;
214
+ assert_eq ! ( HartId :: H2 . number( ) , 2 ) ;
215
+
216
+ assert_eq ! ( HartId :: from_number( 0 ) , Ok ( HartId :: H0 ) ) ;
217
+ assert_eq ! ( HartId :: from_number( 1 ) , Ok ( HartId :: H1 ) ) ;
218
+ assert_eq ! ( HartId :: from_number( 2 ) , Ok ( HartId :: H2 ) ) ;
219
+ assert_eq ! ( HartId :: from_number( 3 ) , Err ( 3 ) ) ;
302
220
}
303
221
}
0 commit comments