xref: /DragonOS/kernel/src/arch/riscv64/interrupt/mod.rs (revision f2022a8a1cc4a8e2a85e9061e036e9c491a2fa00)
1*f2022a8aSLoGin use system_error::SystemError;
2*f2022a8aSLoGin 
34fda81ceSLoGin use crate::exception::{InterruptArch, IrqFlags, IrqFlagsGuard};
44fda81ceSLoGin 
54fda81ceSLoGin pub mod ipi;
64fda81ceSLoGin 
74fda81ceSLoGin pub struct RiscV64InterruptArch;
84fda81ceSLoGin 
94fda81ceSLoGin impl InterruptArch for RiscV64InterruptArch {
10*f2022a8aSLoGin     unsafe fn arch_irq_init() -> Result<(), SystemError> {
11*f2022a8aSLoGin         todo!("RiscV64InterruptArch::arch_irq_init")
12*f2022a8aSLoGin     }
134fda81ceSLoGin     unsafe fn interrupt_enable() {
147a29d4fcSLoGin         riscv::interrupt::enable();
154fda81ceSLoGin     }
164fda81ceSLoGin 
174fda81ceSLoGin     unsafe fn interrupt_disable() {
187a29d4fcSLoGin         riscv::interrupt::disable();
194fda81ceSLoGin     }
204fda81ceSLoGin 
214fda81ceSLoGin     fn is_irq_enabled() -> bool {
227a29d4fcSLoGin         riscv::register::sstatus::read().sie()
234fda81ceSLoGin     }
244fda81ceSLoGin 
254fda81ceSLoGin     unsafe fn save_and_disable_irq() -> IrqFlagsGuard {
267a29d4fcSLoGin         let sie = riscv::register::sstatus::read().sie();
277a29d4fcSLoGin         IrqFlagsGuard::new(IrqFlags::new(sie.into()))
284fda81ceSLoGin     }
294fda81ceSLoGin 
304fda81ceSLoGin     unsafe fn restore_irq(flags: IrqFlags) {
317a29d4fcSLoGin         let sie: bool = flags.flags() != 0;
327a29d4fcSLoGin         if sie {
337a29d4fcSLoGin             riscv::register::sstatus::set_sie();
347a29d4fcSLoGin         } else {
357a29d4fcSLoGin             riscv::register::sstatus::clear_sie();
367a29d4fcSLoGin         }
374fda81ceSLoGin     }
384fda81ceSLoGin }
394fda81ceSLoGin 
404fda81ceSLoGin /// 中断栈帧结构体
414fda81ceSLoGin #[repr(C)]
424fda81ceSLoGin #[derive(Debug, Copy, Clone)]
434fda81ceSLoGin pub struct TrapFrame {
444fda81ceSLoGin     // todo
454fda81ceSLoGin }
464fda81ceSLoGin 
474fda81ceSLoGin impl TrapFrame {
484fda81ceSLoGin     /// 判断当前中断是否来自用户模式
494fda81ceSLoGin     pub fn from_user(&self) -> bool {
504fda81ceSLoGin         unimplemented!("TrapFrame::from_user")
514fda81ceSLoGin     }
524fda81ceSLoGin }
53