use crate::io::vga_text::{CharState, Color, OStream}; const PANIC_SCREEN_MESSAGE_BUFFER_SIZE: usize = 2048; struct TextBuffer<'a> { dst: &'a mut [u8], len: usize, } impl<'a> TextBuffer<'a> { fn new(dst: &'a mut [u8]) -> Self { Self { dst, len: 0 } } fn get(&'a mut self) -> &'a mut [u8] { &mut self.dst[..self.len] } } impl<'a> core::fmt::Write for TextBuffer<'a> { fn write_str(&mut self, s: &str) -> core::fmt::Result { if s.len() + self.len > self.dst.len() { Err(core::fmt::Error) } else { let s = s.as_bytes(); (&mut self.dst[self.len..self.len + s.len()]).clone_from_slice(s); self.len += s.len(); Ok(()) } } } pub fn show(args: Option<&core::fmt::Arguments>) { let mut stderr = OStream::new(); stderr.set_state(CharState::from_colors(Color::LightRed, Color::Red)); stderr.clear(); stderr.print(b"uff-os"); stderr.set_row(10); stderr.set_state(CharState::from_colors(Color::White, Color::Red)); stderr.print_centered(b""); stderr.set_row(14); stderr.set_state(CharState::from_colors(Color::Cyan, Color::Red)); stderr.set_centered(true); let buffer: &mut [u8] = &mut [b' '; PANIC_SCREEN_MESSAGE_BUFFER_SIZE]; let mut tbuffer = TextBuffer::new(buffer); let _ = core::fmt::write( &mut tbuffer, *args.unwrap_or(&format_args!("no panic information obtainable")), ); stderr.print(tbuffer.get()); stderr.set_centered(false); }