feat: kernel/plat/irq: add inital dispatch support

This commit is contained in:
Paul Pan 2024-09-03 20:38:07 +08:00
parent c758e69946
commit 3a7517f8fc

View File

@ -1,6 +1,7 @@
use super::utils::generate_driver; use super::utils::generate_driver;
use crate::drivers::irq::IrqPlic; use crate::drivers::irq::IrqPlic;
use crate::objects::*; use crate::objects::*;
use log::{error, warn};
use spin::{lazy::Lazy, Mutex}; use spin::{lazy::Lazy, Mutex};
const IRQ_NUM: usize = 32; const IRQ_NUM: usize = 32;
@ -63,6 +64,36 @@ impl IrqManager {
} }
pub fn dispatch(&mut self) { pub fn dispatch(&mut self) {
todo!("forward to endpoint cap"); let irq = IRQ_DRIVER.lock().claim();
if irq.is_none() {
warn!("[IrqManager] No pending IRQ found");
return;
}
let irq = irq.unwrap();
if irq >= IRQ_NUM {
error!("[IrqManager] Invalid IRQ number: {}", irq);
IRQ_DRIVER.lock().disable(irq);
IRQ_DRIVER.lock().complete(irq);
return;
}
match self.state[irq] {
IrqState::Inactive => {
warn!("[IrqManager] Received disabled IRQ: {}", irq);
IRQ_DRIVER.lock().disable(irq);
},
IrqState::Signal => {
// TODO: send signal via endpoint
warn!("[IrqManager] Undelivered IRQ: {}", irq);
IRQ_DRIVER.lock().disable(irq);
},
IrqState::Ipi => {
todo!("Kernel: NO SMP support now");
},
IrqState::Reserved => error!("[IrqManager] Received unhandled reserved IRQ: {}", irq),
}
IRQ_DRIVER.lock().complete(irq);
} }
} }