VirtualBox

Changeset 30668 in vbox


Ignore:
Timestamp:
Jul 6, 2010 2:26:53 PM (15 years ago)
Author:
vboxsync
Message:

Generate a session id for the VM that is changed every time the VM starts, resets or is restored.

Location:
trunk
Files:
6 edited

Legend:

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

    r30061 r30668  
    414414VBGLR3DECL(int)     VbglR3GetAdditionsVersion(char **ppszVer, char **ppszRev);
    415415VBGLR3DECL(int)     VbglR3GetAdditionsInstallationPath(char **ppszPath);
     416VBGLR3DECL(int)     VbglR3GetSessionId(uint64_t *pu64IdSession);
     417
    416418/** @} */
    417419
  • trunk/include/VBox/VMMDev.h

    r30061 r30668  
    176176    VMMDevReq_GetPageSharingStatus       = 215,
    177177    VMMDevReq_DebugIsPageShared          = 216,
     178    VMMDevReq_GetSessionId               = 217, /* since version 3.2.6 */
    178179    VMMDevReq_SizeHack                   = 0x7fffffff
    179180} VMMDevRequestType;
     
    12041205    bool                        fAlignment[3];
    12051206} VMMDevPageIsSharedRequest;
     1207
     1208/**
     1209 * Session id request structure.
     1210 *
     1211 * Used by VMMDevReq_GetSessionId.
     1212 */
     1213typedef struct
     1214{
     1215    /** Header */
     1216    VMMDevRequestHeader header;
     1217    /** OUT: unique session id; the id will be different after each start, reset or restore of the VM */
     1218    uint64_t            idSession;
     1219} VMMDevReqSessionId;
     1220AssertCompileSize(VMMDevReqSessionId, 24+8);
    12061221
    12071222#pragma pack()
     
    17171732        case VMMDevReq_DebugIsPageShared:
    17181733            return sizeof(VMMDevPageIsSharedRequest);
     1734        case VMMDevReq_GetSessionId:
     1735            return sizeof(VMMDevReqSessionId);
    17191736        default:
    17201737            return 0;
  • trunk/src/VBox/Additions/common/VBoxGuestLib/VBoxGuestR3LibMisc.cpp

    r28800 r30668  
    7575}
    7676
     77/**
     78 * Query the session id of this VM; this is a unique id that gets changed for each VM start, reset or restore.
     79 * Useful for detection a VM restore.
     80 *
     81 * @returns IPRT status code.
     82 * pu64IdSession    Session id (out)
     83 *
     84 */
     85VBGLR3DECL(int) VbglR3GetSessionId(uint64_t *pu64IdSession)
     86{
     87    VMMDevReqSessionId Req;
     88
     89    vmmdevInitRequest(&Req.header, VMMDevReq_GetSessionId);
     90    int rc = vbglR3GRPerform(&Req.header);
     91    if (rc == VINF_SUCCESS)
     92        *pu64IdSession = Req.idSession;
     93
     94    return rc;
     95}
  • trunk/src/VBox/Additions/common/VBoxService/VBoxServicePageSharing.cpp

    r30666 r30668  
    8787static DECLCALLBACK(int) VBoxServicePageSharingEmptyTreeCallback(PAVLPVNODECORE pNode, void *pvUser);
    8888
    89 static PAVLPVNODECORE   pKnownModuleTree = NULL;
     89static PAVLPVNODECORE   g_pKnownModuleTree = NULL;
     90static uint64_t         g_idSession = 0;
    9091
    9192/**
     
    302303        if (!pRec)
    303304        {
    304             pRec = RTAvlPVRemove(&pKnownModuleTree, ModuleInfo.modBaseAddr);
     305            pRec = RTAvlPVRemove(&g_pKnownModuleTree, ModuleInfo.modBaseAddr);
    305306            if (!pRec)
    306307            {
     
    411412            if (!pRec)
    412413            {
    413                 pRec = RTAvlPVRemove(&pKnownModuleTree, pSystemModules->Modules[i].ImageBase);
     414                pRec = RTAvlPVRemove(&g_pKnownModuleTree, pSystemModules->Modules[i].ImageBase);
    414415                if (!pRec)
    415416                {
     
    484485
    485486    /* Delete leftover modules in the old tree. */
    486     RTAvlPVDestroy(&pKnownModuleTree, VBoxServicePageSharingEmptyTreeCallback, NULL);
     487    RTAvlPVDestroy(&g_pKnownModuleTree, VBoxServicePageSharingEmptyTreeCallback, NULL);
    487488
    488489    /* Check all registered modules. */
    489490    VbglR3CheckSharedModules();
     491
    490492    /* Activate new module tree. */
    491     pKnownModuleTree = pNewTree;
     493    g_pKnownModuleTree = pNewTree;
    492494}
    493495
     
    566568#endif
    567569
     570    rc =  VbglR3GetSessionId(&g_idSession);
     571    AssertRCReturn(rc, rc);
     572
    568573    /* Never fail here. */
    569574    return VINF_SUCCESS;
     
    584589    for (;;)
    585590    {
     591        uint64_t idNewSession;
     592
    586593        VBoxServiceVerbose(3, "VBoxServicePageSharingWorker: enabled=%d\n", VbglR3PageSharingIsEnabled());
    587594
     
    605612            break;
    606613        }
     614        idNewSession = g_idSession;
     615        rc =  VbglR3GetSessionId(&idNewSession);
     616        AssertRC(rc);
     617
     618        if (idNewSession != g_idSession)
     619        {
     620            bool fUnregister = false;
     621
     622            VBoxServiceVerbose(3, "VBoxServicePageSharingWorker: VM was restored!!\n"));
     623            /* The VM was restored, so reregister all modules the next time. */
     624            RTAvlPVDestroy(&g_pKnownModuleTree, VBoxServicePageSharingEmptyTreeCallback, &fUnregister);
     625            g_pKnownModuleTree = NULL;
     626        }
     627
    607628    }
    608629
  • trunk/src/VBox/Devices/VMMDev/VMMDev.cpp

    r30594 r30668  
    3333
    3434#include <iprt/asm.h>
     35#include <iprt/asm-amd64-x86.h>
    3536#include <iprt/assert.h>
    3637#include <iprt/buildconfig.h>
     
    18801881        }
    18811882#endif
     1883
     1884        /*
     1885         * Get a unique session id for this VM; the id will be different after each start, reset or restore of the VM
     1886         * This can be used for restore detection inside the guest.
     1887         */
     1888        case VMMDevReq_GetSessionId:
     1889        {
     1890            if (pRequestHeader->size != sizeof(VMMDevReqSessionId))
     1891            {
     1892                AssertMsgFailed(("VMMDevReq_GetSessionId request size too small.\n"));
     1893                pRequestHeader->rc = VERR_INVALID_PARAMETER;
     1894            }
     1895            else
     1896            {
     1897                VMMDevReqSessionId *pReq = (VMMDevReqSessionId *)pRequestHeader;
     1898                pReq->idSession = pThis->idSession;
     1899                pRequestHeader->rc = VINF_SUCCESS;
     1900            }
     1901            break;
     1902        }
     1903
    18821904        default:
    18831905        {
    18841906            pRequestHeader->rc = VERR_NOT_IMPLEMENTED;
    1885 
    18861907            Log(("VMMDev unknown request type %d\n", pRequestHeader->requestType));
    1887 
    18881908            break;
    18891909        }
     
    27072727    if (fCapsChanged)
    27082728        pThis->pDrv->pfnUpdateGuestCapabilities(pThis->pDrv, pThis->guestCaps);
     2729
     2730    /* Generate a unique session id for this VM; it will be changed for each start, reset or restore.
     2731     * This can be used for restore detection inside the guest.
     2732     */
     2733    pThis->idSession = ASMReadTSC();
    27092734}
    27102735
     
    29302955    PDMDevHlpSTAMRegisterF(pDevIns, &pThis->StatMemBalloonChunks, STAMTYPE_U32, STAMVISIBILITY_ALWAYS, STAMUNIT_COUNT, "Memory balloon size", "/Devices/VMMDev/BalloonChunks");
    29312956
     2957    /* Generate a unique session id for this VM; it will be changed for each start, reset or restore.
     2958     * This can be used for restore detection inside the guest.
     2959     */
     2960    pThis->idSession = ASMReadTSC();
    29322961    return rc;
    29332962}
  • trunk/src/VBox/Devices/VMMDev/VMMDevState.h

    r29590 r30668  
    164164    /* guest ram size */
    165165    uint64_t    cbGuestRAM;
     166   
     167    /* unique session id; the id will be different after each start, reset or restore of the VM. */
     168    uint64_t    idSession;
    166169
    167170    /* statistics interval change request */
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