From 403c53fd6c7059c159db1604eb178251239fc4bf Mon Sep 17 00:00:00 2001 From: Dennis Kobert Date: Mon, 4 Nov 2019 03:25:16 +0100 Subject: Implement serial connection and basic testing --- kernel/src/io/serial.rs | 53 ++++++++++++++++++++++++++++++++----------------- 1 file changed, 35 insertions(+), 18 deletions(-) (limited to 'kernel/src/io/serial.rs') diff --git a/kernel/src/io/serial.rs b/kernel/src/io/serial.rs index e1d4660..2a3bae8 100644 --- a/kernel/src/io/serial.rs +++ b/kernel/src/io/serial.rs @@ -1,25 +1,42 @@ -#[derive(Debug, Clone, Copy, PartialEq, Eq)] -#[repr(u32)] -pub enum QemuExitCode { - Success = 0x10, // The actual exit code is (value << 1) | 1. - Failed = 0x11, +use spin::Mutex; +use uart_16550::SerialPort; + +/*lazy_static! { + pub static ref SERIAL1: Mutex = { + let mut serial_port = unsafe { SerialPort::new(0x3F8) }; + serial_port.init(); + Mutex::new(serial_port) + }; +}*/ +const SERIAL_IO_PORT: u16 = 0x3F8; + +static CONNECTION: Mutex = Mutex::new(Serial { + initialized: false, + port: unsafe { SerialPort::new(SERIAL_IO_PORT) }, +}); + +struct Serial { + pub initialized: bool, + pub port: SerialPort, } -pub fn exit_qemu(exit_code: QemuExitCode) { - use x86_64::instructions::port::Port; +pub struct SerialStream {} - unsafe { - let mut port = Port::new(0xf4); - port.write(exit_code as u32); +impl SerialStream { + pub fn new() -> Self { + SerialStream {} } } -fn trivial_assertion() { - use crate::io::vga_text::OStream; - let mut stdout = OStream::new(); - stdout.clear(); - - stdout.print(b"trivial assertion... "); - assert_eq!(0, 1); - stdout.print(b"[ok]"); +impl core::fmt::Write for SerialStream { + fn write_str(&mut self, s: &str) -> core::fmt::Result { + let mut guard = CONNECTION.lock(); + if !guard.initialized { + unsafe { + guard.port.init(); + } + guard.initialized = true; + } + guard.port.write_str(s) + } } -- cgit v1.2.3-54-g00ecf