Skip to content

Commit b7e9117

Browse files
Merge pull request #237 from rmsyn/riscv/mideleg-csr-macro
riscv: define mideleg using CSR macros
2 parents 275facc + 301469b commit b7e9117

File tree

4 files changed

+59
-51
lines changed

4 files changed

+59
-51
lines changed

riscv/CHANGELOG.md

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

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

riscv/src/register/macros.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1059,3 +1059,19 @@ macro_rules! write_only_csr_field {
10591059
}
10601060
};
10611061
}
1062+
1063+
#[cfg(test)]
1064+
#[macro_export]
1065+
macro_rules! test_csr_field {
1066+
($reg:ident, $field:ident) => {{
1067+
$crate::paste! {
1068+
assert!(!$reg.$field());
1069+
1070+
$reg.[<set_ $field>](true);
1071+
assert!($reg.$field());
1072+
1073+
$reg.[<set_ $field>](false);
1074+
assert!(!$reg.$field());
1075+
}
1076+
}};
1077+
}

riscv/src/register/medeleg.rs

Lines changed: 13 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -131,36 +131,22 @@ set_clear_csr!(
131131
mod tests {
132132
use super::*;
133133

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-
148134
#[test]
149135
fn test_medeleg() {
150136
let mut m = Medeleg::from_bits(0);
151137

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);
138+
test_csr_field!(m, instruction_misaligned);
139+
test_csr_field!(m, instruction_fault);
140+
test_csr_field!(m, illegal_instruction);
141+
test_csr_field!(m, breakpoint);
142+
test_csr_field!(m, load_misaligned);
143+
test_csr_field!(m, load_fault);
144+
test_csr_field!(m, store_misaligned);
145+
test_csr_field!(m, store_fault);
146+
test_csr_field!(m, user_env_call);
147+
test_csr_field!(m, supervisor_env_call);
148+
test_csr_field!(m, instruction_page_fault);
149+
test_csr_field!(m, load_page_fault);
150+
test_csr_field!(m, store_page_fault);
165151
}
166152
}

riscv/src/register/mideleg.rs

Lines changed: 29 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,38 +1,29 @@
11
//! mideleg register
22
3-
/// mideleg register
4-
#[derive(Clone, Copy, Debug)]
5-
pub struct Mideleg {
6-
bits: usize,
3+
read_write_csr! {
4+
/// `mideleg` register
5+
Mideleg: 0x303,
6+
mask: 0x222,
77
}
88

9-
impl Mideleg {
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+
Mideleg,
1611
/// Supervisor Software Interrupt Delegate
17-
#[inline]
18-
pub fn ssoft(&self) -> bool {
19-
self.bits & (1 << 1) != 0
20-
}
12+
ssoft: 1,
13+
}
2114

15+
read_write_csr_field! {
16+
Mideleg,
2217
/// Supervisor Timer Interrupt Delegate
23-
#[inline]
24-
pub fn stimer(&self) -> bool {
25-
self.bits & (1 << 5) != 0
26-
}
18+
stimer: 5,
19+
}
2720

21+
read_write_csr_field! {
22+
Mideleg,
2823
/// Supervisor External Interrupt Delegate
29-
#[inline]
30-
pub fn sext(&self) -> bool {
31-
self.bits & (1 << 9) != 0
32-
}
24+
sext: 9,
3325
}
3426

35-
read_csr_as!(Mideleg, 0x303);
3627
set!(0x303);
3728
clear!(0x303);
3829

@@ -45,3 +36,17 @@ set_clear_csr!(
4536
set_clear_csr!(
4637
/// Supervisor External Interrupt Delegate
4738
, set_sext, clear_sext, 1 << 9);
39+
40+
#[cfg(test)]
41+
mod tests {
42+
use super::*;
43+
44+
#[test]
45+
fn test_mideleg() {
46+
let mut m = Mideleg::from_bits(0);
47+
48+
test_csr_field!(m, ssoft);
49+
test_csr_field!(m, stimer);
50+
test_csr_field!(m, sext);
51+
}
52+
}

0 commit comments

Comments
 (0)