VirtualBox

Changeset 23771 in vbox


Ignore:
Timestamp:
Oct 14, 2009 5:10:20 PM (16 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53509
Message:

SSM: Added SSMFIELD_ENTRY_PAD_MSC32_AUTO.

Location:
trunk
Files:
2 edited

Legend:

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

    r23767 r23771  
    166166     * 64-bit hosts. SSMFIELD::cb has the same format as for
    167167     * SSMFIELDTRANS_PAD_HC. */
    168     SSMFIELDTRANS_PAD_HC_AUTO
     168    SSMFIELDTRANS_PAD_HC_AUTO,
     169    /** Automatic compiler padding specific to the 32-bit Microsoft C
     170     * compiler.
     171     * SSMFIELD::cb has the same format as for SSMFIELDTRANS_PAD_HC. */
     172    SSMFIELDTRANS_PAD_MSC32_AUTO
    169173} SSMFIELDTRANS;
    170174
     
    174178 */
    175179#define SSMFIELDTRANS_IS_PADDING(pfn)   \
    176     (   (uintptr_t)(pfn) >= SSMFIELDTRANS_PAD_HC && (uintptr_t)(pfn) <= SSMFIELDTRANS_PAD_HC_AUTO )
     180    (   (uintptr_t)(pfn) >= SSMFIELDTRANS_PAD_HC && (uintptr_t)(pfn) <= SSMFIELDTRANS_PAD_MSC32_AUTO )
    177181
    178182/**
     
    267271    { \
    268272        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
    269         UINT32_MAX / 2, \
    270         (cb64 << 16) | (cb32) | ((cb64) << 8), \
    271         "<compiler-padding>" \
     273        UINT32_MAX / 2,  (cb64 << 16) | (cb32) | ((cb64) << 8),  "<compiler-padding>" \
    272274    }
    273275#else
     
    275277    { \
    276278        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \
    277         UINT32_MAX / 2, \
    278         (cb32 << 16) | (cb32) | ((cb64) << 8), \
    279         "<compiler-padding>" \
     279        UINT32_MAX / 2,  (cb32 << 16) | (cb32) | ((cb64) << 8),  "<compiler-padding>" \
     280    }
     281#endif
     282/** Emit a SSMFIELD array entry for an automatic compiler padding that is unique
     283 * to the 32-bit microsoft compiler.  This is usually used together with
     284 * SSMFIELD_ENTRY_PAD_HC*. */
     285#if HC_ARCH_BITS == 32 && defined(_MSC_VER)
     286# define SSMFIELD_ENTRY_PAD_MSC32_AUTO(cb) \
     287    { \
     288        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
     289        UINT32_MAX / 2, ((cb) << 16 | (cb), "<msc32-padding>" \
     290    }
     291#else
     292# define SSMFIELD_ENTRY_PAD_MSC32_AUTO(cb) \
     293    { \
     294        (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \
     295        UINT32_MAX / 2, (cb), "<msc32-padding>" \
    280296    }
    281297#endif
  • trunk/src/VBox/VMM/SSM.cpp

    r23764 r23771  
    331331
    332332
     333/** @def SSM_HOST_IS_MSC_32
     334 * Set to 1 if the host is 32-bit MSC, otherwise set to 0.
     335 *   */
     336#if defined(_MSC_VER) && HC_ARCH_BITS == 32
     337# define SSM_HOST_IS_MSC_32     1
     338#else
     339# define SSM_HOST_IS_MSC_32     0
     340#endif
     341
     342
     343
    333344/*******************************************************************************
    334345*   Structures and Typedefs                                                    *
     
    523534            bool            fFixedGCPtrSize;
    524535
     536            /** 32-bit MSC saved this? */
     537            bool            fIsHostMsc32;
    525538
    526539            /** @name Header info (set by ssmR3ValidateFile)
     
    973986                LogRel(("SSM: Saved state info:\n"));
    974987            LogRel(("SSM:   %s: %s\n", szVar, szValue));
     988
     989            /*
     990             * Detect 32-bit MSC for handling SSMFIELD_ENTRY_PAD_MSC32_AUTO.
     991             */
     992            if (!strcmp(szVar, "Host OS"))
     993            {
     994                bool fIsHostMsc32 = !strcmp(szValue, "win.x86");
     995                if (fIsHostMsc32 != pSSM->u.Read.fIsHostMsc32)
     996                {
     997                    LogRel(("SSM: (fIsHostMsc32 %RTbool => %RTbool)\n", pSSM->u.Read.fIsHostMsc32, fIsHostMsc32));
     998                    pSSM->u.Read.fIsHostMsc32 = fIsHostMsc32;
     999                }
     1000            }
    9751001        }
    9761002    }
     
    28182844
    28192845/**
    2820  * Gets the host bit count.
     2846 * Gets the host bit count of the saved state.
    28212847 *
    28222848 * Works for on both save and load handles.
     
    28342860    }
    28352861    return HC_ARCH_BITS;
     2862}
     2863
     2864
     2865/**
     2866 * Saved state origins on a host using 32-bit MSC?
     2867 *
     2868 * Works for on both save and load handles.
     2869 *
     2870 * @returns true/false.
     2871 * @param   pSSM                The saved state handle.
     2872 */
     2873DECLINLINE(bool) ssmR3IsHostMsc32(PSSMHANDLE pSSM)
     2874{
     2875    if (pSSM->enmOp >= SSMSTATE_LOAD_PREP)
     2876    {
     2877        uint32_t cBits = pSSM->u.Read.cHostBits;
     2878        if (cBits)
     2879            return cBits;
     2880    }
     2881    return SSM_HOST_IS_MSC_32;
    28362882}
    28372883
     
    32933339     * Put the fields
    32943340     */
    3295     uint32_t off = 0;
     3341    uint32_t    off          = 0;
    32963342    for (PCSSMFIELD pCur = paFields;
    32973343         pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX;
     
    33813427            case SSMFIELDTRANS_PAD_HC64:
    33823428            case SSMFIELDTRANS_PAD_HC_AUTO:
     3429            case SSMFIELDTRANS_PAD_MSC32_AUTO:
    33833430            {
    33843431                uint32_t cb32    = RT_BYTE1(pCur->cb);
    33853432                uint32_t cb64    = RT_BYTE2(pCur->cb);
    3386                 uint32_t cbCtx   = HC_ARCH_BITS           == 64 ? cb64 : cb32;
    3387                 uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64 ? cb64 : cb32;
     3433                uint32_t cbCtx   =    HC_ARCH_BITS == 64
     3434                                   || (   (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     3435                                       && SSM_HOST_IS_MSC_32)
     3436                                 ? cb64 : cb32;
     3437                uint32_t cbSaved =    ssmR3GetHostBits(pSSM) == 64
     3438                                   || (   (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     3439                                       && ssmR3IsHostMsc32(pSSM))
     3440                                 ? cb64 : cb32;
    33883441                AssertMsgReturn(    cbField == cbCtx
    33893442                                &&  (   (   pCur->off == UINT32_MAX / 2
    33903443                                         && (   cbField == 0
    3391                                              || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO))
    3392                                      || (pCur->off != UINT32_MAX / 2 && cbField != 0)),
    3393                                 ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
    3394                                  cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
     3444                                             || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
     3445                                             || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     3446                                            )
     3447                                        )
     3448                                     || (pCur->off != UINT32_MAX / 2 && cbField != 0)
     3449                                     )
     3450                                , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
     3451                                   cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
    33953452                                VERR_SSM_FIELD_INVALID_PADDING_SIZE);
    33963453                if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
     
    59926049            case SSMFIELDTRANS_PAD_HC64:
    59936050            case SSMFIELDTRANS_PAD_HC_AUTO:
     6051            case SSMFIELDTRANS_PAD_MSC32_AUTO:
    59946052            {
    59956053                uint32_t cb32    = RT_BYTE1(pCur->cb);
    59966054                uint32_t cb64    = RT_BYTE2(pCur->cb);
    5997                 uint32_t cbCtx   = HC_ARCH_BITS           == 64 ? cb64 : cb32;
    5998                 uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64 ? cb64 : cb32;
     6055                uint32_t cbCtx   =    HC_ARCH_BITS == 64
     6056                                   || (   (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     6057                                       && SSM_HOST_IS_MSC_32)
     6058                                 ? cb64 : cb32;
     6059                uint32_t cbSaved =    ssmR3GetHostBits(pSSM) == 64
     6060                                   || (   (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     6061                                       && ssmR3IsHostMsc32(pSSM))
     6062                                 ? cb64 : cb32;
    59996063                AssertMsgReturn(    cbField == cbCtx
    60006064                                &&  (   (   pCur->off == UINT32_MAX / 2
    60016065                                         && (   cbField == 0
    6002                                              || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO))
    6003                                      || (pCur->off != UINT32_MAX / 2 && cbField != 0)),
    6004                                 ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
    6005                                  cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
     6066                                             || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO
     6067                                             || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO
     6068                                            )
     6069                                        )
     6070                                     || (pCur->off != UINT32_MAX / 2 && cbField != 0)
     6071                                     )
     6072                                , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n",
     6073                                   cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off),
    60066074                                VERR_SSM_FIELD_INVALID_PADDING_SIZE);
    60076075                if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
     
    71167184    pSSM->u.Read.cbGCPtr        = UINT8_MAX;
    71177185    pSSM->u.Read.fFixedGCPtrSize= false;
     7186    pSSM->u.Read.fIsHostMsc32   = SSM_HOST_IS_MSC_32;
    71187187    pSSM->u.Read.u16VerMajor    = UINT16_MAX;
    71197188    pSSM->u.Read.u16VerMinor    = UINT16_MAX;
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