Index: /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 43658)
+++ /trunk/src/VBox/Devices/Storage/DevBusLogic.cpp	(revision 43659)
@@ -2063,5 +2063,5 @@
         memcpy(pBusLogic->VBoxSCSI.pBuf, &ScsiInquiryData, 5);
 
-        rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest);
+        rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, SCSI_STATUS_OK);
         AssertMsgRCReturn(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc), rc);
 
@@ -2402,5 +2402,5 @@
         if (pTaskState->fBIOS)
         {
-            rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, pSCSIRequest);
+            rc = vboxscsiRequestFinished(&pBusLogic->VBoxSCSI, pSCSIRequest, rcCompletion);
             AssertMsgRC(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc));
         }
@@ -3367,5 +3367,5 @@
     {
         /* Register I/O port space for BIOS access. */
-        rc = PDMDevHlpIOPortRegister(pDevIns, BUSLOGIC_BIOS_IO_PORT, 3, NULL,
+        rc = PDMDevHlpIOPortRegister(pDevIns, BUSLOGIC_BIOS_IO_PORT, 4, NULL,
                                      buslogicBIOSIOPortWrite, buslogicBIOSIOPortRead,
                                      buslogicBIOSIOPortWriteStr, buslogicBIOSIOPortReadStr,
Index: /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 43658)
+++ /trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp	(revision 43659)
@@ -2110,5 +2110,5 @@
         if (RT_UNLIKELY(pTaskState->fBIOS))
         {
-            int rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, pSCSIRequest);
+            int rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, pSCSIRequest, rcCompletion);
             AssertMsgRC(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc));
         }
@@ -3728,5 +3728,5 @@
     memcpy(pLsiLogic->VBoxSCSI.pBuf, &ScsiInquiryData, 5);
 
-    rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, &pTaskState->PDMScsiRequest);
+    rc = vboxscsiRequestFinished(&pLsiLogic->VBoxSCSI, &pTaskState->PDMScsiRequest, SCSI_STATUS_OK);
     AssertMsgRCReturn(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc), rc);
 
@@ -5230,5 +5230,5 @@
     {
         if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
-            rc = PDMDevHlpIOPortRegister(pDevIns, LSILOGIC_BIOS_IO_PORT, 3, NULL,
+            rc = PDMDevHlpIOPortRegister(pDevIns, LSILOGIC_BIOS_IO_PORT, 4, NULL,
                                          lsilogicIsaIOPortWrite, lsilogicIsaIOPortRead,
                                          lsilogicIsaIOPortWriteStr, lsilogicIsaIOPortReadStr,
Index: /trunk/src/VBox/Devices/Storage/VBoxSCSI.cpp
===================================================================
--- /trunk/src/VBox/Devices/Storage/VBoxSCSI.cpp	(revision 43658)
+++ /trunk/src/VBox/Devices/Storage/VBoxSCSI.cpp	(revision 43659)
@@ -39,17 +39,18 @@
 static void vboxscsiReset(PVBOXSCSI pVBoxSCSI)
 {
-    pVBoxSCSI->regIdentify = 0;
-    pVBoxSCSI->cbCDB       = 0;
+    pVBoxSCSI->regIdentify   = 0;
+    pVBoxSCSI->cbCDB         = 0;
     memset(pVBoxSCSI->aCDB, 0, sizeof(pVBoxSCSI->aCDB));
-    pVBoxSCSI->iCDB        = 0;
-    pVBoxSCSI->fBusy       = false;
-    pVBoxSCSI->cbBuf       = 0;
-    pVBoxSCSI->iBuf        = 0;
+    pVBoxSCSI->iCDB          = 0;
+    pVBoxSCSI->fBusy         = false;
+    pVBoxSCSI->rcCompletion  = 0;
+    pVBoxSCSI->uTargetDevice = 0;
+    pVBoxSCSI->cbBuf         = 0;
+    pVBoxSCSI->iBuf          = 0;
     if (pVBoxSCSI->pBuf)
         RTMemFree(pVBoxSCSI->pBuf);
 
-    pVBoxSCSI->pBuf        = NULL;
-    pVBoxSCSI->enmState    = VBOXSCSISTATE_NO_COMMAND;
-
+    pVBoxSCSI->pBuf          = NULL;
+    pVBoxSCSI->enmState      = VBOXSCSISTATE_NO_COMMAND;
 }
 
@@ -92,6 +93,6 @@
                 RTThreadYield();
             }
-            else
-                uVal &= ~VBOX_SCSI_BUSY;
+            if (pVBoxSCSI->rcCompletion)
+                uVal |= VBOX_SCSI_ERROR;
             break;
         }
@@ -117,4 +118,5 @@
                     pVBoxSCSI->iCDB  = 0;
                     pVBoxSCSI->iBuf  = 0;
+                    pVBoxSCSI->rcCompletion = 0;
                     pVBoxSCSI->uTargetDevice = 0;
                     pVBoxSCSI->enmState = VBOXSCSISTATE_NO_COMMAND;
@@ -127,4 +129,9 @@
         {
             uVal = pVBoxSCSI->regIdentify;
+            break;
+        }
+        case 3:
+        {
+            uVal = pVBoxSCSI->rcCompletion;
             break;
         }
@@ -275,4 +282,7 @@
     AssertMsg(pVBoxSCSI->enmState == VBOXSCSISTATE_COMMAND_READY, ("Invalid state %u\n", pVBoxSCSI->enmState));
 
+    /* Clear any errors from a previous request. */
+    pVBoxSCSI->rcCompletion = 0;
+
     if (pVBoxSCSI->uTxDir == VBOXSCSI_TXDIR_FROM_DEVICE)
     {
@@ -316,5 +326,5 @@
  * is ready at the incoming data port.
  */
-int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest)
+int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest, int rcCompletion)
 {
     LogFlowFunc(("pVBoxSCSI=%#p pScsiRequest=%#p\n", pVBoxSCSI, pScsiRequest));
@@ -335,4 +345,6 @@
         memset(pVBoxSCSI->aCDB, 0, sizeof(pVBoxSCSI->aCDB));
     }
+
+    pVBoxSCSI->rcCompletion = rcCompletion;
 
     ASMAtomicXchgBool(&pVBoxSCSI->fBusy, false);
Index: /trunk/src/VBox/Devices/Storage/VBoxSCSI.h
===================================================================
--- /trunk/src/VBox/Devices/Storage/VBoxSCSI.h	(revision 43658)
+++ /trunk/src/VBox/Devices/Storage/VBoxSCSI.h	(revision 43659)
@@ -24,5 +24,5 @@
  *
  * The BusLogic interface if available will be starting at port 0x330
- * and the LsiLogic starts at 0x340 and each will have a size of 3 ports.
+ * and the LsiLogic starts at 0x340 and each will have a size of 4 ports.
  * The ports are used as described below:
  *
@@ -39,4 +39,6 @@
  * +--------+--------+----------+
  * |   2    |  R/W   | Detect   |
+ * +--------+--------+----------+
+ * |   3    |  Read  | SCSI rc  |
  * +--------+--------+----------+
  * |   3    |  Write | Reset    |
@@ -55,4 +57,7 @@
  * again the adapter is available.
  *
+ * Any write to the register at offset 3 causes the interface to be reset. A read returns
+ * the SCSI status code of the last operation.
+ * 
  * This part has no R0 or GC components.
  */
@@ -66,4 +71,5 @@
 //#define DEBUG
 #include <VBox/vmm/pdmdev.h>
+#include <VBox/scsi.h>
 
 typedef enum VBOXSCSISTATE
@@ -109,4 +115,6 @@
     /** Current position in the buffer. */
     uint32_t             iBuf;
+    /** The result code of last operation. */
+    int                  rcCompletion;
     /** Flag whether a request is pending. */
     volatile bool        fBusy;
@@ -115,5 +123,6 @@
 } VBOXSCSI, *PVBOXSCSI;
 
-#define VBOX_SCSI_BUSY RT_BIT(0)
+#define VBOX_SCSI_BUSY  RT_BIT(0)
+#define VBOX_SCSI_ERROR RT_BIT(1)
 
 #ifdef IN_RING3
@@ -123,5 +132,5 @@
 int vboxscsiWriteRegister(PVBOXSCSI pVBoxSCSI, uint8_t iRegister, uint8_t uVal);
 int vboxscsiSetupRequest(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest, uint32_t *puTargetDevice);
-int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest);
+int vboxscsiRequestFinished(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest, int rcCompletion);
 void vboxscsiSetRequestRedo(PVBOXSCSI pVBoxSCSI, PPDMSCSIREQUEST pScsiRequest);
 int vboxscsiWriteString(PPDMDEVINS pDevIns, PVBOXSCSI pVBoxSCSI, uint8_t iRegister,
