diff options
Diffstat (limited to 'kernel/src')
-rw-r--r-- | kernel/src/interrupts/exceptions.rs | 22 | ||||
-rw-r--r-- | kernel/src/io/vga_text.rs | 9 | ||||
-rw-r--r-- | kernel/src/lib.rs | 11 |
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(); |