Changeset 89197 in vbox for trunk/src/VBox/Devices/Storage
- Timestamp:
- May 20, 2021 9:51:01 AM (4 years ago)
- svn:sync-xref-src-repo-rev:
- 144538
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Storage/DevBusLogic.cpp
r88727 r89197 66 66 67 67 /** State saved version. */ 68 #define BUSLOGIC_SAVED_STATE_MINOR_VERSION 4 69 68 #define BUSLOGIC_SAVED_STATE_MINOR_VERSION 5 69 /** Saved state version before VBoxSCSI got removed. */ 70 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_VBOXSCSI_REMOVAL 4 71 /** Saved state version before command buffer size was raised. */ 72 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_CMDBUF_RESIZE 3 73 /** Saved state version before 24-bit mailbox support was implemented. */ 74 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_24BIT_MBOX 2 70 75 /** Saved state version before the suspend on error feature was implemented. */ 71 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_ERROR_HANDLING 1 72 /** Saved state version before 24-bit mailbox support was implemented. */ 73 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_24BIT_MBOX 2 74 /** Saved state version before command buffer size was raised. */ 75 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_CMDBUF_RESIZE 3 76 #define BUSLOGIC_SAVED_STATE_MINOR_PRE_ERROR_HANDLING 1 76 77 77 78 /** Command buffer size in old saved states. */ … … 447 448 PPDMDEVINSR3 pDevIns; 448 449 449 /** Device state for BIOS access. */450 VBOXSCSI VBoxSCSI;451 452 450 /** BusLogic device states. */ 453 451 BUSLOGICDEVICE aDeviceStates[BUSLOGIC_MAX_DEVICES]; … … 468 466 /** Flag whether the worker thread is sleeping. */ 469 467 volatile bool fWrkThreadSleeping; 470 /** Flag whether a request from the BIOS is pending which the471 * worker thread needs to process. */472 volatile bool fBiosReqPending;473 468 474 469 /** Worker thread. */ … … 1167 1162 * @param pDevIns The device instance. 1168 1163 * @param pThis Pointer to the shared BusLogic instance data. 1169 * @param pThisCC Pointer to the ring-3 BusLogic instance data.1170 1164 * @param fResetIO Flag determining whether ISA I/O should be reset. 1171 1165 */ 1172 static int buslogicR3HwReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, PBUSLOGICCC pThisCC,bool fResetIO)1166 static int buslogicR3HwReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, bool fResetIO) 1173 1167 { 1174 1168 LogFlowFunc(("pThis=%#p\n", pThis)); … … 1199 1193 buslogicR3RegisterISARange(pDevIns, pThis, pThis->uDefaultISABaseCode); 1200 1194 buslogicR3InitializeLocalRam(pThis); 1201 vboxscsiHwReset(&pThisCC->VBoxSCSI);1202 1195 1203 1196 return VINF_SUCCESS; … … 1318 1311 * @param pDevIns The device instance. 1319 1312 * @param pThis Pointer to the shared BusLogic instance data. 1320 * @param pThisCC Pointer to the ring-3 BusLogic instance data.1321 1313 * @param fHardReset Flag initiating a hard (vs. soft) reset. 1322 1314 */ 1323 static void buslogicR3InitiateReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, PBUSLOGICCC pThisCC,bool fHardReset)1315 static void buslogicR3InitiateReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, bool fHardReset) 1324 1316 { 1325 1317 LogFlowFunc(("pThis=%#p fHardReset=%d\n", pThis, fHardReset)); 1326 1318 1327 buslogicR3HwReset(pDevIns, pThis, pThisCC,false);1319 buslogicR3HwReset(pDevIns, pThis, false); 1328 1320 1329 1321 if (fHardReset) … … 2578 2570 2579 2571 LogRel(("BusLogic: %s reset\n", fHardReset ? "hard" : "soft")); 2580 buslogicR3InitiateReset(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC),fHardReset);2572 buslogicR3InitiateReset(pDevIns, pThis, fHardReset); 2581 2573 #else 2582 2574 rc = VINF_IOM_R3_IOPORT_WRITE; … … 2824 2816 #ifdef IN_RING3 2825 2817 2826 static int buslogicR3PrepareBIOSSCSIRequest(PBUSLOGICCC pThisCC)2827 {2828 uint32_t uTargetDevice;2829 uint32_t uLun;2830 uint8_t *pbCdb;2831 size_t cbCdb;2832 size_t cbBuf;2833 2834 int rc = vboxscsiSetupRequest(&pThisCC->VBoxSCSI, &uLun, &pbCdb, &cbCdb, &cbBuf, &uTargetDevice);2835 AssertMsgRCReturn(rc, ("Setting up SCSI request failed rc=%Rrc\n", rc), rc);2836 2837 if ( uTargetDevice < RT_ELEMENTS(pThisCC->aDeviceStates)2838 && pThisCC->aDeviceStates[uTargetDevice].pDrvBase)2839 {2840 PBUSLOGICDEVICE pTgtDev = &pThisCC->aDeviceStates[uTargetDevice];2841 PDMMEDIAEXIOREQ hIoReq;2842 PBUSLOGICREQ pReq;2843 2844 rc = pTgtDev->pDrvMediaEx->pfnIoReqAlloc(pTgtDev->pDrvMediaEx, &hIoReq, (void **)&pReq,2845 0, PDMIMEDIAEX_F_SUSPEND_ON_RECOVERABLE_ERR);2846 AssertMsgRCReturn(rc, ("Getting task from cache failed rc=%Rrc\n", rc), rc);2847 2848 pReq->fBIOS = true;2849 pReq->hIoReq = hIoReq;2850 pReq->pTargetDevice = pTgtDev;2851 2852 ASMAtomicIncU32(&pTgtDev->cOutstandingRequests);2853 2854 rc = pTgtDev->pDrvMediaEx->pfnIoReqSendScsiCmd(pTgtDev->pDrvMediaEx, pReq->hIoReq, uLun,2855 pbCdb, cbCdb, PDMMEDIAEXIOREQSCSITXDIR_UNKNOWN, NULL,2856 cbBuf, NULL, 0, NULL, &pReq->u8ScsiSts, 30 * RT_MS_1SEC);2857 if (rc == VINF_SUCCESS || rc != VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)2858 {2859 uint8_t u8ScsiSts = pReq->u8ScsiSts;2860 pTgtDev->pDrvMediaEx->pfnIoReqFree(pTgtDev->pDrvMediaEx, pReq->hIoReq);2861 rc = vboxscsiRequestFinished(&pThisCC->VBoxSCSI, u8ScsiSts);2862 }2863 else if (rc == VINF_PDM_MEDIAEX_IOREQ_IN_PROGRESS)2864 rc = VINF_SUCCESS;2865 2866 return rc;2867 }2868 2869 /* Device is not present. */2870 AssertMsg(pbCdb[0] == SCSI_INQUIRY,2871 ("Device is not present but command is not inquiry\n"));2872 2873 SCSIINQUIRYDATA ScsiInquiryData;2874 2875 memset(&ScsiInquiryData, 0, sizeof(SCSIINQUIRYDATA));2876 ScsiInquiryData.u5PeripheralDeviceType = SCSI_INQUIRY_DATA_PERIPHERAL_DEVICE_TYPE_UNKNOWN;2877 ScsiInquiryData.u3PeripheralQualifier = SCSI_INQUIRY_DATA_PERIPHERAL_QUALIFIER_NOT_CONNECTED_NOT_SUPPORTED;2878 2879 memcpy(pThisCC->VBoxSCSI.pbBuf, &ScsiInquiryData, 5);2880 2881 rc = vboxscsiRequestFinished(&pThisCC->VBoxSCSI, SCSI_STATUS_OK);2882 AssertMsgRCReturn(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc), rc);2883 2884 return rc;2885 }2886 2887 2888 /**2889 * @callback_method_impl{FNIOMIOPORTNEWIN, BIOS port.}2890 */2891 static DECLCALLBACK(VBOXSTRICTRC)2892 buslogicR3BiosIoPortRead(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t *pu32, unsigned cb)2893 {2894 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);2895 RT_NOREF(pvUser, cb);2896 2897 ASSERT_GUEST(cb == 1);2898 2899 int rc = vboxscsiReadRegister(&pThisCC->VBoxSCSI, offPort, pu32);2900 2901 //Log2(("%s: pu32=%p:{%.*Rhxs} iRegister=%d rc=%Rrc\n", __FUNCTION__, pu32, 1, pu32, offPort, rc));2902 2903 return rc;2904 }2905 2906 /**2907 * @callback_method_impl{FNIOMIOPORTNEWOUT, BIOS port.}2908 */2909 static DECLCALLBACK(VBOXSTRICTRC)2910 buslogicR3BiosIoPortWrite(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort, uint32_t u32, unsigned cb)2911 {2912 PBUSLOGIC pThis = PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC);2913 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);2914 Log2(("#%d %s: pvUser=%#p cb=%d u32=%#x offPort=%#x\n", pDevIns->iInstance, __FUNCTION__, pvUser, cb, u32, offPort));2915 RT_NOREF(pvUser, cb);2916 2917 /*2918 * If there is already a request form the BIOS pending ignore this write2919 * because it should not happen.2920 */2921 if (ASMAtomicReadBool(&pThisCC->fBiosReqPending))2922 return VINF_SUCCESS;2923 2924 ASSERT_GUEST(cb == 1);2925 2926 int rc = vboxscsiWriteRegister(&pThisCC->VBoxSCSI, offPort, (uint8_t)u32);2927 if (rc == VERR_MORE_DATA)2928 {2929 ASMAtomicXchgBool(&pThisCC->fBiosReqPending, true);2930 /* Wake up the worker thread now that there are pending requests. */2931 int rc2 = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->hEvtProcess);2932 AssertRC(rc2);2933 rc = VINF_SUCCESS;2934 }2935 else if (RT_FAILURE(rc))2936 AssertMsgFailed(("Writing BIOS register failed %Rrc\n", rc));2937 2938 return VINF_SUCCESS;2939 }2940 2941 /**2942 * @callback_method_impl{FNIOMIOPORTNEWOUTSTRING, BIOS port.}2943 */2944 static DECLCALLBACK(VBOXSTRICTRC) buslogicR3BiosIoPortWriteStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort,2945 uint8_t const *pbSrc, uint32_t *pcTransfers, unsigned cb)2946 {2947 PBUSLOGIC pThis = PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC);2948 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);2949 Log2(("#%d %s: pvUser=%#p cb=%d offPort=%#x\n", pDevIns->iInstance, __FUNCTION__, pvUser, cb, offPort));2950 RT_NOREF(pvUser);2951 2952 /*2953 * If there is already a request form the BIOS pending ignore this write2954 * because it should not happen.2955 */2956 if (ASMAtomicReadBool(&pThisCC->fBiosReqPending))2957 return VINF_SUCCESS;2958 2959 int rc = vboxscsiWriteString(pDevIns, &pThisCC->VBoxSCSI, offPort, pbSrc, pcTransfers, cb);2960 if (rc == VERR_MORE_DATA)2961 {2962 ASMAtomicXchgBool(&pThisCC->fBiosReqPending, true);2963 /* Wake up the worker thread now taht there are pending requests. */2964 int rc2 = PDMDevHlpSUPSemEventSignal(pDevIns, pThis->hEvtProcess);2965 AssertRC(rc2);2966 }2967 else if (RT_FAILURE(rc))2968 AssertMsgFailed(("Writing BIOS register failed %Rrc\n", rc));2969 2970 return VINF_SUCCESS;2971 }2972 2973 /**2974 * @callback_method_impl{FNIOMIOPORTNEWINSTRING, BIOS port.}2975 */2976 static DECLCALLBACK(VBOXSTRICTRC) buslogicR3BiosIoPortReadStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT offPort,2977 uint8_t *pbDst, uint32_t *pcTransfers, unsigned cb)2978 {2979 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);2980 LogFlowFunc(("#%d %s: pvUser=%#p cb=%d offPort=%#x\n", pDevIns->iInstance, __FUNCTION__, pvUser, cb, offPort));2981 RT_NOREF(pvUser);2982 2983 return vboxscsiReadString(pDevIns, &pThisCC->VBoxSCSI, offPort, pbDst, pcTransfers, cb);2984 }2985 2986 2818 /** 2987 2819 * Update the ISA I/O range. … … 3053 2885 LogFlowFunc(("after decrement %u\n", pTgtDev->cOutstandingRequests)); 3054 2886 3055 if (pReq->fBIOS) 3056 { 3057 uint8_t u8ScsiSts = pReq->u8ScsiSts; 3058 pTgtDev->pDrvMediaEx->pfnIoReqFree(pTgtDev->pDrvMediaEx, pReq->hIoReq); 3059 int rc = vboxscsiRequestFinished(&pThisCC->VBoxSCSI, u8ScsiSts); 3060 AssertMsgRC(rc, ("Finishing BIOS SCSI request failed rc=%Rrc\n", rc)); 3061 } 2887 if (pReq->pbSenseBuffer) 2888 buslogicR3SenseBufferFree(pReq, (pReq->u8ScsiSts != SCSI_STATUS_OK)); 2889 2890 /* Update residual data length. */ 2891 if ( (pReq->CCBGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH) 2892 || (pReq->CCBGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 2893 { 2894 size_t cbResidual = 0; 2895 int rc = pTgtDev->pDrvMediaEx->pfnIoReqQueryResidual(pTgtDev->pDrvMediaEx, pReq->hIoReq, &cbResidual); 2896 AssertRC(rc); Assert(cbResidual == (uint32_t)cbResidual); 2897 2898 if (pReq->fIs24Bit) 2899 U32_TO_LEN(pReq->CCBGuest.o.acbData, (uint32_t)cbResidual); 2900 else 2901 pReq->CCBGuest.n.cbData = (uint32_t)cbResidual; 2902 } 2903 2904 /* 2905 * Save vital things from the request and free it before posting completion 2906 * to avoid that the guest submits a new request with the same ID as the still 2907 * allocated one. 2908 */ 2909 #ifdef LOG_ENABLED 2910 bool fIs24Bit = pReq->fIs24Bit; 2911 #endif 2912 uint8_t u8ScsiSts = pReq->u8ScsiSts; 2913 RTGCPHYS GCPhysAddrCCB = pReq->GCPhysAddrCCB; 2914 CCBU CCBGuest; 2915 memcpy(&CCBGuest, &pReq->CCBGuest, sizeof(CCBU)); 2916 2917 pTgtDev->pDrvMediaEx->pfnIoReqFree(pTgtDev->pDrvMediaEx, pReq->hIoReq); 2918 if (u8ScsiSts == SCSI_STATUS_OK) 2919 buslogicR3SendIncomingMailbox(pDevIns, pThis, GCPhysAddrCCB, &CCBGuest, 2920 BUSLOGIC_MAILBOX_INCOMING_ADAPTER_STATUS_CMD_COMPLETED, 2921 BUSLOGIC_MAILBOX_INCOMING_DEVICE_STATUS_OPERATION_GOOD, 2922 BUSLOGIC_MAILBOX_INCOMING_COMPLETION_WITHOUT_ERROR); 2923 else if (u8ScsiSts == SCSI_STATUS_CHECK_CONDITION) 2924 buslogicR3SendIncomingMailbox(pDevIns, pThis, GCPhysAddrCCB, &CCBGuest, 2925 BUSLOGIC_MAILBOX_INCOMING_ADAPTER_STATUS_CMD_COMPLETED, 2926 BUSLOGIC_MAILBOX_INCOMING_DEVICE_STATUS_CHECK_CONDITION, 2927 BUSLOGIC_MAILBOX_INCOMING_COMPLETION_WITH_ERROR); 3062 2928 else 3063 { 3064 if (pReq->pbSenseBuffer) 3065 buslogicR3SenseBufferFree(pReq, (pReq->u8ScsiSts != SCSI_STATUS_OK)); 3066 3067 /* Update residual data length. */ 3068 if ( (pReq->CCBGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_DATA_LENGTH) 3069 || (pReq->CCBGuest.c.uOpcode == BUSLOGIC_CCB_OPCODE_INITIATOR_CCB_RESIDUAL_SCATTER_GATHER)) 3070 { 3071 size_t cbResidual = 0; 3072 int rc = pTgtDev->pDrvMediaEx->pfnIoReqQueryResidual(pTgtDev->pDrvMediaEx, pReq->hIoReq, &cbResidual); 3073 AssertRC(rc); Assert(cbResidual == (uint32_t)cbResidual); 3074 3075 if (pReq->fIs24Bit) 3076 U32_TO_LEN(pReq->CCBGuest.o.acbData, (uint32_t)cbResidual); 3077 else 3078 pReq->CCBGuest.n.cbData = (uint32_t)cbResidual; 3079 } 3080 3081 /* 3082 * Save vital things from the request and free it before posting completion 3083 * to avoid that the guest submits a new request with the same ID as the still 3084 * allocated one. 3085 */ 2929 AssertMsgFailed(("invalid completion status %u\n", u8ScsiSts)); 2930 3086 2931 #ifdef LOG_ENABLED 3087 bool fIs24Bit = pReq->fIs24Bit;2932 buslogicR3DumpCCBInfo(&CCBGuest, fIs24Bit); 3088 2933 #endif 3089 uint8_t u8ScsiSts = pReq->u8ScsiSts;3090 RTGCPHYS GCPhysAddrCCB = pReq->GCPhysAddrCCB;3091 CCBU CCBGuest;3092 memcpy(&CCBGuest, &pReq->CCBGuest, sizeof(CCBU));3093 3094 pTgtDev->pDrvMediaEx->pfnIoReqFree(pTgtDev->pDrvMediaEx, pReq->hIoReq);3095 if (u8ScsiSts == SCSI_STATUS_OK)3096 buslogicR3SendIncomingMailbox(pDevIns, pThis, GCPhysAddrCCB, &CCBGuest,3097 BUSLOGIC_MAILBOX_INCOMING_ADAPTER_STATUS_CMD_COMPLETED,3098 BUSLOGIC_MAILBOX_INCOMING_DEVICE_STATUS_OPERATION_GOOD,3099 BUSLOGIC_MAILBOX_INCOMING_COMPLETION_WITHOUT_ERROR);3100 else if (u8ScsiSts == SCSI_STATUS_CHECK_CONDITION)3101 buslogicR3SendIncomingMailbox(pDevIns, pThis, GCPhysAddrCCB, &CCBGuest,3102 BUSLOGIC_MAILBOX_INCOMING_ADAPTER_STATUS_CMD_COMPLETED,3103 BUSLOGIC_MAILBOX_INCOMING_DEVICE_STATUS_CHECK_CONDITION,3104 BUSLOGIC_MAILBOX_INCOMING_COMPLETION_WITH_ERROR);3105 else3106 AssertMsgFailed(("invalid completion status %u\n", u8ScsiSts));3107 3108 #ifdef LOG_ENABLED3109 buslogicR3DumpCCBInfo(&CCBGuest, fIs24Bit);3110 #endif3111 }3112 2934 3113 2935 if (pTgtDev->cOutstandingRequests == 0 && pThisCC->fSignalIdle) … … 3149 2971 RT_NOREF(hIoReq); 3150 2972 3151 size_t cbCopied = 0; 3152 if (RT_LIKELY(!pReq->fBIOS)) 3153 cbCopied = buslogicR3CopySgBufToGuest(pDevIns, PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC), pReq, pSgBuf, offDst, cbCopy); 3154 else 3155 { 3156 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC); 3157 cbCopied = vboxscsiCopyToBuf(&pThisCC->VBoxSCSI, pSgBuf, offDst, cbCopy); 3158 } 2973 size_t cbCopied = buslogicR3CopySgBufToGuest(pDevIns, PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC), pReq, pSgBuf, offDst, cbCopy); 3159 2974 return cbCopied == cbCopy ? VINF_SUCCESS : VERR_PDM_MEDIAEX_IOBUF_OVERFLOW; 3160 2975 } … … 3172 2987 PBUSLOGICREQ pReq = (PBUSLOGICREQ)pvIoReqAlloc; 3173 2988 3174 size_t cbCopied = 0; 3175 if (RT_LIKELY(!pReq->fBIOS)) 3176 cbCopied = buslogicR3CopySgBufFromGuest(pDevIns, PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC), pReq, pSgBuf, offSrc, cbCopy); 3177 else 3178 { 3179 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC); 3180 cbCopied = vboxscsiCopyFromBuf(&pThisCC->VBoxSCSI, pSgBuf, offSrc, cbCopy); 3181 } 2989 size_t cbCopied = buslogicR3CopySgBufFromGuest(pDevIns, PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC), pReq, pSgBuf, offSrc, cbCopy); 3182 2990 return cbCopied == cbCopy ? VINF_SUCCESS : VERR_PDM_MEDIAEX_IOBUF_UNDERRUN; 3183 2991 } … … 3523 3331 pHlp->pfnSSMPutBool (pSSM, pThis->fExtendedLunCCBFormat); 3524 3332 3525 vboxscsiR3SaveExec(pDevIns->pHlpR3, &pThisCC->VBoxSCSI, pSSM);3526 3527 3333 pHlp->pfnSSMPutU32(pSSM, cReqsSuspended); 3528 3334 … … 3573 3379 3574 3380 /* Kick of any requests we might need to redo. */ 3575 if (pThisCC->VBoxSCSI.fBusy) 3576 { 3577 3578 /* The BIOS had a request active when we got suspended. Resume it. */ 3579 int rc = buslogicR3PrepareBIOSSCSIRequest(pThisCC); 3580 AssertRC(rc); 3581 } 3582 else if (pThisCC->cReqsRedo) 3381 if (pThisCC->cReqsRedo) 3583 3382 { 3584 3383 for (unsigned i = 0; i < pThisCC->cReqsRedo; i++) … … 3658 3457 pHlp->pfnSSMGetBool (pSSM, &pThis->fExtendedLunCCBFormat); 3659 3458 3660 rc = vboxscsiR3LoadExec(pDevIns->pHlpR3, &pThisCC->VBoxSCSI, pSSM); 3661 if (RT_FAILURE(rc)) 3662 { 3663 LogRel(("BusLogic: Failed to restore BIOS state: %Rrc.\n", rc)); 3664 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic: Failed to restore BIOS state\n")); 3459 if (uVersion <= BUSLOGIC_SAVED_STATE_MINOR_PRE_VBOXSCSI_REMOVAL) 3460 { 3461 rc = vboxscsiR3LoadExecLegacy(pDevIns->pHlpR3, pSSM); 3462 if (RT_FAILURE(rc)) 3463 { 3464 LogRel(("BusLogic: Failed to restore BIOS state: %Rrc.\n", rc)); 3465 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic: Failed to restore BIOS state\n")); 3466 } 3665 3467 } 3666 3468 … … 3800 3602 ASMAtomicWriteBool(&pThisCC->fWrkThreadSleeping, false); 3801 3603 3802 /* Check whether there is a BIOS request pending and process it first. */ 3803 if (ASMAtomicReadBool(&pThisCC->fBiosReqPending)) 3804 { 3805 rc = buslogicR3PrepareBIOSSCSIRequest(pThisCC); 3806 AssertRC(rc); 3807 ASMAtomicXchgBool(&pThisCC->fBiosReqPending, false); 3808 } 3809 else 3810 { 3811 ASMAtomicXchgU32(&pThis->cMailboxesReady, 0); /** @todo Actually not required anymore but to stay compatible with older saved states. */ 3812 3813 /* Process mailboxes. */ 3814 do 3815 { 3816 rc = buslogicR3ProcessMailboxNext(pDevIns, pThis, pThisCC); 3817 AssertMsg(RT_SUCCESS(rc) || rc == VERR_NO_DATA, ("Processing mailbox failed rc=%Rrc\n", rc)); 3818 } while (RT_SUCCESS(rc)); 3819 } 3604 3605 ASMAtomicXchgU32(&pThis->cMailboxesReady, 0); /** @todo Actually not required anymore but to stay compatible with older saved states. */ 3606 3607 /* Process mailboxes. */ 3608 do 3609 { 3610 rc = buslogicR3ProcessMailboxNext(pDevIns, pThis, pThisCC); 3611 AssertMsg(RT_SUCCESS(rc) || rc == VERR_NO_DATA, ("Processing mailbox failed rc=%Rrc\n", rc)); 3612 } while (RT_SUCCESS(rc)); 3820 3613 } /* While running */ 3821 3614 … … 4150 3943 ASMAtomicWriteBool(&pThisCC->fSignalIdle, false); 4151 3944 4152 buslogicR3HwReset(pDevIns, pThis, pThisCC,true);3945 buslogicR3HwReset(pDevIns, pThis, true); 4153 3946 return true; 4154 3947 } … … 4168 3961 { 4169 3962 ASMAtomicWriteBool(&pThisCC->fSignalIdle, false); 4170 buslogicR3HwReset(pDevIns, pThis, pThisCC,true);3963 buslogicR3HwReset(pDevIns, pThis, true); 4171 3964 } 4172 3965 } … … 4195 3988 PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns); 4196 3989 PBUSLOGIC pThis = PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC); 4197 PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);4198 3990 4199 3991 PDMDevHlpCritSectDelete(pDevIns, &pThis->CritSectIntr); … … 4204 3996 pThis->hEvtProcess = NIL_SUPSEMEVENT; 4205 3997 } 4206 4207 vboxscsiDestroy(&pThisCC->VBoxSCSI);4208 3998 4209 3999 return VINF_SUCCESS; … … 4250 4040 * Validate and read configuration. 4251 4041 */ 4252 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "Bootable|AdapterType|ISACompat", ""); 4253 4254 bool fBootable = true; 4255 int rc = pHlp->pfnCFGMQueryBoolDef(pCfg, "Bootable", &fBootable, true); 4256 if (RT_FAILURE(rc)) 4257 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic configuration error: failed to read Bootable as boolean")); 4258 Log(("%s: fBootable=%RTbool\n", __FUNCTION__, fBootable)); 4042 PDMDEV_VALIDATE_CONFIG_RETURN(pDevIns, "Bootable|" /* Keep it for legacy configs, even though it doesn't do anything anymore, see @bugref{4841}. */ 4043 "AdapterType|" 4044 "ISACompat", 4045 ""); 4259 4046 4260 4047 /* Figure out the emulated device type. */ 4261 4048 char szCfgStr[16]; 4262 rc = pHlp->pfnCFGMQueryStringDef(pCfg, "AdapterType", szCfgStr, sizeof(szCfgStr), "BT-958D");4049 int rc = pHlp->pfnCFGMQueryStringDef(pCfg, "AdapterType", szCfgStr, sizeof(szCfgStr), "BT-958D"); 4263 4050 if (RT_FAILURE(rc)) 4264 4051 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic configuration error: failed to read AdapterType as string")); … … 4323 4110 "BusLogic MMIO", &pThis->hMmio); 4324 4111 AssertRCReturn(rc, rc); 4325 }4326 4327 /* Initialize the SCSI emulation for the BIOS. */4328 rc = vboxscsiInitialize(&pThisCC->VBoxSCSI);4329 if (RT_FAILURE(rc))4330 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic failed to initialize BIOS SCSI interface"));4331 4332 if (fBootable)4333 {4334 /* Register I/O port space for BIOS access. */4335 rc = PDMDevHlpIoPortCreateExAndMap(pDevIns, BUSLOGIC_BIOS_IO_PORT, 4 /*cPorts*/, 0 /*fFlags*/,4336 buslogicR3BiosIoPortWrite, buslogicR3BiosIoPortRead,4337 buslogicR3BiosIoPortWriteStr, buslogicR3BiosIoPortReadStr, NULL /*pvUser*/,4338 "BusLogic BIOS" , NULL /*paExtDesc*/, &pThis->hIoPortsBios);4339 if (RT_FAILURE(rc))4340 return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic cannot register BIOS I/O handlers"));4341 4112 } 4342 4113 … … 4465 4236 PDMDevHlpDBGFInfoRegister(pDevIns, szTmp, "BusLogic HBA info", buslogicR3Info); 4466 4237 4467 rc = buslogicR3HwReset(pDevIns, pThis, pThisCC,true);4238 rc = buslogicR3HwReset(pDevIns, pThis, true); 4468 4239 AssertMsgRC(rc, ("hardware reset of BusLogic host adapter failed rc=%Rrc\n", rc)); 4469 4240
Note:
See TracChangeset
for help on using the changeset viewer.