VirtualBox

Changeset 70597 in vbox


Ignore:
Timestamp:
Jan 15, 2018 11:46:26 PM (7 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
120305
Message:

DevVGA: cleanup in progress

Location:
trunk/src/VBox/Devices/Graphics
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp

    r70596 r70597  
    24572457
    24582458        case VBVA_CMDVBVA_CTL:
    2459         {
    2460             if (cbBuffer < VBoxSHGSMIBufferHeaderSize() + sizeof(VBOXCMDVBVA_CTL))
    2461             {
     2459            if (cbBuffer >= VBoxSHGSMIBufferHeaderSize() + sizeof(VBOXCMDVBVA_CTL))
     2460            {
     2461                VBOXCMDVBVA_CTL *pCtl = (VBOXCMDVBVA_CTL *)VBoxSHGSMIBufferData((PVBOXSHGSMIHEADER)pvBuffer);
     2462                rc = vboxCmdVBVACmdCtl(pVGAState, pCtl, cbBuffer - VBoxSHGSMIBufferHeaderSize());
     2463            }
     2464            else
    24622465                rc = VERR_INVALID_PARAMETER;
    2463                 break;
    2464             }
    2465 
    2466             VBOXCMDVBVA_CTL *pCtl = (VBOXCMDVBVA_CTL*)VBoxSHGSMIBufferData((PVBOXSHGSMIHEADER)pvBuffer);
    2467             rc = vboxCmdVBVACmdCtl(pVGAState, pCtl, cbBuffer - VBoxSHGSMIBufferHeaderSize());
    2468         } break;
     2466            break;
    24692467#endif /* VBOX_WITH_CRHGSMI */
    24702468
  • trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp

    r70596 r70597  
    317317}
    318318
     319/**
     320 * Worker for vboxVBVAExHPCheckProcessCtlInternal() and
     321 * vboxVDMACrGuestCtlProcess() / VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED.
     322 */
    319323static int VBoxVBVAExHPPause(struct VBVAEXHOSTCONTEXT *pCmdVbva)
    320324{
     
    15861590}
    15871591
     1592/**
     1593 * Handles on entry in a VBVAEXHOSTCTL_TYPE_GHH_RESIZE command.
     1594 *
     1595 * @returns IPRT status code.
     1596 * @param   pVdma               The VDMA channel
     1597 * @param   pEntry              The entry to handle.  Considered volatile.
     1598 *
     1599 * @thread  VDMA
     1600 */
    15881601static int vboxVDMACrGuestCtlResizeEntryProcess(struct VBOXVDMAHOST *pVdma, VBOXCMDVBVA_RESIZE_ENTRY *pEntry)
    15891602{
     
    16621675}
    16631676
     1677
     1678/**
     1679 * Processes VBVAEXHOST_DATA_TYPE_GUESTCTL for vboxVDMAWorkerThread and
     1680 * vdmaVBVACtlThreadCreatedEnable.
     1681 *
     1682 * @returns VBox status code.
     1683 * @param   pVdma               The VDMA channel.
     1684 * @param   pCmd                The command to process.
     1685 *
     1686 * @thread  VDMA
     1687 */
    16641688static int vboxVDMACrGuestCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd)
    16651689{
     
    16671691    switch (enmType)
    16681692    {
     1693        /*
     1694         * See handling of VBOXCMDVBVACTL_TYPE_3DCTL in vboxCmdVBVACmdCtl().
     1695         */
    16691696        case VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE:
    1670         {
    1671             if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
    1672             {
    1673                 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
    1674                 return VERR_INVALID_STATE;
    1675             }
    1676             if (!pVdma->CrSrvInfo.pfnGuestCtl)
    1677             {
     1697            if (VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
     1698            {
     1699                if (pVdma->CrSrvInfo.pfnGuestCtl)
     1700                    return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd);
     1701
    16781702                /* Unexpected. */
    16791703                WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE in HGCM-less mode\n"));
    1680                 return VERR_INVALID_STATE;
    1681             }
    1682             return pVdma->CrSrvInfo.pfnGuestCtl(pVdma->CrSrvInfo.hSvr, pCmd->u.cmd.pu8Cmd, pCmd->u.cmd.cbCmd);
    1683         }
     1704            }
     1705            else
     1706                WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
     1707            return VERR_INVALID_STATE;
     1708
     1709        /*
     1710         * See handling of VBOXCMDVBVACTL_TYPE_RESIZE in vboxCmdVBVACmdCtl().
     1711         */
    16841712        case VBVAEXHOSTCTL_TYPE_GHH_RESIZE:
    1685         {
    1686             if (!VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
    1687             {
    1688                 WARN(("VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE for disabled vdma VBVA\n"));
    1689                 return VERR_INVALID_STATE;
    1690             }
    1691 
    1692             uint32_t cbCmd = pCmd->u.cmd.cbCmd;
    1693 
    1694             if (cbCmd % sizeof (VBOXCMDVBVA_RESIZE_ENTRY))
    1695             {
    1696                 WARN(("invalid buffer size\n"));
     1713            if (VBoxVBVAExHSIsEnabled(&pVdma->CmdVbva))
     1714            {
     1715                uint32_t cbCmd = pCmd->u.cmd.cbCmd;
     1716                if (   !(cbCmd % sizeof(VBOXCMDVBVA_RESIZE_ENTRY))
     1717                    && cbCmd > 0)
     1718                {
     1719                    uint32_t cElements = cbCmd / sizeof(VBOXCMDVBVA_RESIZE_ENTRY);
     1720                    VBOXCMDVBVA_RESIZE *pResize = (VBOXCMDVBVA_RESIZE *)pCmd->u.cmd.pu8Cmd;
     1721                    for (uint32_t i = 0; i < cElements; ++i)
     1722                    {
     1723                        VBOXCMDVBVA_RESIZE_ENTRY *pEntry = &pResize->aEntries[i];
     1724                        int rc = vboxVDMACrGuestCtlResizeEntryProcess(pVdma, pEntry);
     1725                        if (RT_FAILURE(rc))
     1726                        {
     1727                            WARN(("vboxVDMACrGuestCtlResizeEntryProcess failed %d\n", rc));
     1728                            return rc;
     1729                        }
     1730                    }
     1731                    return VINF_SUCCESS;
     1732                }
     1733                else
     1734                    WARN(("invalid buffer size: cbCmd=%#x\n", cbCmd));
    16971735                return VERR_INVALID_PARAMETER;
    16981736            }
    1699 
    1700             uint32_t cElements = cbCmd / sizeof (VBOXCMDVBVA_RESIZE_ENTRY);
    1701             if (!cElements)
    1702             {
    1703                 WARN(("invalid buffer size\n"));
    1704                 return VERR_INVALID_PARAMETER;
    1705             }
    1706 
    1707             VBOXCMDVBVA_RESIZE *pResize = (VBOXCMDVBVA_RESIZE*)pCmd->u.cmd.pu8Cmd;
    1708 
    1709             int rc = VINF_SUCCESS;
    1710 
    1711             for (uint32_t i = 0; i < cElements; ++i)
    1712             {
    1713                 VBOXCMDVBVA_RESIZE_ENTRY *pEntry = &pResize->aEntries[i];
    1714                 rc = vboxVDMACrGuestCtlResizeEntryProcess(pVdma, pEntry);
    1715                 if (RT_FAILURE(rc))
    1716                 {
    1717                     WARN(("vboxVDMACrGuestCtlResizeEntryProcess failed %d\n", rc));
    1718                     break;
    1719                 }
    1720             }
    1721             return rc;
    1722         }
     1737            WARN(("VBVAEXHOSTCTL_TYPE_GHH_RESIZE for disabled vdma VBVA\n"));
     1738            return VERR_INVALID_STATE;
     1739
     1740        /*
     1741         * See vdmaVBVACtlEnableSubmitInternal().
     1742         */
    17231743        case VBVAEXHOSTCTL_TYPE_GHH_ENABLE:
    17241744        case VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED:
    17251745        {
    17261746            VBVAENABLE *pEnable = (VBVAENABLE *)pCmd->u.cmd.pu8Cmd;
    1727             Assert(pCmd->u.cmd.cbCmd == sizeof (VBVAENABLE));
     1747            Assert(pCmd->u.cmd.cbCmd == sizeof(VBVAENABLE));
     1748
    17281749            uint32_t u32Offset = pEnable->u32Offset;
    17291750            int rc = vdmaVBVAEnableProcess(pVdma, u32Offset);
    1730             if (!RT_SUCCESS(rc))
    1731             {
     1751            if (RT_SUCCESS(rc))
     1752            {
     1753                if (enmType != VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED)
     1754                    return VINF_SUCCESS;
     1755
     1756                rc = VBoxVBVAExHPPause(&pVdma->CmdVbva);
     1757                if (RT_SUCCESS(rc))
     1758                    return VINF_SUCCESS;
     1759                WARN(("VBoxVBVAExHPPause failed %d\n", rc));
     1760            }
     1761            else
    17321762                WARN(("vdmaVBVAEnableProcess failed %d\n", rc));
    1733                 return rc;
    1734             }
    1735 
    1736             if (enmType == VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED)
    1737             {
    1738                 rc = VBoxVBVAExHPPause(&pVdma->CmdVbva);
    1739                 if (!RT_SUCCESS(rc))
    1740                 {
    1741                     WARN(("VBoxVBVAExHPPause failed %d\n", rc));
    1742                     return rc;
    1743                 }
    1744             }
    1745 
    1746             return VINF_SUCCESS;
    1747         }
     1763            return rc;
     1764        }
     1765
     1766        /*
     1767         * See vdmaVBVACtlDisableSubmitInternal().
     1768         */
    17481769        case VBVAEXHOSTCTL_TYPE_GHH_DISABLE:
    17491770        {
     
    17611782            return VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, false);
    17621783        }
     1784
    17631785        default:
    17641786            WARN(("unexpected ctl type %d\n", pCmd->enmType));
     
    28652887
    28662888/**
    2867  * Called by vgaR3Destruct() to do cleanup..
     2889 * Called by vgaR3Destruct() to do cleanup.
    28682890 */
    28692891void vboxVDMADestruct(struct VBOXVDMAHOST *pVdma)
     
    30073029                                    uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete)
    30083030{
     3031    int            rc;
    30093032    VBVAEXHOSTCTL *pHCtl = VBoxVBVAExHCtlCreate(&pVdma->CmdVbva, enmType);
    3010     if (!pHCtl)
    3011     {
    3012         WARN(("VBoxVBVAExHCtlCreate failed\n"));
    3013         return VERR_NO_MEMORY;
    3014     }
    3015 
    3016     pHCtl->u.cmd.pu8Cmd = pu8Cmd;
    3017     pHCtl->u.cmd.cbCmd = cbCmd;
    3018     int rc = vdmaVBVACtlSubmit(pVdma, pHCtl, enmSource, pfnComplete, pvComplete);
    3019     if (RT_FAILURE(rc))
    3020     {
     3033    if (pHCtl)
     3034    {
     3035        pHCtl->u.cmd.pu8Cmd = pu8Cmd;
     3036        pHCtl->u.cmd.cbCmd  = cbCmd;
     3037        rc = vdmaVBVACtlSubmit(pVdma, pHCtl, enmSource, pfnComplete, pvComplete);
     3038        if (RT_SUCCESS(rc))
     3039            return VINF_SUCCESS;
     3040
    30213041        VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl);
    30223042        Log(("vdmaVBVACtlSubmit failed rc %d\n", rc));
    3023         return rc;;
    3024     }
    3025     return VINF_SUCCESS;
     3043    }
     3044    else
     3045    {
     3046        WARN(("VBoxVBVAExHCtlCreate failed\n"));
     3047        rc = VERR_NO_MEMORY;
     3048    }
     3049    return rc;
    30263050}
    30273051
     
    30313055static int vdmaVBVACtlGenericGuestSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_TYPE enmType, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)
    30323056{
    3033     Assert(cbCtl >= sizeof (VBOXCMDVBVA_CTL));
     3057    Assert(cbCtl >= sizeof(VBOXCMDVBVA_CTL)); /* Checked by callers caller, vbvaChannelHandler(). */
     3058
    30343059    VBoxSHGSMICommandMarkAsynchCompletion(pCtl);
    3035     int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t*)(pCtl+1),
    3036                                       cbCtl - sizeof (VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma);
     3060    int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t *)(pCtl + 1),
     3061                                      cbCtl - sizeof(VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma);
    30373062    if (RT_SUCCESS(rc))
    30383063        return VINF_SUCCESS;
     
    31193144/**
    31203145 * Hook that is called by vboxVDMAWorkerThread when it starts.
     3146 *
     3147 * @thread VDMA
    31213148 */
    31223149static DECLCALLBACK(void) vdmaVBVACtlThreadCreatedEnable(struct VBOXVDMATHREAD *pThread, int rc,
     
    31623189    if (pHCtl)
    31633190    {
    3164         pHCtl->u.cmd.pu8Cmd = (uint8_t*)pEnable;
    3165         pHCtl->u.cmd.cbCmd = sizeof (*pEnable);
    3166         pHCtl->pfnComplete = pfnComplete;
    3167         pHCtl->pvComplete = pvComplete;
     3191        pHCtl->u.cmd.pu8Cmd = (uint8_t *)pEnable;
     3192        pHCtl->u.cmd.cbCmd  = sizeof(*pEnable);
     3193        pHCtl->pfnComplete  = pfnComplete;
     3194        pHCtl->pvComplete   = pvComplete;
    31683195
    31693196        rc = VBoxVDMAThreadCreate(&pVdma->Thread, vboxVDMAWorkerThread, pVdma, vdmaVBVACtlThreadCreatedEnable, pHCtl);
     
    35283555/**
    35293556 * Handler for VBVA_CMDVBVA_CTL, see vbvaChannelHandler().
     3557 *
     3558 * @returns VBox status code
     3559 * @param   pVGAState           The VGA state.
     3560 * @param   pCtl                The control command.
     3561 * @param   cbCtl               The size of it.  This is at least
     3562 *                              sizeof(VBOXCMDVBVA_CTL).
    35303563 */
    35313564int vboxCmdVBVACmdCtl(PVGASTATE pVGAState, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl)
     
    35363569        case VBOXCMDVBVACTL_TYPE_3DCTL:
    35373570            return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, pCtl, cbCtl);
     3571
    35383572        case VBOXCMDVBVACTL_TYPE_RESIZE:
    35393573            return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_RESIZE, pCtl, cbCtl);
     3574
    35403575        case VBOXCMDVBVACTL_TYPE_ENABLE:
    35413576            if (cbCtl == sizeof(VBOXCMDVBVA_CTL_ENABLE))
Note: See TracChangeset for help on using the changeset viewer.

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