Changeset 70597 in vbox
- Timestamp:
- Jan 15, 2018 11:46:26 PM (7 years ago)
- svn:sync-xref-src-repo-rev:
- 120305
- Location:
- trunk/src/VBox/Devices/Graphics
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/Graphics/DevVGA_VBVA.cpp
r70596 r70597 2457 2457 2458 2458 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 2462 2465 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; 2469 2467 #endif /* VBOX_WITH_CRHGSMI */ 2470 2468 -
trunk/src/VBox/Devices/Graphics/DevVGA_VDMA.cpp
r70596 r70597 317 317 } 318 318 319 /** 320 * Worker for vboxVBVAExHPCheckProcessCtlInternal() and 321 * vboxVDMACrGuestCtlProcess() / VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED. 322 */ 319 323 static int VBoxVBVAExHPPause(struct VBVAEXHOSTCONTEXT *pCmdVbva) 320 324 { … … 1586 1590 } 1587 1591 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 */ 1588 1601 static int vboxVDMACrGuestCtlResizeEntryProcess(struct VBOXVDMAHOST *pVdma, VBOXCMDVBVA_RESIZE_ENTRY *pEntry) 1589 1602 { … … 1662 1675 } 1663 1676 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 */ 1664 1688 static int vboxVDMACrGuestCtlProcess(struct VBOXVDMAHOST *pVdma, VBVAEXHOSTCTL *pCmd) 1665 1689 { … … 1667 1691 switch (enmType) 1668 1692 { 1693 /* 1694 * See handling of VBOXCMDVBVACTL_TYPE_3DCTL in vboxCmdVBVACmdCtl(). 1695 */ 1669 1696 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 1678 1702 /* Unexpected. */ 1679 1703 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 */ 1684 1712 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)); 1697 1735 return VERR_INVALID_PARAMETER; 1698 1736 } 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 */ 1723 1743 case VBVAEXHOSTCTL_TYPE_GHH_ENABLE: 1724 1744 case VBVAEXHOSTCTL_TYPE_GHH_ENABLE_PAUSED: 1725 1745 { 1726 1746 VBVAENABLE *pEnable = (VBVAENABLE *)pCmd->u.cmd.pu8Cmd; 1727 Assert(pCmd->u.cmd.cbCmd == sizeof (VBVAENABLE)); 1747 Assert(pCmd->u.cmd.cbCmd == sizeof(VBVAENABLE)); 1748 1728 1749 uint32_t u32Offset = pEnable->u32Offset; 1729 1750 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 1732 1762 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 */ 1748 1769 case VBVAEXHOSTCTL_TYPE_GHH_DISABLE: 1749 1770 { … … 1761 1782 return VBoxVDMAThreadTerm(&pVdma->Thread, NULL, NULL, false); 1762 1783 } 1784 1763 1785 default: 1764 1786 WARN(("unexpected ctl type %d\n", pCmd->enmType)); … … 2865 2887 2866 2888 /** 2867 * Called by vgaR3Destruct() to do cleanup. .2889 * Called by vgaR3Destruct() to do cleanup. 2868 2890 */ 2869 2891 void vboxVDMADestruct(struct VBOXVDMAHOST *pVdma) … … 3007 3029 uint8_t* pu8Cmd, uint32_t cbCmd, PFNVBVAEXHOSTCTL_COMPLETE pfnComplete, void *pvComplete) 3008 3030 { 3031 int rc; 3009 3032 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 3021 3041 VBoxVBVAExHCtlFree(&pVdma->CmdVbva, pHCtl); 3022 3042 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; 3026 3050 } 3027 3051 … … 3031 3055 static int vdmaVBVACtlGenericGuestSubmit(PVBOXVDMAHOST pVdma, VBVAEXHOSTCTL_TYPE enmType, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl) 3032 3056 { 3033 Assert(cbCtl >= sizeof (VBOXCMDVBVA_CTL)); 3057 Assert(cbCtl >= sizeof(VBOXCMDVBVA_CTL)); /* Checked by callers caller, vbvaChannelHandler(). */ 3058 3034 3059 VBoxSHGSMICommandMarkAsynchCompletion(pCtl); 3035 int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t *)(pCtl+1),3036 cbCtl - sizeof 3060 int rc = vdmaVBVACtlGenericSubmit(pVdma, VBVAEXHOSTCTL_SOURCE_GUEST, enmType, (uint8_t *)(pCtl + 1), 3061 cbCtl - sizeof(VBOXCMDVBVA_CTL), vboxCmdVBVACmdCtlGuestCompletion, pVdma); 3037 3062 if (RT_SUCCESS(rc)) 3038 3063 return VINF_SUCCESS; … … 3119 3144 /** 3120 3145 * Hook that is called by vboxVDMAWorkerThread when it starts. 3146 * 3147 * @thread VDMA 3121 3148 */ 3122 3149 static DECLCALLBACK(void) vdmaVBVACtlThreadCreatedEnable(struct VBOXVDMATHREAD *pThread, int rc, … … 3162 3189 if (pHCtl) 3163 3190 { 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; 3168 3195 3169 3196 rc = VBoxVDMAThreadCreate(&pVdma->Thread, vboxVDMAWorkerThread, pVdma, vdmaVBVACtlThreadCreatedEnable, pHCtl); … … 3528 3555 /** 3529 3556 * 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). 3530 3563 */ 3531 3564 int vboxCmdVBVACmdCtl(PVGASTATE pVGAState, VBOXCMDVBVA_CTL *pCtl, uint32_t cbCtl) … … 3536 3569 case VBOXCMDVBVACTL_TYPE_3DCTL: 3537 3570 return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_BE_OPAQUE, pCtl, cbCtl); 3571 3538 3572 case VBOXCMDVBVACTL_TYPE_RESIZE: 3539 3573 return vdmaVBVACtlGenericGuestSubmit(pVdma, VBVAEXHOSTCTL_TYPE_GHH_RESIZE, pCtl, cbCtl); 3574 3540 3575 case VBOXCMDVBVACTL_TYPE_ENABLE: 3541 3576 if (cbCtl == sizeof(VBOXCMDVBVA_CTL_ENABLE))
Note:
See TracChangeset
for help on using the changeset viewer.