summaryrefslogtreecommitdiff
path: root/kernel/src/io/serial.rs
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/io/serial.rs')
-rw-r--r--kernel/src/io/serial.rs53
1 files changed, 35 insertions, 18 deletions
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<SerialPort> = {
+ let mut serial_port = unsafe { SerialPort::new(0x3F8) };
+ serial_port.init();
+ Mutex::new(serial_port)
+ };
+}*/
+const SERIAL_IO_PORT: u16 = 0x3F8;
+
+static CONNECTION: Mutex<Serial> = 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)
+ }
}