os/
lang_items.rs

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}