aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/lib.rs4
-rw-r--r--src/machine/device_io.rs2
-rw-r--r--src/machine/mod.rs1
-rw-r--r--src/machine/serial.rs16
4 files changed, 21 insertions, 2 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 99478be..185014d 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -9,7 +9,6 @@ mod ds;
mod io;
mod machine;
mod mm;
-use crate::machine::key::Modifiers;
mod proc;
extern crate alloc;
use alloc::vec::Vec;
@@ -19,7 +18,9 @@ use arch::x86_64::interrupt::pic_8259::PicDeviceInt;
use core::panic::PanicInfo;
use defs::*;
use machine::cgascr::CGAScreen;
+use machine::key::Modifiers;
use machine::multiboot;
+use machine::serial::Serial;
#[cfg(not(test))]
#[panic_handler]
@@ -61,6 +62,7 @@ pub extern "C" fn _entry() -> ! {
for s in test_vec.iter() {
println!("{s}");
}
+ Serial::print("hello from serial");
loop {
io::KBCTL_GLOBAL.lock().fetch_key();
if let Some(k) = io::KBCTL_GLOBAL.lock().consume_key() {
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);
+ }
+ }
+}