Skip to content

Commit f92d787

Browse files
Merge pull request #257 from rmsyn/riscv/pmpcfgx-csr-macro
riscv: define `pmpcfgx` types with CSR macros
2 parents 2628fe4 + f70a201 commit f92d787

File tree

2 files changed

+25
-44
lines changed

2 files changed

+25
-44
lines changed

riscv/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
3131
- Use CSR helper macros to define `mtvec` register
3232
- Use CSR helper macros to define `mtvendorid` register
3333
- Use CSR helper macros to define `satp` register
34+
- Use CSR helper macros to define `pmpcfgx` field types
3435

3536
## [v0.12.1] - 2024-10-20
3637

riscv/src/register/pmpcfgx.rs

Lines changed: 24 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,45 @@
22
33
use crate::result::{Error, Result};
44

5-
/// Permission enum contains all possible permission modes for pmp registers
6-
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
7-
pub enum Permission {
8-
NONE = 0b000,
9-
R = 0b001,
10-
W = 0b010,
11-
RW = 0b011,
12-
X = 0b100,
13-
RX = 0b101,
14-
WX = 0b110,
15-
RWX = 0b111,
5+
csr_field_enum! {
6+
/// Permission enum contains all possible permission modes for pmp registers
7+
Permission {
8+
default: NONE,
9+
NONE = 0b000,
10+
R = 0b001,
11+
W = 0b010,
12+
RW = 0b011,
13+
X = 0b100,
14+
RX = 0b101,
15+
WX = 0b110,
16+
RWX = 0b111,
17+
}
1618
}
1719

1820
impl TryFrom<u8> for Permission {
1921
type Error = Error;
2022

2123
fn try_from(val: u8) -> Result<Self> {
22-
match val {
23-
0b000 => Ok(Self::NONE),
24-
0b001 => Ok(Self::R),
25-
0b010 => Ok(Self::W),
26-
0b011 => Ok(Self::RW),
27-
0b100 => Ok(Self::X),
28-
0b101 => Ok(Self::RX),
29-
0b110 => Ok(Self::WX),
30-
0b111 => Ok(Self::RWX),
31-
_ => Err(Error::InvalidFieldValue {
32-
field: "permission",
33-
value: val as usize,
34-
bitmask: 0b111,
35-
}),
36-
}
24+
Self::from_usize(val as usize)
3725
}
3826
}
3927

40-
/// Range enum contains all possible addressing modes for pmp registers
41-
#[derive(Clone, Copy, Debug, Eq, PartialEq)]
42-
pub enum Range {
43-
OFF = 0b00,
44-
TOR = 0b01,
45-
NA4 = 0b10,
46-
NAPOT = 0b11,
28+
csr_field_enum! {
29+
/// Range enum contains all possible addressing modes for pmp registers
30+
Range {
31+
default: OFF,
32+
OFF = 0b00,
33+
TOR = 0b01,
34+
NA4 = 0b10,
35+
NAPOT = 0b11,
36+
}
4737
}
4838

4939
impl TryFrom<u8> for Range {
5040
type Error = Error;
5141

5242
fn try_from(val: u8) -> Result<Self> {
53-
match val {
54-
0b00 => Ok(Self::OFF),
55-
0b01 => Ok(Self::TOR),
56-
0b10 => Ok(Self::NA4),
57-
0b11 => Ok(Self::NAPOT),
58-
_ => Err(Error::InvalidFieldValue {
59-
field: "range",
60-
value: val as usize,
61-
bitmask: 0b11,
62-
}),
63-
}
43+
Self::from_usize(val as usize)
6444
}
6545
}
6646

0 commit comments

Comments
 (0)