From d0ecdbef0073a5516c9b7ec56d346cf9f1febd14 Mon Sep 17 00:00:00 2001 From: natrixaeria Date: Sat, 9 Nov 2019 01:00:09 +0100 Subject: Create panic screen module with text buffer --- kernel/src/io/panic_screen.rs | 57 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 kernel/src/io/panic_screen.rs (limited to 'kernel/src/io/panic_screen.rs') diff --git a/kernel/src/io/panic_screen.rs b/kernel/src/io/panic_screen.rs new file mode 100644 index 0000000..ce2c118 --- /dev/null +++ b/kernel/src/io/panic_screen.rs @@ -0,0 +1,57 @@ +use core::fmt::Write; +use crate::io::vga_text::{OStream, CharState, Color}; + +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); + Ok(self.len += s.len()) + } + } +} + +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); +} -- cgit v1.2.3-54-g00ecf