VirtualBox

Changeset 55465 in vbox for trunk/include


Ignore:
Timestamp:
Apr 28, 2015 12:09:47 AM (10 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
99812
Message:

SSM: Extended the SSMFIELD structure with a first-introduced-in-version member so we won't have to duplicate the descriptors. Currently only added one macro for specifying it called SSMFIELD_ENTRY_VER, more can be added as needed.

File:
1 edited

Legend:

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

    r55048 r55465  
    225225    /** The size of the field. */
    226226    uint32_t            cb;
     227    /** This field was first saved by this unit version number. */
     228    uint32_t            uFirstVer;
    227229    /** Field name. */
    228230    const char         *pszName;
     
    231233/** Emit a SSMFIELD array entry.
    232234 * @internal  */
    233 #define SSMFIELD_ENTRY_INT(Name, off, cb, enmTransformer) \
    234     { (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), (off), (cb), Name }
     235#define SSMFIELD_ENTRY_INT(Name, off, cb, enmTransformer, uFirstVer) \
     236    { (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), (off), (cb), (uFirstVer), Name }
    235237/** Emit a SSMFIELD array entry.
    236238 * @internal  */
    237 #define SSMFIELD_ENTRY_TF_INT(Type, Field, enmTransformer) \
    238     SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), enmTransformer)
     239#define SSMFIELD_ENTRY_TF_INT(Type, Field, enmTransformer, uFirstVer) \
     240    SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), enmTransformer, uFirstVer)
    239241/** Emit a SSMFIELD array entry for an old field.
    240242 * @internal  */
    241243#define SSMFIELD_ENTRY_OLD_INT(Field, cb, enmTransformer) \
    242     SSMFIELD_ENTRY_INT("old::" #Field, UINT32_MAX / 2, (cb), enmTransformer)
     244    SSMFIELD_ENTRY_INT("old::" #Field, UINT32_MAX / 2, (cb), enmTransformer, 0)
    243245/** Emit a SSMFIELD array entry for an alignment padding.
    244246 * @internal  */
    245247#define SSMFIELD_ENTRY_PAD_INT(Type, Field, cb32, cb64, enmTransformer) \
    246248    SSMFIELD_ENTRY_INT(#Type "::" #Field, RT_OFFSETOF(Type, Field), \
    247                        (RT_SIZEOFMEMB(Type, Field) << 16) | (cb32) | ((cb64) << 8), enmTransformer)
     249                       (RT_SIZEOFMEMB(Type, Field) << 16) | (cb32) | ((cb64) << 8), enmTransformer, 0)
    248250/** Emit a SSMFIELD array entry for an alignment padding.
    249251 * @internal  */
    250252#define SSMFIELD_ENTRY_PAD_OTHER_INT(Type, Field, cb32, cb64, enmTransformer) \
    251     SSMFIELD_ENTRY_INT(#Type "::" #Field, UINT32_MAX / 2, 0 | (cb32) | ((cb64) << 8), enmTransformer)
     253    SSMFIELD_ENTRY_INT(#Type "::" #Field, UINT32_MAX / 2, 0 | (cb32) | ((cb64) << 8), enmTransformer, 0)
    252254
    253255/** Emit a SSMFIELD array entry. */
    254 #define SSMFIELD_ENTRY(Type, Field)                 SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION)
     256#define SSMFIELD_ENTRY(Type, Field)                 SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION, 0)
     257/** Emit a SSMFIELD array entry with first version. */
     258#define SSMFIELD_ENTRY_VER(Type, Field, uFirstVer)  SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION, uFirstVer)
    255259/** Emit a SSMFIELD array entry for a custom made field.  This is intended
    256260 *  for working around bitfields in old structures. */
    257 #define SSMFIELD_ENTRY_CUSTOM(Field, off, cb)       SSMFIELD_ENTRY_INT("custom::" #Field, off, cb, SSMFIELDTRANS_NO_TRANSFORMATION)
     261#define SSMFIELD_ENTRY_CUSTOM(Field, off, cb)       SSMFIELD_ENTRY_INT("custom::" #Field, off, cb, \
     262                                                                       SSMFIELDTRANS_NO_TRANSFORMATION, 0)
    258263/** Emit a SSMFIELD array entry for a RTGCPHYS type. */
    259 #define SSMFIELD_ENTRY_GCPHYS(Type, Field)          SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPHYS)
     264#define SSMFIELD_ENTRY_GCPHYS(Type, Field)          SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPHYS, 0)
    260265/** Emit a SSMFIELD array entry for a RTGCPTR type. */
    261 #define SSMFIELD_ENTRY_GCPTR(Type, Field)           SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPTR)
     266#define SSMFIELD_ENTRY_GCPTR(Type, Field)           SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_GCPTR, 0)
    262267/** Emit a SSMFIELD array entry for a raw-mode context pointer. */
    263 #define SSMFIELD_ENTRY_RCPTR(Type, Field)           SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR)
     268#define SSMFIELD_ENTRY_RCPTR(Type, Field)           SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR, 0)
    264269/** Emit a SSMFIELD array entry for a raw-mode context pointer. */
    265 #define SSMFIELD_ENTRY_RCPTR_ARRAY(Type, Field)     SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR_ARRAY)
     270#define SSMFIELD_ENTRY_RCPTR_ARRAY(Type, Field)     SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_RCPTR_ARRAY, 0)
    266271/** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that is only
    267272 * of interest as a NULL indicator.
     
    270275 * SSMSTRUCT_FLAGS_DONT_IGNORE is set, the pointer will be saved in its
    271276 * entirety, when clear it will be saved as a boolean. */
    272 #define SSMFIELD_ENTRY_HCPTR_NI(Type, Field)        SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI)
     277#define SSMFIELD_ENTRY_HCPTR_NI(Type, Field)        SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI, 0)
    273278/** Same as SSMFIELD_ENTRY_HCPTR_NI, except it's an array of the buggers. */
    274 #define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field)  SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY)
     279#define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field)  SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY, 0)
    275280/** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that has
    276281 * been hacked such that it will never exceed 32-bit.  No sign extending. */
    277 #define SSMFIELD_ENTRY_HCPTR_HACK_U32(Type, Field)  SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_HACK_U32)
     282#define SSMFIELD_ENTRY_HCPTR_HACK_U32(Type, Field)  SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_HCPTR_HACK_U32, 0)
    278283/** Emit a SSMFIELD array entry for loading a 32-bit field into a 64-bit
    279284 * structure member, zero extending the value. */
    280 #define SSMFIELD_ENTRY_U32_ZX_U64(Type, Field)      SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_U32_ZX_U64)
     285#define SSMFIELD_ENTRY_U32_ZX_U64(Type, Field)      SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_U32_ZX_U64, 0)
    281286
    282287/** Emit a SSMFIELD array entry for a field that can be ignored.
    283288 * It is stored as zeros if SSMSTRUCT_FLAGS_DONT_IGNORE is specified to
    284289 * SSMR3PutStructEx.  The member is never touched upon restore. */
    285 #define SSMFIELD_ENTRY_IGNORE(Type, Field)          SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGNORE)
     290#define SSMFIELD_ENTRY_IGNORE(Type, Field)          SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGNORE, 0)
    286291/** Emit a SSMFIELD array entry for an ignorable RTGCPHYS type. */
    287 #define SSMFIELD_ENTRY_IGN_GCPHYS(Type, Field)      SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPHYS)
     292#define SSMFIELD_ENTRY_IGN_GCPHYS(Type, Field)      SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPHYS, 0)
    288293/** Emit a SSMFIELD array entry for an ignorable RTGCPHYS type. */
    289 #define SSMFIELD_ENTRY_IGN_GCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPTR)
     294#define SSMFIELD_ENTRY_IGN_GCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_GCPTR, 0)
    290295/** Emit a SSMFIELD array entry for an ignorable raw-mode context pointer. */
    291 #define SSMFIELD_ENTRY_IGN_RCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_RCPTR)
     296#define SSMFIELD_ENTRY_IGN_RCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_RCPTR, 0)
    292297/** Emit a SSMFIELD array entry for an ignorable ring-3 or/and ring-0 pointer. */
    293 #define SSMFIELD_ENTRY_IGN_HCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_HCPTR)
     298#define SSMFIELD_ENTRY_IGN_HCPTR(Type, Field)       SSMFIELD_ENTRY_TF_INT(Type, Field, SSMFIELDTRANS_IGN_HCPTR, 0)
    294299
    295300/** Emit a SSMFIELD array entry for an old field that should be ignored now.
     
    335340    { \
    336341        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
    337         UINT32_MAX / 2,  (cb64 << 16) | (cb32) | ((cb64) << 8),  "<compiler-padding>" \
     342        UINT32_MAX / 2,  (cb64 << 16) | (cb32) | ((cb64) << 8),  0, "<compiler-padding>" \
    338343    }
    339344#else
     
    341346    { \
    342347        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
    343         UINT32_MAX / 2,  (cb32 << 16) | (cb32) | ((cb64) << 8),  "<compiler-padding>" \
     348        UINT32_MAX / 2,  (cb32 << 16) | (cb32) | ((cb64) << 8),  0, "<compiler-padding>" \
    344349    }
    345350#endif
     
    351356    { \
    352357        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
    353         UINT32_MAX / 2, ((cb) << 16) | (cb), "<msc32-padding>" \
     358        UINT32_MAX / 2, ((cb) << 16) | (cb), 0, "<msc32-padding>" \
    354359    }
    355360#else
     
    357362    { \
    358363        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
    359         UINT32_MAX / 2, (cb), "<msc32-padding>" \
     364        UINT32_MAX / 2, (cb), 0, "<msc32-padding>" \
    360365    }
    361366#endif
     
    363368/** Emit a SSMFIELD array entry for a field with a custom callback. */
    364369#define SSMFIELD_ENTRY_CALLBACK(Type, Field, pfnGetPut) \
    365     { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), #Type "::" #Field }
     370    { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), 0, #Type "::" #Field }
    366371/** Emit the terminating entry of a SSMFIELD array. */
    367 #define SSMFIELD_ENTRY_TERM()               { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX, NULL }
     372#define SSMFIELD_ENTRY_TERM() \
     373    { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX, UINT32_MAX, NULL }
    368374
    369375
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