xref: /DragonOS/kernel/src/arch/riscv64/interrupt/mod.rs (revision 338f6903262c5031abad3c8e361813355a27fcdb)
1f2022a8aSLoGin use system_error::SystemError;
2f2022a8aSLoGin 
3*338f6903SLoGin use crate::{
4*338f6903SLoGin     driver::irqchip::riscv_intc::riscv_intc_init,
5*338f6903SLoGin     exception::{InterruptArch, IrqFlags, IrqFlagsGuard, IrqNumber},
6*338f6903SLoGin };
74fda81ceSLoGin 
84fda81ceSLoGin pub mod ipi;
94fda81ceSLoGin 
104fda81ceSLoGin pub struct RiscV64InterruptArch;
114fda81ceSLoGin 
124fda81ceSLoGin impl InterruptArch for RiscV64InterruptArch {
13f2022a8aSLoGin     unsafe fn arch_irq_init() -> Result<(), SystemError> {
14*338f6903SLoGin         riscv_intc_init()?;
15*338f6903SLoGin 
16*338f6903SLoGin         Ok(())
17f2022a8aSLoGin     }
184fda81ceSLoGin     unsafe fn interrupt_enable() {
197a29d4fcSLoGin         riscv::interrupt::enable();
204fda81ceSLoGin     }
214fda81ceSLoGin 
224fda81ceSLoGin     unsafe fn interrupt_disable() {
237a29d4fcSLoGin         riscv::interrupt::disable();
244fda81ceSLoGin     }
254fda81ceSLoGin 
264fda81ceSLoGin     fn is_irq_enabled() -> bool {
277a29d4fcSLoGin         riscv::register::sstatus::read().sie()
284fda81ceSLoGin     }
294fda81ceSLoGin 
304fda81ceSLoGin     unsafe fn save_and_disable_irq() -> IrqFlagsGuard {
317a29d4fcSLoGin         let sie = riscv::register::sstatus::read().sie();
327a29d4fcSLoGin         IrqFlagsGuard::new(IrqFlags::new(sie.into()))
334fda81ceSLoGin     }
344fda81ceSLoGin 
354fda81ceSLoGin     unsafe fn restore_irq(flags: IrqFlags) {
367a29d4fcSLoGin         let sie: bool = flags.flags() != 0;
377a29d4fcSLoGin         if sie {
387a29d4fcSLoGin             riscv::register::sstatus::set_sie();
397a29d4fcSLoGin         } else {
407a29d4fcSLoGin             riscv::register::sstatus::clear_sie();
417a29d4fcSLoGin         }
424fda81ceSLoGin     }
433bc96fa4SLoGin 
443bc96fa4SLoGin     fn probe_total_irq_num() -> u32 {
453bc96fa4SLoGin         // todo: 获取中断总数
463bc96fa4SLoGin         256
473bc96fa4SLoGin     }
483bc96fa4SLoGin 
493bc96fa4SLoGin     fn ack_bad_irq(irq: IrqNumber) {
503bc96fa4SLoGin         todo!("ack_bad_irq: {}", irq.data());
513bc96fa4SLoGin     }
524fda81ceSLoGin }
534fda81ceSLoGin 
544fda81ceSLoGin /// 中断栈帧结构体
554fda81ceSLoGin #[repr(C)]
564fda81ceSLoGin #[derive(Debug, Copy, Clone)]
574fda81ceSLoGin pub struct TrapFrame {
584fda81ceSLoGin     // todo
594fda81ceSLoGin }
604fda81ceSLoGin 
614fda81ceSLoGin impl TrapFrame {
624fda81ceSLoGin     /// 判断当前中断是否来自用户模式
634fda81ceSLoGin     pub fn from_user(&self) -> bool {
644fda81ceSLoGin         unimplemented!("TrapFrame::from_user")
654fda81ceSLoGin     }
664fda81ceSLoGin }
67