46 lines
1 KiB
Rust
46 lines
1 KiB
Rust
//! Intrinsics for panic handling
|
|
|
|
use interrupt::halt;
|
|
|
|
#[cfg(not(test))]
|
|
#[lang = "eh_personality"]
|
|
extern "C" fn eh_personality() {}
|
|
|
|
#[cfg(not(test))]
|
|
/// Required to handle panics
|
|
#[lang = "panic_fmt"]
|
|
extern "C" fn panic_fmt(fmt: ::core::fmt::Arguments, file: &str, line: u32) -> ! {
|
|
let mut rbp: usize;
|
|
unsafe { asm!("xchg bx, bx" : "={rbp}"(rbp) : : : "intel", "volatile"); }
|
|
|
|
println!("PANIC: {}", fmt);
|
|
println!("FILE: {}", file);
|
|
println!("LINE: {}", line);
|
|
|
|
println!("TRACE: {:>016X}", rbp);
|
|
for _frame in 0..16 { //Maximum 16 frames
|
|
unsafe {
|
|
let rip = *(rbp as *const usize).offset(1);
|
|
println!(" {:>016X}: {:>016X}", rbp, rip);
|
|
if rip == 0 {
|
|
break;
|
|
}
|
|
rbp = *(rbp as *const usize);
|
|
}
|
|
}
|
|
|
|
println!("HALT");
|
|
loop {
|
|
unsafe { halt() };
|
|
}
|
|
}
|
|
|
|
#[allow(non_snake_case)]
|
|
#[no_mangle]
|
|
/// Required to handle panics
|
|
pub extern "C" fn _Unwind_Resume() -> ! {
|
|
loop {
|
|
unsafe { halt() }
|
|
}
|
|
}
|