From d9d836fe2cf6bdccae22cd5f315d520771acafaa Mon Sep 17 00:00:00 2001 From: Philipp Oppermann Date: Mon, 4 Jun 2018 13:48:39 +0200 Subject: [PATCH] Print panic message to vga buffer --- .../posts/03-vga-text-buffer/index.md | 22 ++++++++++++++++++ .../posts/03-vga-text-buffer/vga-panic.png | Bin 0 -> 8449 bytes src/main.rs | 3 ++- 3 files changed, 24 insertions(+), 1 deletion(-) create mode 100644 blog/content/second-edition/posts/03-vga-text-buffer/vga-panic.png diff --git a/blog/content/second-edition/posts/03-vga-text-buffer/index.md b/blog/content/second-edition/posts/03-vga-text-buffer/index.md index 6dd6df34..2af8d68c 100644 --- a/blog/content/second-edition/posts/03-vga-text-buffer/index.md +++ b/blog/content/second-edition/posts/03-vga-text-buffer/index.md @@ -616,6 +616,28 @@ As expected, we now see a _“Hello World!”_ on the screen: ![QEMU printing “Hello World!”](vga-hello-world.png) +### Printing Panic Messages + +Now that we have a `println` macro, we can use it in our panic function to print the panic message and the location of the panic: + +```rust +// in main.rs + +/// This function is called on panic. +#[panic_implementation] +#[no_mangle] +pub fn panic(info: &PanicInfo) -> ! { + println!("{}", info); + loop {} +} +``` + +When we now insert `panic!("Some panic message");` in our `_start` function, we get the following output: + +![QEMU printing “panicked at 'Some panic message', src/main.rs:28:5](vga-panic.png) + +So we know not only that a panic has occurred, but also the panic message and where in the code it happened. + ## Summary In this post we learned about the structure of the VGA text buffer and how it can be written through the memory mapping at address `0xb8000`. We created a Rust module that encapsulates the unsafety of writing to this memory mapped buffer and presents a safe and convenient interface to the outside. diff --git a/blog/content/second-edition/posts/03-vga-text-buffer/vga-panic.png b/blog/content/second-edition/posts/03-vga-text-buffer/vga-panic.png new file mode 100644 index 0000000000000000000000000000000000000000..7076128184e81b3e508f9b9a9b3ec135a6ddab33 GIT binary patch literal 8449 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 literal 0 HcmV?d00001 diff --git a/src/main.rs b/src/main.rs index a6bfbdb9..30879508 100644 --- a/src/main.rs +++ b/src/main.rs @@ -31,6 +31,7 @@ pub extern "C" fn _start() -> ! { /// This function is called on panic. #[panic_implementation] #[no_mangle] -pub fn panic(_info: &PanicInfo) -> ! { +pub fn panic(info: &PanicInfo) -> ! { + println!("{}", info); loop {} }