diff --git a/src/console.rs b/src/console.rs deleted file mode 100644 index 92f28d868eb5d098fe8eef91a707723cd3325eb3..0000000000000000000000000000000000000000 --- 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 87e18c73d7e15b01a1cfa883883b4a4fae7e0f89..b29c8b05dbcb1cac0b30d225c70249e42422324a 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 a83a33f4c8e842c88a5e72b95213089e886bc021..976323621a6297d942fd8e0cc21589d51d070a89 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 131afa037f303e328c27d7064e04548e3ef067e6..55d3c57baf37b72365202750dd830d6f7c133fe0 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 6946c2010e51d1d45a3c2162b400c32e7c4a2596..a54fb35399bd2ab11b687e3d0024f681fa9ee1d3 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 4d929a84b66a0ec9e774c557509520cf8369161e..ddfa120c029961f9d69511f4d5200a77c575958f 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()) }