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