From fe157268a376f5b945f1d64629e051340b06e6f2 Mon Sep 17 00:00:00 2001 From: Christian Cunningham Date: Fri, 19 Aug 2022 23:13:53 -0700 Subject: New allocation --- src/panic_wait.rs | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) (limited to 'src/panic_wait.rs') 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() } -- cgit v1.2.1