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