--- pistachio/platform/pc99/pistachio/kdb/io.cc	2013-06-10 11:34:34.607813369 +0200
+++ pistachio/platform/pc99/pistachio/kdb/io.cc	2013-06-10 11:32:02.607810593 +0200
@@ -336,16 +336,23 @@
 #define COMPORT         CONFIG_KDB_COMPORT
 #define RATE            CONFIG_KDB_COMSPEED
 
+static unsigned short comport = COMPORT;
+
 void Platform::serial_init(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--; );
@@ -367,8 +374,8 @@
 
 void Platform::serial_putc(char c)
 {
-    while ((in_u8(COMPORT+5) & 0x60) == 0);
-    out_u8(COMPORT,c);
+    while ((in_u8(comport+5) & 0x60) == 0);
+    out_u8(comport,c);
     if (c == '\n')
         Platform::serial_putc('\r');
 
@@ -376,11 +383,11 @@
 
 int Platform::serial_getc(bool can_block)
 {
-    if ((in_u8(COMPORT+5) & 0x01) == 0)
+    if ((in_u8(comport+5) & 0x01) == 0)
     {
         return -1;
     }
-    return (int) in_u8(COMPORT);
+    return (int) in_u8(comport);
 }
 
 DECLARE_CMD (cmd_dumpvga, arch, 'V', "screendump", "dump VGA screen contents");