diff options
Diffstat (limited to 'src/panic_wait.rs')
-rw-r--r-- | src/panic_wait.rs | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/src/panic_wait.rs b/src/panic_wait.rs index 1136e54..2181869 100644 --- a/src/panic_wait.rs +++ b/src/panic_wait.rs @@ -2,10 +2,32 @@ //! //! A panic handler that infinitely waits +use crate::{cpu,println}; use core::panic::PanicInfo; +fn panic_prevent_reenter() { + use core::sync::atomic::{AtomicBool, Ordering}; + + static PANIC_IN_PROGRESS: AtomicBool = AtomicBool::new(false); + + if !PANIC_IN_PROGRESS.load(Ordering::Relaxed) { + PANIC_IN_PROGRESS.store(true, Ordering::Relaxed); + return; + } + + cpu::wait_forever() +} + /// # Panic handler #[panic_handler] -fn panic(_info: &PanicInfo) -> ! { - unimplemented!() +fn panic(info: &PanicInfo) -> ! { + panic_prevent_reenter(); + + let (location, line, column) = match info.location() { + Some(loc) => (loc.file(), loc.line(), loc.column()), + _ => ("???",0,0), + }; + + println!("Kernel panic!\n\nPanic Location:\n\tFile: '{}', line {}, column {}\n\n{}", location, line, column, info.message().unwrap_or(&format_args!("")),); + cpu::wait_forever() } |