Skip to content

Commit ab93f1b

Browse files
Support Serial Being logger
1 parent c40c19f commit ab93f1b

File tree

5 files changed

+38
-6
lines changed

5 files changed

+38
-6
lines changed

Cargo.lock

Lines changed: 4 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

common/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ xmas-elf = "0.8.0"
1919
raw-cpuid = "10.2.0"
2020
rand = { version = "0.8.4", default-features = false }
2121
rand_hc = "0.3.1"
22+
uart_16550 = "0.2.18"
2223

2324
[dependencies.noto-sans-mono-bitmap]
2425
version = "0.2.0"

common/src/lib.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ pub mod level_4_entries;
3333
pub mod load_kernel;
3434
/// Provides a logger that logs output as text in various formats.
3535
pub mod logger;
36+
pub mod serial;
3637

3738
const PAGE_SIZE: u64 = 4096;
3839

common/src/logger.rs

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use crate::framebuffer::FrameBufferWriter;
1+
use crate::{framebuffer::FrameBufferWriter, serial::SerialPort};
22
use bootloader_api::info::FrameBufferInfo;
33
use conquer_once::spin::OnceCell;
44
use core::fmt::Write;
@@ -8,20 +8,26 @@ use spinning_top::Spinlock;
88
pub static LOGGER: OnceCell<LockedLogger> = OnceCell::uninit();
99

1010
/// A [`FrameBufferWriter`] instance protected by a spinlock.
11-
pub struct LockedLogger(Spinlock<FrameBufferWriter>);
11+
pub struct LockedLogger(Spinlock<FrameBufferWriter>, Spinlock<SerialPort>);
1212

1313
impl LockedLogger {
1414
/// Create a new instance that logs to the given framebuffer.
1515
pub fn new(framebuffer: &'static mut [u8], info: FrameBufferInfo) -> Self {
16-
LockedLogger(Spinlock::new(FrameBufferWriter::new(framebuffer, info)))
16+
LockedLogger(
17+
Spinlock::new(FrameBufferWriter::new(framebuffer, info)),
18+
Spinlock::new(SerialPort::new()),
19+
)
1720
}
1821

1922
/// Force-unlocks the logger to prevent a deadlock.
2023
///
2124
/// ## Safety
2225
/// This method is not memory safe and should be only used when absolutely necessary.
2326
pub unsafe fn force_unlock(&self) {
24-
unsafe { self.0.force_unlock() };
27+
unsafe {
28+
self.0.force_unlock();
29+
self.1.force_unlock();
30+
};
2531
}
2632
}
2733

@@ -32,7 +38,9 @@ impl log::Log for LockedLogger {
3238

3339
fn log(&self, record: &log::Record) {
3440
let mut logger = self.0.lock();
41+
let mut serial = self.1.lock();
3542
writeln!(logger, "{:5}: {}", record.level(), record.args()).unwrap();
43+
writeln!(serial, "{:5}: {}", record.level(), record.args()).unwrap();
3644
}
3745

3846
fn flush(&self) {}

common/src/serial.rs

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
use core::fmt;
2+
3+
pub struct SerialPort {
4+
port: uart_16550::SerialPort,
5+
}
6+
7+
impl SerialPort {
8+
pub fn new() -> Self {
9+
let mut port = unsafe { uart_16550::SerialPort::new(0x3F8) };
10+
port.init();
11+
Self { port }
12+
}
13+
}
14+
15+
impl fmt::Write for SerialPort {
16+
fn write_str(&mut self, s: &str) -> fmt::Result {
17+
self.port.write_str(s).unwrap();
18+
Ok(())
19+
}
20+
}

0 commit comments

Comments
 (0)