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);
+    }
 }