kernel/arch/riscv64/trap/
interrupt.rs1use crate::arch::{Trapframe, get_cpu};
2use crate::interrupt::InterruptManager;
3
4const SUPERVISOR_SOFTWARE_INTERRUPT: usize = 1;
6const SUPERVISOR_TIMER_INTERRUPT: usize = 5;
7const SUPERVISOR_EXTERNAL_INTERRUPT: usize = 9;
8
9pub fn arch_interrupt_handler(trapframe: &mut Trapframe, cause: usize) {
10 match cause {
11 SUPERVISOR_SOFTWARE_INTERRUPT => handle_software_interrupt(),
12 SUPERVISOR_TIMER_INTERRUPT => handle_timer_interrupt(trapframe),
13 SUPERVISOR_EXTERNAL_INTERRUPT => handle_external_interrupt(trapframe),
14 _ => handle_unknown_interrupt(trapframe, cause),
15 }
16}
17
18fn handle_software_interrupt() {
21 crate::early_println!("[interrupt] Software interrupt received - TODO: implement IPI");
22 }
25
26fn handle_timer_interrupt(trapframe: &mut Trapframe) {
28 crate::timer::tick(trapframe);
30}
31
32fn handle_external_interrupt(trapframe: &mut Trapframe) {
34 let cpu_id = get_cpu().get_cpuid() as u32;
35
36 match InterruptManager::with_manager(|mgr| mgr.claim_and_handle_external_interrupt(cpu_id)) {
38 Ok(Some(interrupt_id)) => {
39 }
41 Ok(None) => {
42 crate::early_println!(
43 "[interrupt] No pending external interrupt on CPU {}",
44 cpu_id
45 );
46 }
47 Err(e) => {
48 crate::early_println!("[interrupt] Failed to handle external interrupt: {}", e);
49 }
50 }
51}
52
53fn handle_unknown_interrupt(trapframe: &mut Trapframe, cause: usize) {
55 crate::early_println!("[interrupt] Unknown interrupt trapframe: {:x?}", trapframe);
56 panic!("Unknown interrupt cause: {}", cause);
57}