From a7f35e14cc0be480963b7094d1de5a8c1d3fa190 Mon Sep 17 00:00:00 2001 From: Jeremy Soller <jackpot51@gmail.com> Date: Wed, 5 Apr 2017 20:11:51 -0600 Subject: [PATCH] Cleanup debug scheme --- src/console.rs | 14 ------------- src/device/serial.rs | 48 +++++++++++++++++++++----------------------- src/interrupt/irq.rs | 4 ++-- src/lib.rs | 3 --- src/macros.rs | 2 +- src/scheme/debug.rs | 12 +++++------ 6 files changed, 32 insertions(+), 51 deletions(-) delete mode 100644 src/console.rs diff --git a/src/console.rs b/src/console.rs deleted file mode 100644 index 92f28d86..00000000 --- a/src/console.rs +++ /dev/null @@ -1,14 +0,0 @@ -use core::fmt::{self, Write}; -use spin::Mutex; - -use device::serial::COM1; - -pub static CONSOLE: Mutex<Console> = Mutex::new(Console); - -pub struct Console; - -impl Write for Console { - fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { - COM1.lock().write_str(s) - } -} diff --git a/src/device/serial.rs b/src/device/serial.rs index 87e18c73..b29c8b05 100644 --- a/src/device/serial.rs +++ b/src/device/serial.rs @@ -1,6 +1,7 @@ use core::fmt::{self, Write}; use spin::Mutex; +use scheme::debug::debug_input; use syscall::io::{Io, Pio, ReadOnly}; pub static COM1: Mutex<SerialPort> = Mutex::new(SerialPort::new(0x3F8)); @@ -63,15 +64,6 @@ impl SerialPort { } } - fn line_sts(&self) -> LineStsFlags { - LineStsFlags::from_bits_truncate(self.line_sts.read()) - } - - fn write(&mut self, data: u8) { - while ! self.line_sts().contains(OUTPUT_EMPTY) {} - self.data.write(data) - } - fn init(&mut self) { //TODO: Cleanup self.int_en.write(0x00); @@ -84,15 +76,30 @@ impl SerialPort { self.int_en.write(0x01); } - pub fn on_receive(&mut self) { + fn line_sts(&self) -> LineStsFlags { + LineStsFlags::from_bits_truncate(self.line_sts.read()) + } + + pub fn receive(&mut self) { while self.line_sts().contains(INPUT_FULL) { - let data = self.data.read(); + debug_input(self.data.read()); + } + } - extern { - fn debug_input(byte: u8); + pub fn send(&mut self, data: u8) { + match data { + 8 | 0x7F => { + while ! self.line_sts().contains(OUTPUT_EMPTY) {} + self.data.write(8); + while ! self.line_sts().contains(OUTPUT_EMPTY) {} + self.data.write(b' '); + while ! self.line_sts().contains(OUTPUT_EMPTY) {} + self.data.write(8); + }, + _ => { + while ! self.line_sts().contains(OUTPUT_EMPTY) {} + self.data.write(data); } - - unsafe { debug_input(data) }; } } } @@ -100,16 +107,7 @@ impl SerialPort { impl Write for SerialPort { fn write_str(&mut self, s: &str) -> Result<(), fmt::Error> { for byte in s.bytes() { - match byte { - 8 | 0x7F => { - self.write(8); - self.write(b' '); - self.write(8); - }, - _ => { - self.write(byte); - } - } + self.send(byte); } Ok(()) diff --git a/src/interrupt/irq.rs b/src/interrupt/irq.rs index a83a33f4..97632362 100644 --- a/src/interrupt/irq.rs +++ b/src/interrupt/irq.rs @@ -54,12 +54,12 @@ interrupt!(cascade, { }); interrupt!(com2, { - COM2.lock().on_receive(); + COM2.lock().receive(); pic::MASTER.ack(); }); interrupt!(com1, { - COM1.lock().on_receive(); + COM1.lock().receive(); pic::MASTER.ack(); }); diff --git a/src/lib.rs b/src/lib.rs index 131afa03..55d3c57b 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -50,9 +50,6 @@ pub mod consts; /// ACPI table parsing mod acpi; -/// Console handling -pub mod console; - /// Context management pub mod context; diff --git a/src/macros.rs b/src/macros.rs index 6946c201..a54fb353 100644 --- a/src/macros.rs +++ b/src/macros.rs @@ -3,7 +3,7 @@ macro_rules! print { ($($arg:tt)*) => ({ use core::fmt::Write; - let _ = write!($crate::console::CONSOLE.lock(), $($arg)*); + let _ = write!($crate::device::serial::COM1.lock(), $($arg)*); }); } diff --git a/src/scheme/debug.rs b/src/scheme/debug.rs index 4d929a84..ddfa120c 100644 --- a/src/scheme/debug.rs +++ b/src/scheme/debug.rs @@ -1,8 +1,8 @@ -use core::str; use core::sync::atomic::Ordering; use spin::Once; use context; +use device::serial::COM1; use scheme::*; use sync::WaitQueue; use syscall::flag::EVENT_READ; @@ -19,10 +19,8 @@ fn init_input() -> WaitQueue<u8> { } /// Add to the input queue -#[no_mangle] -pub extern fn debug_input(b: u8) { +pub fn debug_input(b: u8) { let len = INPUT.call_once(init_input).send(b); - context::event::trigger(DEBUG_SCHEME_ID.load(Ordering::SeqCst), 0, EVENT_READ, len); } @@ -55,8 +53,10 @@ impl Scheme for DebugScheme { /// /// Returns the number of bytes written fn write(&self, _file: usize, buffer: &[u8]) -> Result<usize> { - //TODO: Write bytes, do not convert to str - print!("{}", unsafe { str::from_utf8_unchecked(buffer) }); + let mut com = COM1.lock(); + for &byte in buffer.iter() { + com.send(byte); + } Ok(buffer.len()) } -- GitLab