VirtualBox

Changeset 13594 in vbox


Ignore:
Timestamp:
Oct 27, 2008 6:41:07 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
38502
Message:

#1865: SSM - just some cleaning up.

Location:
trunk
Files:
4 edited

Legend:

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

    r12989 r13594  
    407407
    408408
    409 VMMR3DECL(int) SSMR3Register(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess,
     409VMMR3DECL(int) SSMR3RegisterDevice(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess,
    410410    PFNSSMDEVSAVEPREP pfnSavePrep, PFNSSMDEVSAVEEXEC pfnSaveExec, PFNSSMDEVSAVEDONE pfnSaveDone,
    411411    PFNSSMDEVLOADPREP pfnLoadPrep, PFNSSMDEVLOADEXEC pfnLoadExec, PFNSSMDEVLOADDONE pfnLoadDone);
     
    419419    PFNSSMEXTSAVEPREP pfnSavePrep, PFNSSMEXTSAVEEXEC pfnSaveExec, PFNSSMEXTSAVEDONE pfnSaveDone,
    420420    PFNSSMEXTLOADPREP pfnLoadPrep, PFNSSMEXTLOADEXEC pfnLoadExec, PFNSSMEXTLOADDONE pfnLoadDone, void *pvUser);
    421 VMMR3DECL(int) SSMR3Deregister(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance);
     421VMMR3DECL(int) SSMR3DeregisterDevice(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance);
    422422VMMR3DECL(int) SSMR3DeregisterDriver(PVM pVM, PPDMDRVINS pDrvIns, const char *pszName, uint32_t u32Instance);
    423423VMMR3DECL(int) SSMR3DeregisterInternal(PVM pVM, const char *pszName);
  • trunk/src/VBox/VMM/PDMDevHlp.cpp

    r13373 r13594  
    363363             pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, pszName, pszName, u32Instance, u32Version, cbGuess, pfnSavePrep, pfnSaveExec, pfnSaveDone, pfnLoadPrep, pfnLoadExec, pfnLoadDone));
    364364
    365     int rc = SSMR3Register(pDevIns->Internal.s.pVMR3, pDevIns, pszName, u32Instance, u32Version, cbGuess,
    366                            pfnSavePrep, pfnSaveExec, pfnSaveDone,
    367                            pfnLoadPrep, pfnLoadExec, pfnLoadDone);
     365    int rc = SSMR3RegisterDevice(pDevIns->Internal.s.pVMR3, pDevIns, pszName, u32Instance, u32Version, cbGuess,
     366                                 pfnSavePrep, pfnSaveExec, pfnSaveDone,
     367                                 pfnLoadPrep, pfnLoadExec, pfnLoadDone);
    368368
    369369    LogFlow(("pdmR3DevHlp_SSMRegister: caller='%s'/%d: returns %Vrc\n", pDevIns->pDevReg->szDeviceName, pDevIns->iInstance, rc));
  • trunk/src/VBox/VMM/SSM.cpp

    r13005 r13594  
    2323/** @page pg_ssm        SSM - The Saved State Manager
    2424 *
    25  * The Saved State Manager (SSM) implements facilities for saving and loading
    26  * a VM state in a structural manner using callbacks for each collection of
    27  * data which needs saving.
    28  *
    29  * At init time each of the VM components will register data entities which
    30  * they need to save and restore. Each entity have a unique name (ascii) and
    31  * a set of callbacks associated with it. The name will be used to identify
    32  * the entity during restore. The callbacks are for the two operations, save
    33  * and restore. There are three callbacks for each of the two - a prepare,
    34  * a execute and a what-now.
     25 * The Saved State Manager (SSM) implements facilities for saving and loading a
     26 * VM state in a structural manner using callbacks for each collection of data
     27 * which needs saving.
     28 *
     29 * At init time each of the VMM components, Devices, Drivers and one or two
     30 * other things will register data entities which they need to save and restore.
     31 * Each entity have a unique name (ascii), instance number, and a set of
     32 * callbacks associated with it.  The name will be used to identify the entity
     33 * during restore.  The callbacks are for the two operations, save and restore.
     34 * There are three callbacks for each of the two - a prepare, a execute and a
     35 * complete - giving each component ample opportunity to perform actions both
     36 * before and afterwards.
    3537 *
    3638 * The SSM provides a number of APIs for encoding and decoding the data.
    3739 *
    3840 * @see grp_ssm
     41 *
     42 *
     43 * @section sec_ssm_future  Future Changes
     44 *
     45 * There are plans to extend SSM to make it easier to be both backwards and
     46 * (somewhat) forwards compatible.  One of the new features will be being able
     47 * to classify units and data items as unimportant, one example where this would
     48 * be nice can be seen in with the SSM data unit.  Another potentail feature is
     49 * naming data items, perhaps by extending the SSMR3PutStruct API.
     50 *
    3951 */
    4052
     
    6375
    6476
    65 
    6677/*******************************************************************************
    6778*   Defined Constants And Macros                                               *
    6879*******************************************************************************/
     80/** Saved state file magic base string. */
     81#define SSMFILEHDR_MAGIC_BASE   "\177VirtualBox SavedState "
     82/** Saved state file v1.0 magic. */
     83#define SSMFILEHDR_MAGIC_V1_0   "\177VirtualBox SavedState V1.0\n"
     84/** Saved state file v1.1 magic. */
     85#define SSMFILEHDR_MAGIC_V1_1   "\177VirtualBox SavedState V1.1\n"
     86
     87/** Data unit magic. */
     88#define SSMFILEUNITHDR_MAGIC    "\nUnit\n"
     89/** Data end marker magic. */
     90#define SSMFILEUNITHDR_END      "\nTheEnd"
     91
    6992/** Start structure magic. (Isacc Asimov) */
    70 #define SSMR3STRUCT_BEGIN 0x19200102
     93#define SSMR3STRUCT_BEGIN       0x19200102
    7194/** End structure magic. (Isacc Asimov) */
    72 #define SSMR3STRUCT_END   0x19920406
     95#define SSMR3STRUCT_END         0x19920406
    7396
    7497
     
    7699*   Structures and Typedefs                                                    *
    77100*******************************************************************************/
    78 
     101/** SSM state. */
    79102typedef enum SSMSTATE
    80103{
     
    145168typedef struct SSMFILEHDR
    146169{
    147     /** Magic string which identifies this file as a version of VBox saved state file format. */
    148     char        achMagic[32];
     170    /** Magic string which identifies this file as a version of VBox saved state
     171     *  file format (SSMFILEHDR_MAGIC_V1_1). */
     172    char            achMagic[32];
    149173    /** The size of this file. Used to check
    150174     * whether the save completed and that things are fine otherwise. */
    151     uint64_t    cbFile;
     175    uint64_t        cbFile;
    152176    /** File checksum. The actual calculation skips past the u32CRC field. */
    153     uint32_t    u32CRC;
     177    uint32_t        u32CRC;
    154178    /** Padding. */
    155     uint32_t    u32Reserved;
     179    uint32_t        u32Reserved;
    156180    /** The machine UUID. (Ignored if NIL.) */
    157     RTUUID      MachineUuid;
    158 } SSMFILEHDR, *PSSMFILEHDR;
     181    RTUUID          MachineUuid;
     182} SSMFILEHDR;
    159183AssertCompileSize(SSMFILEHDR, 64);
     184/** Pointer to a saved state file header. */
     185typedef SSMFILEHDR *PSSMFILEHDR;
    160186
    161187
     
    166192typedef struct SSMFILEHDRV10X86
    167193{
    168     /** Magic string which identifies this file as a version of VBox saved state file format. */
    169     char        achMagic[32];
     194    /** Magic string which identifies this file as a version of VBox saved state
     195     * file format (SSMFILEHDR_MAGIC_V1_0). */
     196    char            achMagic[32];
    170197    /** The size of this file. Used to check
    171198     * whether the save completed and that things are fine otherwise. */
    172     uint64_t    cbFile;
     199    uint64_t        cbFile;
    173200    /** File checksum. The actual calculation skips past the u32CRC field. */
    174     uint32_t    u32CRC;
     201    uint32_t        u32CRC;
    175202    /** The machine UUID. (Ignored if NIL.) */
    176     RTUUID      MachineUuid;
    177 } SSMFILEHDRV10X86, *PSSMFILEHDRV10X86;
     203    RTUUID          MachineUuid;
     204} SSMFILEHDRV10X86;
    178205#pragma pack()
     206/** Pointer to a SSMFILEHDRV10X86. */
     207typedef SSMFILEHDRV10X86 *PSSMFILEHDRV10X86;
    179208
    180209/**
    181210 * The amd64 edition of the 1.0 header.
    182211 */
    183 typedef SSMFILEHDR SSMFILEHDRV10AMD64, *PSSMFILEHDRV10AMD64;
    184 
    185 /** Saved state file magic base string. */
    186 #define SSMFILEHDR_MAGIC_BASE   "\177VirtualBox SavedState "
    187 /** Saved state file v1.0 magic. */
    188 #define SSMFILEHDR_MAGIC_V1_0   "\177VirtualBox SavedState V1.0\n"
    189 /** Saved state file v1.1 magic. */
    190 #define SSMFILEHDR_MAGIC_V1_1   "\177VirtualBox SavedState V1.1\n"
    191 
    192 
     212typedef SSMFILEHDR SSMFILEHDRV10AMD64;
     213/** Pointer to SSMFILEHDRV10AMD64. */
     214typedef SSMFILEHDRV10AMD64 *PSSMFILEHDRV10AMD64;
    193215
    194216
     
    198220typedef struct SSMFILEUNITHDR
    199221{
    200     /** Magic. */
    201     char        achMagic[8];
     222    /** Magic (SSMFILEUNITHDR_MAGIC or SSMFILEUNITHDR_END). */
     223    char            achMagic[8];
    202224    /** Number of bytes in this data unit including the header. */
    203     uint64_t    cbUnit;
     225    uint64_t        cbUnit;
    204226    /** Data version. */
    205     uint32_t    u32Version;
     227    uint32_t        u32Version;
    206228    /** Instance number. */
    207     uint32_t    u32Instance;
     229    uint32_t        u32Instance;
    208230    /** Size of the data unit name including the terminator. (bytes) */
    209     uint32_t    cchName;
     231    uint32_t        cchName;
    210232    /** Data unit name. */
    211     char        szName[1];
    212 } SSMFILEUNITHDR, *PSSMFILEUNITHDR;
    213 
    214 /** Data unit magic. */
    215 #define SSMFILEUNITHDR_MAGIC "\nUnit\n"
    216 /** Data end marker magic. */
    217 #define SSMFILEUNITHDR_END   "\nTheEnd"
    218 
     233    char            szName[1];
     234} SSMFILEUNITHDR;
     235/** Pointer to SSMFILEUNITHDR.  */
     236typedef SSMFILEUNITHDR *PSSMFILEUNITHDR;
    219237
    220238
     
    225243static DECLCALLBACK(int)    ssmR3SelfSaveExec(PVM pVM, PSSMHANDLE pSSM);
    226244static DECLCALLBACK(int)    ssmR3SelfLoadExec(PVM pVM, PSSMHANDLE pSSM, uint32_t u32Version);
    227 static int smmr3Register(PVM pVM, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess, PSSMUNIT *ppUnit);
    228 static int ssmr3CalcChecksum(RTFILE File, uint64_t cbFile, uint32_t *pu32CRC);
    229 static void ssmR3Progress(PSSMHANDLE pSSM, uint64_t cbAdvance);
    230 static int ssmr3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr);
    231 static PSSMUNIT ssmr3Find(PVM pVM, const char *pszName, uint32_t u32Instance);
    232 static int ssmr3WriteFinish(PSSMHANDLE pSSM);
    233 static int ssmr3Write(PSSMHANDLE pSSM, const void *pvBuf, size_t cbBuf);
    234 static DECLCALLBACK(int) ssmr3WriteOut(void *pvSSM, const void *pvBuf, size_t cbBuf);
    235 static void ssmr3ReadFinish(PSSMHANDLE pSSM);
    236 static int ssmr3Read(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf);
    237 static DECLCALLBACK(int) ssmr3ReadIn(void *pvSSM, void *pvBuf, size_t cbBuf, size_t *pcbRead);
     245static int                  ssmR3Register(PVM pVM, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess, PSSMUNIT *ppUnit);
     246static int                  ssmR3CalcChecksum(RTFILE File, uint64_t cbFile, uint32_t *pu32CRC);
     247static void                 ssmR3Progress(PSSMHANDLE pSSM, uint64_t cbAdvance);
     248static int                  ssmR3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr);
     249static PSSMUNIT             ssmR3Find(PVM pVM, const char *pszName, uint32_t u32Instance);
     250static int                  ssmR3WriteFinish(PSSMHANDLE pSSM);
     251static int                  ssmR3Write(PSSMHANDLE pSSM, const void *pvBuf, size_t cbBuf);
     252static DECLCALLBACK(int)    ssmR3WriteOut(void *pvSSM, const void *pvBuf, size_t cbBuf);
     253static void                 ssmR3ReadFinish(PSSMHANDLE pSSM);
     254static int                  ssmR3Read(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf);
     255static DECLCALLBACK(int)    ssmR3ReadIn(void *pvSSM, void *pvBuf, size_t cbBuf, size_t *pcbRead);
    238256
    239257
     
    246264static int ssmR3LazyInit(PVM pVM)
    247265{
    248 #if 1 /* if we want 2.0.2 to remain forward compatible with 2.0.x, disable this. */
    249266    /*
    250267     * Register a saved state unit which we use to put the VirtualBox version,
     
    257274    pVM->ssm.s.fInitialized = RT_SUCCESS(rc);
    258275    return rc;
    259 #else
    260     pVM->ssm.s.fInitialized = true;
    261     return VINF_SUCCESS;
    262 #endif
    263276}
    264277
     
    340353 *                          Caller must fill in the missing details.
    341354 */
    342 static int smmr3Register(PVM pVM, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess, PSSMUNIT *ppUnit)
     355static int ssmR3Register(PVM pVM, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess, PSSMUNIT *ppUnit)
    343356{
    344357    /*
     
    404417 *
    405418 * @returns VBox status.
     419 *
    406420 * @param   pVM             The VM handle.
    407421 * @param   pDevIns         Device instance.
     
    419433 * @param   pfnLoadDone     Done load callback, optional.
    420434 */
    421 VMMR3DECL(int) SSMR3Register(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess,
     435VMMR3DECL(int) SSMR3RegisterDevice(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance, uint32_t u32Version, size_t cbGuess,
    422436    PFNSSMDEVSAVEPREP pfnSavePrep, PFNSSMDEVSAVEEXEC pfnSaveExec, PFNSSMDEVSAVEDONE pfnSaveDone,
    423437    PFNSSMDEVLOADPREP pfnLoadPrep, PFNSSMDEVLOADEXEC pfnLoadExec, PFNSSMDEVLOADDONE pfnLoadDone)
    424438{
    425439    PSSMUNIT pUnit;
    426     int rc = smmr3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
     440    int rc = ssmR3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
    427441    if (VBOX_SUCCESS(rc))
    428442    {
     
    444458 *
    445459 * @returns VBox status.
     460 *
    446461 * @param   pVM             The VM handle.
    447462 * @param   pDrvIns         Driver instance.
     
    464479{
    465480    PSSMUNIT pUnit;
    466     int rc = smmr3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
     481    int rc = ssmR3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
    467482    if (VBOX_SUCCESS(rc))
    468483    {
     
    484499 *
    485500 * @returns VBox status.
     501 *
    486502 * @param   pVM             The VM handle.
    487503 * @param   pszName         Data unit name.
     
    503519{
    504520    PSSMUNIT pUnit;
    505     int rc = smmr3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
     521    int rc = ssmR3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
    506522    if (VBOX_SUCCESS(rc))
    507523    {
     
    522538 *
    523539 * @returns VBox status.
     540 *
    524541 * @param   pVM             The VM handle.
    525542 * @param   pszName         Data unit name.
     
    542559{
    543560    PSSMUNIT pUnit;
    544     int rc = smmr3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
     561    int rc = ssmR3Register(pVM, pszName, u32Instance, u32Version, cbGuess, &pUnit);
    545562    if (VBOX_SUCCESS(rc))
    546563    {
     
    562579 *
    563580 * @returns VBox status.
     581 *
    564582 * @param   pVM             The VM handle.
    565583 * @param   pDevIns         Device instance.
     
    570588 * @remark  Only for dynmaic data units and dynamic unloaded modules.
    571589 */
    572 VMMR3DECL(int) SSMR3Deregister(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance)
     590VMMR3DECL(int) SSMR3DeregisterDevice(PVM pVM, PPDMDEVINS pDevIns, const char *pszName, uint32_t u32Instance)
    573591{
    574592    /*
     
    705723}
    706724
     725
    707726/**
    708727 * Deregister a data unit.
     
    799818 * @param   pu32CRC     Where to store the calculated checksum.
    800819 */
    801 static int ssmr3CalcChecksum(RTFILE File, uint64_t cbFile, uint32_t *pu32CRC)
     820static int ssmR3CalcChecksum(RTFILE File, uint64_t cbFile, uint32_t *pu32CRC)
    802821{
    803822    /*
     
    811830     * Loop reading and calculating CRC32.
    812831     */
    813     int                 rc = VINF_SUCCESS;
    814     uint32_t   u32CRC = RTCrc32Start();
     832    int         rc = VINF_SUCCESS;
     833    uint32_t    u32CRC = RTCrc32Start();
    815834    while (cbFile)
    816835    {
     
    864883            pSSM->pfnProgress(pSSM->pVM, pSSM->uPercent, pSSM->pvUser);
    865884        pSSM->uPercent++;
    866         pSSM->offEstProgress = (pSSM->uPercent - pSSM->uPercentPrepare) * pSSM->cbEstTotal /
    867                                 (100-pSSM->uPercentDone-pSSM->uPercentPrepare);
     885        pSSM->offEstProgress = (pSSM->uPercent - pSSM->uPercentPrepare) * pSSM->cbEstTotal
     886                             / (100 - pSSM->uPercentDone - pSSM->uPercentPrepare);
    868887    }
    869888}
     
    872891/**
    873892 * Start VM save operation.
    874  * The caller must be the emulation thread!
    875  *
    876  * @returns VBox status.
     893 *
     894 * @returns VBox status.
     895 *
    877896 * @param   pVM             The VM handle.
    878897 * @param   pszFilename     Name of the file to save the state in.
     
    880899 * @param   pfnProgress     Progress callback. Optional.
    881900 * @param   pvUser          User argument for the progress callback.
     901 *
     902 * @thread  EMT
    882903 */
    883904VMMR3DECL(int) SSMR3Save(PVM pVM, const char *pszFilename, SSMAFTER enmAfter, PFNVMPROGRESS pfnProgress, void *pvUser)
    884905{
    885906    LogFlow(("SSMR3Save: pszFilename=%p:{%s} enmAfter=%d pfnProgress=%p pvUser=%p\n", pszFilename, pszFilename, enmAfter, pfnProgress, pvUser));
     907    VM_ASSERT_EMT(pVM);
    886908
    887909    /*
     
    896918
    897919    /*
    898      * Try open the file.
    899      */
    900     SSMHANDLE Handle   = {0};
    901     Handle.enmAfter    = enmAfter;
    902     Handle.pVM         = pVM;
    903     Handle.cbFileHdr   = sizeof(SSMFILEHDR);
    904     Handle.pfnProgress = pfnProgress;
    905     Handle.pvUser      = pvUser;
    906     /*
    907      * The 'done' part might take much time:
    908      *   (1) Call the SaveDone function of each module
    909      *   (2) Calculate the Checksum
    910      *   (3) RTFileClose() will probably flush the write cache
    911      */
     920     * Create the handle and try open the file.
     921     *
     922     * Note that there might be quite some work to do after executing the saving,
     923     * so we reserve 20% for the 'Done' period.  The checksumming and closing of
     924     * the saved state file might take a long time.
     925     */
     926    SSMHANDLE Handle       = {0};
     927    Handle.enmAfter        = enmAfter;
     928    Handle.pVM             = pVM;
     929    Handle.cbFileHdr       = sizeof(SSMFILEHDR);
     930    Handle.pfnProgress     = pfnProgress;
     931    Handle.pvUser          = pvUser;
    912932    Handle.uPercentPrepare = 2;
    913     Handle.uPercentDone    = 20; /* reserve substantial time for crc-checking the image */
     933    Handle.uPercentDone    = 20;
     934
    914935    int rc = RTFileOpen(&Handle.File, pszFilename, RTFILE_O_READWRITE | RTFILE_O_CREATE_REPLACE | RTFILE_O_DENY_WRITE);
    915936    if (VBOX_FAILURE(rc))
     
    10581079                             */
    10591080                            if (Handle.pZipComp)
    1060                                 rc = ssmr3WriteFinish(&Handle);
     1081                                rc = ssmR3WriteFinish(&Handle);
    10611082                            if (VBOX_SUCCESS(rc))
    10621083                            {
     
    11631184                rc = RTFileSeek(Handle.File, RT_OFFSETOF(SSMFILEHDR, u32CRC) + sizeof(Hdr.u32CRC), RTFILE_SEEK_BEGIN, NULL);
    11641185                if (VBOX_SUCCESS(rc))
    1165                     rc = ssmr3CalcChecksum(Handle.File, Hdr.cbFile - sizeof(Hdr), &Hdr.u32CRC);
     1186                    rc = ssmR3CalcChecksum(Handle.File, Hdr.cbFile - sizeof(Hdr), &Hdr.u32CRC);
    11661187                if (VBOX_SUCCESS(rc))
    11671188                {
     
    12221243 * @param   pcbFileHdr  Where to store the file header size.
    12231244 */
    1224 static int ssmr3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr)
     1245static int ssmR3Validate(RTFILE File, PSSMFILEHDR pHdr, size_t *pcbFileHdr)
    12251246{
    12261247    /*
     
    12611282        else
    12621283        {
    1263             /* (It's identical, but this doesn't harm us and will continue working after future changes.) */
     1284            /* (It's identical to the current, but this doesn't harm us and will
     1285               continue working after future changes.) */
    12641286            SSMFILEHDRV10AMD64 OldHdr;
    12651287            memcpy(&OldHdr, pHdr, sizeof(OldHdr));
     
    13051327    }
    13061328    uint32_t u32CRC;
    1307     rc = ssmr3CalcChecksum(File, pHdr->cbFile - *pcbFileHdr, &u32CRC);
     1329    rc = ssmR3CalcChecksum(File, pHdr->cbFile - *pcbFileHdr, &u32CRC);
    13081330    if (VBOX_FAILURE(rc))
    13091331        return rc;
     
    13361358 * @returns Pointer to the unit.
    13371359 * @returns NULL if not found.
     1360 *
    13381361 * @param   pVM             VM handle.
    13391362 * @param   pszName         Data unit name.
    13401363 * @param   u32Instance     The data unit instance id.
    13411364 */
    1342 static PSSMUNIT ssmr3Find(PVM pVM, const char *pszName, uint32_t u32Instance)
     1365static PSSMUNIT ssmR3Find(PVM pVM, const char *pszName, uint32_t u32Instance)
    13431366{
    13441367    size_t   cchName = strlen(pszName);
     
    13551378/**
    13561379 * Load VM save operation.
    1357  * The caller must be the emulation thread!
    1358  *
    1359  * @returns VBox status.
     1380 *
     1381 * @returns VBox status.
     1382 *
    13601383 * @param   pVM             The VM handle.
    13611384 * @param   pszFilename     Name of the file to save the state in.
     
    13641387 * @param   pfnProgress     Progress callback. Optional.
    13651388 * @param   pvUser          User argument for the progress callback.
     1389 *
     1390 * @thread  EMT
    13661391 */
    13671392VMMR3DECL(int) SSMR3Load(PVM pVM, const char *pszFilename, SSMAFTER enmAfter, PFNVMPROGRESS pfnProgress, void *pvUser)
    13681393{
    13691394    LogFlow(("SSMR3Load: pszFilename=%p:{%s} enmAfter=%d pfnProgress=%p pvUser=%p\n", pszFilename, pszFilename, enmAfter, pfnProgress, pvUser));
     1395    VM_ASSERT_EMT(pVM);
    13701396
    13711397    /*
     
    13801406
    13811407    /*
    1382      * Open the file.
     1408     * Create the handle and open the file.
     1409     * Note that we reserve 20% of the time on validating the image since this might
     1410     * take a long time.
    13831411     */
    13841412    SSMHANDLE Handle       = {0};
     
    13881416    Handle.pfnProgress     = pfnProgress;
    13891417    Handle.pvUser          = pvUser;
    1390     Handle.uPercentPrepare = 20; /* reserve substantial time for validating the image */
     1418    Handle.uPercentPrepare = 20;
    13911419    Handle.uPercentDone    = 2;
     1420
    13921421    int rc = RTFileOpen(&Handle.File, pszFilename, RTFILE_O_READ | RTFILE_O_OPEN | RTFILE_O_DENY_WRITE);
    13931422    if (VBOX_FAILURE(rc))
     
    14011430     */
    14021431    SSMFILEHDR Hdr;
    1403     rc = ssmr3Validate(Handle.File, &Hdr, &Handle.cbFileHdr);
     1432    rc = ssmR3Validate(Handle.File, &Hdr, &Handle.cbFileHdr);
    14041433    if (VBOX_SUCCESS(rc))
    14051434    {
     
    15291558                                 * Find the data unit in our internal table.
    15301559                                 */
    1531                                 pUnit = ssmr3Find(pVM, pszName, UnitHdr.u32Instance);
     1560                                pUnit = ssmR3Find(pVM, pszName, UnitHdr.u32Instance);
    15321561                                if (pUnit)
    15331562                                {
     
    15821611                                         */
    15831612                                        if (Handle.pZipDecomp)
    1584                                             ssmr3ReadFinish(&Handle);
     1613                                            ssmR3ReadFinish(&Handle);
    15851614
    15861615                                        pUnit->fCalled = true;
     
    17521781 * @returns VINF_SUCCESS if valid.
    17531782 * @returns VBox status code on other failures.
     1783 *
    17541784 * @param   pszFilename     The path to the file to validate.
     1785 *
     1786 * @thread  Any.
    17551787 */
    17561788VMMR3DECL(int) SSMR3ValidateFile(const char *pszFilename)
     
    17671799        size_t cbFileHdr;
    17681800        SSMFILEHDR Hdr;
    1769         rc = ssmr3Validate(File, &Hdr, &cbFileHdr);
     1801        rc = ssmR3Validate(File, &Hdr, &cbFileHdr);
    17701802        RTFileClose(File);
    17711803    }
     
    17801812 *
    17811813 * @returns VBox status code.
     1814 *
    17821815 * @param   pszFilename     The path to the saved state file.
    17831816 * @param   fFlags          Open flags. Reserved, must be 0.
    17841817 * @param   ppSSM           Where to store the SSM handle.
     1818 *
     1819 * @thread  Any.
    17851820 */
    17861821VMMR3DECL(int) SSMR3Open(const char *pszFilename, unsigned fFlags, PSSMHANDLE *ppSSM)
     
    18091844        SSMFILEHDR Hdr;
    18101845        size_t cbFileHdr;
    1811         rc = ssmr3Validate(pSSM->File, &Hdr, &cbFileHdr);
     1846        rc = ssmR3Validate(pSSM->File, &Hdr, &cbFileHdr);
    18121847        if (VBOX_SUCCESS(rc))
    18131848        {
     
    18161851            pSSM->enmOp           = SSMSTATE_OPEN_READ;
    18171852            pSSM->enmAfter        = SSMAFTER_OPENED;
    1818             pSSM->uPercentPrepare = 20; /* reserve substantial time for validating the image */
     1853            pSSM->uPercentPrepare = 20;
    18191854            pSSM->uPercentDone    = 2;
    18201855            //pSSM->rc            = VINF_SUCCESS;
     
    18481883 *
    18491884 * @returns VBox status code.
     1885 *
    18501886 * @param   pSSM            The SSM handle returned by SSMR3Open().
     1887 *
     1888 * @thread  Any, but the caller is responsible for serializing calls per handle.
    18511889 */
    18521890VMMR3DECL(int) SSMR3Close(PSSMHANDLE pSSM)
     
    18791917 * @returns VBox status code.
    18801918 * @returns VERR_SSM_UNIT_NOT_FOUND if the unit+instance wasn't found.
     1919 *
    18811920 * @param   pSSM            The SSM handle returned by SSMR3Open().
    18821921 * @param   pszUnit         The name of the data unit.
    18831922 * @param   iInstance       The instance number.
    18841923 * @param   piVersion       Where to store the version number. (Optional)
     1924 *
     1925 * @thread  Any, but the caller is responsible for serializing calls per handle.
    18851926 */
    18861927VMMR3DECL(int) SSMR3Seek(PSSMHANDLE pSSM, const char *pszUnit, uint32_t iInstance, uint32_t *piVersion)
     
    20032044 * @param   pSSM            SSM operation handle.
    20042045 */
    2005 static int ssmr3WriteFinish(PSSMHANDLE pSSM)
    2006 {
    2007     //Log2(("ssmr3WriteFinish: %#010llx start\n", RTFileTell(pSSM->File)));
     2046static int ssmR3WriteFinish(PSSMHANDLE pSSM)
     2047{
     2048    //Log2(("ssmR3WriteFinish: %#010llx start\n", RTFileTell(pSSM->File)));
    20082049    if (!pSSM->pZipComp)
    20092050        return VINF_SUCCESS;
     
    20162057        {
    20172058            pSSM->pZipComp = NULL;
    2018             //Log2(("ssmr3WriteFinish: %#010llx done\n", RTFileTell(pSSM->File)));
     2059            //Log2(("ssmR3WriteFinish: %#010llx done\n", RTFileTell(pSSM->File)));
    20192060            return VINF_SUCCESS;
    20202061        }
     
    20222063    if (VBOX_SUCCESS(pSSM->rc))
    20232064        pSSM->rc = rc;
    2024     Log2(("ssmr3WriteFinish: failure rc=%Vrc\n", rc));
     2065    Log2(("ssmR3WriteFinish: failure rc=%Vrc\n", rc));
    20252066    return rc;
    20262067}
     2068
    20272069
    20282070/**
     
    20342076 * @param   cbBuf           The number of bytes to write.
    20352077 */
    2036 static int ssmr3Write(PSSMHANDLE pSSM, const void *pvBuf, size_t cbBuf)
    2037 {
    2038     Log2(("ssmr3Write: pvBuf=%p cbBuf=%#x %.*Vhxs%s\n", pvBuf, cbBuf, RT_MIN(cbBuf, 128), pvBuf, cbBuf > 128 ? "..." : ""));
     2078static int ssmR3Write(PSSMHANDLE pSSM, const void *pvBuf, size_t cbBuf)
     2079{
     2080    Log2(("ssmR3Write: pvBuf=%p cbBuf=%#x %.*Vhxs%s\n", pvBuf, cbBuf, RT_MIN(cbBuf, 128), pvBuf, cbBuf > 128 ? "..." : ""));
    20392081
    20402082    /*
     
    20482090        if (!pSSM->pZipComp)
    20492091        {
    2050             //int rc = RTZipCompCreate(&pSSM->pZipComp, pSSM, ssmr3WriteOut, RTZIPTYPE_ZLIB, RTZIPLEVEL_FAST);
    2051             int rc = RTZipCompCreate(&pSSM->pZipComp, pSSM, ssmr3WriteOut, RTZIPTYPE_LZF, RTZIPLEVEL_FAST);
     2092            //int rc = RTZipCompCreate(&pSSM->pZipComp, pSSM, ssmR3WriteOut, RTZIPTYPE_ZLIB, RTZIPLEVEL_FAST);
     2093            int rc = RTZipCompCreate(&pSSM->pZipComp, pSSM, ssmR3WriteOut, RTZIPTYPE_LZF, RTZIPLEVEL_FAST);
    20522094            if (VBOX_FAILURE(rc))
    20532095                return rc;
     
    20782120 * @returns VBox status.
    20792121 * @param   pvSSM           SSM operation handle.
    2080  * @param   pvBuf       Compressed data.
    2081  * @param   cbBuf       Size of the compressed data.
    2082  */
    2083 static DECLCALLBACK(int) ssmr3WriteOut(void *pvSSM, const void *pvBuf, size_t cbBuf)
    2084 {
    2085     //Log2(("ssmr3WriteOut: %#010llx cbBuf=%#x\n", RTFileTell(((PSSMHANDLE)pvSSM)->File), cbBuf));
     2122 * @param   pvBuf           Compressed data.
     2123 * @param   cbBuf           Size of the compressed data.
     2124 */
     2125static DECLCALLBACK(int) ssmR3WriteOut(void *pvSSM, const void *pvBuf, size_t cbBuf)
     2126{
     2127    //Log2(("ssmR3WriteOut: %#010llx cbBuf=%#x\n", RTFileTell(((PSSMHANDLE)pvSSM)->File), cbBuf));
    20862128    int rc = RTFileWrite(((PSSMHANDLE)pvSSM)->File, pvBuf, cbBuf, NULL);
    20872129    if (VBOX_SUCCESS(rc))
    20882130        return rc;
    2089     Log(("ssmr3WriteOut: RTFileWrite(,,%d) -> %d\n", cbBuf, rc));
     2131    Log(("ssmR3WriteOut: RTFileWrite(,,%d) -> %d\n", cbBuf, rc));
    20902132    return rc;
    20912133}
     
    21132155         pCur++)
    21142156    {
    2115         rc = ssmr3Write(pSSM, (uint8_t *)pvStruct + pCur->off, pCur->cb);
     2157        rc = ssmR3Write(pSSM, (uint8_t *)pvStruct + pCur->off, pCur->cb);
    21162158        if (VBOX_FAILURE(rc))
    21172159            return rc;
     
    21352177    {
    21362178        uint8_t u8 = fBool; /* enforce 1 byte size */
    2137         return ssmr3Write(pSSM, &u8, sizeof(u8));
    2138     }
    2139     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2140     return VERR_SSM_INVALID_STATE;
    2141 }
     2179        return ssmR3Write(pSSM, &u8, sizeof(u8));
     2180    }
     2181    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2182    return VERR_SSM_INVALID_STATE;
     2183}
     2184
    21422185
    21432186/**
     
    21512194{
    21522195    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2153         return ssmr3Write(pSSM, &u8, sizeof(u8));
    2154     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2155     return VERR_SSM_INVALID_STATE;
    2156 }
     2196        return ssmR3Write(pSSM, &u8, sizeof(u8));
     2197    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2198    return VERR_SSM_INVALID_STATE;
     2199}
     2200
    21572201
    21582202/**
     
    21662210{
    21672211    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2168         return ssmr3Write(pSSM, &i8, sizeof(i8));
    2169     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2170     return VERR_SSM_INVALID_STATE;
    2171 }
     2212        return ssmR3Write(pSSM, &i8, sizeof(i8));
     2213    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2214    return VERR_SSM_INVALID_STATE;
     2215}
     2216
    21722217
    21732218/**
     
    21812226{
    21822227    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2183         return ssmr3Write(pSSM, &u16, sizeof(u16));
    2184     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2185     return VERR_SSM_INVALID_STATE;
    2186 }
     2228        return ssmR3Write(pSSM, &u16, sizeof(u16));
     2229    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2230    return VERR_SSM_INVALID_STATE;
     2231}
     2232
    21872233
    21882234/**
     
    21962242{
    21972243    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2198         return ssmr3Write(pSSM, &i16, sizeof(i16));
    2199     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2200     return VERR_SSM_INVALID_STATE;
    2201 }
     2244        return ssmR3Write(pSSM, &i16, sizeof(i16));
     2245    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2246    return VERR_SSM_INVALID_STATE;
     2247}
     2248
    22022249
    22032250/**
     
    22112258{
    22122259    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2213         return ssmr3Write(pSSM, &u32, sizeof(u32));
    2214     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2215     return VERR_SSM_INVALID_STATE;
    2216 }
     2260        return ssmR3Write(pSSM, &u32, sizeof(u32));
     2261    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2262    return VERR_SSM_INVALID_STATE;
     2263}
     2264
    22172265
    22182266/**
     
    22262274{
    22272275    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2228         return ssmr3Write(pSSM, &i32, sizeof(i32));
    2229     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2230     return VERR_SSM_INVALID_STATE;
    2231 }
     2276        return ssmR3Write(pSSM, &i32, sizeof(i32));
     2277    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2278    return VERR_SSM_INVALID_STATE;
     2279}
     2280
    22322281
    22332282/**
     
    22412290{
    22422291    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2243         return ssmr3Write(pSSM, &u64, sizeof(u64));
    2244     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2245     return VERR_SSM_INVALID_STATE;
    2246 }
     2292        return ssmR3Write(pSSM, &u64, sizeof(u64));
     2293    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2294    return VERR_SSM_INVALID_STATE;
     2295}
     2296
    22472297
    22482298/**
     
    22562306{
    22572307    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2258         return ssmr3Write(pSSM, &i64, sizeof(i64));
    2259     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2260     return VERR_SSM_INVALID_STATE;
    2261 }
     2308        return ssmR3Write(pSSM, &i64, sizeof(i64));
     2309    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2310    return VERR_SSM_INVALID_STATE;
     2311}
     2312
    22622313
    22632314/**
     
    22712322{
    22722323    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2273         return ssmr3Write(pSSM, &u128, sizeof(u128));
    2274     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2275     return VERR_SSM_INVALID_STATE;
    2276 }
     2324        return ssmR3Write(pSSM, &u128, sizeof(u128));
     2325    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2326    return VERR_SSM_INVALID_STATE;
     2327}
     2328
    22772329
    22782330/**
     
    22862338{
    22872339    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2288         return ssmr3Write(pSSM, &i128, sizeof(i128));
    2289     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2290     return VERR_SSM_INVALID_STATE;
    2291 }
     2340        return ssmR3Write(pSSM, &i128, sizeof(i128));
     2341    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2342    return VERR_SSM_INVALID_STATE;
     2343}
     2344
    22922345
    22932346/**
     
    23012354{
    23022355    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2303         return ssmr3Write(pSSM, &u, sizeof(u));
     2356        return ssmR3Write(pSSM, &u, sizeof(u));
    23042357    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23052358    return VERR_SSM_INVALID_STATE;
     
    23172370{
    23182371    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2319         return ssmr3Write(pSSM, &i, sizeof(i));
     2372        return ssmR3Write(pSSM, &i, sizeof(i));
    23202373    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23212374    return VERR_SSM_INVALID_STATE;
     
    23332386{
    23342387    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2335         return ssmr3Write(pSSM, &u, sizeof(u));
     2388        return ssmR3Write(pSSM, &u, sizeof(u));
    23362389    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23372390    return VERR_SSM_INVALID_STATE;
     
    23492402{
    23502403    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2351         return ssmr3Write(pSSM, &i, sizeof(i));
     2404        return ssmR3Write(pSSM, &i, sizeof(i));
    23522405    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23532406    return VERR_SSM_INVALID_STATE;
     
    23652418{
    23662419    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2367         return ssmr3Write(pSSM, &GCPhys, sizeof(GCPhys));
     2420        return ssmR3Write(pSSM, &GCPhys, sizeof(GCPhys));
    23682421    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23692422    return VERR_SSM_INVALID_STATE;
     
    23812434{
    23822435    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2383         return ssmr3Write(pSSM, &GCPhys, sizeof(GCPhys));
     2436        return ssmR3Write(pSSM, &GCPhys, sizeof(GCPhys));
    23842437    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    23852438    return VERR_SSM_INVALID_STATE;
     
    23972450{
    23982451    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2399         return ssmr3Write(pSSM, &GCPhys, sizeof(GCPhys));
     2452        return ssmR3Write(pSSM, &GCPhys, sizeof(GCPhys));
    24002453    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24012454    return VERR_SSM_INVALID_STATE;
     
    24132466{
    24142467    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2415         return ssmr3Write(pSSM, &GCPtr, sizeof(GCPtr));
     2468        return ssmR3Write(pSSM, &GCPtr, sizeof(GCPtr));
    24162469    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24172470    return VERR_SSM_INVALID_STATE;
     
    24292482{
    24302483    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2431         return ssmr3Write(pSSM, &RCPtr, sizeof(RCPtr));
     2484        return ssmR3Write(pSSM, &RCPtr, sizeof(RCPtr));
    24322485    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24332486    return VERR_SSM_INVALID_STATE;
     
    24452498{
    24462499    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2447         return ssmr3Write(pSSM, &GCPtr, sizeof(GCPtr));
     2500        return ssmR3Write(pSSM, &GCPtr, sizeof(GCPtr));
    24482501    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24492502    return VERR_SSM_INVALID_STATE;
     
    24612514{
    24622515    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2463         return ssmr3Write(pSSM, &u, sizeof(u));
     2516        return ssmR3Write(pSSM, &u, sizeof(u));
    24642517    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24652518    return VERR_SSM_INVALID_STATE;
     
    24772530{
    24782531    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2479         return ssmr3Write(pSSM, &i, sizeof(i));
     2532        return ssmR3Write(pSSM, &i, sizeof(i));
    24802533    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24812534    return VERR_SSM_INVALID_STATE;
     
    24932546{
    24942547    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2495         return ssmr3Write(pSSM, &IOPort, sizeof(IOPort));
     2548        return ssmR3Write(pSSM, &IOPort, sizeof(IOPort));
    24962549    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    24972550    return VERR_SSM_INVALID_STATE;
     
    25092562{
    25102563    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2511         return ssmr3Write(pSSM, &Sel, sizeof(Sel));
     2564        return ssmR3Write(pSSM, &Sel, sizeof(Sel));
    25122565    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    25132566    return VERR_SSM_INVALID_STATE;
     
    25262579{
    25272580    if (pSSM->enmOp == SSMSTATE_SAVE_EXEC)
    2528         return ssmr3Write(pSSM, pv, cb);
    2529     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2530     return VERR_SSM_INVALID_STATE;
    2531 }
     2581        return ssmR3Write(pSSM, pv, cb);
     2582    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2583    return VERR_SSM_INVALID_STATE;
     2584}
     2585
    25322586
    25332587/**
     
    25492603        }
    25502604        uint32_t u32 = (uint32_t)cch;
    2551         int rc = ssmr3Write(pSSM, &u32, sizeof(u32));
     2605        int rc = ssmR3Write(pSSM, &u32, sizeof(u32));
    25522606        if (rc)
    25532607            return rc;
    2554         return ssmr3Write(pSSM, psz, cch);
     2608        return ssmR3Write(pSSM, psz, cch);
    25552609    }
    25562610    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     
    25672621 * @param   pSSM            SSM operation handle.
    25682622 */
    2569 static void ssmr3ReadFinish(PSSMHANDLE pSSM)
     2623static void ssmR3ReadFinish(PSSMHANDLE pSSM)
    25702624{
    25712625    int rc = RTZipDecompDestroy(pSSM->pZipDecomp);
     
    25742628}
    25752629
     2630
    25762631/**
    25772632 * Internal read worker.
     
    25812636 * @param   cbBuf           Number of bytes to read.
    25822637 */
    2583 static int ssmr3Read(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf)
     2638static int ssmR3Read(PSSMHANDLE pSSM, void *pvBuf, size_t cbBuf)
    25842639{
    25852640    /*
     
    25932648        if (!pSSM->pZipDecomp)
    25942649        {
    2595             pSSM->rc = RTZipDecompCreate(&pSSM->pZipDecomp, pSSM, ssmr3ReadIn);
     2650            pSSM->rc = RTZipDecompCreate(&pSSM->pZipDecomp, pSSM, ssmR3ReadIn);
    25962651            if (VBOX_FAILURE(pSSM->rc))
    25972652                return pSSM->rc;
     
    26042659        pSSM->rc = RTZipDecompress(pSSM->pZipDecomp, pvBuf, cbBuf, NULL);
    26052660        if (VBOX_SUCCESS(pSSM->rc))
    2606             Log2(("ssmr3Read: pvBuf=%p cbBuf=%#x %.*Vhxs%s\n", pvBuf, cbBuf, RT_MIN(cbBuf, 128), pvBuf, cbBuf > 128 ? "..." : ""));
     2661            Log2(("ssmR3Read: pvBuf=%p cbBuf=%#x %.*Vhxs%s\n", pvBuf, cbBuf, RT_MIN(cbBuf, 128), pvBuf, cbBuf > 128 ? "..." : ""));
    26072662        else
    26082663            AssertMsgFailed(("rc=%Vrc cbBuf=%#x\n", pSSM->rc, cbBuf));
     
    26112666    return pSSM->rc;
    26122667}
     2668
    26132669
    26142670/**
     
    26222678 * @param   pcbRead     Number of bytes actually stored in the buffer.
    26232679 */
    2624 static DECLCALLBACK(int) ssmr3ReadIn(void *pvSSM, void *pvBuf, size_t cbBuf, size_t *pcbRead)
     2680static DECLCALLBACK(int) ssmR3ReadIn(void *pvSSM, void *pvBuf, size_t cbBuf, size_t *pcbRead)
    26252681{
    26262682    PSSMHANDLE pSSM = (PSSMHANDLE)pvSSM;
     
    26302686    if (cbRead)
    26312687    {
    2632         //Log2(("ssmr3ReadIn: %#010llx cbBug=%#x cbRead=%#x\n", RTFileTell(pSSM->File), cbBuf, cbRead));
     2688        //Log2(("ssmR3ReadIn: %#010llx cbBug=%#x cbRead=%#x\n", RTFileTell(pSSM->File), cbBuf, cbRead));
    26332689        int rc = RTFileRead(pSSM->File, pvBuf, cbRead, NULL);
    26342690        if (VBOX_SUCCESS(rc))
     
    26402696            return VINF_SUCCESS;
    26412697        }
    2642         Log(("ssmr3ReadIn: RTFileRead(,,%d) -> %d\n", cbRead, rc));
     2698        Log(("ssmR3ReadIn: RTFileRead(,,%d) -> %d\n", cbRead, rc));
    26432699        return rc;
    26442700    }
     
    26752731         pCur++)
    26762732    {
    2677         rc = ssmr3Read(pSSM, (uint8_t *)pvStruct + pCur->off, pCur->cb);
     2733        rc = ssmR3Read(pSSM, (uint8_t *)pvStruct + pCur->off, pCur->cb);
    26782734        if (VBOX_FAILURE(rc))
    26792735            return rc;
     
    27022758    {
    27032759        uint8_t u8; /* see SSMR3PutBool */
    2704         int rc = ssmr3Read(pSSM, &u8, sizeof(u8));
     2760        int rc = ssmR3Read(pSSM, &u8, sizeof(u8));
    27052761        if (VBOX_SUCCESS(rc))
    27062762        {
     
    27142770}
    27152771
     2772
    27162773/**
    27172774 * Loads a 8-bit unsigned integer item from the current data unit.
     
    27242781{
    27252782    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2726         return ssmr3Read(pSSM, pu8, sizeof(*pu8));
    2727     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2728     return VERR_SSM_INVALID_STATE;
    2729 }
     2783        return ssmR3Read(pSSM, pu8, sizeof(*pu8));
     2784    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2785    return VERR_SSM_INVALID_STATE;
     2786}
     2787
    27302788
    27312789/**
     
    27392797{
    27402798    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2741         return ssmr3Read(pSSM, pi8, sizeof(*pi8));
    2742     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2743     return VERR_SSM_INVALID_STATE;
    2744 }
     2799        return ssmR3Read(pSSM, pi8, sizeof(*pi8));
     2800    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2801    return VERR_SSM_INVALID_STATE;
     2802}
     2803
    27452804
    27462805/**
     
    27542813{
    27552814    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2756         return ssmr3Read(pSSM, pu16, sizeof(*pu16));
    2757     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2758     return VERR_SSM_INVALID_STATE;
    2759 }
     2815        return ssmR3Read(pSSM, pu16, sizeof(*pu16));
     2816    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2817    return VERR_SSM_INVALID_STATE;
     2818}
     2819
    27602820
    27612821/**
     
    27692829{
    27702830    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2771         return ssmr3Read(pSSM, pi16, sizeof(*pi16));
    2772     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2773     return VERR_SSM_INVALID_STATE;
    2774 }
     2831        return ssmR3Read(pSSM, pi16, sizeof(*pi16));
     2832    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2833    return VERR_SSM_INVALID_STATE;
     2834}
     2835
    27752836
    27762837/**
     
    27842845{
    27852846    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2786         return ssmr3Read(pSSM, pu32, sizeof(*pu32));
    2787     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2788     return VERR_SSM_INVALID_STATE;
    2789 }
     2847        return ssmR3Read(pSSM, pu32, sizeof(*pu32));
     2848    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2849    return VERR_SSM_INVALID_STATE;
     2850}
     2851
    27902852
    27912853/**
     
    27992861{
    28002862    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2801         return ssmr3Read(pSSM, pi32, sizeof(*pi32));
    2802     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2803     return VERR_SSM_INVALID_STATE;
    2804 }
     2863        return ssmR3Read(pSSM, pi32, sizeof(*pi32));
     2864    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2865    return VERR_SSM_INVALID_STATE;
     2866}
     2867
    28052868
    28062869/**
     
    28142877{
    28152878    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2816         return ssmr3Read(pSSM, pu64, sizeof(*pu64));
    2817     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2818     return VERR_SSM_INVALID_STATE;
    2819 }
     2879        return ssmR3Read(pSSM, pu64, sizeof(*pu64));
     2880    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2881    return VERR_SSM_INVALID_STATE;
     2882}
     2883
    28202884
    28212885/**
     
    28292893{
    28302894    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2831         return ssmr3Read(pSSM, pi64, sizeof(*pi64));
    2832     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    2833     return VERR_SSM_INVALID_STATE;
    2834 }
     2895        return ssmR3Read(pSSM, pi64, sizeof(*pi64));
     2896    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     2897    return VERR_SSM_INVALID_STATE;
     2898}
     2899
    28352900
    28362901/**
     
    28442909{
    28452910    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2846         return ssmr3Read(pSSM, pu128, sizeof(*pu128));
     2911        return ssmR3Read(pSSM, pu128, sizeof(*pu128));
    28472912    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    28482913    return VERR_SSM_INVALID_STATE;
     
    28602925{
    28612926    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2862         return ssmr3Read(pSSM, pi128, sizeof(*pi128));
     2927        return ssmR3Read(pSSM, pi128, sizeof(*pi128));
    28632928    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    28642929    return VERR_SSM_INVALID_STATE;
     
    28762941{
    28772942    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2878         return ssmr3Read(pSSM, pu, sizeof(*pu));
     2943        return ssmR3Read(pSSM, pu, sizeof(*pu));
    28792944    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    28802945    return VERR_SSM_INVALID_STATE;
     
    28922957{
    28932958    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2894         return ssmr3Read(pSSM, pi, sizeof(*pi));
     2959        return ssmR3Read(pSSM, pi, sizeof(*pi));
    28952960    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    28962961    return VERR_SSM_INVALID_STATE;
     
    29152980            uint32_t val;
    29162981            Assert(sizeof(*pu) == sizeof(uint64_t) && pSSM->cbGCPtr == sizeof(uint32_t));
    2917             int rc = ssmr3Read(pSSM, &val, pSSM->cbGCPtr);
     2982            int rc = ssmR3Read(pSSM, &val, pSSM->cbGCPtr);
    29182983            *pu = val;
    29192984            return rc;
    29202985        }
    2921         return ssmr3Read(pSSM, pu, sizeof(*pu));
     2986        return ssmR3Read(pSSM, pu, sizeof(*pu));
    29222987    }
    29232988    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     
    29433008            int32_t val;
    29443009            Assert(sizeof(*pi) == sizeof(uint64_t) && pSSM->cbGCPtr == sizeof(uint32_t));
    2945             int rc = ssmr3Read(pSSM, &val, pSSM->cbGCPtr);
     3010            int rc = ssmR3Read(pSSM, &val, pSSM->cbGCPtr);
    29463011            *pi = val;
    29473012            return rc;
    29483013        }
    2949         return ssmr3Read(pSSM, pi, sizeof(*pi));
     3014        return ssmR3Read(pSSM, pi, sizeof(*pi));
    29503015    }
    29513016    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     
    29643029{
    29653030    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2966         return ssmr3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
     3031        return ssmR3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
    29673032    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    29683033    return VERR_SSM_INVALID_STATE;
     
    29803045{
    29813046    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2982         return ssmr3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
     3047        return ssmR3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
    29833048    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    29843049    return VERR_SSM_INVALID_STATE;
     
    29963061{
    29973062    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    2998         return ssmr3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
     3063        return ssmR3Read(pSSM, pGCPhys, sizeof(*pGCPhys));
    29993064    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    30003065    return VERR_SSM_INVALID_STATE;
     
    30053070 * Loads a GC virtual address item from the current data unit.
    30063071 *
    3007  * Note: only applies to:
    3008  * - SSMR3GetGCPtr
    3009  * - SSMR3GetGCUIntPtr
    3010  * - SSMR3GetGCSInt
    3011  * - SSMR3GetGCUInt
     3072 * Only applies to:
     3073 *  - SSMR3GetGCPtr
     3074 *  - SSMR3GetGCUIntPtr
     3075 *  - SSMR3GetGCSInt
     3076 *  - SSMR3GetGCUInt
    30123077 *
    30133078 * Put functions are not affected.
     
    30253090}
    30263091
     3092
    30273093/**
    30283094 * Loads a GC virtual address item from the current data unit.
     
    30423108            RTGCPTR32 val;
    30433109            Assert(sizeof(*pGCPtr) == sizeof(uint64_t) && pSSM->cbGCPtr == sizeof(uint32_t));
    3044             int rc = ssmr3Read(pSSM, &val, pSSM->cbGCPtr);
     3110            int rc = ssmR3Read(pSSM, &val, pSSM->cbGCPtr);
    30453111            *pGCPtr = val;
    30463112            return rc;
    30473113        }
    3048         return ssmr3Read(pSSM, pGCPtr, pSSM->cbGCPtr);
    3049     }
    3050     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    3051     return VERR_SSM_INVALID_STATE;
    3052 }
     3114        return ssmR3Read(pSSM, pGCPtr, pSSM->cbGCPtr);
     3115    }
     3116    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     3117    return VERR_SSM_INVALID_STATE;
     3118}
     3119
    30533120
    30543121/**
     
    30623129{
    30633130    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    3064         return ssmr3Read(pSSM, pRCPtr, sizeof(*pRCPtr));
    3065 
    3066     AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    3067     return VERR_SSM_INVALID_STATE;
    3068 }
     3131        return ssmR3Read(pSSM, pRCPtr, sizeof(*pRCPtr));
     3132
     3133    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     3134    return VERR_SSM_INVALID_STATE;
     3135}
     3136
    30693137
    30703138/**
     
    30853153            RTGCUINTPTR32 val;
    30863154            Assert(sizeof(*pGCPtr) == sizeof(uint64_t) && pSSM->cbGCPtr == sizeof(uint32_t));
    3087             int rc = ssmr3Read(pSSM, &val, pSSM->cbGCPtr);
     3155            int rc = ssmR3Read(pSSM, &val, pSSM->cbGCPtr);
    30883156            *pGCPtr = val;
    30893157            return rc;
    30903158        }
    3091         return ssmr3Read(pSSM, pGCPtr, pSSM->cbGCPtr);
     3159        return ssmR3Read(pSSM, pGCPtr, pSSM->cbGCPtr);
    30923160    }
    30933161    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
     
    31063174{
    31073175    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    3108         return ssmr3Read(pSSM, pIOPort, sizeof(*pIOPort));
     3176        return ssmR3Read(pSSM, pIOPort, sizeof(*pIOPort));
    31093177    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    31103178    return VERR_SSM_INVALID_STATE;
     
    31223190{
    31233191    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    3124         return ssmr3Read(pSSM, pSel, sizeof(*pSel));
     3192        return ssmR3Read(pSSM, pSel, sizeof(*pSel));
    31253193    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    31263194    return VERR_SSM_INVALID_STATE;
     
    31393207{
    31403208    if (pSSM->enmOp == SSMSTATE_LOAD_EXEC || pSSM->enmOp == SSMSTATE_OPEN_READ)
    3141         return ssmr3Read(pSSM, pv, cb);
     3209        return ssmR3Read(pSSM, pv, cb);
    31423210    AssertMsgFailed(("Invalid state %d\n", pSSM->enmOp));
    31433211    return VERR_SSM_INVALID_STATE;
     
    31833251                /* terminate and read string content. */
    31843252                psz[u32] = '\0';
    3185                 return ssmr3Read(pSSM, psz, u32);
     3253                return ssmR3Read(pSSM, psz, u32);
    31863254            }
    31873255            return VERR_TOO_MUCH_DATA;
     
    32103278}
    32113279
     3280
    32123281/**
    32133282 * Fail the load operation.
  • trunk/src/VBox/VMM/testcase/tstSSM.cpp

    r11822 r13594  
    634634     * Register a few callbacks.
    635635     */
    636     rc = SSMR3Register(pVM, NULL, "SSM Testcase Data Item no.1 (all types)", 1, 0, 256,
     636    rc = SSMR3RegisterDevice(pVM, NULL, "SSM Testcase Data Item no.1 (all types)", 1, 0, 256,
    637637        NULL, Item01Save, NULL,
    638638        NULL, Item01Load, NULL);
     
    643643    }
    644644
    645     rc = SSMR3Register(pVM, NULL, "SSM Testcase Data Item no.2 (rand mem)", 2, 0, _1M * 8,
     645    rc = SSMR3RegisterDevice(pVM, NULL, "SSM Testcase Data Item no.2 (rand mem)", 2, 0, _1M * 8,
    646646        NULL, Item02Save, NULL,
    647647        NULL, Item02Load, NULL);
     
    652652    }
    653653
    654     rc = SSMR3Register(pVM, NULL, "SSM Testcase Data Item no.3 (big mem)", 0, 123, 512*_1M,
     654    rc = SSMR3RegisterDevice(pVM, NULL, "SSM Testcase Data Item no.3 (big mem)", 0, 123, 512*_1M,
    655655        NULL, Item03Save, NULL,
    656656        NULL, Item03Load, NULL);
     
    661661    }
    662662
    663     rc = SSMR3Register(pVM, NULL, "SSM Testcase Data Item no.4 (big zero mem)", 0, 42, 512*_1M,
     663    rc = SSMR3RegisterDevice(pVM, NULL, "SSM Testcase Data Item no.4 (big zero mem)", 0, 42, 512*_1M,
    664664        NULL, Item04Save, NULL,
    665665        NULL, Item04Load, NULL);
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