1f2022a8aSLoGin use system_error::SystemError; 2f2022a8aSLoGin 3*3bc96fa4SLoGin use crate::exception::{InterruptArch, IrqFlags, IrqFlagsGuard, IrqNumber}; 44fda81ceSLoGin 54fda81ceSLoGin pub mod ipi; 64fda81ceSLoGin 74fda81ceSLoGin pub struct RiscV64InterruptArch; 84fda81ceSLoGin 94fda81ceSLoGin impl InterruptArch for RiscV64InterruptArch { 10f2022a8aSLoGin unsafe fn arch_irq_init() -> Result<(), SystemError> { 11f2022a8aSLoGin todo!("RiscV64InterruptArch::arch_irq_init") 12f2022a8aSLoGin } 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 } 38*3bc96fa4SLoGin 39*3bc96fa4SLoGin fn probe_total_irq_num() -> u32 { 40*3bc96fa4SLoGin // todo: 获取中断总数 41*3bc96fa4SLoGin 256 42*3bc96fa4SLoGin } 43*3bc96fa4SLoGin 44*3bc96fa4SLoGin fn ack_bad_irq(irq: IrqNumber) { 45*3bc96fa4SLoGin todo!("ack_bad_irq: {}", irq.data()); 46*3bc96fa4SLoGin } 474fda81ceSLoGin } 484fda81ceSLoGin 494fda81ceSLoGin /// 中断栈帧结构体 504fda81ceSLoGin #[repr(C)] 514fda81ceSLoGin #[derive(Debug, Copy, Clone)] 524fda81ceSLoGin pub struct TrapFrame { 534fda81ceSLoGin // todo 544fda81ceSLoGin } 554fda81ceSLoGin 564fda81ceSLoGin impl TrapFrame { 574fda81ceSLoGin /// 判断当前中断是否来自用户模式 584fda81ceSLoGin pub fn from_user(&self) -> bool { 594fda81ceSLoGin unimplemented!("TrapFrame::from_user") 604fda81ceSLoGin } 614fda81ceSLoGin } 62