Skip to content

Commit 275facc

Browse files
Merge pull request #235 from rmsyn/riscv/medeleg-csr-macro
riscv: define medeleg using CSR macros
2 parents b60a5a7 + 8fad75f commit 275facc

File tree

2 files changed

+94
-64
lines changed

2 files changed

+94
-64
lines changed

riscv/CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/).
1616
- Use CSR helper macros to define `marchid` register
1717
- Re-use `try_*` functions in `mcountinhibit`
1818
- Use CSR helper macros to define `mcause` register
19+
- Use CSR helper macros to define `medeleg` register
1920

2021
## [v0.12.1] - 2024-10-20
2122

riscv/src/register/medeleg.rs

Lines changed: 93 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -1,98 +1,89 @@
11
//! medeleg register
22
3-
/// medeleg register
4-
#[derive(Clone, Copy, Debug)]
5-
pub struct Medeleg {
6-
bits: usize,
3+
read_write_csr! {
4+
/// `medeleg` register
5+
Medeleg: 0x302,
6+
mask: 0xb3ff,
77
}
88

9-
impl Medeleg {
10-
/// Returns the contents of the register as raw bits
11-
#[inline]
12-
pub fn bits(&self) -> usize {
13-
self.bits
14-
}
15-
9+
read_write_csr_field! {
10+
Medeleg,
1611
/// Instruction Address Misaligned Delegate
17-
#[inline]
18-
pub fn instruction_misaligned(&self) -> bool {
19-
self.bits & (1 << 0) != 0
20-
}
12+
instruction_misaligned: 0,
13+
}
2114

15+
read_write_csr_field! {
16+
Medeleg,
2217
/// Instruction Access Fault Delegate
23-
#[inline]
24-
pub fn instruction_fault(&self) -> bool {
25-
self.bits & (1 << 1) != 0
26-
}
18+
instruction_fault: 1,
19+
}
2720

21+
read_write_csr_field! {
22+
Medeleg,
2823
/// Illegal Instruction Delegate
29-
#[inline]
30-
pub fn illegal_instruction(&self) -> bool {
31-
self.bits & (1 << 2) != 0
32-
}
24+
illegal_instruction: 2,
25+
}
3326

27+
read_write_csr_field! {
28+
Medeleg,
3429
/// Breakpoint Delegate
35-
#[inline]
36-
pub fn breakpoint(&self) -> bool {
37-
self.bits & (1 << 3) != 0
38-
}
30+
breakpoint: 3,
31+
}
3932

33+
read_write_csr_field! {
34+
Medeleg,
4035
/// Load Address Misaligned Delegate
41-
#[inline]
42-
pub fn load_misaligned(&self) -> bool {
43-
self.bits & (1 << 4) != 0
44-
}
36+
load_misaligned: 4,
37+
}
4538

39+
read_write_csr_field! {
40+
Medeleg,
4641
/// Load Access Fault Delegate
47-
#[inline]
48-
pub fn load_fault(&self) -> bool {
49-
self.bits & (1 << 5) != 0
50-
}
42+
load_fault: 5,
43+
}
5144

45+
read_write_csr_field! {
46+
Medeleg,
5247
/// Store/AMO Address Misaligned Delegate
53-
#[inline]
54-
pub fn store_misaligned(&self) -> bool {
55-
self.bits & (1 << 6) != 0
56-
}
48+
store_misaligned: 6,
49+
}
5750

51+
read_write_csr_field! {
52+
Medeleg,
5853
/// Store/AMO Access Fault Delegate
59-
#[inline]
60-
pub fn store_fault(&self) -> bool {
61-
self.bits & (1 << 7) != 0
62-
}
54+
store_fault: 7,
55+
}
6356

57+
read_write_csr_field! {
58+
Medeleg,
6459
/// Environment Call from U-mode Delegate
65-
#[inline]
66-
pub fn user_env_call(&self) -> bool {
67-
self.bits & (1 << 8) != 0
68-
}
60+
user_env_call: 8,
61+
}
6962

63+
read_write_csr_field! {
64+
Medeleg,
7065
/// Environment Call from S-mode Delegate
71-
#[inline]
72-
pub fn supervisor_env_call(&self) -> bool {
73-
self.bits & (1 << 9) != 0
74-
}
66+
supervisor_env_call: 9,
67+
}
7568

69+
read_write_csr_field! {
70+
Medeleg,
7671
/// Instruction Page Fault Delegate
77-
#[inline]
78-
pub fn instruction_page_fault(&self) -> bool {
79-
self.bits & (1 << 12) != 0
80-
}
72+
instruction_page_fault: 12,
73+
}
8174

75+
read_write_csr_field! {
76+
Medeleg,
8277
/// Load Page Fault Delegate
83-
#[inline]
84-
pub fn load_page_fault(&self) -> bool {
85-
self.bits & (1 << 13) != 0
86-
}
78+
load_page_fault: 13,
79+
}
8780

81+
read_write_csr_field! {
82+
Medeleg,
8883
/// Store/AMO Page Fault Delegate
89-
#[inline]
90-
pub fn store_page_fault(&self) -> bool {
91-
self.bits & (1 << 15) != 0
92-
}
84+
store_page_fault: 15,
9385
}
9486

95-
read_csr_as!(Medeleg, 0x302);
9687
set!(0x302);
9788
clear!(0x302);
9889

@@ -135,3 +126,41 @@ set_clear_csr!(
135126
set_clear_csr!(
136127
/// Store/AMO Page Fault Delegate
137128
, set_store_page_fault, clear_store_page_fault, 1 << 15);
129+
130+
#[cfg(test)]
131+
mod tests {
132+
use super::*;
133+
134+
macro_rules! test_field {
135+
($reg:ident, $field:ident) => {{
136+
$crate::paste! {
137+
assert!(!$reg.$field());
138+
139+
$reg.[<set_ $field>](true);
140+
assert!($reg.$field());
141+
142+
$reg.[<set_ $field>](false);
143+
assert!(!$reg.$field());
144+
}
145+
}};
146+
}
147+
148+
#[test]
149+
fn test_medeleg() {
150+
let mut m = Medeleg::from_bits(0);
151+
152+
test_field!(m, instruction_misaligned);
153+
test_field!(m, instruction_fault);
154+
test_field!(m, illegal_instruction);
155+
test_field!(m, breakpoint);
156+
test_field!(m, load_misaligned);
157+
test_field!(m, load_fault);
158+
test_field!(m, store_misaligned);
159+
test_field!(m, store_fault);
160+
test_field!(m, user_env_call);
161+
test_field!(m, supervisor_env_call);
162+
test_field!(m, instruction_page_fault);
163+
test_field!(m, load_page_fault);
164+
test_field!(m, store_page_fault);
165+
}
166+
}

0 commit comments

Comments
 (0)