kernel/arch/riscv64/trap/
interrupt.rs

1use crate::arch::Trapframe;
2use crate::sched::scheduler::get_scheduler;
3use crate::interrupt::InterruptManager;
4
5/// RISC-V S-mode interrupt causes
6const 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
19/// Handle software interrupt (IPI)
20/// TODO: Implement inter-processor interrupt handling
21fn handle_software_interrupt() {
22    crate::early_println!("[interrupt] Software interrupt received - TODO: implement IPI");
23    // TODO: CLINT software interrupt handling
24    // TODO: Inter-processor interrupt (IPI) support
25}
26
27/// Handle timer interrupt from CLINT
28fn handle_timer_interrupt(_trapframe: &mut Trapframe) {        
29    // Call the existing scheduler
30    let scheduler = get_scheduler();
31    let cpu = crate::arch::get_cpu();
32    
33    // Use the new scheduler design that saves the current task internally
34    scheduler.schedule(cpu);
35}
36
37/// Handle external interrupt from PLIC
38fn handle_external_interrupt(trapframe: &mut Trapframe) {
39    let cpu_id = trapframe.get_cpuid() as u32;
40
41    // Claim and handle external interrupt through PLIC
42    match InterruptManager::with_manager(|mgr| {
43        mgr.claim_and_handle_external_interrupt(cpu_id)
44    }) {
45        Ok(Some(interrupt_id)) => {
46            // crate::early_println!("[interrupt] Handled external interrupt {} on CPU {}", interrupt_id, cpu_id);
47        }
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
57/// Handle unknown interrupt
58fn 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}