VirtualBox

Changeset 89197 in vbox for trunk/src/VBox/Devices/Storage


Ignore:
Timestamp:
May 20, 2021 9:51:01 AM (4 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
144538
Message:

Devices/Storage/DevBusLogic,Devices/testcase: Get rid of the VBoxSCSI interface now that we have proper drivers in the BIOS, bugref:4841

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Storage/DevBusLogic.cpp

    r88727 r89197  
    6666
    6767/** 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
    7075/** 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
    7677
    7778/** Command buffer size in old saved states. */
     
    447448    PPDMDEVINSR3                    pDevIns;
    448449
    449     /** Device state for BIOS access. */
    450     VBOXSCSI                        VBoxSCSI;
    451 
    452450    /** BusLogic device states. */
    453451    BUSLOGICDEVICE                  aDeviceStates[BUSLOGIC_MAX_DEVICES];
     
    468466    /** Flag whether the worker thread is sleeping. */
    469467    volatile bool                   fWrkThreadSleeping;
    470     /** Flag whether a request from the BIOS is pending which the
    471      * worker thread needs to process. */
    472     volatile bool                   fBiosReqPending;
    473468
    474469    /** Worker thread. */
     
    11671162 * @param   pDevIns     The device instance.
    11681163 * @param   pThis       Pointer to the shared BusLogic instance data.
    1169  * @param   pThisCC     Pointer to the ring-3 BusLogic instance data.
    11701164 * @param   fResetIO    Flag determining whether ISA I/O should be reset.
    11711165 */
    1172 static int buslogicR3HwReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, PBUSLOGICCC pThisCC, bool fResetIO)
     1166static int buslogicR3HwReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, bool fResetIO)
    11731167{
    11741168    LogFlowFunc(("pThis=%#p\n", pThis));
     
    11991193        buslogicR3RegisterISARange(pDevIns, pThis, pThis->uDefaultISABaseCode);
    12001194    buslogicR3InitializeLocalRam(pThis);
    1201     vboxscsiHwReset(&pThisCC->VBoxSCSI);
    12021195
    12031196    return VINF_SUCCESS;
     
    13181311 * @param   pDevIns     The device instance.
    13191312 * @param   pThis       Pointer to the shared BusLogic instance data.
    1320  * @param   pThisCC     Pointer to the ring-3 BusLogic instance data.
    13211313 * @param   fHardReset  Flag initiating a hard (vs. soft) reset.
    13221314 */
    1323 static void buslogicR3InitiateReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, PBUSLOGICCC pThisCC, bool fHardReset)
     1315static void buslogicR3InitiateReset(PPDMDEVINS pDevIns, PBUSLOGIC pThis, bool fHardReset)
    13241316{
    13251317    LogFlowFunc(("pThis=%#p fHardReset=%d\n", pThis, fHardReset));
    13261318
    1327     buslogicR3HwReset(pDevIns, pThis, pThisCC, false);
     1319    buslogicR3HwReset(pDevIns, pThis, false);
    13281320
    13291321    if (fHardReset)
     
    25782570
    25792571                LogRel(("BusLogic: %s reset\n", fHardReset ? "hard" : "soft"));
    2580                 buslogicR3InitiateReset(pDevIns, pThis, PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC), fHardReset);
     2572                buslogicR3InitiateReset(pDevIns, pThis, fHardReset);
    25812573#else
    25822574                rc = VINF_IOM_R3_IOPORT_WRITE;
     
    28242816#ifdef IN_RING3
    28252817
    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 write
    2919      * 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 write
    2954      * 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 
    29862818/**
    29872819 * Update the ISA I/O range.
     
    30532885    LogFlowFunc(("after decrement %u\n", pTgtDev->cOutstandingRequests));
    30542886
    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);
    30622928    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
    30862931#ifdef LOG_ENABLED
    3087         bool fIs24Bit = pReq->fIs24Bit;
     2932    buslogicR3DumpCCBInfo(&CCBGuest, fIs24Bit);
    30882933#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         else
    3106             AssertMsgFailed(("invalid completion status %u\n", u8ScsiSts));
    3107 
    3108 #ifdef LOG_ENABLED
    3109         buslogicR3DumpCCBInfo(&CCBGuest, fIs24Bit);
    3110 #endif
    3111     }
    31122934
    31132935    if (pTgtDev->cOutstandingRequests == 0 && pThisCC->fSignalIdle)
     
    31492971    RT_NOREF(hIoReq);
    31502972
    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);
    31592974    return cbCopied == cbCopy ? VINF_SUCCESS : VERR_PDM_MEDIAEX_IOBUF_OVERFLOW;
    31602975}
     
    31722987    PBUSLOGICREQ    pReq    = (PBUSLOGICREQ)pvIoReqAlloc;
    31732988
    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);
    31822990    return cbCopied == cbCopy ? VINF_SUCCESS : VERR_PDM_MEDIAEX_IOBUF_UNDERRUN;
    31832991}
     
    35233331    pHlp->pfnSSMPutBool  (pSSM, pThis->fExtendedLunCCBFormat);
    35243332
    3525     vboxscsiR3SaveExec(pDevIns->pHlpR3, &pThisCC->VBoxSCSI, pSSM);
    3526 
    35273333    pHlp->pfnSSMPutU32(pSSM, cReqsSuspended);
    35283334
     
    35733379
    35743380    /* 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)
    35833382    {
    35843383        for (unsigned i = 0; i < pThisCC->cReqsRedo; i++)
     
    36583457    pHlp->pfnSSMGetBool  (pSSM, &pThis->fExtendedLunCCBFormat);
    36593458
    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        }
    36653467    }
    36663468
     
    38003602        ASMAtomicWriteBool(&pThisCC->fWrkThreadSleeping, false);
    38013603
    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));
    38203613    } /* While running */
    38213614
     
    41503943    ASMAtomicWriteBool(&pThisCC->fSignalIdle, false);
    41513944
    4152     buslogicR3HwReset(pDevIns, pThis, pThisCC, true);
     3945    buslogicR3HwReset(pDevIns, pThis, true);
    41533946    return true;
    41543947}
     
    41683961    {
    41693962        ASMAtomicWriteBool(&pThisCC->fSignalIdle, false);
    4170         buslogicR3HwReset(pDevIns, pThis, pThisCC, true);
     3963        buslogicR3HwReset(pDevIns, pThis, true);
    41713964    }
    41723965}
     
    41953988    PDMDEV_CHECK_VERSIONS_RETURN_QUIET(pDevIns);
    41963989    PBUSLOGIC pThis = PDMDEVINS_2_DATA(pDevIns, PBUSLOGIC);
    4197     PBUSLOGICCC pThisCC = PDMDEVINS_2_DATA_CC(pDevIns, PBUSLOGICCC);
    41983990
    41993991    PDMDevHlpCritSectDelete(pDevIns, &pThis->CritSectIntr);
     
    42043996        pThis->hEvtProcess = NIL_SUPSEMEVENT;
    42053997    }
    4206 
    4207     vboxscsiDestroy(&pThisCC->VBoxSCSI);
    42083998
    42093999    return VINF_SUCCESS;
     
    42504040     * Validate and read configuration.
    42514041     */
    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                                           "");
    42594046
    42604047    /* Figure out the emulated device type. */
    42614048    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");
    42634050    if (RT_FAILURE(rc))
    42644051        return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic configuration error: failed to read AdapterType as string"));
     
    43234110                                            "BusLogic MMIO", &pThis->hMmio);
    43244111        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"));
    43414112    }
    43424113
     
    44654236    PDMDevHlpDBGFInfoRegister(pDevIns, szTmp, "BusLogic HBA info", buslogicR3Info);
    44664237
    4467     rc = buslogicR3HwReset(pDevIns, pThis, pThisCC, true);
     4238    rc = buslogicR3HwReset(pDevIns, pThis, true);
    44684239    AssertMsgRC(rc, ("hardware reset of BusLogic host adapter failed rc=%Rrc\n", rc));
    44694240
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette