From a867e77e3c75d10ade84acd48e3c7a0ee44787a8 Mon Sep 17 00:00:00 2001 From: Paul Pan Date: Fri, 23 Aug 2024 20:52:39 +0800 Subject: [PATCH] feat: kernel/plat/irq: wire up dispatch --- kernel/src/arch/riscv/trap.rs | 12 ++++++++---- kernel/src/plat/irq.rs | 6 +++++- 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/kernel/src/arch/riscv/trap.rs b/kernel/src/arch/riscv/trap.rs index e4bb207..408dce9 100644 --- a/kernel/src/arch/riscv/trap.rs +++ b/kernel/src/arch/riscv/trap.rs @@ -2,6 +2,7 @@ use crate::arch::riscv::backtrace::read_sp; use crate::entry::HART_ID; use crate::objects::*; use crate::plat::console::CONSOLE; +use crate::plat::irq::IRQ_MANAGER; use crate::plat::timer::{Timer, TimerOps}; use crate::plat::trap::{Trap, TrapContextOps, TrapOps}; use core::ops::{Index, IndexMut}; @@ -96,14 +97,17 @@ impl TrapContextOps for TrapContext { tcb.do_tick(); } }, + T::Interrupt(I::SupervisorExternal) => { + IRQ_MANAGER.lock().dispatch(); + }, + T::Interrupt(I::SupervisorSoft) => { + // This should never happen + panic_fatal!("Buggy kernel: supervisor software interrupt triggered"); + }, T::Exception(E::UserEnvCall) => { tcb.handle_syscall(); self.sepc += 4; }, - T::Interrupt(I::SupervisorExternal) => { - // TODO: handle external interrupt, e.g. plic - panic_fatal!("Unhandled External Interrupt"); - }, T::Exception(E::InstructionPageFault) | T::Exception(E::LoadPageFault) | T::Exception(E::StorePageFault) => { if from_kernel { panic_fatal!("Page Fault in Kernel"); diff --git a/kernel/src/plat/irq.rs b/kernel/src/plat/irq.rs index dcad959..3a0d42e 100644 --- a/kernel/src/plat/irq.rs +++ b/kernel/src/plat/irq.rs @@ -52,7 +52,7 @@ pub struct IrqManager { state: [IrqState; IRQ_NUM], } -pub static IRQ_MANAGER: Mutex> = Mutex::new(Lazy::new(IrqManager::new)); +pub static IRQ_MANAGER: Lazy> = Lazy::new(|| Mutex::new(IrqManager::new())); impl IrqManager { pub fn new() -> Self { @@ -61,4 +61,8 @@ impl IrqManager { state: [IrqState::Inactive; IRQ_NUM], } } + + pub fn dispatch(&mut self) { + todo!("forward to endpoint cap"); + } }