Changeset 75769 in vbox for trunk/src/VBox/Devices/VMMDev
- Timestamp:
- Nov 27, 2018 12:30:00 PM (6 years ago)
- svn:sync-xref-src-repo-rev:
- 126971
- Location:
- trunk/src/VBox/Devices/VMMDev
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/VMMDev/VMMDev.cpp
r75596 r75769 4420 4420 pThis->IHGCMPort.pfnCompleted = hgcmCompleted; 4421 4421 pThis->IHGCMPort.pfnIsCmdRestored = hgcmIsCmdRestored; 4422 pThis->IHGCMPort.pfnGetRequestor = hgcmGetRequestor; 4422 4423 #endif 4423 4424 -
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp
r75754 r75769 124 124 RTLISTNODE node; 125 125 126 /** The type of the command . */127 VBOXHGCMCMDTYPEenmCmdType;126 /** The type of the command (VBOXHGCMCMDTYPE). */ 127 uint8_t enmCmdType; 128 128 129 129 /** Whether the command was cancelled by the guest. */ … … 135 135 /** Set if allocated from the memory cache, clear if heap. */ 136 136 bool fMemCache; 137 138 /** Copy of VMMDevRequestHeader::fRequestor. 139 * @note Only valid if VBOXGSTINFO2_F_REQUESTOR_INFO is set in 140 * VMMDevState.guestInfo2.fFeatures. */ 141 uint32_t fRequestor; 137 142 138 143 /** GC physical address of the guest request. */ … … 231 236 * @param cbRequest The size of the HGCM request. 232 237 * @param cParms Number of HGCM parameters for VBOXHGCMCMDTYPE_CALL command. 233 */ 234 static PVBOXHGCMCMD vmmdevHGCMCmdAlloc(PVMMDEV pThis, VBOXHGCMCMDTYPE enmCmdType, RTGCPHYS GCPhys, uint32_t cbRequest, uint32_t cParms) 238 * @param fRequstor The VMMDevRequestHeader::fRequestor value. 239 */ 240 static PVBOXHGCMCMD vmmdevHGCMCmdAlloc(PVMMDEV pThis, VBOXHGCMCMDTYPE enmCmdType, RTGCPHYS GCPhys, 241 uint32_t cbRequest, uint32_t cParms, uint32_t fRequestor) 235 242 { 236 243 #if 1 … … 250 257 pCmdCached->Core.cbRequest = cbRequest; 251 258 pCmdCached->Core.enmCmdType = enmCmdType; 259 pCmdCached->Core.fRequestor = fRequestor; 252 260 if (enmCmdType == VBOXHGCMCMDTYPE_CALL) 253 261 { … … 432 440 int rc = VINF_SUCCESS; 433 441 434 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CONNECT, GCPhys, pHGCMConnect->header.header.size, 0); 442 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CONNECT, GCPhys, pHGCMConnect->header.header.size, 0, 443 pHGCMConnect->header.header.fRequestor); 435 444 if (pCmd) 436 445 { … … 475 484 int rc = VINF_SUCCESS; 476 485 477 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_DISCONNECT, GCPhys, pHGCMDisconnect->header.header.size, 0); 486 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_DISCONNECT, GCPhys, pHGCMDisconnect->header.header.size, 0, 487 pHGCMDisconnect->header.header.fRequestor); 478 488 if (pCmd) 479 489 { … … 732 742 RT_UNTRUSTED_VALIDATED_FENCE(); 733 743 734 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CALL, GCPhys, cbHGCMCall, cParms); 744 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CALL, GCPhys, cbHGCMCall, cParms, 745 pHGCMCall->header.header.fRequestor); 735 746 if (pCmd == NULL) 736 747 return VERR_NO_MEMORY; … … 1008 1019 VMMDevRequestType enmRequestType, uint64_t tsArrival, PVMMDEVREQLOCK *ppLock) 1009 1020 { 1010 LogFunc(("client id = %d, function = %d, cParms = %d, enmRequestType = %d \n",1011 pHGCMCall->u32 ClientID, pHGCMCall->u32Function, pHGCMCall->cParms, enmRequestType));1021 LogFunc(("client id = %d, function = %d, cParms = %d, enmRequestType = %d, fRequestor = %#x\n", pHGCMCall->u32ClientID, 1022 pHGCMCall->u32Function, pHGCMCall->cParms, enmRequestType, pHGCMCall->header.header.fRequestor)); 1012 1023 1013 1024 /* … … 1524 1535 } 1525 1536 1537 /** 1538 * @interface_method_impl{PDMIHGCMPORT,pfnGetRequestor} 1539 */ 1540 DECLCALLBACK(uint32_t) hgcmGetRequestor(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd) 1541 { 1542 PVMMDEV pThis = RT_FROM_MEMBER(pInterface, VMMDevState, IHGCMPort); 1543 if (pThis->guestInfo2.fFeatures & VBOXGSTINFO2_F_REQUESTOR_INFO) 1544 if (pCmd) 1545 return pCmd->fRequestor; 1546 return 0; 1547 } 1548 1526 1549 /** Save information about pending HGCM requests from pThis->listHGCMCmd. 1527 1550 * … … 1641 1664 * 1642 1665 * Allocate VBOXHGCMCMD commands and add them to pThis->listHGCMCmd temporarily. 1643 * vmmdevHGCMLoadStateDone will process the temporary list. 1666 * vmmdevHGCMLoadStateDone will process the temporary list. This includes 1667 * loading the correct fRequestor fields. 1644 1668 * 1645 1669 * @returns VBox status code that the guest should see. … … 1689 1713 AssertRCReturn(rc, rc); 1690 1714 1691 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cParms );1715 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cParms, 0 /*fRequestor*/); 1692 1716 AssertReturn(pCmd, VERR_NO_MEMORY); 1693 1717 … … 1818 1842 AssertRCReturn(rc, rc); 1819 1843 1820 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cLinAddrs );1844 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cLinAddrs, 0 /*fRequestor*/); 1821 1845 AssertReturn(pCmd, VERR_NO_MEMORY); 1822 1846 … … 1876 1900 LogFlowFunc(("Restoring %RGp size %x bytes\n", GCPhys, cbRequest)); 1877 1901 1878 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_LOADSTATE, GCPhys, cbRequest, 0 );1902 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_LOADSTATE, GCPhys, cbRequest, 0, 0 /*fRequestor*/); 1879 1903 AssertReturn(pCmd, VERR_NO_MEMORY); 1880 1904 … … 1908 1932 ASSERT_GUEST_RETURN(cbReq >= sizeof(*pReq), VERR_MISMATCH); 1909 1933 if (u32SSMVersion >= 9) 1910 {1911 1934 ASSERT_GUEST_RETURN(pLoadedCmd->enmCmdType == VBOXHGCMCMDTYPE_CONNECT, VERR_MISMATCH); 1912 } 1913 1914 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CONNECT, pLoadedCmd->GCPhys, cbReq, 0);1935 1936 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_CONNECT, pLoadedCmd->GCPhys, cbReq, 0, 1937 pReq->header.header.fRequestor); 1915 1938 AssertReturn(pCmd, VERR_NO_MEMORY); 1916 1939 … … 1952 1975 ASSERT_GUEST_RETURN(cbReq >= sizeof(*pReq), VERR_MISMATCH); 1953 1976 if (u32SSMVersion >= 9) 1954 {1955 1977 ASSERT_GUEST_RETURN(pLoadedCmd->enmCmdType == VBOXHGCMCMDTYPE_DISCONNECT, VERR_MISMATCH); 1956 } 1957 1958 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_DISCONNECT, pLoadedCmd->GCPhys, cbReq, 0);1978 1979 PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_DISCONNECT, pLoadedCmd->GCPhys, cbReq, 0, 1980 pReq->header.header.fRequestor); 1959 1981 AssertReturn(pCmd, VERR_NO_MEMORY); 1960 1982 -
trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.h
r75740 r75769 31 31 DECLCALLBACK(int) hgcmCompleted(PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmdPtr); 32 32 DECLCALLBACK(bool) hgcmIsCmdRestored(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd); 33 DECLCALLBACK(uint32_t) hgcmGetRequestor(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd); 33 34 34 35 int vmmdevHGCMSaveState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM);
Note:
See TracChangeset
for help on using the changeset viewer.