1use crate::sbi::shutdown;
2use crate::task::current_kstack_top;
3use core::arch::asm;
4use core::panic::PanicInfo;
5use log::*;
6
7#[panic_handler]
8fn panic(info: &PanicInfo) -> ! {
9 if let Some(location) = info.location() {
10 error!(
11 "[kernel] Panicked at {}:{} {}",
12 location.file(),
13 location.line(),
14 info.message()
15 );
16 } else {
17 error!("[kernel] Panicked: {}", info.message());
18 }
19 backtrace();
20 shutdown(true)
21}
22
23fn backtrace() {
24 let mut fp: usize;
25 let stop = current_kstack_top();
26 unsafe {
27 asm!("mv {}, s0", out(reg) fp);
28 }
29 println!("---START BACKTRACE---");
30 for i in 0..10 {
31 if fp == stop {
32 break;
33 }
34 unsafe {
35 println!("#{}:ra={:#x}", i, *((fp - 8) as *const usize));
36 fp = *((fp - 16) as *const usize);
37 }
38 }
39 println!("---END BACKTRACE---");
40}