VirtualBox

Changeset 75769 in vbox for trunk/src/VBox/Devices/VMMDev


Ignore:
Timestamp:
Nov 27, 2018 12:30:00 PM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
126971
Message:

VMMDev,HGCM: Give access to VMMDevRequestHeader::fRequestor. bugref:9105

Location:
trunk/src/VBox/Devices/VMMDev
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r75596 r75769  
    44204420    pThis->IHGCMPort.pfnCompleted           = hgcmCompleted;
    44214421    pThis->IHGCMPort.pfnIsCmdRestored       = hgcmIsCmdRestored;
     4422    pThis->IHGCMPort.pfnGetRequestor        = hgcmGetRequestor;
    44224423#endif
    44234424
  • trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.cpp

    r75754 r75769  
    124124    RTLISTNODE          node;
    125125
    126     /** The type of the command. */
    127     VBOXHGCMCMDTYPE     enmCmdType;
     126    /** The type of the command (VBOXHGCMCMDTYPE). */
     127    uint8_t             enmCmdType;
    128128
    129129    /** Whether the command was cancelled by the guest. */
     
    135135    /** Set if allocated from the memory cache, clear if heap. */
    136136    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;
    137142
    138143    /** GC physical address of the guest request. */
     
    231236 * @param   cbRequest       The size of the HGCM request.
    232237 * @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 */
     240static PVBOXHGCMCMD vmmdevHGCMCmdAlloc(PVMMDEV pThis, VBOXHGCMCMDTYPE enmCmdType, RTGCPHYS GCPhys,
     241                                       uint32_t cbRequest, uint32_t cParms, uint32_t fRequestor)
    235242{
    236243#if 1
     
    250257            pCmdCached->Core.cbRequest  = cbRequest;
    251258            pCmdCached->Core.enmCmdType = enmCmdType;
     259            pCmdCached->Core.fRequestor = fRequestor;
    252260            if (enmCmdType == VBOXHGCMCMDTYPE_CALL)
    253261            {
     
    432440    int rc = VINF_SUCCESS;
    433441
    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);
    435444    if (pCmd)
    436445    {
     
    475484    int rc = VINF_SUCCESS;
    476485
    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);
    478488    if (pCmd)
    479489    {
     
    732742    RT_UNTRUSTED_VALIDATED_FENCE();
    733743
    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);
    735746    if (pCmd == NULL)
    736747        return VERR_NO_MEMORY;
     
    10081019                   VMMDevRequestType enmRequestType, uint64_t tsArrival, PVMMDEVREQLOCK *ppLock)
    10091020{
    1010     LogFunc(("client id = %d, function = %d, cParms = %d, enmRequestType = %d\n",
    1011              pHGCMCall->u32ClientID, 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));
    10121023
    10131024    /*
     
    15241535}
    15251536
     1537/**
     1538 * @interface_method_impl{PDMIHGCMPORT,pfnGetRequestor}
     1539 */
     1540DECLCALLBACK(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
    15261549/** Save information about pending HGCM requests from pThis->listHGCMCmd.
    15271550 *
     
    16411664 *
    16421665 * 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.
    16441668 *
    16451669 * @returns VBox status code that the guest should see.
     
    16891713            AssertRCReturn(rc, rc);
    16901714
    1691             PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cParms);
     1715            PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cParms, 0 /*fRequestor*/);
    16921716            AssertReturn(pCmd, VERR_NO_MEMORY);
    16931717
     
    18181842            AssertRCReturn(rc, rc);
    18191843
    1820             PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cLinAddrs);
     1844            PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, enmCmdType, GCPhys, cbRequest, cLinAddrs, 0 /*fRequestor*/);
    18211845            AssertReturn(pCmd, VERR_NO_MEMORY);
    18221846
     
    18761900            LogFlowFunc(("Restoring %RGp size %x bytes\n", GCPhys, cbRequest));
    18771901
    1878             PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_LOADSTATE, GCPhys, cbRequest, 0);
     1902            PVBOXHGCMCMD pCmd = vmmdevHGCMCmdAlloc(pThis, VBOXHGCMCMDTYPE_LOADSTATE, GCPhys, cbRequest, 0, 0 /*fRequestor*/);
    18791903            AssertReturn(pCmd, VERR_NO_MEMORY);
    18801904
     
    19081932    ASSERT_GUEST_RETURN(cbReq >= sizeof(*pReq), VERR_MISMATCH);
    19091933    if (u32SSMVersion >= 9)
    1910     {
    19111934        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);
    19151938    AssertReturn(pCmd, VERR_NO_MEMORY);
    19161939
     
    19521975    ASSERT_GUEST_RETURN(cbReq >= sizeof(*pReq), VERR_MISMATCH);
    19531976    if (u32SSMVersion >= 9)
    1954     {
    19551977        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);
    19591981    AssertReturn(pCmd, VERR_NO_MEMORY);
    19601982
  • trunk/src/VBox/Devices/VMMDev/VMMDevHGCM.h

    r75740 r75769  
    3131DECLCALLBACK(int)  hgcmCompleted(PPDMIHGCMPORT pInterface, int32_t result, PVBOXHGCMCMD pCmdPtr);
    3232DECLCALLBACK(bool) hgcmIsCmdRestored(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd);
     33DECLCALLBACK(uint32_t) hgcmGetRequestor(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd);
    3334
    3435int vmmdevHGCMSaveState(VMMDevState *pVMMDevState, PSSMHANDLE pSSM);
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