You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
46 lines
1.2 KiB
Rust
46 lines
1.2 KiB
Rust
//! The module handelling kernel panic.
|
|
|
|
use core::panic::PanicInfo;
|
|
|
|
use crate::fatal;
|
|
use crate::wait_forever;
|
|
|
|
/// Avoid nested panic
|
|
fn panic_prevent_reenter() {
|
|
use core::sync::atomic::{AtomicBool, Ordering};
|
|
// This code is safe to use with AArch64, if using another
|
|
// arch, check the safety first
|
|
#[cfg(not(target_arch = "aarch64"))]
|
|
compile_error!(
|
|
"The following code is safe for aarch64, \
|
|
check the safety before using with another arch"
|
|
);
|
|
static PANIC_IN_PROGRESS: AtomicBool = AtomicBool::new(false);
|
|
if !PANIC_IN_PROGRESS.load(Ordering::Relaxed) {
|
|
PANIC_IN_PROGRESS.store(true, Ordering::Relaxed);
|
|
return;
|
|
}
|
|
wait_forever()
|
|
}
|
|
|
|
#[panic_handler]
|
|
fn panic(info: &PanicInfo) -> ! {
|
|
panic_prevent_reenter();
|
|
|
|
let (location, line, column) = match info.location() {
|
|
Some(loc) => (loc.file(), loc.line(), loc.column()),
|
|
_ => ("???", 0, 0),
|
|
};
|
|
|
|
fatal!(
|
|
"Kernel panic!\n\n\
|
|
Panic location:\n File: '{}', line {}, column {}\n\n\
|
|
{}",
|
|
location,
|
|
line,
|
|
column,
|
|
info.message().unwrap_or(&format_args!(""))
|
|
);
|
|
wait_forever()
|
|
}
|