Index: /trunk/src/VBox/Devices/Serial/DevSerial.cpp
===================================================================
--- /trunk/src/VBox/Devices/Serial/DevSerial.cpp	(revision 29888)
+++ /trunk/src/VBox/Devices/Serial/DevSerial.cpp	(revision 29889)
@@ -67,5 +67,6 @@
 *   Defined Constants And Macros                                               *
 *******************************************************************************/
-#define SERIAL_SAVED_STATE_VERSION  3
+#define SERIAL_SAVED_STATE_VERSION_16450        3
+#define SERIAL_SAVED_STATE_VERSION              4
 
 #define UART_LCR_DLAB       0x80        /* Divisor latch access bit */
@@ -216,4 +217,5 @@
     bool                            fYieldOnLSRRead;
     bool volatile                   fRecvWaiting;
+    bool                            f16550AEnabled;
     bool                            Alignment3[3];
     /** Time it takes to transmit a character */
@@ -459,4 +461,7 @@
         break;
     case 2:
+        if (!s->f16550AEnabled)
+            break;
+
         val = val & 0xFF;
 
@@ -941,4 +946,5 @@
     SSMR3PutU8(pSSM, pThis->msr);
     SSMR3PutU8(pSSM, pThis->scr);
+    SSMR3PutU8(pSSM, pThis->fcr); /* 16550A */
     SSMR3PutS32(pSSM, pThis->thr_ipending);
     SSMR3PutS32(pSSM, pThis->irq);
@@ -946,4 +952,10 @@
     SSMR3PutU32(pSSM, pThis->base);
     SSMR3PutBool(pSSM, pThis->msr_changed);
+
+    /* Don't store:
+     *  - the content of the FIFO
+     *  - tsr_retry
+     */
+
     return SSMR3PutU32(pSSM, ~0); /* sanity/terminator */
 }
@@ -959,5 +971,10 @@
     SerialState *pThis = PDMINS_2_DATA(pDevIns, SerialState *);
 
-    AssertMsgReturn(uVersion == SERIAL_SAVED_STATE_VERSION, ("%d\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
+    if (uVersion == SERIAL_SAVED_STATE_VERSION_16450)
+    {
+        pThis->f16550AEnabled = false;
+    }
+    else
+        AssertMsgReturn(uVersion == SERIAL_SAVED_STATE_VERSION, ("%d\n", uVersion), VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION);
 
     if (uPass == SSM_PASS_FINAL)
@@ -971,4 +988,8 @@
         SSMR3GetU8(pSSM, &pThis->msr);
         SSMR3GetU8(pSSM, &pThis->scr);
+        if (uVersion > SERIAL_SAVED_STATE_VERSION_16450)
+        {
+            SSMR3GetU8(pSSM, &pThis->fcr);
+        }
         SSMR3GetS32(pSSM, &pThis->thr_ipending);
     }
@@ -1000,6 +1021,8 @@
         AssertMsgReturn(u32 == ~0U, ("%#x\n", u32), VERR_SSM_DATA_UNIT_FORMAT_CHANGED);
 
-        if (pThis->lsr & UART_LSR_DR)
+        if (   (pThis->lsr & UART_LSR_DR)
+            || pThis->fRecvWaiting)
         {
+            pThis->fRecvWaiting = false;
             rc = RTSemEventSignal(pThis->ReceiveSem);
             AssertRC(rc);
@@ -1192,4 +1215,6 @@
 #endif
 
+    pThis->f16550AEnabled = true;
+
     /*
      * Initialize critical section and the semaphore.
@@ -1246,5 +1271,4 @@
             return rc;
     }
-
 
     if (pThis->fR0Enabled)
