- Timestamp:
- Oct 14, 2009 5:10:20 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 53509
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
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.