VirtualBox

Changeset 906 in vbox


Ignore:
Timestamp:
Feb 14, 2007 2:27:46 PM (18 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
18628
Message:

Save and load state notifications for HGCM host services added.

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/VMMDevInterface.cpp

    r1 r906  
    317317}
    318318
     319/**
     320 * Execute state save operation.
     321 *
     322 * @returns VBox status code.
     323 * @param   pDrvIns         Driver instance of the driver which registered the data unit.
     324 * @param   pSSM            SSM operation handle.
     325 */
     326static DECLCALLBACK(int) iface_hgcmSave(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM)
     327{
     328    PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV);
     329   
     330    return hgcmSaveStateInternal (pDrv->pHGCMPort, pDrv->pVMMDev->mSharedFolderClientId, pSSM);
     331}
     332
     333
     334/**
     335 * Execute state load operation.
     336 *
     337 * @returns VBox status code.
     338 * @param   pDrvIns         Driver instance of the driver which registered the data unit.
     339 * @param   pSSM            SSM operation handle.
     340 * @param   u32Version      Data layout version.
     341 */
     342static DECLCALLBACK(int) iface_hgcmLoad(PPDMDRVINS pDrvIns, PSSMHANDLE pSSM, uint32_t u32Version)
     343{
     344    PDRVMAINVMMDEV pDrv = PDMINS2DATA(pDrvIns, PDRVMAINVMMDEV);
     345
     346    if (u32Version != HGCM_SSM_VERSION)
     347        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
     348
     349    return hgcmLoadStateInternal (pDrv->pHGCMPort, pDrv->pVMMDev->mSharedFolderClientId, pSSM);
     350}
     351
    319352int VMMDev::hgcmLoadService (const char *pszServiceName, const char *pszServiceLibrary)
    320353{
     
    542575        pData->pVMMDev->mSharedFolderClientId = 0;
    543576    }
     577#if 0 /* enable later */
     578    pDrvIns->pDrvHlp->pfnSSMRegister(pDrvIns, "HGCM", 0, HGCM_SSM_VERSION, 4096/* bad guess */, NULL, iface_hgcmSave, NULL, NULL, iface_hgcmLoad, NULL);
     579#endif
    544580#endif
    545581
  • trunk/src/VBox/Main/hgcm/HGCM.cpp

    r222 r906  
    272272#define HGCMMSGID_DISCONNECT (11)
    273273#define HGCMMSGID_LOAD       (12)
    274 
    275274#define HGCMMSGID_HOSTCALL   (13)
     275#define HGCMMSGID_LOADSTATE  (14)
     276#define HGCMMSGID_SAVESTATE  (15)
    276277
    277278class HGCMMsgConnect: public HGCMMsgHeader
     
    291292        /* client identifier */
    292293        uint32_t u32ClientID;
     294};
     295
     296class HGCMMsgLoadSaveState: public HGCMMsgHeader
     297{
     298    public:
     299        /* client identifier */
     300        uint32_t    u32ClientID;
     301        PSSMHANDLE  pSSM;
    293302};
    294303
     
    388397        case HGCMMSGID_LOAD:            return new HGCMMsgLoad ();
    389398        case HGCMMSGID_HOSTCALL:        return new HGCMMsgHostCall ();
     399        case HGCMMSGID_LOADSTATE:     
     400        case HGCMMSGID_SAVESTATE:       return new HGCMMsgLoadSaveState ();
    390401        default:
    391402            Log(("hgcmMessageAlloc::Unsupported message number %08X\n", u32MsgId));
     
    520531                rc = VINF_SUCCESS;
    521532            } break;
     533
     534            case HGCMMSGID_LOADSTATE:
     535            {
     536                LogFlow(("HGCMMSGID_LOADSTATE\n"));
     537
     538                HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
     539                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     540
     541                rc = VINF_SUCCESS;
     542                if (pClient && pSvc->m_fntable.pfnLoadState)
     543                {
     544                    rc = pSvc->m_fntable.pfnLoadState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM);
     545                    hgcmObjDereference (pClient);
     546                }
     547                break;
     548            }
     549
     550            case HGCMMSGID_SAVESTATE:
     551            {
     552                LogFlow(("HGCMMSGID_SAVESTATE\n"));
     553
     554                HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)pMsgCore;
     555                HGCMClient *pClient = (HGCMClient *)hgcmObjReference (pMsg->u32ClientID);
     556
     557                rc = VINF_SUCCESS;
     558                if (pClient && pSvc->m_fntable.pfnSaveState)
     559                {
     560                    rc = pSvc->m_fntable.pfnSaveState (pMsg->u32ClientID, HGCM_CLIENT_DATA(pSvc, pClient), pMsg->pSSM);
     561                    hgcmObjDereference (pClient);
     562                }
     563                break;
     564            }
    522565
    523566            default:
     
    12751318}
    12761319
     1320int hgcmSaveStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t u32ClientID, PSSMHANDLE pSSM)
     1321{
     1322    int rc = VINF_SUCCESS;
     1323
     1324    LogFlow(("MAIN::hgcmSaveStateInternal: pHGCMPort = %p, u32ClientID = %d\n",
     1325             pHGCMPort, u32ClientID));
     1326
     1327    if (!pHGCMPort)
     1328    {
     1329        return VERR_INVALID_PARAMETER;
     1330    }
     1331
     1332    HGCMMSGHANDLE hMsg = 0;
     1333
     1334    rc = hgcmMsgAlloc (g_hgcmThread, &hMsg, HGCMMSGID_SAVESTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
     1335
     1336    if (VBOX_SUCCESS(rc))
     1337    {
     1338        HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg);
     1339
     1340        AssertRelease(pMsg);
     1341
     1342        pMsg->pHGCMPort   = pHGCMPort;
     1343        pMsg->u32ClientID = u32ClientID;
     1344        pMsg->pSSM        = pSSM;
     1345
     1346        rc = hgcmMsgSend (hMsg);
     1347
     1348        hgcmObjDereference (pMsg);
     1349    }
     1350    else
     1351    {
     1352        Log(("MAIN::hgcmSaveStateInternal: Message allocation failed: %Vrc\n", rc));
     1353    }
     1354
     1355    return rc;
     1356}
     1357
     1358int hgcmLoadStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t u32ClientID, PSSMHANDLE pSSM)
     1359{
     1360    int rc = VINF_SUCCESS;
     1361
     1362    LogFlow(("MAIN::hgcmLoadStateInternal: pHGCMPort = %p, u32ClientID = %d\n",
     1363             pHGCMPort, u32ClientID));
     1364
     1365    if (!pHGCMPort)
     1366    {
     1367        return VERR_INVALID_PARAMETER;
     1368    }
     1369
     1370    HGCMMSGHANDLE hMsg = 0;
     1371
     1372    rc = hgcmMsgAlloc (g_hgcmThread, &hMsg, HGCMMSGID_LOADSTATE, sizeof (HGCMMsgLoadSaveState), hgcmMessageAlloc);
     1373
     1374    if (VBOX_SUCCESS(rc))
     1375    {
     1376        HGCMMsgLoadSaveState *pMsg = (HGCMMsgLoadSaveState *)hgcmObjReference (hMsg);
     1377
     1378        AssertRelease(pMsg);
     1379
     1380        pMsg->pHGCMPort   = pHGCMPort;
     1381        pMsg->u32ClientID = u32ClientID;
     1382        pMsg->pSSM        = pSSM;
     1383
     1384        rc = hgcmMsgSend (hMsg);
     1385
     1386        hgcmObjDereference (pMsg);
     1387    }
     1388    else
     1389    {
     1390        Log(("MAIN::hgcmLoadStateInternal: Message allocation failed: %Vrc\n", rc));
     1391    }
     1392
     1393    return rc;
     1394}
     1395
    12771396int hgcmLoadInternal (const char *pszServiceName, const char *pszServiceLibrary)
    12781397{
  • trunk/src/VBox/Main/include/hgcm/HGCM.h

    r1 r906  
    3030#include <VBox/hgcmsvc.h>
    3131
     32/* HGCM saved state version */
     33#define HGCM_SSM_VERSION    1
     34
    3235__BEGIN_DECLS
    3336int hgcmInit (void);
     
    3942int hgcmGuestCallInternal (PPDMIHGCMPORT pHGCMPort, PVBOXHGCMCMD pCmdPtr, uint32_t clientID, uint32_t function, uint32_t cParms, VBOXHGCMSVCPARM aParms[], bool fBlock);
    4043int hgcmHostCallInternal (const char *pszServiceName, uint32_t function, uint32_t cParms, VBOXHGCMSVCPARM aParms[]);
     44
     45int hgcmSaveStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t clientID, PSSMHANDLE pSSM);
     46int hgcmLoadStateInternal (PPDMIHGCMPORT pHGCMPort, uint32_t clientID, PSSMHANDLE pSSM);
     47
    4148__END_DECLS
    4249
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