xref: /DragonOS/kernel/src/arch/riscv64/interrupt/mod.rs (revision 7a29d4fcbcd89a226289c7bf541c2c78623de3ad)
14fda81ceSLoGin use crate::exception::{InterruptArch, IrqFlags, IrqFlagsGuard};
24fda81ceSLoGin 
34fda81ceSLoGin pub mod ipi;
44fda81ceSLoGin 
54fda81ceSLoGin pub struct RiscV64InterruptArch;
64fda81ceSLoGin 
74fda81ceSLoGin impl InterruptArch for RiscV64InterruptArch {
84fda81ceSLoGin     unsafe fn interrupt_enable() {
9*7a29d4fcSLoGin         riscv::interrupt::enable();
104fda81ceSLoGin     }
114fda81ceSLoGin 
124fda81ceSLoGin     unsafe fn interrupt_disable() {
13*7a29d4fcSLoGin         riscv::interrupt::disable();
144fda81ceSLoGin     }
154fda81ceSLoGin 
164fda81ceSLoGin     fn is_irq_enabled() -> bool {
17*7a29d4fcSLoGin         riscv::register::sstatus::read().sie()
184fda81ceSLoGin     }
194fda81ceSLoGin 
204fda81ceSLoGin     unsafe fn save_and_disable_irq() -> IrqFlagsGuard {
21*7a29d4fcSLoGin         let sie = riscv::register::sstatus::read().sie();
22*7a29d4fcSLoGin         IrqFlagsGuard::new(IrqFlags::new(sie.into()))
234fda81ceSLoGin     }
244fda81ceSLoGin 
254fda81ceSLoGin     unsafe fn restore_irq(flags: IrqFlags) {
26*7a29d4fcSLoGin         let sie: bool = flags.flags() != 0;
27*7a29d4fcSLoGin         if sie {
28*7a29d4fcSLoGin             riscv::register::sstatus::set_sie();
29*7a29d4fcSLoGin         } else {
30*7a29d4fcSLoGin             riscv::register::sstatus::clear_sie();
31*7a29d4fcSLoGin         }
324fda81ceSLoGin     }
334fda81ceSLoGin }
344fda81ceSLoGin 
354fda81ceSLoGin /// 中断栈帧结构体
364fda81ceSLoGin #[repr(C)]
374fda81ceSLoGin #[derive(Debug, Copy, Clone)]
384fda81ceSLoGin pub struct TrapFrame {
394fda81ceSLoGin     // todo
404fda81ceSLoGin }
414fda81ceSLoGin 
424fda81ceSLoGin impl TrapFrame {
434fda81ceSLoGin     /// 判断当前中断是否来自用户模式
444fda81ceSLoGin     pub fn from_user(&self) -> bool {
454fda81ceSLoGin         unimplemented!("TrapFrame::from_user")
464fda81ceSLoGin     }
474fda81ceSLoGin }
48