Nothing to see here, move along
at main 94 lines 3.0 kB view raw
1use core::panic::PanicInfo; 2 3#[cfg(not(lancer_test))] 4#[panic_handler] 5fn panic(info: &PanicInfo) -> ! { 6 x86_64::instructions::interrupts::disable(); 7 { 8 use core::fmt::Write; 9 let mut w = crate::arch::serial::SerialWriter; 10 let formatted = (|| -> Result<(), core::fmt::Error> { 11 w.write_str("\n")?; 12 lancer_log::format::write_gutter( 13 &mut w, 14 "kern", 15 lancer_log::Severity::Error, 16 format_args!("panic"), 17 crate::log::KLOG_GUTTER, 18 )?; 19 w.write_str("\n")?; 20 match info.location() { 21 Some(loc) => { 22 lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER)?; 23 writeln!( 24 w, 25 "{}{}:{}{}", 26 lancer_log::color::Fg(lancer_log::palette::PURE_WHITE), 27 loc.file(), 28 loc.line(), 29 lancer_log::color::Reset, 30 )?; 31 } 32 None => {} 33 } 34 lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER)?; 35 writeln!( 36 w, 37 "{}{}{}", 38 lancer_log::color::Fg(lancer_log::palette::ICE_WHITE), 39 info.message(), 40 lancer_log::color::Reset, 41 )?; 42 Ok(()) 43 })(); 44 match formatted { 45 Ok(()) => {} 46 Err(_) => { 47 let _ = writeln!(w, "KERNEL PANIC: {}", info); 48 } 49 } 50 } 51 loop { 52 x86_64::instructions::hlt(); 53 } 54} 55 56#[cfg(lancer_test)] 57#[panic_handler] 58fn panic(info: &PanicInfo) -> ! { 59 use core::fmt::Write; 60 let mut w = crate::arch::serial::SerialWriter; 61 let (num, name) = crate::test_harness::current(); 62 let _ = writeln!(w, "\nnot ok {} - {}", num, name); 63 let _ = lancer_log::format::write_gutter( 64 &mut w, 65 "test", 66 lancer_log::Severity::Error, 67 format_args!("{}", name), 68 crate::log::KLOG_GUTTER, 69 ); 70 let _ = w.write_str("\n"); 71 match info.location() { 72 Some(loc) => { 73 let _ = lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER); 74 let _ = writeln!( 75 w, 76 "{}{}:{}{}", 77 lancer_log::color::Fg(lancer_log::palette::PURE_WHITE), 78 loc.file(), 79 loc.line(), 80 lancer_log::color::Reset, 81 ); 82 } 83 None => {} 84 } 85 let _ = lancer_log::format::write_continuation(&mut w, crate::log::KLOG_GUTTER); 86 let _ = writeln!( 87 w, 88 "{}{}{}", 89 lancer_log::color::Fg(lancer_log::palette::ICE_WHITE), 90 info.message(), 91 lancer_log::color::Reset, 92 ); 93 crate::qemu::exit(crate::qemu::ExitCode::Failure); 94}