From b304764fb5bde83c0a8339fa7633b66ac18df245 Mon Sep 17 00:00:00 2001 From: WangRunji Date: Fri, 15 Mar 2019 15:34:33 +0800 Subject: [PATCH] fix VGA on x86_64 --- kernel/Cargo.lock | 2 +- kernel/src/arch/x86_64/driver/vga.rs | 3 ++- kernel/src/arch/x86_64/io.rs | 13 +++++++++++-- 3 files changed, 14 insertions(+), 4 deletions(-) diff --git a/kernel/Cargo.lock b/kernel/Cargo.lock index 6994a2c..785fb39 100644 --- a/kernel/Cargo.lock +++ b/kernel/Cargo.lock @@ -79,7 +79,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "bootloader" version = "0.3.14" -source = "git+https://github.com/wangrunji0408/bootloader#4014546a8655232d87e863b564ae1e4e027f9849" +source = "git+https://github.com/wangrunji0408/bootloader#d19ff0de234a8a54d4f93c355af5399672e026ae" dependencies = [ "apic 0.1.0 (git+https://github.com/wangrunji0408/APIC-Rust)", "fixedvec 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/kernel/src/arch/x86_64/driver/vga.rs b/kernel/src/arch/x86_64/driver/vga.rs index b4f096b..11f79d7 100644 --- a/kernel/src/arch/x86_64/driver/vga.rs +++ b/kernel/src/arch/x86_64/driver/vga.rs @@ -68,7 +68,8 @@ impl VgaBuffer { lazy_static! { pub static ref VGA_WRITER: Mutex = Mutex::new( - VgaWriter::new(unsafe{ &mut *((KERNEL_OFFSET + 0xb8000) as *mut VgaBuffer) }) + // VGA virtual address is specified at bootloader + VgaWriter::new(unsafe{ &mut *((KERNEL_OFFSET + 0xf0000000) as *mut VgaBuffer) }) ); } diff --git a/kernel/src/arch/x86_64/io.rs b/kernel/src/arch/x86_64/io.rs index cf054e1..9927d5a 100644 --- a/kernel/src/arch/x86_64/io.rs +++ b/kernel/src/arch/x86_64/io.rs @@ -1,4 +1,5 @@ use super::driver::serial::*; +use super::driver::vga::VGA_WRITER; use core::fmt::{Arguments, Write}; pub fn getchar() -> char { @@ -7,6 +8,14 @@ pub fn getchar() -> char { } pub fn putfmt(fmt: Arguments) { - unsafe { COM1.force_unlock(); } - COM1.lock().write_fmt(fmt).unwrap() + #[cfg(feature = "nographic")] + { + unsafe { COM1.force_unlock(); } + COM1.lock().write_fmt(fmt).unwrap(); + } + #[cfg(not(feature = "nographic"))] + { + unsafe { VGA_WRITER.force_unlock(); } + VGA_WRITER.lock().write_fmt(fmt).unwrap(); + } } \ No newline at end of file