VirtualBox

Changeset 34009 in vbox


Ignore:
Timestamp:
Nov 11, 2010 8:14:36 PM (14 years ago)
Author:
vboxsync
Message:

Devices/Storage: Introduce Bootable CFGM key to enable BIOS access

Location:
trunk/src/VBox/Devices
Files:
4 edited

Legend:

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

    r33595 r34009  
    635635     * a port is entering the idle state. */
    636636    bool volatile                   fSignalIdle;
    637     bool                            afAlignment8[1];
     637    /** Flag whether the controller has BIOS access enabled. */
     638    bool                            fBootable;
    638639
    639640    /** Number of usable ports on this controller. */
     
    66966697    }
    66976698
    6698     for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
    6699         if (!ataControllerIsIdle(&pThis->aCts[i]))
    6700             return false;
     6699    if (pThis->fBootable)
     6700        for (uint32_t i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
     6701            if (!ataControllerIsIdle(&pThis->aCts[i]))
     6702                return false;
    67016703
    67026704    return true;
     
    74067408
    74077409    Log(("%s:\n", __FUNCTION__));
    7408     for (uint32_t i = 0; i < RT_ELEMENTS(pAhci->aCts); i++)
    7409         ataControllerResume(&pAhci->aCts[i]);
     7410    if (pAhci->fBootable)
     7411        for (uint32_t i = 0; i < RT_ELEMENTS(pAhci->aCts); i++)
     7412            ataControllerResume(&pAhci->aCts[i]);
    74107413    return;
    74117414}
     
    75937596        ahciPortHwReset(&pAhci->ahciPort[i]);
    75947597
    7595     for (uint32_t i = 0; i < RT_ELEMENTS(pAhci->aCts); i++)
    7596         ataControllerReset(&pAhci->aCts[i]);
     7598    if (pAhci->fBootable)
     7599        for (uint32_t i = 0; i < RT_ELEMENTS(pAhci->aCts); i++)
     7600            ataControllerReset(&pAhci->aCts[i]);
    75977601    return VINF_SUCCESS;
    75987602}
     
    76647668     */
    76657669    if (!CFGMR3AreValuesValid(pCfg, "GCEnabled\0"
    7666                                           "R0Enabled\0"
    7667                                           "PrimaryMaster\0"
    7668                                           "PrimarySlave\0"
    7669                                           "SecondaryMaster\0"
    7670                                           "SecondarySlave\0"
    7671                                           "PortCount\0"
    7672                                           "UseAsyncInterfaceIfAvailable\0"))
     7670                                    "R0Enabled\0"
     7671                                    "PrimaryMaster\0"
     7672                                    "PrimarySlave\0"
     7673                                    "SecondaryMaster\0"
     7674                                    "SecondarySlave\0"
     7675                                    "PortCount\0"
     7676                                    "UseAsyncInterfaceIfAvailable\0"
     7677                                    "Bootable\0"))
    76737678        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    76747679                                N_("AHCI configuration error: unknown option specified"));
     
    77047709        return PDMDEV_SET_ERROR(pDevIns, rc,
    77057710                                N_("AHCI configuration error: failed to read UseAsyncInterfaceIfAvailable as boolean"));
     7711
     7712    rc = CFGMR3QueryBoolDef(pCfg, "Bootable", &pThis->fBootable, true);
     7713    if (RT_FAILURE(rc))
     7714        return PDMDEV_SET_ERROR(pDevIns, rc,
     7715                                N_("AHCI configuration error: failed to read Bootable as boolean"));
    77067716
    77077717    pThis->fR0Enabled = fR0Enabled;
     
    78017811                                N_("AHCI cannot register PCI memory region for registers"));
    78027812
    7803     rc = PDMDevHlpCritSectInit(pDevIns, &pThis->lock, RT_SRC_POS, "AHCI");
     7813    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->lock, RT_SRC_POS, "AHCI%d", pDevIns->iInstance);
    78047814    if (RT_FAILURE(rc))
    78057815    {
     
    80508060    }
    80518061
    8052     /*
    8053      * Setup IDE emulation.
    8054      * We only emulate the I/O ports but not bus master DMA.
    8055      * If the configuration values are not found the setup of the ports is as follows:
    8056      *     Primary Master:   Port 0
    8057      *     Primary Slave:    Port 1
    8058      *     Secondary Master: Port 2
    8059      *     Secondary Slave:  Port 3
    8060      */
    8061 
    8062     /*
    8063      * Setup I/O ports for the PCI device.
    8064      */
    8065     pThis->aCts[0].irq          = 12;
    8066     pThis->aCts[0].IOPortBase1  = 0x1e8;
    8067     pThis->aCts[0].IOPortBase2  = 0x3e6;
    8068     pThis->aCts[1].irq          = 11;
    8069     pThis->aCts[1].IOPortBase1  = 0x168;
    8070     pThis->aCts[1].IOPortBase2  = 0x366;
    8071 
    8072     for (i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
    8073     {
    8074         PAHCIATACONTROLLER pCtl = &pThis->aCts[i];
    8075         uint32_t iPortMaster, iPortSlave;
    8076         uint32_t cbSSMState = 0;
    8077         static const char *s_apszDescs[RT_ELEMENTS(pThis->aCts)][RT_ELEMENTS(pCtl->aIfs)] =
    8078         {
    8079             { "PrimaryMaster", "PrimarySlave" },
    8080             { "SecondaryMaster", "SecondarySlave" }
    8081         };
    8082 
    8083         rc = CFGMR3QueryU32Def(pCfg, s_apszDescs[i][0], &iPortMaster, 2 * i);
    8084         if (RT_FAILURE(rc))
    8085             return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    8086                                        N_("AHCI configuration error: failed to read %s as U32"), s_apszDescs[i][0]);
    8087 
    8088         rc = CFGMR3QueryU32Def(pCfg, s_apszDescs[i][1], &iPortSlave, 2 * i + 1);
    8089         if (RT_FAILURE(rc))
    8090             return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
    8091                                        N_("AHCI configuration error: failed to read %s as U32"), s_apszDescs[i][1]);
    8092 
    8093         char szName[24];
    8094         RTStrPrintf(szName, sizeof(szName), "EmulatedATA%d", i);
    8095         rc = ataControllerInit(pDevIns, pCtl,
    8096                                iPortMaster, pThis->ahciPort[iPortMaster].pDrvBase,
    8097                                iPortSlave, pThis->ahciPort[iPortSlave].pDrvBase,
    8098                                &cbSSMState, szName, &pThis->ahciPort[iPortMaster].Led,
    8099                                &pThis->ahciPort[iPortMaster].StatBytesRead,
    8100                                &pThis->ahciPort[iPortMaster].StatBytesWritten);
    8101         if (RT_FAILURE(rc))
    8102             return rc;
    8103 
    8104         cbTotalBufferSize += cbSSMState;
    8105 
    8106         rc = PDMDevHlpIOPortRegister(pDevIns, pCtl->IOPortBase1, 8, (RTHCPTR)i,
    8107                                      ahciIOPortWrite1, ahciIOPortRead1, ahciIOPortWriteStr1, ahciIOPortReadStr1, "AHCI");
    8108         if (RT_FAILURE(rc))
    8109             return rc;
    8110 
    8111         if (pThis->fR0Enabled)
    8112         {
    8113             rc = PDMDevHlpIOPortRegisterR0(pDevIns, pCtl->IOPortBase1, 8, (RTR0PTR)i,
    8114                                            "ahciIOPortWrite1", "ahciIOPortRead1", NULL, NULL, "AHCI R0");
     8062    if (pThis->fBootable)
     8063    {
     8064        /*
     8065         * Setup IDE emulation.
     8066         * We only emulate the I/O ports but not bus master DMA.
     8067         * If the configuration values are not found the setup of the ports is as follows:
     8068         *     Primary Master:   Port 0
     8069         *     Primary Slave:    Port 1
     8070         *     Secondary Master: Port 2
     8071         *     Secondary Slave:  Port 3
     8072         */
     8073
     8074        /*
     8075         * Setup I/O ports for the PCI device.
     8076         */
     8077        pThis->aCts[0].irq          = 12;
     8078        pThis->aCts[0].IOPortBase1  = 0x1e8;
     8079        pThis->aCts[0].IOPortBase2  = 0x3e6;
     8080        pThis->aCts[1].irq          = 11;
     8081        pThis->aCts[1].IOPortBase1  = 0x168;
     8082        pThis->aCts[1].IOPortBase2  = 0x366;
     8083
     8084        for (i = 0; i < RT_ELEMENTS(pThis->aCts); i++)
     8085        {
     8086            PAHCIATACONTROLLER pCtl = &pThis->aCts[i];
     8087            uint32_t iPortMaster, iPortSlave;
     8088            uint32_t cbSSMState = 0;
     8089            static const char *s_apszDescs[RT_ELEMENTS(pThis->aCts)][RT_ELEMENTS(pCtl->aIfs)] =
     8090            {
     8091                { "PrimaryMaster", "PrimarySlave" },
     8092                { "SecondaryMaster", "SecondarySlave" }
     8093            };
     8094
     8095            rc = CFGMR3QueryU32Def(pCfg, s_apszDescs[i][0], &iPortMaster, 2 * i);
     8096            if (RT_FAILURE(rc))
     8097                return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     8098                                           N_("AHCI configuration error: failed to read %s as U32"), s_apszDescs[i][0]);
     8099
     8100            rc = CFGMR3QueryU32Def(pCfg, s_apszDescs[i][1], &iPortSlave, 2 * i + 1);
     8101            if (RT_FAILURE(rc))
     8102                return PDMDevHlpVMSetError(pDevIns, rc, RT_SRC_POS,
     8103                                           N_("AHCI configuration error: failed to read %s as U32"), s_apszDescs[i][1]);
     8104
     8105            char szName[24];
     8106            RTStrPrintf(szName, sizeof(szName), "EmulatedATA%d", i);
     8107            rc = ataControllerInit(pDevIns, pCtl,
     8108                                   iPortMaster, pThis->ahciPort[iPortMaster].pDrvBase,
     8109                                   iPortSlave, pThis->ahciPort[iPortSlave].pDrvBase,
     8110                                   &cbSSMState, szName, &pThis->ahciPort[iPortMaster].Led,
     8111                                   &pThis->ahciPort[iPortMaster].StatBytesRead,
     8112                                   &pThis->ahciPort[iPortMaster].StatBytesWritten);
    81158113            if (RT_FAILURE(rc))
    81168114                return rc;
    8117         }
    8118 
    8119         if (pThis->fGCEnabled)
    8120         {
    8121             rc = PDMDevHlpIOPortRegisterRC(pDevIns, pCtl->IOPortBase1, 8, (RTGCPTR)i,
    8122                                             "ahciIOPortWrite1", "ahciIOPortRead1", NULL, NULL, "AHCI GC");
     8115
     8116            cbTotalBufferSize += cbSSMState;
     8117
     8118            rc = PDMDevHlpIOPortRegister(pDevIns, pCtl->IOPortBase1, 8, (RTHCPTR)i,
     8119                                         ahciIOPortWrite1, ahciIOPortRead1, ahciIOPortWriteStr1, ahciIOPortReadStr1, "AHCI");
    81238120            if (RT_FAILURE(rc))
    81248121                return rc;
    8125         }
    8126 
    8127         rc = PDMDevHlpIOPortRegister(pDevIns, pCtl->IOPortBase2, 1, (RTHCPTR)i,
    8128                                      ahciIOPortWrite2, ahciIOPortRead2, NULL, NULL, "AHCI");
    8129         if (RT_FAILURE(rc))
    8130             return rc;
    8131 
    8132         if (pThis->fR0Enabled)
    8133         {
    8134             rc = PDMDevHlpIOPortRegisterR0(pDevIns, pCtl->IOPortBase2, 1, (RTR0PTR)i,
    8135                                             "ahciIOPortWrite2", "ahciIOPortRead2", NULL, NULL, "AHCI R0");
     8122
     8123            if (pThis->fR0Enabled)
     8124            {
     8125                rc = PDMDevHlpIOPortRegisterR0(pDevIns, pCtl->IOPortBase1, 8, (RTR0PTR)i,
     8126                                               "ahciIOPortWrite1", "ahciIOPortRead1", NULL, NULL, "AHCI R0");
     8127                if (RT_FAILURE(rc))
     8128                    return rc;
     8129            }
     8130
     8131            if (pThis->fGCEnabled)
     8132            {
     8133                rc = PDMDevHlpIOPortRegisterRC(pDevIns, pCtl->IOPortBase1, 8, (RTGCPTR)i,
     8134                                                "ahciIOPortWrite1", "ahciIOPortRead1", NULL, NULL, "AHCI GC");
     8135                if (RT_FAILURE(rc))
     8136                    return rc;
     8137            }
     8138
     8139            rc = PDMDevHlpIOPortRegister(pDevIns, pCtl->IOPortBase2, 1, (RTHCPTR)i,
     8140                                         ahciIOPortWrite2, ahciIOPortRead2, NULL, NULL, "AHCI");
    81368141            if (RT_FAILURE(rc))
    81378142                return rc;
    8138         }
    8139 
    8140         if (pThis->fGCEnabled)
    8141         {
    8142             rc = PDMDevHlpIOPortRegisterRC(pDevIns, pCtl->IOPortBase2, 1, (RTGCPTR)i,
    8143                                             "ahciIOPortWrite2", "ahciIOPortRead2", NULL, NULL, "AHCI GC");
    8144             if (RT_FAILURE(rc))
    8145                 return rc;
     8143
     8144            if (pThis->fR0Enabled)
     8145            {
     8146                rc = PDMDevHlpIOPortRegisterR0(pDevIns, pCtl->IOPortBase2, 1, (RTR0PTR)i,
     8147                                                "ahciIOPortWrite2", "ahciIOPortRead2", NULL, NULL, "AHCI R0");
     8148                if (RT_FAILURE(rc))
     8149                    return rc;
     8150            }
     8151
     8152            if (pThis->fGCEnabled)
     8153            {
     8154                rc = PDMDevHlpIOPortRegisterRC(pDevIns, pCtl->IOPortBase2, 1, (RTGCPTR)i,
     8155                                                "ahciIOPortWrite2", "ahciIOPortRead2", NULL, NULL, "AHCI GC");
     8156                if (RT_FAILURE(rc))
     8157                    return rc;
     8158            }
    81468159        }
    81478160    }
  • trunk/src/VBox/Devices/Storage/DevBusLogic.cpp

    r33676 r34009  
    29602960    PBUSLOGIC  pThis = PDMINS_2_DATA(pDevIns, PBUSLOGIC);
    29612961    int        rc = VINF_SUCCESS;
     2962    bool       fBootable = true;
    29622963    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    29632964
     
    29672968    if (!CFGMR3AreValuesValid(pCfg,
    29682969                              "GCEnabled\0"
    2969                               "R0Enabled\0"))
     2970                              "R0Enabled\0"
     2971                              "Bootable\0"))
    29702972        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
    29712973                                N_("BusLogic configuration error: unknown option specified"));
     
    29822984                                N_("BusLogic configuration error: failed to read R0Enabled as boolean"));
    29832985    Log(("%s: fR0Enabled=%d\n", __FUNCTION__, pThis->fR0Enabled));
    2984 
     2986    rc = CFGMR3QueryBoolDef(pCfg, "Bootable", &fBootable, true);
     2987    if (RT_FAILURE(rc))
     2988        return PDMDEV_SET_ERROR(pDevIns, rc,
     2989                                N_("BusLogic configuration error: failed to read Bootable as boolean"));
     2990    Log(("%s: fBootable=%RTbool\n", __FUNCTION__, fBootable));
    29852991
    29862992    pThis->pDevInsR3 = pDevIns;
     
    30193025        return rc;
    30203026
    3021     /* Register I/O port space in ISA region for BIOS access. */
    3022     rc = PDMDevHlpIOPortRegister(pDevIns, BUSLOGIC_ISA_IO_PORT, 3, NULL,
    3023                                  buslogicIsaIOPortWrite, buslogicIsaIOPortRead,
    3024                                  buslogicIsaIOPortWriteStr, buslogicIsaIOPortReadStr,
    3025                                  "BusLogic BIOS");
    3026     if (RT_FAILURE(rc))
    3027         return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic cannot register legacy I/O handlers"));
     3027    if (fBootable)
     3028    {
     3029        /* Register I/O port space in ISA region for BIOS access. */
     3030        rc = PDMDevHlpIOPortRegister(pDevIns, BUSLOGIC_ISA_IO_PORT, 3, NULL,
     3031                                     buslogicIsaIOPortWrite, buslogicIsaIOPortRead,
     3032                                     buslogicIsaIOPortWriteStr, buslogicIsaIOPortReadStr,
     3033                                     "BusLogic BIOS");
     3034        if (RT_FAILURE(rc))
     3035            return PDMDEV_SET_ERROR(pDevIns, rc, N_("BusLogic cannot register legacy I/O handlers"));
     3036    }
    30283037
    30293038    /* Initialize task cache. */
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp

    r33919 r34009  
    49404940    char *pszCtrlType = NULL;
    49414941    char  szDevTag[20], szTaggedText[64];
     4942    bool fBootable = true;
    49424943    PDMDEV_CHECK_VERSIONS_RETURN(pDevIns);
    49434944
     
    49504951                                    "RequestQueueDepth\0"
    49514952                                    "ControllerType\0"
    4952                                     "NumPorts\0");
     4953                                    "NumPorts\0"
     4954                                    "Bootable\0");
    49534955    if (RT_FAILURE(rc))
    49544956        return PDMDEV_SET_ERROR(pDevIns, VERR_PDM_DEVINS_UNKNOWN_CFG_VALUES,
     
    49884990                                N_("LsiLogic configuration error: failed to read ControllerType as string"));
    49894991    Log(("%s: ControllerType=%s\n", __FUNCTION__, pszCtrlType));
    4990    
     4992
    49914993    rc = lsilogicGetCtrlTypeFromString(pThis, pszCtrlType);
    49924994    MMR3HeapFree(pszCtrlType);
     
    50155017        return PDMDEV_SET_ERROR(pDevIns, rc,
    50165018                                N_("LsiLogic configuration error: failed to read NumPorts as integer"));
     5019
     5020    rc = CFGMR3QueryBoolDef(pCfg, "Bootable", &fBootable, true);
     5021    if (RT_FAILURE(rc))
     5022        return PDMDEV_SET_ERROR(pDevIns, rc,
     5023                                N_("LsiLogic configuration error: failed to read Bootable as boolean"));
     5024    Log(("%s: Bootable=%RTbool\n", __FUNCTION__, fBootable));
    50175025
    50185026    /* Init static parts. */
     
    51195127     * Create critical sections protecting the reply post and free queues.
    51205128     */
    5121     RTStrPrintf(szTaggedText, sizeof(szTaggedText), "%sRFQ", szDevTag);    
     5129    RTStrPrintf(szTaggedText, sizeof(szTaggedText), "%sRFQ", szDevTag);
    51225130    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyFreeQueueCritSect, RT_SRC_POS,
    51235131                               szTaggedText);
     
    51265134                                N_("LsiLogic: cannot create critical section for reply free queue"));
    51275135
    5128     RTStrPrintf(szTaggedText, sizeof(szTaggedText), "%sRPQ", szDevTag);       
     5136    RTStrPrintf(szTaggedText, sizeof(szTaggedText), "%sRPQ", szDevTag);
    51295137    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyPostQueueCritSect, RT_SRC_POS,
    51305138                               szTaggedText);
     
    52105218    AssertRC(rc);
    52115219
    5212     /* Register I/O port space in ISA region for BIOS access, only for first controller. */
    5213     if (iInstance == 0)
     5220    /*
     5221     * Register I/O port space in ISA region for BIOS access
     5222     * if the controller is marked as bootable.
     5223     */
     5224    if (fBootable)
    52145225    {
    52155226        if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     
    52285239        if (RT_FAILURE(rc))
    52295240            return PDMDEV_SET_ERROR(pDevIns, rc, N_("LsiLogic cannot register legacy I/O handlers"));
    5230     }       
     5241    }
    52315242
    52325243    /* Register save state handlers. */
  • trunk/src/VBox/Devices/testcase/tstDeviceStructSizeRC.cpp

    r33648 r34009  
    12691269    GEN_CHECK_OFF(AHCI, fR0Enabled);
    12701270    GEN_CHECK_OFF(AHCI, fSignalIdle);
     1271    GEN_CHECK_OFF(AHCI, fBootable);
    12711272    GEN_CHECK_OFF(AHCI, cPortsImpl);
    12721273    GEN_CHECK_OFF(AHCI, f8ByteMMIO4BytesWrittenSuccessfully);
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