diff --git a/Cargo.toml b/Cargo.toml index f10dbe64fc2eae73d09230c3036b58bca137170c..d5348af4b548db9684795674df979f901b4ae853 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -36,6 +36,7 @@ acpi = [] doc = [] graphical_debug = [] live = [] +lpss_debug = [] multi_core = ["acpi"] pti = [] qemu_debug = [] diff --git a/src/arch/x86_64/debug.rs b/src/arch/x86_64/debug.rs index 591e65da10a602c68c08612ab747b2e850436bab..c2dd73a0b9f487a8246d589dc466988ea8f8c82a 100644 --- a/src/arch/x86_64/debug.rs +++ b/src/arch/x86_64/debug.rs @@ -8,11 +8,15 @@ use crate::log::{LOG, Log}; use syscall::io::Io; #[cfg(any(feature = "qemu_debug", feature = "serial_debug"))] use crate::syscall::io::Pio; -#[cfg(feature = "serial_debug")] +#[cfg(feature = "lpss_debug")] +use crate::syscall::io::Mmio; +#[cfg(any(feature = "lpss_debug", feature = "serial_debug"))] use crate::devices::uart_16550::SerialPort; #[cfg(feature = "graphical_debug")] use super::graphical_debug::{DEBUG_DISPLAY, DebugDisplay}; +#[cfg(feature = "lpss_debug")] +use super::device::serial::LPSS; #[cfg(feature = "serial_debug")] use super::device::serial::COM1; @@ -23,6 +27,8 @@ pub struct Writer<'a> { log: MutexGuard<'a, Option<Log>>, #[cfg(feature = "graphical_debug")] display: MutexGuard<'a, Option<DebugDisplay>>, + #[cfg(feature = "lpss_debug")] + lpss: MutexGuard<'a, Option<&'static mut SerialPort<Mmio<u32>>>>, #[cfg(feature = "qemu_debug")] qemu: MutexGuard<'a, Pio<u8>>, #[cfg(feature = "serial_debug")] @@ -35,6 +41,8 @@ impl<'a> Writer<'a> { log: LOG.lock(), #[cfg(feature = "graphical_debug")] display: DEBUG_DISPLAY.lock(), + #[cfg(feature = "lpss_debug")] + lpss: LPSS.lock(), #[cfg(feature = "qemu_debug")] qemu: QEMU.lock(), #[cfg(feature = "serial_debug")] @@ -56,6 +64,13 @@ impl<'a> Writer<'a> { } } + #[cfg(feature = "lpss_debug")] + { + if let Some(ref mut lpss) = *self.lpss { + lpss.write(buf); + } + } + #[cfg(feature = "qemu_debug")] { for &b in buf { diff --git a/src/arch/x86_64/device/serial.rs b/src/arch/x86_64/device/serial.rs index 83fe75b635d93b89d875947aa0d609e8b8843179..a9548d5fe830acc9fe7ab1b32bbe65a83eb13d82 100644 --- a/src/arch/x86_64/device/serial.rs +++ b/src/arch/x86_64/device/serial.rs @@ -1,5 +1,5 @@ use crate::devices::uart_16550::SerialPort; -use crate::syscall::io::Pio; +use crate::syscall::io::{Mmio, Pio}; use spin::Mutex; pub static COM1: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>::new(0x3F8)); @@ -7,9 +7,36 @@ pub static COM2: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>:: pub static COM3: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>::new(0x3E8)); pub static COM4: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>::new(0x2E8)); +#[cfg(feature = "lpss_debug")] +pub static LPSS: Mutex<Option<&'static mut SerialPort<Mmio<u32>>>> = Mutex::new(None); + pub unsafe fn init() { COM1.lock().init(); COM2.lock().init(); COM3.lock().init(); COM4.lock().init(); + + #[cfg(feature = "lpss_debug")] + { + // TODO: Make this configurable + let address = crate::KERNEL_OFFSET + 0xFE032000; + + { + use crate::paging::{ActivePageTable, Page, VirtualAddress, entry::EntryFlags}; + use crate::memory::{Frame, PhysicalAddress}; + + let mut active_table = ActivePageTable::new(); + let page = Page::containing_address(VirtualAddress::new(address)); + let frame = Frame::containing_address(PhysicalAddress::new(address - crate::KERNEL_OFFSET)); + let result = active_table.map_to(page, frame, EntryFlags::PRESENT | EntryFlags::WRITABLE | EntryFlags::NO_EXECUTE); + result.flush(&mut active_table); + } + + let lpss = SerialPort::<Mmio<u32>>::new( + crate::KERNEL_OFFSET + 0xFE032000 + ); + lpss.init(); + + *LPSS.lock() = Some(lpss); + } }