diff --git a/kernel/kdb/platform/pc99/io.cc b/kernel/kdb/platform/pc99/io.cc
index 9dedf7a..0a70b23 100644
--- a/kernel/kdb/platform/pc99/io.cc
+++ b/kernel/kdb/platform/pc99/io.cc
@@ -299,17 +299,23 @@ static char getc_screen (bool block)
 **
 */
 
+static unsigned short comport = COMPORT;
 
 static void init_serial (void)
 {
-#define IER	(COMPORT+1)
-#define EIR	(COMPORT+2)
-#define LCR	(COMPORT+3)
-#define MCR	(COMPORT+4)
-#define LSR	(COMPORT+5)
-#define MSR	(COMPORT+6)
-#define DLLO	(COMPORT+0)
-#define DLHI	(COMPORT+1)
+    /* read BDA region to obtain I/O ports of serial device */
+    unsigned short comport_count = (*((unsigned short *)0x410) >> 9) & 0x7;
+    if (comport_count)
+        comport = *((unsigned short *)0x400);
+
+#define IER	(comport+1)
+#define EIR	(comport+2)
+#define LCR	(comport+3)
+#define MCR	(comport+4)
+#define LSR	(comport+5)
+#define MSR	(comport+6)
+#define DLLO	(comport+0)
+#define DLHI	(comport+1)
 
     out_u8(LCR, 0x80);		/* select bank 1	*/
     for (volatile int i = 10000000; i--; );
@@ -326,13 +332,14 @@ static void init_serial (void)
     in_u8(MCR);
     in_u8(LSR);
     in_u8(MSR);
+
 }
 
 
 static void putc_serial (const char c)
 {
     while ((in_u8(LSR) & 0x20) == 0);
-    out_u8(COMPORT,c);
+    out_u8(comport,c);
     while ((in_u8(LSR) & 0x40) == 0);
     if (c == '\n')
 	putc_serial('\r');
@@ -357,7 +364,7 @@ static char getc_serial (bool block)
 	getc_blocked = false;
 	
     }
-    return in_u8(COMPORT);
+    return in_u8(comport);
 }
 
 #if defined(CONFIG_KDB_BREAKIN) 
@@ -381,7 +388,7 @@ void kdebug_check_breakin (void)
     } 
 #endif
 #if defined(CONFIG_KDB_BREAKIN_ESCAPE)
-    if ((c & 0x01) && (in_u8(COMPORT) == 0x1b))
+    if ((c & 0x01) && (in_u8(comport) == 0x1b))
 	    enter_kdebug("breakin");
 #endif
     return;