Skip to content

Commit 2b35502

Browse files
committed
riscv-pac: add field and field-less error variants
Changes current `Invalid*` variants to `InvalidField*` variants to indicate their use for subfields in an outer struct. Adds the field-less counterparts for use in a context without subfields.
1 parent fea2e0b commit 2b35502

File tree

7 files changed

+35
-76
lines changed

7 files changed

+35
-76
lines changed

riscv-pac/src/result.rs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,13 +13,17 @@ pub enum Error {
1313
max: usize,
1414
},
1515
/// Invalid field value.
16-
InvalidValue {
16+
InvalidFieldValue {
1717
field: &'static str,
1818
value: usize,
1919
bitmask: usize,
2020
},
2121
/// Invalid value of a register field that does not match any known variants.
22-
InvalidVariant { field: &'static str, value: usize },
22+
InvalidFieldVariant { field: &'static str, value: usize },
23+
/// Invalid value.
24+
InvalidValue { value: usize, bitmask: usize },
25+
/// Invalid value that does not match any known variants.
26+
InvalidVariant(usize),
2327
/// Unimplemented function or type.
2428
Unimplemented,
2529
}
@@ -31,17 +35,23 @@ impl fmt::Display for Error {
3135
f,
3236
"out-of-bounds access, index: {index}, min: {min}, max: {max}"
3337
),
34-
Self::InvalidValue {
38+
Self::InvalidFieldValue {
3539
field,
3640
value,
3741
bitmask,
3842
} => write!(
3943
f,
4044
"invalid {field} field value: {value:#x}, valid bitmask: {bitmask:#x}",
4145
),
42-
Self::InvalidVariant { field, value } => {
46+
Self::InvalidFieldVariant { field, value } => {
4347
write!(f, "invalid {field} field variant: {value:#x}")
4448
}
49+
Self::InvalidValue { value, bitmask } => {
50+
write!(f, "invalid value: {value:#x}, valid bitmask: {bitmask:#x}",)
51+
}
52+
Self::InvalidVariant(value) => {
53+
write!(f, "invalid variant: {value:#x}")
54+
}
4555
Self::Unimplemented => write!(f, "unimplemented"),
4656
}
4757
}

riscv-peripheral/examples/e310x.rs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,7 @@ unsafe impl HartIdNumber for HartId {
2222
#[inline]
2323
fn from_number(number: u16) -> Result<Self> {
2424
if number > Self::MAX_HART_ID_NUMBER {
25-
Err(Error::InvalidVariant {
26-
field: "hart_id",
27-
value: number as usize,
28-
})
25+
Err(Error::InvalidVariant(number as usize))
2926
} else {
3027
// SAFETY: valid context number
3128
Ok(unsafe { core::mem::transmute(number) })
@@ -101,10 +98,7 @@ unsafe impl InterruptNumber for Interrupt {
10198
#[inline]
10299
fn from_number(number: u16) -> Result<Self> {
103100
if number == 0 || number > Self::MAX_INTERRUPT_NUMBER {
104-
Err(Error::InvalidVariant {
105-
field: "interrupt",
106-
value: number as usize,
107-
})
101+
Err(Error::InvalidVariant(number as usize))
108102
} else {
109103
// SAFETY: valid interrupt number
110104
Ok(unsafe { core::mem::transmute(number) })
@@ -136,10 +130,7 @@ unsafe impl PriorityNumber for Priority {
136130
#[inline]
137131
fn from_number(number: u8) -> Result<Self> {
138132
if number > Self::MAX_PRIORITY_NUMBER {
139-
Err(Error::InvalidVariant {
140-
field: "priority",
141-
value: number as usize,
142-
})
133+
Err(Error::InvalidVariant(number as usize))
143134
} else {
144135
// SAFETY: valid priority number
145136
Ok(unsafe { core::mem::transmute(number) })

riscv-peripheral/src/aclint.rs

Lines changed: 2 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -84,10 +84,7 @@ pub(crate) mod test {
8484
#[inline]
8585
fn from_number(number: u16) -> Result<Self> {
8686
if number > Self::MAX_HART_ID_NUMBER {
87-
Err(Error::InvalidVariant {
88-
field: "hart_id",
89-
value: number as usize,
90-
})
87+
Err(Error::InvalidVariant(number as usize))
9188
} else {
9289
// SAFETY: valid context number
9390
Ok(unsafe { core::mem::transmute(number) })
@@ -105,13 +102,7 @@ pub(crate) mod test {
105102
assert_eq!(HartId::from_number(1), Ok(HartId::H1));
106103
assert_eq!(HartId::from_number(2), Ok(HartId::H2));
107104

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

117108
#[allow(dead_code)]

riscv-peripheral/src/macros.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
/// fn number(self) -> u16 { self as _ }
4444
/// fn from_number(number: u16) -> Result<Self> {
4545
/// if number > Self::MAX_HART_ID_NUMBER {
46-
/// Err(Error::InvalidVariant { field: "hart_id", value: number as usize })
46+
/// Err(Error::InvalidVariant(number as usize))
4747
/// } else {
4848
/// // SAFETY: valid context number
4949
/// Ok(unsafe { core::mem::transmute(number) })

riscv-peripheral/src/plic.rs

Lines changed: 7 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -185,10 +185,7 @@ pub(crate) mod test {
185185
#[inline]
186186
fn from_number(number: u16) -> Result<Self> {
187187
if number > Self::MAX_INTERRUPT_NUMBER || number == 0 {
188-
Err(Error::InvalidVariant {
189-
field: "interrupt",
190-
value: number as usize,
191-
})
188+
Err(Error::InvalidVariant(number as usize))
192189
} else {
193190
// SAFETY: valid interrupt number
194191
Ok(unsafe { core::mem::transmute(number) })
@@ -207,10 +204,7 @@ pub(crate) mod test {
207204
#[inline]
208205
fn from_number(number: u8) -> Result<Self> {
209206
if number > Self::MAX_PRIORITY_NUMBER {
210-
Err(Error::InvalidVariant {
211-
field: "priority",
212-
value: number as usize,
213-
})
207+
Err(Error::InvalidVariant(number as usize))
214208
} else {
215209
// SAFETY: valid priority number
216210
Ok(unsafe { core::mem::transmute(number) })
@@ -229,10 +223,7 @@ pub(crate) mod test {
229223
#[inline]
230224
fn from_number(number: u16) -> Result<Self> {
231225
if number > Self::MAX_HART_ID_NUMBER {
232-
Err(Error::InvalidVariant {
233-
field: "context",
234-
value: number as usize,
235-
})
226+
Err(Error::InvalidVariant(number as usize))
236227
} else {
237228
// SAFETY: valid context number
238229
Ok(unsafe { core::mem::transmute(number) })
@@ -252,20 +243,8 @@ pub(crate) mod test {
252243
assert_eq!(Interrupt::from_number(3), Ok(Interrupt::I3));
253244
assert_eq!(Interrupt::from_number(4), Ok(Interrupt::I4));
254245

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-
);
246+
assert_eq!(Interrupt::from_number(0), Err(Error::InvalidVariant(0)),);
247+
assert_eq!(Interrupt::from_number(5), Err(Error::InvalidVariant(5)),);
269248
}
270249

271250
#[test]
@@ -280,13 +259,7 @@ pub(crate) mod test {
280259
assert_eq!(Priority::from_number(2), Ok(Priority::P2));
281260
assert_eq!(Priority::from_number(3), Ok(Priority::P3));
282261

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

292265
#[test]
@@ -299,13 +272,7 @@ pub(crate) mod test {
299272
assert_eq!(Context::from_number(1), Ok(Context::C1));
300273
assert_eq!(Context::from_number(2), Ok(Context::C2));
301274

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

311278
#[allow(dead_code)]

riscv/src/register/pmpcfgx.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ impl TryFrom<u8> for Permission {
2828
0b101 => Ok(Self::RX),
2929
0b110 => Ok(Self::WX),
3030
0b111 => Ok(Self::RWX),
31-
_ => Err(Error::InvalidValue {
31+
_ => Err(Error::InvalidFieldValue {
3232
field: "permission",
3333
value: val as usize,
3434
bitmask: 0b111,
@@ -55,7 +55,7 @@ impl TryFrom<u8> for Range {
5555
0b01 => Ok(Self::TOR),
5656
0b10 => Ok(Self::NA4),
5757
0b11 => Ok(Self::NAPOT),
58-
_ => Err(Error::InvalidValue {
58+
_ => Err(Error::InvalidFieldValue {
5959
field: "range",
6060
value: val as usize,
6161
bitmask: 0b11,

riscv/src/register/satp.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -110,7 +110,7 @@ impl TryFrom<u8> for Mode {
110110
match val {
111111
0 => Ok(Mode::Bare),
112112
1 => Ok(Mode::Sv32),
113-
_ => Err(Error::InvalidVariant {
113+
_ => Err(Error::InvalidFieldVariant {
114114
field: "mode",
115115
value: val as usize,
116116
}),
@@ -129,7 +129,7 @@ impl TryFrom<u8> for Mode {
129129
9 => Ok(Mode::Sv48),
130130
10 => Ok(Mode::Sv57),
131131
11 => Ok(Mode::Sv64),
132-
_ => Err(Error::InvalidVariant {
132+
_ => Err(Error::InvalidFieldVariant {
133133
field: "mode",
134134
value: val as usize,
135135
}),
@@ -157,13 +157,13 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
157157
#[cfg(target_pointer_width = "32")]
158158
pub unsafe fn try_set(mode: Mode, asid: usize, ppn: usize) -> Result<()> {
159159
if asid != asid & 0x1FF {
160-
Err(Error::InvalidValue {
160+
Err(Error::InvalidFieldValue {
161161
field: "asid",
162162
value: asid,
163163
bitmask: 0x1FF,
164164
})
165165
} else if ppn != ppn & 0x3F_FFFF {
166-
Err(Error::InvalidValue {
166+
Err(Error::InvalidFieldValue {
167167
field: "ppn",
168168
value: ppn,
169169
bitmask: 0x3F_FFFF,
@@ -191,13 +191,13 @@ pub unsafe fn set(mode: Mode, asid: usize, ppn: usize) {
191191
#[cfg(target_pointer_width = "64")]
192192
pub unsafe fn try_set(mode: Mode, asid: usize, ppn: usize) -> Result<()> {
193193
if asid != asid & 0xFFFF {
194-
Err(Error::InvalidValue {
194+
Err(Error::InvalidFieldValue {
195195
field: "asid",
196196
value: asid,
197197
bitmask: 0xFFFF,
198198
})
199199
} else if ppn != ppn & 0xFFF_FFFF_FFFF {
200-
Err(Error::InvalidValue {
200+
Err(Error::InvalidFieldValue {
201201
field: "ppn",
202202
value: ppn,
203203
bitmask: 0xFFF_FFFF_FFFF,

0 commit comments

Comments
 (0)