use core::panic::PanicInfo; #[cfg(not(lancer_test))] #[panic_handler] fn panic(info: &PanicInfo) -> ! { x86_64::instructions::interrupts::disable(); { use core::fmt::Write; let mut w = crate::arch::serial::SerialWriter; let formatted = (|| -> Result<(), core::fmt::Error> { w.write_str("\n")?; lancer_log::format::write_gutter( &mut w, "kern", lancer_log::Severity::Error, format_args!("panic"), crate::log::KLOG_GUTTER, )?; w.write_str("\n")?; match info.location() { Some(loc) => { lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER)?; writeln!( w, "{}{}:{}{}", lancer_log::color::Fg(lancer_log::palette::PURE_WHITE), loc.file(), loc.line(), lancer_log::color::Reset, )?; } None => {} } lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER)?; writeln!( w, "{}{}{}", lancer_log::color::Fg(lancer_log::palette::ICE_WHITE), info.message(), lancer_log::color::Reset, )?; Ok(()) })(); match formatted { Ok(()) => {} Err(_) => { let _ = writeln!(w, "KERNEL PANIC: {}", info); } } } loop { x86_64::instructions::hlt(); } } #[cfg(lancer_test)] #[panic_handler] fn panic(info: &PanicInfo) -> ! { use core::fmt::Write; let mut w = crate::arch::serial::SerialWriter; let (num, name) = crate::test_harness::current(); let _ = writeln!(w, "\nnot ok {} - {}", num, name); let _ = lancer_log::format::write_gutter( &mut w, "test", lancer_log::Severity::Error, format_args!("{}", name), crate::log::KLOG_GUTTER, ); let _ = w.write_str("\n"); match info.location() { Some(loc) => { let _ = lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER); let _ = writeln!( w, "{}{}:{}{}", lancer_log::color::Fg(lancer_log::palette::PURE_WHITE), loc.file(), loc.line(), lancer_log::color::Reset, ); } None => {} } let _ = lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER); let _ = writeln!( w, "{}{}{}", lancer_log::color::Fg(lancer_log::palette::ICE_WHITE), info.message(), lancer_log::color::Reset, ); crate::qemu::exit(crate::qemu::ExitCode::Failure); }