diff --git a/src/arch/x86_64/debug.rs b/src/arch/x86_64/debug.rs
index 3da2a6634cf31569a2d931e2bfceb651ffed846f..591e65da10a602c68c08612ab747b2e850436bab 100644
--- a/src/arch/x86_64/debug.rs
+++ b/src/arch/x86_64/debug.rs
@@ -6,6 +6,7 @@ use spin::MutexGuard;
 use crate::log::{LOG, Log};
 #[cfg(feature = "qemu_debug")]
 use syscall::io::Io;
+#[cfg(any(feature = "qemu_debug", feature = "serial_debug"))]
 use crate::syscall::io::Pio;
 #[cfg(feature = "serial_debug")]
 use crate::devices::uart_16550::SerialPort;
diff --git a/src/arch/x86_64/device/serial.rs b/src/arch/x86_64/device/serial.rs
index c2b424c0f183f780214e4da72f8791fbbce07356..83fe75b635d93b89d875947aa0d609e8b8843179 100644
--- a/src/arch/x86_64/device/serial.rs
+++ b/src/arch/x86_64/device/serial.rs
@@ -4,8 +4,12 @@ use spin::Mutex;
 
 pub static COM1: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>::new(0x3F8));
 pub static COM2: Mutex<SerialPort<Pio<u8>>> = Mutex::new(SerialPort::<Pio<u8>>::new(0x2F8));
+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));
 
 pub unsafe fn init() {
     COM1.lock().init();
     COM2.lock().init();
+    COM3.lock().init();
+    COM4.lock().init();
 }
diff --git a/src/arch/x86_64/interrupt/irq.rs b/src/arch/x86_64/interrupt/irq.rs
index 8c755baa31dd4974fab94ad9c74786c6f2806bf0..ccd505c7cc29d9a0079c95d4fc90940790ed7da9 100644
--- a/src/arch/x86_64/interrupt/irq.rs
+++ b/src/arch/x86_64/interrupt/irq.rs
@@ -2,7 +2,7 @@ use core::sync::atomic::{AtomicUsize, Ordering};
 
 use crate::context::timeout;
 use crate::device::pic;
-use crate::device::serial::{COM1, COM2};
+use crate::device::serial::{COM1, COM2, COM3, COM4};
 use crate::ipi::{ipi, IpiKind, IpiTarget};
 use crate::scheme::debug::debug_input;
 use crate::{context, ptrace, time};
@@ -78,6 +78,9 @@ interrupt!(com2, {
     while let Some(c) = COM2.lock().receive() {
         debug_input(c);
     }
+    while let Some(c) = COM4.lock().receive() {
+        debug_input(c);
+    }
     pic::MASTER.ack();
 });
 
@@ -85,6 +88,9 @@ interrupt!(com1, {
     while let Some(c) = COM1.lock().receive() {
         debug_input(c);
     }
+    while let Some(c) = COM3.lock().receive() {
+        debug_input(c);
+    }
     pic::MASTER.ack();
 });