os/arch/riscv/intr/
mod.rs1#![allow(unused)]
3mod softirq;
4
5use riscv::register::{
6 sie,
7 sstatus::{self, Sstatus},
8};
9pub use softirq::*;
10
11use crate::{
12 arch::{
13 constant::{IRQ_MIN, SSTATUS_SIE},
14 mm::paddr_to_vaddr,
15 },
16 println,
17};
18
19pub unsafe fn enable_timer_interrupt() {
23 unsafe { sie::set_stimer() };
24}
25
26pub unsafe fn disable_timer_interrupt() {
30 unsafe { sie::clear_stimer() };
31}
32
33pub unsafe fn enable_interrupts() {
37 unsafe { sstatus::set_sie() };
38}
39
40pub unsafe fn disable_interrupts() {
44 unsafe { sstatus::clear_sie() };
45}
46
47pub fn are_interrupts_enabled() -> bool {
49 sstatus::read().sie()
50}
51
52pub unsafe fn read_and_disable_interrupts() -> usize {
57 let sie_mask: usize = 1 << 1;
59 let old: usize;
60 unsafe {
62 core::arch::asm!(
63 "csrrc {old}, sstatus, {mask}",
64 old = out(reg) old,
65 mask = in(reg) sie_mask,
66 options(nomem, nostack)
67 );
68 }
69 old
70}
71
72pub unsafe fn read_and_enable_interrupts() -> usize {
74 let sie_mask: usize = 1 << 1;
76 let old: usize;
77 unsafe {
79 core::arch::asm!(
80 "csrrs {old}, sstatus, {mask}",
81 old = out(reg) old,
82 mask = in(reg) sie_mask,
83 options(nomem, nostack)
84 );
85 }
86 old
87}
88pub unsafe fn restore_interrupts(flags: usize) {
93 let spie: usize = flags & SSTATUS_SIE;
94 if spie != 0 {
95 unsafe { sstatus::set_sie() };
96 }
97}
98
99pub fn enable_irq(irq: usize) {
101 }