Skip to content

Commit ea1f028

Browse files
committed
Add mideleg register support
1 parent 0259333 commit ea1f028

File tree

2 files changed

+78
-1
lines changed

2 files changed

+78
-1
lines changed

src/register/mideleg.rs

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
//! mideleg register
2+
3+
use bit_field::BitField;
4+
5+
/// mideleg register
6+
#[derive(Clone, Copy, Debug)]
7+
pub struct Mideleg {
8+
bits: usize,
9+
}
10+
11+
impl Mideleg {
12+
/// Returns the contents of the register as raw bits
13+
#[inline]
14+
pub fn bits(&self) -> usize {
15+
self.bits
16+
}
17+
18+
/// User Software Interrupt Enable
19+
#[inline]
20+
pub fn usoft(&self) -> bool {
21+
self.bits.get_bit(0)
22+
}
23+
24+
/// Supervisor Software Interrupt Enable
25+
#[inline]
26+
pub fn ssoft(&self) -> bool {
27+
self.bits.get_bit(1)
28+
}
29+
30+
/// User Timer Interrupt Enable
31+
#[inline]
32+
pub fn utimer(&self) -> bool {
33+
self.bits.get_bit(4)
34+
}
35+
36+
/// Supervisor Timer Interrupt Enable
37+
#[inline]
38+
pub fn stimer(&self) -> bool {
39+
self.bits.get_bit(5)
40+
}
41+
42+
/// User External Interrupt Enable
43+
#[inline]
44+
pub fn uext(&self) -> bool {
45+
self.bits.get_bit(8)
46+
}
47+
48+
/// Supervisor External Interrupt Enable
49+
#[inline]
50+
pub fn sext(&self) -> bool {
51+
self.bits.get_bit(9)
52+
}
53+
}
54+
55+
read_csr_as!(Mideleg, 0x304, __read_mideleg);
56+
set!(0x303, __set_mideleg);
57+
clear!(0x303, __clear_mideleg);
58+
59+
set_clear_csr!(
60+
/// User Software Interrupt Pending
61+
, set_usoft, clear_usoft, 1 << 0);
62+
set_clear_csr!(
63+
/// Supervisor Software Interrupt Pending
64+
, set_ssoft, clear_ssoft, 1 << 1);
65+
set_clear_csr!(
66+
/// User Timer Interrupt Pending
67+
, set_utimer, clear_utimer, 1 << 4);
68+
set_clear_csr!(
69+
/// Supervisor Timer Interrupt Pending
70+
, set_stimer, clear_stimer, 1 << 5);
71+
set_clear_csr!(
72+
/// User External Interrupt Pending
73+
, set_uext, clear_uext, 1 << 8);
74+
set_clear_csr!(
75+
/// Supervisor External Interrupt Pending
76+
, set_sext, clear_sext, 1 << 9);

src/register/mod.rs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -68,7 +68,8 @@ pub mod mhartid;
6868
// Machine Trap Setup
6969
pub mod mstatus;
7070
pub mod misa;
71-
// TODO: medeleg, mideleg
71+
// TODO: medeleg
72+
pub mod mideleg;
7273
pub mod mie;
7374
pub mod mtvec;
7475
// TODO: mcounteren

0 commit comments

Comments
 (0)