From a86f59b32eb86a1ccb94bf1e627c1115c3b6b217 Mon Sep 17 00:00:00 2001 From: Tianhao Wang Date: Thu, 6 Jun 2024 00:02:53 +0200 Subject: io: add serial output through port 0x3f8 (qemu) not yet wrapped with fmt macros because I want some thing stateless. (i.e. I don't want to pass `&mut self` to write_str...). --- src/machine/device_io.rs | 2 +- src/machine/mod.rs | 1 + src/machine/serial.rs | 16 ++++++++++++++++ 3 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 src/machine/serial.rs (limited to 'src/machine') diff --git a/src/machine/device_io.rs b/src/machine/device_io.rs index 2a0c907..9a530f1 100644 --- a/src/machine/device_io.rs +++ b/src/machine/device_io.rs @@ -4,7 +4,7 @@ pub use crate::arch::x86_64::io_port::*; // either use the io functions directly, or via a IOPort instance. pub struct IOPort(u16); impl IOPort { - pub fn new(port: u16) -> Self { + pub const fn new(port: u16) -> Self { Self(port) } pub fn inw(&self) -> u16 { diff --git a/src/machine/mod.rs b/src/machine/mod.rs index a2cf730..b2b026f 100644 --- a/src/machine/mod.rs +++ b/src/machine/mod.rs @@ -5,5 +5,6 @@ pub mod key; pub mod keyctrl; pub mod mem; pub mod multiboot; +pub mod serial; // TODO: this module *should* be arch independent. diff --git a/src/machine/serial.rs b/src/machine/serial.rs new file mode 100644 index 0000000..edb18c0 --- /dev/null +++ b/src/machine/serial.rs @@ -0,0 +1,16 @@ +use crate::machine::device_io::IOPort; +use core::{fmt, str}; +/// serial output through port 3f8 (qemu), stateless, not thread safe. +pub struct Serial {} +impl Serial { + const PORT: IOPort = IOPort::new(0x3f8); + pub fn putchar(ch: char) { + Self::PORT.outb(ch as u8); + } + + pub fn print(s: &str) { + for c in s.bytes() { + Self::putchar(c as char); + } + } +} -- cgit v1.2.3-70-g09d2