Changeset 23771 in vbox
- Timestamp:
- Oct 14, 2009 5:10:20 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 53509
- Location:
- trunk
- Files:
-
- 2 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/ssm.h
r23767 r23771 166 166 * 64-bit hosts. SSMFIELD::cb has the same format as for 167 167 * 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 169 173 } SSMFIELDTRANS; 170 174 … … 174 178 */ 175 179 #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 ) 177 181 178 182 /** … … 267 271 { \ 268 272 (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>" \ 272 274 } 273 275 #else … … 275 277 { \ 276 278 (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>" \ 280 296 } 281 297 #endif -
trunk/src/VBox/VMM/SSM.cpp
r23764 r23771 331 331 332 332 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 333 344 /******************************************************************************* 334 345 * Structures and Typedefs * … … 523 534 bool fFixedGCPtrSize; 524 535 536 /** 32-bit MSC saved this? */ 537 bool fIsHostMsc32; 525 538 526 539 /** @name Header info (set by ssmR3ValidateFile) … … 973 986 LogRel(("SSM: Saved state info:\n")); 974 987 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 } 975 1001 } 976 1002 } … … 2818 2844 2819 2845 /** 2820 * Gets the host bit count .2846 * Gets the host bit count of the saved state. 2821 2847 * 2822 2848 * Works for on both save and load handles. … … 2834 2860 } 2835 2861 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 */ 2873 DECLINLINE(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; 2836 2882 } 2837 2883 … … 3293 3339 * Put the fields 3294 3340 */ 3295 uint32_t off= 0;3341 uint32_t off = 0; 3296 3342 for (PCSSMFIELD pCur = paFields; 3297 3343 pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX; … … 3381 3427 case SSMFIELDTRANS_PAD_HC64: 3382 3428 case SSMFIELDTRANS_PAD_HC_AUTO: 3429 case SSMFIELDTRANS_PAD_MSC32_AUTO: 3383 3430 { 3384 3431 uint32_t cb32 = RT_BYTE1(pCur->cb); 3385 3432 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; 3388 3441 AssertMsgReturn( cbField == cbCtx 3389 3442 && ( ( pCur->off == UINT32_MAX / 2 3390 3443 && ( 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), 3395 3452 VERR_SSM_FIELD_INVALID_PADDING_SIZE); 3396 3453 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) … … 5992 6049 case SSMFIELDTRANS_PAD_HC64: 5993 6050 case SSMFIELDTRANS_PAD_HC_AUTO: 6051 case SSMFIELDTRANS_PAD_MSC32_AUTO: 5994 6052 { 5995 6053 uint32_t cb32 = RT_BYTE1(pCur->cb); 5996 6054 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; 5999 6063 AssertMsgReturn( cbField == cbCtx 6000 6064 && ( ( pCur->off == UINT32_MAX / 2 6001 6065 && ( 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), 6006 6074 VERR_SSM_FIELD_INVALID_PADDING_SIZE); 6007 6075 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) … … 7116 7184 pSSM->u.Read.cbGCPtr = UINT8_MAX; 7117 7185 pSSM->u.Read.fFixedGCPtrSize= false; 7186 pSSM->u.Read.fIsHostMsc32 = SSM_HOST_IS_MSC_32; 7118 7187 pSSM->u.Read.u16VerMajor = UINT16_MAX; 7119 7188 pSSM->u.Read.u16VerMinor = UINT16_MAX;
Note:
See TracChangeset
for help on using the changeset viewer.