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 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);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user