VirtualBox

Changeset 75769 in vbox for trunk


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
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/hgcmsvc.h

    r75747 r75769  
    6969 * 5.1->6.1 Because pfnCall got a new parameter. Also new helpers. (VBox 6.0)
    7070 * 6.1->6.2 Because pfnCallComplete starts returning a status code (VBox 6.0).
     71 * 6.2->6.3 Because pfnGetRequestor was added (VBox 6.0).
    7172 */
    7273#define VBOX_HGCM_SVC_VERSION_MAJOR (0x0006)
    73 #define VBOX_HGCM_SVC_VERSION_MINOR (0x0002)
     74#define VBOX_HGCM_SVC_VERSION_MINOR (0x0003)
    7475#define VBOX_HGCM_SVC_VERSION ((VBOX_HGCM_SVC_VERSION_MAJOR << 16) + VBOX_HGCM_SVC_VERSION_MINOR)
    7576
     
    110111    /** Access to DBGFR3InfoDeregisterExternal. */
    111112    DECLR3CALLBACKMEMBER(int, pfnInfoDeregister,(void *pvInstance, const char *pszName));
     113
     114    /**
     115     * Retrieves the VMMDevRequestHeader::fRequestor value.
     116     *
     117     * @returns The field value, 0 if invalid call.
     118     * @param   hCall       The call we're checking up on.
     119     */
     120    DECLR3CALLBACKMEMBER(uint32_t, pfnGetRequestor, (VBOXHGCMCALLHANDLE hCall));
    112121
    113122} VBOXHGCMSVCHELPERS;
  • trunk/include/VBox/vmm/pdmifs.h

    r75740 r75769  
    20842084    DECLR3CALLBACKMEMBER(bool, pfnIsCmdRestored,(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd));
    20852085
     2086    /**
     2087     * Gets the VMMDevRequestHeader::fRequestor value for @a pCmd.
     2088     *
     2089     * @returns The fRequestor value, 0 if invalid parameters.
     2090     * @param   pInterface          Pointer to this interface.
     2091     * @param   pCmd                The command we're in checking on.
     2092     */
     2093    DECLR3CALLBACKMEMBER(uint32_t, pfnGetRequestor,(PPDMIHGCMPORT pInterface, PVBOXHGCMCMD pCmd));
     2094
    20862095} PDMIHGCMPORT;
    20872096/** PDMIHGCMPORT interface ID. */
    2088 # define PDMIHGCMPORT_IID                       "e82b1709-c245-4ccc-1611-0e6d50d93cbc"
     2097# define PDMIHGCMPORT_IID                       "0864e1c5-659b-40c8-2c97-994e2983038e"
    20892098
    20902099
  • 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);
  • trunk/src/VBox/Main/src-client/HGCM.cpp

    r75747 r75769  
    149149                                                     PFNDBGFHANDLEREXT pfnHandler, void *pvUser);
    150150        static DECLCALLBACK(int)  svcHlpInfoDeregister(void *pvInstance, const char *pszName);
     151        static DECLCALLBACK(uint32_t) svcHlpGetRequestor(VBOXHGCMCALLHANDLE hCall);
    151152
    152153    public:
     
    889890
    890891
     892/**
     893 * @interface_method_impl{VBOXHGCMSVCHELPERS,pfnGetRequestor}
     894 */
     895/* static */ DECLCALLBACK(uint32_t) HGCMService::svcHlpGetRequestor(VBOXHGCMCALLHANDLE hCall)
     896{
     897    HGCMMsgHeader *pMsgHdr = (HGCMMsgHeader *)(hCall);
     898    AssertPtrReturn(pMsgHdr, 0);
     899
     900    PVBOXHGCMCMD pCmd = pMsgHdr->pCmd;
     901    AssertPtrReturn(pCmd, 0);
     902
     903    PPDMIHGCMPORT pHgcmPort = pMsgHdr->pHGCMPort;
     904    AssertPtrReturn(pHgcmPort, 0);
     905
     906    return pHgcmPort->pfnGetRequestor(pHgcmPort, pCmd);
     907}
     908
     909
    891910static DECLCALLBACK(int) hgcmMsgCompletionCallback(int32_t result, HGCMMsgCore *pMsgCore)
    892911{
     
    955974            m_svcHelpers.pfnInfoRegister     = svcHlpInfoRegister;
    956975            m_svcHelpers.pfnInfoDeregister   = svcHlpInfoDeregister;
     976            m_svcHelpers.pfnGetRequestor     = svcHlpGetRequestor;
    957977
    958978            /* Execute the load request on the service thread. */
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