mirror of
https://github.com/panpaul/tiny_os
synced 2024-09-20 09:45:19 +08:00
feat: kernel/plat/irq: add inital dispatch support
This commit is contained in:
parent
c758e69946
commit
3a7517f8fc
@ -1,6 +1,7 @@
|
||||
use super::utils::generate_driver;
|
||||
use crate::drivers::irq::IrqPlic;
|
||||
use crate::objects::*;
|
||||
use log::{error, warn};
|
||||
use spin::{lazy::Lazy, Mutex};
|
||||
|
||||
const IRQ_NUM: usize = 32;
|
||||
@ -63,6 +64,36 @@ impl IrqManager {
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user