summaryrefslogtreecommitdiff
path: root/kernel
diff options
context:
space:
mode:
Diffstat (limited to 'kernel')
-rw-r--r--kernel/src/interrupts/exceptions.rs22
-rw-r--r--kernel/src/io/vga_text.rs9
-rw-r--r--kernel/src/lib.rs11
3 files changed, 31 insertions, 11 deletions
diff --git a/kernel/src/interrupts/exceptions.rs b/kernel/src/interrupts/exceptions.rs
index b6fb5a6..88c78a7 100644
--- a/kernel/src/interrupts/exceptions.rs
+++ b/kernel/src/interrupts/exceptions.rs
@@ -1,11 +1,19 @@
use x86_64::structures::idt::{InterruptStackFrame, PageFaultErrorCode};
+macro_rules! exception_default {
+ ($stack_frame: expr) => {
+ format_args!("instruction addr: 0x{:08x}\nstack addr: 0x{:08x}\nflags: 0x{:x}",
+ $stack_frame.instruction_pointer.as_u64(),
+ $stack_frame.cpu_flags,
+ $stack_frame.stack_pointer.as_u64()
+ )
+ }
+}
+
pub extern "x86-interrupt" fn breakpoint_handler(stack_frame: &mut InterruptStackFrame) {
panic!(
- "BREAKPOINT at {:x} Flags: {:b} Stack: {:x}",
- stack_frame.instruction_pointer.as_u64(),
- stack_frame.cpu_flags,
- stack_frame.stack_pointer.as_u64()
+ "BREAKPOINT exception thrown\n\n{}",
+ exception_default!(stack_frame)
);
}
@@ -16,11 +24,11 @@ pub extern "x86-interrupt" fn page_fault_handler(
use x86_64::registers::control::Cr2;
panic!(
- "PAGE FAULT while accessing address: {:x}{:?}Flags: {:b} Stack: {:x}",
+ "PAGE FAULT while accessing address: 0x{:08x}\nerror code: {:?}(0x{:x})\n{}",
Cr2::read().as_u64(),
error_code,
- stack_frame.cpu_flags,
- stack_frame.stack_pointer.as_u64()
+ error_code.bits(),
+ exception_default!(stack_frame)
);
}
diff --git a/kernel/src/io/vga_text.rs b/kernel/src/io/vga_text.rs
index 833c191..277db73 100644
--- a/kernel/src/io/vga_text.rs
+++ b/kernel/src/io/vga_text.rs
@@ -160,10 +160,11 @@ impl OStream {
pub fn print_centered(&mut self, s: &[u8]) {
let mut line_start = 0;
let mut line_len = 0;
- for chunk in s.chunks(WIDTH) {
- for line in chunk.split(|&c| c == b'\n') {
- self.set_col((WIDTH - line.len()) >> 1);
- self.put_bytes(line);
+ for line in s.split(|&c| c == b'\n') {
+ if line.is_empty() { self.new_line() }
+ for chunk in line.chunks(WIDTH) {
+ self.set_col((WIDTH - chunk.len()) >> 1);
+ self.put_bytes(chunk);
self.new_line()
}
}
diff --git a/kernel/src/lib.rs b/kernel/src/lib.rs
index d18ca6f..e18c22c 100644
--- a/kernel/src/lib.rs
+++ b/kernel/src/lib.rs
@@ -33,6 +33,17 @@ pub extern "C" fn _start() -> ! {
test_main();
qemu::exit_qemu(qemu::QemuExitCode::Success);
}
+
+ fn _loop(i: u64) -> u64 {
+ if i > 0b1010101001101101 {
+ return i;
+ }
+ let n = i;
+ let mut stdout = OStream::new();
+ write!(&mut stdout, "{:x}", &n as *const u64 as u64).unwrap();
+ _loop(i + 1)
+ }
+ _loop(0);
x86_64::instructions::interrupts::int3();
let stdout = OStream::new();