VirtualBox

Changeset 43750 in vbox for trunk/src/VBox/Main


Ignore:
Timestamp:
Oct 26, 2012 7:25:05 AM (12 years ago)
Author:
vboxsync
Message:

Main/src-client/ConsoleImpl2 & Devices/PC/DevPcBios: Logical Geometry fix (xtracker bug #6433)
Fix for finding the initial 4 SATA ports used (attached HD to them) and creating a CFGM entry for those ports.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/src-client/ConsoleImpl2.cpp

    r43350 r43750  
    464464        throw ConfigError("CFGMR3RemoveValue", vrc, pcszName);
    465465}
     466/** Helper that finds out the next SATA port used
     467 */
     468static int GetNextUsedSataPort(int aSataPortUsed[30], int iBaseVal, int iSize)
     469{
     470    int iNextPortUsed = 30;
     471    for (size_t j = 0; j < iSize; ++j)
     472    {
     473        if(aSataPortUsed[j] > iBaseVal &&
     474           aSataPortUsed[j] <= iNextPortUsed)
     475           iNextPortUsed = aSataPortUsed[j];
     476    }
     477    return iNextPortUsed;
     478}
    466479
    467480#ifdef VBOX_WITH_PCI_PASSTHROUGH
     
    16131626                    if (!BusMgr->hasPCIDevice("ahci", 1))
    16141627                    {
     1628#define MAX_SATA_LUN_COUNT 4
     1629#define MAX_SATA_PORTS     30
     1630
     1631                        static const char * const s_apszBiosConfig[4] =
     1632                        { "SataLUN1", "SataLUN2", "SataLUN3", "SataLUN4" };
     1633
     1634                        int iPortNum = 0;
     1635                        uint32_t u32PortLUN[MAX_SATA_LUN_COUNT];
     1636                        uint32_t u32PortUsed[MAX_SATA_PORTS];
     1637                        uint32_t u32HDSataPortCount = 0;
     1638                        uint32_t u32MaxPortCount = MAX_SATA_LUN_COUNT;
     1639                        uint32_t u32NumAttachments = 0;
     1640                        DeviceType_T lType;
     1641                        com::SafeIfaceArray<IMediumAttachment> atts;
     1642
     1643                        /* init to max value */
     1644                        u32PortLUN[0] = MAX_SATA_PORTS;
     1645
    16151646                        if (pBiosCfg)
    16161647                        {
    16171648                            InsertConfigString(pBiosCfg, "SataHardDiskDevice", "ahci");
    16181649                        }
     1650
     1651
     1652                        hrc = pMachine->GetMediumAttachmentsOfController(controllerName.raw(),
     1653                                                            ComSafeArrayAsOutParam(atts));  H();
     1654                        u32NumAttachments = atts.size();
     1655                        if (u32NumAttachments > MAX_SATA_PORTS)
     1656                        {
     1657                            LogRel(("Number of Sata Port Attachments > Max=%d.\n", u32NumAttachments));
     1658                            u32NumAttachments =  MAX_SATA_PORTS;
     1659                        }
     1660
     1661                        /* find the relavant ports i.e Sata ports to which
     1662                         * HD is attached.
     1663                         */
     1664                        for (size_t j = 0; j < u32NumAttachments; ++j)
     1665                        {
     1666                            IMediumAttachment *pMediumAtt = atts[j];
     1667                            hrc = pMediumAtt->COMGETTER(Port)(&iPortNum);                   H();
     1668                            if(SUCCEEDED(hrc))
     1669                                hrc = pMediumAtt->COMGETTER(Type)(&lType);                    H();
     1670                                if(SUCCEEDED(hrc) && lType == DeviceType_HardDisk)
     1671                                {
     1672                                    /* find min port number used for HD */
     1673                                    if(iPortNum < u32PortLUN[0])
     1674                                        u32PortLUN[0] = iPortNum;
     1675                                    u32PortUsed[u32HDSataPortCount++] = iPortNum;
     1676                                    LogFlowFunc(("HD Sata port Count=%d\n", u32HDSataPortCount));
     1677                                }
     1678                        }
     1679
     1680
     1681                        /* Pick only the top 4 used HD Sata Ports as CMOS doesn't have space
     1682                         * to save details for every 30 ports
     1683                         */
     1684                        if (u32HDSataPortCount < MAX_SATA_LUN_COUNT)
     1685                            u32MaxPortCount = u32HDSataPortCount;
     1686                        for (size_t i = 1; i < u32MaxPortCount; i++)
     1687                            u32PortLUN[i] = GetNextUsedSataPort(u32PortUsed,
     1688                                                                u32PortLUN[i-1],
     1689                                                                u32HDSataPortCount);
     1690                        if (pBiosCfg)
     1691                            for (j = 0; j < u32MaxPortCount; j++)
     1692                            {
     1693                                InsertConfigInteger(pBiosCfg, s_apszBiosConfig[j], u32PortLUN[j]);
     1694                                LogFlowFunc(("Top %d ports = %s, %d\n", j, s_apszBiosConfig[j], u32PortLUN[j]));
     1695                            }
    16191696                    }
    16201697
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