VirtualBox

Changeset 34010 in vbox


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

Main, FE/VBoxManage: Make it possible to mark specific controllers as bootable which means that the BIOS can access devices attached to the controller to boot from it

Location:
trunk
Files:
11 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/settings.h

    r33827 r34010  
    797797          ulInstance(0),
    798798          fUseHostIOCache(true),
     799          fBootable(true),
    799800          lIDE0MasterEmulationPort(0),
    800801          lIDE0SlaveEmulationPort(0),
     
    811812    uint32_t                ulInstance;
    812813    bool                    fUseHostIOCache;
     814    bool                    fBootable;
    813815
    814816    // only for when controllerType == StorageControllerType_IntelAhci:
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageHelp.cpp

    r33825 r34010  
    478478                     "                            [--sataportcount <1-30>]\n"
    479479                     "                            [--hostiocache on|off]\n"
     480                     "                            [--bootable on|off]\n"
    480481                     "                            [--remove]\n"
    481482                     "\n");
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageInfo.cpp

    r33904 r34010  
    666666        const char *pszCtl = NULL;
    667667        ULONG ulValue = 0;
     668        BOOL  fBootable = FALSE;
    668669        Bstr storageCtlName;
    669670
     
    724725        else
    725726            RTPrintf("Storage Controller Port Count (%u):      %lu\n", i, ulValue);
     727
     728        storageCtl->COMGETTER(Bootable)(&fBootable);
     729        if (details == VMINFO_MACHINEREADABLE)
     730            RTPrintf("storagecontrollerbootable%u=\"%s\"\n", i, fBootable ? "on" : "off");
     731        else
     732            RTPrintf("Storage Controller Bootable (%u):        %s\n", i, fBootable ? "on" : "off");
    726733    }
    727734
  • trunk/src/VBox/Frontends/VBoxManage/VBoxManageStorageController.cpp

    r33540 r34010  
    647647    { "--remove",           'r', RTGETOPT_REQ_NOTHING },
    648648    { "--hostiocache",      'i', RTGETOPT_REQ_STRING },
     649    { "--bootable",         'b', RTGETOPT_REQ_STRING },
    649650};
    650651
     
    657658    const char       *pszCtlType     = NULL;
    658659    const char       *pszHostIOCache = NULL;
     660    const char       *pszBootable    = NULL;
    659661    ULONG             satabootdev    = ~0U;
    660662    ULONG             sataidedev     = ~0U;
     
    728730            }
    729731
     732            case 'b':
     733            {
     734                pszBootable = ValueUnion.psz;
     735                break;
     736            }
     737
    730738            default:
    731739            {
     
    949957            }
    950958        }
     959
     960        if (   pszBootable
     961            && SUCCEEDED(rc))
     962        {
     963            if (SUCCEEDED(rc))
     964            {
     965                if (!RTStrICmp(pszBootable, "on"))
     966                {
     967                    CHECK_ERROR(machine, SetStorageControllerBootable(Bstr(pszCtl).raw(), TRUE));
     968                }
     969                else if (!RTStrICmp(pszBootable, "off"))
     970                {
     971                    CHECK_ERROR(machine, SetStorageControllerBootable(Bstr(pszCtl).raw(), FALSE));
     972                }
     973                else
     974                {
     975                    errorArgument("Invalid --bootable argument '%s'", pszHostIOCache);
     976                    rc = E_FAIL;
     977                }
     978            }
     979            else
     980            {
     981                errorArgument("Couldn't find the controller with the name: '%s'\n", pszCtl);
     982                rc = E_FAIL;
     983            }
     984        }
    951985    }
    952986
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r33918 r34010  
    12811281            rc = ctrls[i]->COMGETTER(UseHostIOCache)(&fUseHostIOCache);                     H();
    12821282
     1283            BOOL fBootable;
     1284            rc = ctrls[i]->COMGETTER(Bootable)(&fBootable);                                 H();
     1285
    12831286            /* /Devices/<ctrldev>/ */
    12841287            const char *pszCtrlDev = pConsole->convertControllerTypeToDev(enmCtrlType);
     
    13041307                    hrc = BusMgr->assignPciDevice("lsilogic", pCtlInst);                               H();
    13051308
     1309                    InsertConfigInteger(pCfg, "Bootable",  fBootable);
    13061310
    13071311                    /* Attach the status driver */
     
    13211325                    hrc = BusMgr->assignPciDevice("buslogic", pCtlInst);                               H();
    13221326
     1327                    InsertConfigInteger(pCfg, "Bootable",  fBootable);
     1328
    13231329                    /* Attach the status driver */
    13241330                    InsertConfigNode(pCtlInst, "LUN#999", &pLunL0);
     
    13401346                    hrc = ctrls[i]->COMGETTER(PortCount)(&cPorts);                          H();
    13411347                    InsertConfigInteger(pCfg, "PortCount", cPorts);
     1348                    InsertConfigInteger(pCfg, "Bootable",  fBootable);
    13421349
    13431350                    /* Needed configuration values for the bios, only first controller. */
     
    14311438
    14321439                    InsertConfigString(pCfg,  "ControllerType", "SAS1068");
     1440                    InsertConfigInteger(pCfg, "Bootable",  fBootable);
    14331441
    14341442                    /* Attach the status driver */
  • trunk/src/VBox/Main/MachineImpl.cpp

    r33952 r34010  
    51365136    /* get a new instance number for the storage controller */
    51375137    ULONG ulInstance = 0;
     5138    bool fBootable = true;
    51385139    for (StorageControllerList::const_iterator it = mStorageControllers->begin();
    51395140         it != mStorageControllers->end();
     
    51465147            if (ulCurInst >= ulInstance)
    51475148                ulInstance = ulCurInst + 1;
    5148         }
    5149     }
    5150 
    5151     rc = ctrl->init(this, aName, aConnectionType, ulInstance);
     5149
     5150            /* Only one controller of each type can be marked as bootable. */
     5151            if ((*it)->getBootable())
     5152                fBootable = false;
     5153        }
     5154    }
     5155
     5156    rc = ctrl->init(this, aName, aConnectionType, ulInstance, fBootable);
    51525157    if (FAILED(rc)) return rc;
    51535158
     
    52065211                    tr("Could not find a storage controller with instance number '%lu'"),
    52075212                    aInstance);
     5213}
     5214
     5215STDMETHODIMP Machine::SetStorageControllerBootable(IN_BSTR aName, BOOL fBootable)
     5216{
     5217    AutoCaller autoCaller(this);
     5218    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     5219
     5220    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     5221
     5222    HRESULT rc = checkStateDependency(MutableStateDep);
     5223    if (FAILED(rc)) return rc;
     5224
     5225    ComObjPtr<StorageController> ctrl;
     5226
     5227    rc = getStorageControllerByName(aName, ctrl, true /* aSetError */);
     5228    if (SUCCEEDED(rc))
     5229    {
     5230        /* Check that only one controller of each type is marked as bootable. */
     5231        if (fBootable == TRUE)
     5232        {
     5233            for (StorageControllerList::const_iterator it = mStorageControllers->begin();
     5234                 it != mStorageControllers->end();
     5235                 ++it)
     5236            {
     5237                ComObjPtr<StorageController> aCtrl = (*it);
     5238
     5239                if (   (aCtrl->getName() != Utf8Str(aName))
     5240                    && aCtrl->getBootable() == TRUE
     5241                    && aCtrl->getStorageBus() == ctrl->getStorageBus()
     5242                    && aCtrl->getControllerType() == ctrl->getControllerType())
     5243                {
     5244                    rc = setError(VBOX_E_OBJECT_IN_USE,
     5245                                  tr("Another storage controller '%s' is already marked as bootable"),
     5246                                  aCtrl->getName().c_str());
     5247                    break;
     5248                }
     5249            }
     5250        }
     5251
     5252        if (SUCCEEDED(rc))
     5253        {
     5254            ctrl->setBootable(fBootable);
     5255            setModified(IsModified_Storage);
     5256        }
     5257    }
     5258
     5259    if (SUCCEEDED(rc))
     5260    {
     5261        /* inform the direct session if any */
     5262        alock.leave();
     5263        onStorageControllerChange();
     5264    }
     5265
     5266    return rc;
    52085267}
    52095268
     
    72357294                        ctlData.strName,
    72367295                        ctlData.storageBus,
    7237                         ctlData.ulInstance);
     7296                        ctlData.ulInstance,
     7297                        ctlData.fBootable);
    72387298        if (FAILED(rc)) return rc;
    72397299
     
    82678327        ctl.storageBus = pCtl->getStorageBus();
    82688328        ctl.ulInstance = pCtl->getInstance();
     8329        ctl.fBootable = pCtl->getBootable();
    82698330
    82708331        /* Save the port count. */
  • trunk/src/VBox/Main/StorageControllerImpl.cpp

    r33915 r34010  
    4747          mPortCount(2),
    4848          fUseHostIOCache(true),
     49          fBootable(false),
    4950          mPortIde0Master(0),
    5051          mPortIde0Slave(1),
     
    6566    /** Whether to use the host IO caches. */
    6667    BOOL fUseHostIOCache;
     68    /** Whether it is possible to boot from disks attached to this controller. */
     69    BOOL fBootable;
    6770
    6871    /** The following is only for the SATA controller atm. */
     
    124127                                const Utf8Str &aName,
    125128                                StorageBus_T aStorageBus,
    126                                 ULONG aInstance)
     129                                ULONG aInstance, bool fBootable)
    127130{
    128131    LogFlowThisFunc(("aParent=%p aName=\"%s\" aInstance=%u\n",
     
    159162    m->bd->strName = aName;
    160163    m->bd->mInstance = aInstance;
     164    m->bd->fBootable = fBootable;
    161165    m->bd->mStorageBus = aStorageBus;
    162166    if (   aStorageBus != StorageBus_IDE
     
    622626}
    623627
     628STDMETHODIMP StorageController::COMGETTER(Bootable) (BOOL *fBootable)
     629{
     630    AutoCaller autoCaller(this);
     631    if (FAILED(autoCaller.rc())) return autoCaller.rc();
     632
     633    /* The machine doesn't need to be mutable. */
     634
     635    AutoReadLock alock(this COMMA_LOCKVAL_SRC_POS);
     636
     637    *fBootable = m->bd->fBootable;
     638
     639    return S_OK;
     640}
     641
    624642// IStorageController methods
    625643/////////////////////////////////////////////////////////////////////////////
     
    721739{
    722740    return m->bd->mInstance;
     741}
     742
     743bool StorageController::getBootable() const
     744{
     745    return !!m->bd->fBootable;
    723746}
    724747
     
    754777
    755778/** @note Locks objects for writing! */
     779void StorageController::setBootable(BOOL fBootable)
     780{
     781    AutoCaller autoCaller(this);
     782    AssertComRCReturnVoid(autoCaller.rc());
     783
     784    AutoWriteLock alock(this COMMA_LOCKVAL_SRC_POS);
     785
     786    m->bd.backup();
     787    m->bd->fBootable = fBootable;
     788}
     789
     790/** @note Locks objects for writing! */
    756791void StorageController::rollback()
    757792{
  • trunk/src/VBox/Main/idl/VirtualBox.xidl

    r33959 r34010  
    34193419  <interface
    34203420     name="IMachine" extends="$unknown"
    3421      uuid="cc4fec9a-3150-45df-9ee9-f00ba54d6ac3"
     3421     uuid="7c05b1c3-c325-46cd-820d-47648d13b7f2"
    34223422     wsmap="managed"
    34233423     >
     
    46454645      </desc>
    46464646      <param name="name" type="wstring" dir="in"/>
     4647    </method>
     4648
     4649    <method name="setStorageControllerBootable">
     4650      <desc>
     4651        Sets the bootable flag of the storage controller with the given name.
     4652
     4653        <result name="VBOX_E_OBJECT_NOT_FOUND">
     4654          A storage controller with given name doesn't exist.
     4655        </result>
     4656        <result name="VBOX_E_OBJECT_IN_USE">
     4657          Another storage controller is marked as bootable already.
     4658        </result>
     4659      </desc>
     4660      <param name="name" type="wstring" dir="in"/>
     4661      <param name="bootable" type="boolean" dir="in"/>
    46474662    </method>
    46484663
     
    1327213287  <interface
    1327313288    name="IStorageController" extends="$unknown"
    13274     uuid="fd93adc0-bbaa-4256-9e6e-00e29f9151c9"
     13289    uuid="1556333-09b6-46d9-bfb7-fc239b7fbe1e"
    1327513290    wsmap="managed"
    1327613291  >
     
    1336713382        virtual machines are running at the same time to prevent I/O cache related hangs.
    1336813383        This option new with the API of VirtualBox 3.2 and is now the default for non-IDE storage controllers.
     13384      </desc>
     13385    </attribute>
     13386
     13387    <attribute name="bootable" type="boolean" readonly="yes">
     13388      <desc>
     13389        Returns whether it is possible to boot from disks attached to this controller.
    1336913390      </desc>
    1337013391    </attribute>
  • trunk/src/VBox/Main/include/MachineImpl.h

    r33952 r34010  
    507507    STDMETHOD(GetStorageControllerByName(IN_BSTR aName, IStorageController **storageController));
    508508    STDMETHOD(GetStorageControllerByInstance(ULONG aInstance, IStorageController **storageController));
     509    STDMETHOD(SetStorageControllerBootable)(IN_BSTR aName, BOOL fBootable);
    509510    STDMETHOD(QuerySavedGuestSize)(ULONG aScreenId, ULONG *puWidth, ULONG *puHeight);
    510511    STDMETHOD(QuerySavedThumbnailSize)(ULONG aScreenId, ULONG *aSize, ULONG *aWidth, ULONG *aHeight);
  • trunk/src/VBox/Main/include/StorageControllerImpl.h

    r31308 r34010  
    5151                 const Utf8Str &aName,
    5252                 StorageBus_T aBus,
    53                  ULONG aInstance);
     53                 ULONG aInstance,
     54                 bool fBootable);
    5455    HRESULT init(Machine *aParent,
    5556                 StorageController *aThat,
     
    7374    STDMETHOD(COMGETTER(UseHostIOCache)) (BOOL *fUseHostIOCache);
    7475    STDMETHOD(COMSETTER(UseHostIOCache)) (BOOL fUseHostIOCache);
     76    STDMETHOD(COMGETTER(Bootable)) (BOOL *fBootable);
    7577
    7678    // StorageController methods
     
    8486    StorageBus_T getStorageBus() const;
    8587    ULONG getInstance() const;
     88    bool getBootable() const;
    8689
    8790    HRESULT checkPortAndDeviceValid(LONG aControllerPort,
    8891                                    LONG aDevice);
     92
     93    void setBootable(BOOL fBootable);
    8994
    9095    void rollback();
  • trunk/src/VBox/Main/xml/Settings.cpp

    r33828 r34010  
    28142814            // default from constructor is 0
    28152815
     2816        pelmController->getAttributeValue("Bootable", sctl.fBootable);
     2817            // default from constructor is true which is true
     2818            // for settings below version 1.11 because they allowed only
     2819            // one controller per type.
     2820
    28162821        Utf8Str strType;
    28172822        if (!pelmController->getAttributeValue("type", strType))
     
    39933998            pelmController->setAttribute("useHostIOCache", sc.fUseHostIOCache);
    39943999
     4000        if (m->sv >= SettingsVersion_v1_11)
     4001            pelmController->setAttribute("Bootable", sc.fBootable);
     4002
    39954003        if (sc.controllerType == StorageControllerType_IntelAhci)
    39964004        {
     
    43904398    }
    43914399
     4400    // Settings version 1.11 is required if more than one controller of each type
     4401    // is present.
     4402    if (m->sv < SettingsVersion_v1_11)
     4403    {
     4404        size_t cSata = 0;
     4405        size_t cScsiLsi = 0;
     4406        size_t cScsiBuslogic = 0;
     4407        size_t cSas = 0;
     4408        size_t cIde = 0;
     4409        size_t cFloppy = 0;
     4410
     4411        for (StorageControllersList::const_iterator it = storageMachine.llStorageControllers.begin();
     4412             it != storageMachine.llStorageControllers.end();
     4413             ++it)
     4414        {
     4415            switch ((*it).storageBus)
     4416            {
     4417                case StorageBus_IDE:
     4418                    cIde++;
     4419                    break;
     4420                case StorageBus_SATA:
     4421                    cSata++;
     4422                    break;
     4423                case StorageBus_SAS:
     4424                    cSas++;
     4425                    break;
     4426                case StorageBus_SCSI:
     4427                    if ((*it).controllerType == StorageControllerType_LsiLogic)
     4428                        cScsiLsi++;
     4429                    else
     4430                        cScsiBuslogic++;
     4431                    break;
     4432                case StorageBus_Floppy:
     4433                    cFloppy++;
     4434                    break;
     4435                default:
     4436                    // Do nothing
     4437                    break;
     4438            }
     4439
     4440            if (   cSata > 1
     4441                || cScsiLsi > 1
     4442                || cScsiBuslogic > 1
     4443                || cSas > 1
     4444                || cIde > 1
     4445                || cFloppy > 1)
     4446                m->sv = SettingsVersion_v1_11;
     4447        }
     4448    }
     4449
    43924450    // settings version 1.9 is required if there is not exactly one DVD
    43934451    // or more than one floppy drive present or the DVD is not at the secondary
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