diff --git a/kernel/src/debug/mod.rs b/kernel/src/debug/mod.rs index eb00dd01a..b00170fab 100644 --- a/kernel/src/debug/mod.rs +++ b/kernel/src/debug/mod.rs @@ -167,6 +167,21 @@ fn process_irq_character(b: u8) { } match b { + b'i' => { + println!("Interrupt handlers:"); + println!(" IRQ | Process | Handler | Argument"); + crate::services::SystemServices::with(|system_services| { + crate::irq::for_each_irq(|irq, pid, address, arg| { + println!( + " {}: {} @ {:x?} {:x?}", + irq, + system_services.process_name(*pid).unwrap_or(""), + address, + arg + ); + }); + }); + } b'm' => { println!("Printing memory page tables"); crate::services::SystemServices::with(|system_services| { @@ -268,6 +283,7 @@ fn process_irq_character(b: u8) { println!("--- + -----------------------"); #[cfg(all(feature = "gdbserver", baremetal))] println!(" g | enter the gdb server"); + println!(" i | print irq handlers"); println!(" m | print MMU page tables of all processes"); println!(" p | print all processes"); println!(" P | print all processes and threads"); diff --git a/kernel/src/irq.rs b/kernel/src/irq.rs index 885513098..9bd496220 100644 --- a/kernel/src/irq.rs +++ b/kernel/src/irq.rs @@ -44,6 +44,20 @@ pub fn handle(irqs_pending: usize) -> Result(op: F) +where + F: Fn(usize, &PID, MemoryAddress, Option), +{ + unsafe { + for (idx, handler) in IRQ_HANDLERS.iter().enumerate() { + // Ignore threads that have no PC, and ignore the ISR thread + if let Some(handler) = handler { + op(idx, &handler.0, handler.1, handler.2); + } + } + } +} + pub fn interrupt_claim( irq: usize, pid: PID,