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