1
1
//! sie register
2
2
3
+ use riscv_pac:: CoreInterruptNumber ;
4
+
3
5
read_write_csr ! {
4
6
/// sie register
5
7
Sie : 0x104 ,
6
- mask: 0x222 ,
8
+ mask: usize :: MAX ,
7
9
}
8
10
9
11
read_write_csr_field ! {
@@ -24,6 +26,26 @@ read_write_csr_field! {
24
26
sext: 9 ,
25
27
}
26
28
29
+ impl Sie {
30
+ /// Check if a specific core interrupt source is enabled.
31
+ #[ inline]
32
+ pub fn is_enabled < I : CoreInterruptNumber > ( & self , interrupt : I ) -> bool {
33
+ ( self . bits & ( 1 << interrupt. number ( ) ) ) != 0
34
+ }
35
+
36
+ /// Enable a specific core interrupt source.
37
+ #[ inline]
38
+ pub fn enable < I : CoreInterruptNumber > ( & mut self , interrupt : I ) {
39
+ self . bits |= 1 << interrupt. number ( ) ;
40
+ }
41
+
42
+ /// Disable a specific core interrupt source.
43
+ #[ inline]
44
+ pub fn disable < I : CoreInterruptNumber > ( & mut self , interrupt : I ) {
45
+ self . bits &= !( 1 << interrupt. number ( ) ) ;
46
+ }
47
+ }
48
+
27
49
set ! ( 0x104 ) ;
28
50
clear ! ( 0x104 ) ;
29
51
@@ -37,9 +59,28 @@ set_clear_csr!(
37
59
/// Supervisor External Interrupt Enable
38
60
, set_sext, clear_sext, 1 << 9 ) ;
39
61
62
+ /// Disables a specific core interrupt source.
63
+ #[ inline]
64
+ pub fn disable_interrupt < I : CoreInterruptNumber > ( interrupt : I ) {
65
+ // SAFETY: it is safe to disable an interrupt source
66
+ unsafe { _clear ( 1 << interrupt. number ( ) ) } ;
67
+ }
68
+
69
+ /// Enables a specific core interrupt source.
70
+ ///
71
+ /// # Safety
72
+ ///
73
+ /// Enabling interrupts might break critical sections or other synchronization mechanisms.
74
+ /// Ensure that this is called in a safe context where interrupts can be enabled.
75
+ #[ inline]
76
+ pub unsafe fn enable_interrupt < I : CoreInterruptNumber > ( interrupt : I ) {
77
+ unsafe { _set ( 1 << interrupt. number ( ) ) } ;
78
+ }
79
+
40
80
#[ cfg( test) ]
41
81
mod tests {
42
82
use super :: * ;
83
+ use crate :: interrupt:: supervisor:: Interrupt ;
43
84
44
85
#[ test]
45
86
fn test_sie ( ) {
@@ -49,4 +90,24 @@ mod tests {
49
90
test_csr_field ! ( sie, stimer) ;
50
91
test_csr_field ! ( sie, sext) ;
51
92
}
93
+
94
+ #[ test]
95
+ fn test_sie_interrupt ( ) {
96
+ let mut s = Sie :: from_bits ( 0 ) ;
97
+
98
+ s. enable ( Interrupt :: SupervisorSoft ) ;
99
+ assert ! ( s. is_enabled( Interrupt :: SupervisorSoft ) ) ;
100
+ s. disable ( Interrupt :: SupervisorSoft ) ;
101
+ assert ! ( !s. is_enabled( Interrupt :: SupervisorSoft ) ) ;
102
+
103
+ s. enable ( Interrupt :: SupervisorTimer ) ;
104
+ assert ! ( s. is_enabled( Interrupt :: SupervisorTimer ) ) ;
105
+ s. disable ( Interrupt :: SupervisorTimer ) ;
106
+ assert ! ( !s. is_enabled( Interrupt :: SupervisorTimer ) ) ;
107
+
108
+ s. enable ( Interrupt :: SupervisorExternal ) ;
109
+ assert ! ( s. is_enabled( Interrupt :: SupervisorExternal ) ) ;
110
+ s. disable ( Interrupt :: SupervisorExternal ) ;
111
+ assert ! ( !s. is_enabled( Interrupt :: SupervisorExternal ) ) ;
112
+ }
52
113
}
0 commit comments