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