Skip to content

Commit fea2e0b

Browse files
committed
riscv-peripheral: use riscv-pac result types
Uses the `riscv_pac::result::*` types for unsafe trait implementations.
1 parent 62a417a commit fea2e0b

File tree

5 files changed

+82
-22
lines changed

5 files changed

+82
-22
lines changed

riscv-peripheral/CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
77

88
## [Unreleased]
99

10+
### Added
11+
12+
- use `riscv-pac` result types for trait implementations
13+
1014
### Fixed
1115

1216
- `clippy` fixes

riscv-peripheral/examples/e310x.rs

Lines changed: 16 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
//! This is a simple example of how to use the `riscv-peripheral` crate to generate
33
//! peripheral definitions for a target.
44
5+
use riscv_pac::result::{Error, Result};
56
use riscv_pac::{HartIdNumber, InterruptNumber, PriorityNumber};
67

78
#[repr(u16)]
@@ -19,9 +20,12 @@ unsafe impl HartIdNumber for HartId {
1920
}
2021

2122
#[inline]
22-
fn from_number(number: u16) -> Result<Self, u16> {
23+
fn from_number(number: u16) -> Result<Self> {
2324
if number > Self::MAX_HART_ID_NUMBER {
24-
Err(number)
25+
Err(Error::InvalidVariant {
26+
field: "hart_id",
27+
value: number as usize,
28+
})
2529
} else {
2630
// SAFETY: valid context number
2731
Ok(unsafe { core::mem::transmute(number) })
@@ -95,9 +99,12 @@ unsafe impl InterruptNumber for Interrupt {
9599
}
96100

97101
#[inline]
98-
fn from_number(number: u16) -> Result<Self, u16> {
102+
fn from_number(number: u16) -> Result<Self> {
99103
if number == 0 || number > Self::MAX_INTERRUPT_NUMBER {
100-
Err(number)
104+
Err(Error::InvalidVariant {
105+
field: "interrupt",
106+
value: number as usize,
107+
})
101108
} else {
102109
// SAFETY: valid interrupt number
103110
Ok(unsafe { core::mem::transmute(number) })
@@ -127,9 +134,12 @@ unsafe impl PriorityNumber for Priority {
127134
}
128135

129136
#[inline]
130-
fn from_number(number: u8) -> Result<Self, u8> {
137+
fn from_number(number: u8) -> Result<Self> {
131138
if number > Self::MAX_PRIORITY_NUMBER {
132-
Err(number)
139+
Err(Error::InvalidVariant {
140+
field: "priority",
141+
value: number as usize,
142+
})
133143
} else {
134144
// SAFETY: valid priority number
135145
Ok(unsafe { core::mem::transmute(number) })

riscv-peripheral/src/aclint.rs

Lines changed: 13 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ impl<C: Clint> CLINT<C> {
6363
#[cfg(test)]
6464
pub(crate) mod test {
6565
use super::HartIdNumber;
66+
use riscv_pac::result::{Error, Result};
6667

6768
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
6869
#[repr(u16)]
@@ -81,9 +82,12 @@ pub(crate) mod test {
8182
}
8283

8384
#[inline]
84-
fn from_number(number: u16) -> Result<Self, u16> {
85+
fn from_number(number: u16) -> Result<Self> {
8586
if number > Self::MAX_HART_ID_NUMBER {
86-
Err(number)
87+
Err(Error::InvalidVariant {
88+
field: "hart_id",
89+
value: number as usize,
90+
})
8791
} else {
8892
// SAFETY: valid context number
8993
Ok(unsafe { core::mem::transmute(number) })
@@ -101,7 +105,13 @@ pub(crate) mod test {
101105
assert_eq!(HartId::from_number(1), Ok(HartId::H1));
102106
assert_eq!(HartId::from_number(2), Ok(HartId::H2));
103107

104-
assert_eq!(HartId::from_number(3), Err(3));
108+
assert_eq!(
109+
HartId::from_number(3),
110+
Err(Error::InvalidVariant {
111+
field: "hart_id",
112+
value: 3
113+
})
114+
);
105115
}
106116

107117
#[allow(dead_code)]

riscv-peripheral/src/macros.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@
3030
///
3131
/// ```
3232
/// use riscv_peripheral::clint_codegen;
33+
/// use riscv_pac::result::{Error, Result};
3334
///
3435
/// /// HART IDs for the target CLINT peripheral
3536
/// #[derive(Clone, Copy, Debug, Eq, PartialEq)]
@@ -40,9 +41,9 @@
4041
/// unsafe impl riscv_peripheral::aclint::HartIdNumber for HartId {
4142
/// const MAX_HART_ID_NUMBER: u16 = 2;
4243
/// fn number(self) -> u16 { self as _ }
43-
/// fn from_number(number: u16) -> Result<Self, u16> {
44+
/// fn from_number(number: u16) -> Result<Self> {
4445
/// if number > Self::MAX_HART_ID_NUMBER {
45-
/// Err(number)
46+
/// Err(Error::InvalidVariant { field: "hart_id", value: number as usize })
4647
/// } else {
4748
/// // SAFETY: valid context number
4849
/// Ok(unsafe { core::mem::transmute(number) })

riscv-peripheral/src/plic.rs

Lines changed: 46 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,8 @@ pub mod pendings;
88
pub mod priorities;
99
pub mod threshold;
1010

11-
pub use riscv_pac::{HartIdNumber, InterruptNumber, PriorityNumber}; // re-export useful riscv-pac traits
11+
// re-export useful riscv-pac traits
12+
pub use riscv_pac::{HartIdNumber, InterruptNumber, PriorityNumber};
1213

1314
/// Trait for a PLIC peripheral.
1415
///
@@ -145,6 +146,7 @@ impl<P: Plic> CTX<P> {
145146
#[cfg(test)]
146147
pub(crate) mod test {
147148
use super::{HartIdNumber, InterruptNumber, PriorityNumber};
149+
use riscv_pac::result::{Error, Result};
148150

149151
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
150152
#[repr(u16)]
@@ -181,9 +183,12 @@ pub(crate) mod test {
181183
}
182184

183185
#[inline]
184-
fn from_number(number: u16) -> Result<Self, u16> {
186+
fn from_number(number: u16) -> Result<Self> {
185187
if number > Self::MAX_INTERRUPT_NUMBER || number == 0 {
186-
Err(number)
188+
Err(Error::InvalidVariant {
189+
field: "interrupt",
190+
value: number as usize,
191+
})
187192
} else {
188193
// SAFETY: valid interrupt number
189194
Ok(unsafe { core::mem::transmute(number) })
@@ -200,9 +205,12 @@ pub(crate) mod test {
200205
}
201206

202207
#[inline]
203-
fn from_number(number: u8) -> Result<Self, u8> {
208+
fn from_number(number: u8) -> Result<Self> {
204209
if number > Self::MAX_PRIORITY_NUMBER {
205-
Err(number)
210+
Err(Error::InvalidVariant {
211+
field: "priority",
212+
value: number as usize,
213+
})
206214
} else {
207215
// SAFETY: valid priority number
208216
Ok(unsafe { core::mem::transmute(number) })
@@ -219,9 +227,12 @@ pub(crate) mod test {
219227
}
220228

221229
#[inline]
222-
fn from_number(number: u16) -> Result<Self, u16> {
230+
fn from_number(number: u16) -> Result<Self> {
223231
if number > Self::MAX_HART_ID_NUMBER {
224-
Err(number)
232+
Err(Error::InvalidVariant {
233+
field: "context",
234+
value: number as usize,
235+
})
225236
} else {
226237
// SAFETY: valid context number
227238
Ok(unsafe { core::mem::transmute(number) })
@@ -241,8 +252,20 @@ pub(crate) mod test {
241252
assert_eq!(Interrupt::from_number(3), Ok(Interrupt::I3));
242253
assert_eq!(Interrupt::from_number(4), Ok(Interrupt::I4));
243254

244-
assert_eq!(Interrupt::from_number(0), Err(0));
245-
assert_eq!(Interrupt::from_number(5), Err(5));
255+
assert_eq!(
256+
Interrupt::from_number(0),
257+
Err(Error::InvalidVariant {
258+
field: "interrupt",
259+
value: 0
260+
})
261+
);
262+
assert_eq!(
263+
Interrupt::from_number(5),
264+
Err(Error::InvalidVariant {
265+
field: "interrupt",
266+
value: 5
267+
})
268+
);
246269
}
247270

248271
#[test]
@@ -257,7 +280,13 @@ pub(crate) mod test {
257280
assert_eq!(Priority::from_number(2), Ok(Priority::P2));
258281
assert_eq!(Priority::from_number(3), Ok(Priority::P3));
259282

260-
assert_eq!(Priority::from_number(4), Err(4));
283+
assert_eq!(
284+
Priority::from_number(4),
285+
Err(Error::InvalidVariant {
286+
field: "priority",
287+
value: 4
288+
})
289+
);
261290
}
262291

263292
#[test]
@@ -270,7 +299,13 @@ pub(crate) mod test {
270299
assert_eq!(Context::from_number(1), Ok(Context::C1));
271300
assert_eq!(Context::from_number(2), Ok(Context::C2));
272301

273-
assert_eq!(Context::from_number(3), Err(3));
302+
assert_eq!(
303+
Context::from_number(3),
304+
Err(Error::InvalidVariant {
305+
field: "context",
306+
value: 3
307+
})
308+
);
274309
}
275310

276311
#[allow(dead_code)]

0 commit comments

Comments
 (0)