Add a print_error function, which works for exceptions inside println

This commit is contained in:
Philipp Oppermann
2016-05-28 15:41:16 +02:00
parent c1df1d3354
commit f58a6fe185
3 changed files with 18 additions and 3 deletions

View File

@@ -14,7 +14,9 @@ pub fn init() {
IDT.load();
}
use vga_buffer::print_error;
extern "C" fn page_fault_handler() -> ! {
println!("EXCEPTION: PAGE FAULT");
unsafe { print_error(format_args!("EXCEPTION: PAGE FAULT")) };
loop {}
}

View File

@@ -49,8 +49,8 @@ pub extern "C" fn rust_main(multiboot_information_address: usize) {
// initialize our IDT
interrupts::init();
// provoke a page fault by writing to some random address
unsafe{ *(0xdeadbeaf as *mut u64) = 42 };
// provoke a page fault inside println
println!("{:?}", unsafe{ *(0xdeadbeaf as *mut u64) = 42 });
println!("It did not crash!");
loop {}

View File

@@ -38,6 +38,19 @@ pub fn clear_screen() {
}
}
pub unsafe fn print_error(fmt: fmt::Arguments) {
use core::fmt::Write;
let mut writer = Writer {
column_position: 0,
color_code: ColorCode::new(Color::Red, Color::Black),
buffer: Unique::new(0xb8000 as *mut _),
};
writer.new_line();
writer.write_fmt(fmt);
}
#[allow(dead_code)]
#[repr(u8)]
pub enum Color {