From b471b604d0eed7d67d8694b69bede8582a1262f6 Mon Sep 17 00:00:00 2001 From: bunnie Date: Mon, 10 Apr 2023 16:11:37 +0800 Subject: [PATCH] add option to print panics to screen on certain kernel panic events --- kernel/src/arch/riscv/irq.rs | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/kernel/src/arch/riscv/irq.rs b/kernel/src/arch/riscv/irq.rs index 3aaa47428..94b64987b 100644 --- a/kernel/src/arch/riscv/irq.rs +++ b/kernel/src/arch/riscv/irq.rs @@ -156,6 +156,7 @@ fn generate_exception_args(ex: &RiscvException) -> Option<[usize; 3]> { /// the Interrupt or Exception enum and passed to handle_interrupt or /// handle_exception. #[export_name = "_start_trap_rust"] +#[allow(unreachable_code)] // panic handler will terminate execution pub extern "C" fn trap_handler( a0: usize, a1: usize, @@ -355,7 +356,10 @@ pub extern "C" fn trap_handler( } _ => { + #[cfg(not(any(feature = "precursor", feature = "renode")))] println!("!!! Unrecognized exception: {:?}", ex); + #[cfg(any(feature = "precursor", feature = "renode"))] + panic!("!!! Unrecognized exception: {:?}", ex); } } @@ -393,8 +397,9 @@ pub extern "C" fn trap_handler( let is_kernel_failure = sstatus::read().spp() == sstatus::SPP::Supervisor; // The exception was not handled. We should terminate the program here. // For now, let's halt the whole system instead so that it becomes - // immediately obvious that we screwed up. On harware this will trigger + // immediately obvious that we screwed up. On hardware this will trigger // a watchdog reset. + #[cfg(not(any(feature = "precursor", feature = "renode")))] println!( "{}: CPU Exception on PID {}: {}", if is_kernel_failure { @@ -405,6 +410,17 @@ pub extern "C" fn trap_handler( pid, ex ); + #[cfg(any(feature = "precursor", feature = "renode"))] + panic!( + "{}: CPU Exception on PID {}: {}", + if is_kernel_failure { + "!!! KERNEL FAILURE !!!" + } else { + "PROGRAM HALT" + }, + pid, + ex + ); ArchProcess::with_current(|process| { println!("Current thread {}:", process.current_tid()); process.print_current_thread();