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