Changeset 55465 in vbox
- Timestamp:
- Apr 28, 2015 12:09:47 AM (9 years ago)
- Location:
- trunk
- Files:
-
- 2 edited
-
include/VBox/vmm/ssm.h (modified) (8 diffs)
-
src/VBox/VMM/VMMR3/SSM.cpp (modified) (3 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/vmm/ssm.h
r55048 r55465 225 225 /** The size of the field. */ 226 226 uint32_t cb; 227 /** This field was first saved by this unit version number. */ 228 uint32_t uFirstVer; 227 229 /** Field name. */ 228 230 const char *pszName; … … 231 233 /** Emit a SSMFIELD array entry. 232 234 * @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 } 235 237 /** Emit a SSMFIELD array entry. 236 238 * @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) 239 241 /** Emit a SSMFIELD array entry for an old field. 240 242 * @internal */ 241 243 #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) 243 245 /** Emit a SSMFIELD array entry for an alignment padding. 244 246 * @internal */ 245 247 #define SSMFIELD_ENTRY_PAD_INT(Type, Field, cb32, cb64, enmTransformer) \ 246 248 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) 248 250 /** Emit a SSMFIELD array entry for an alignment padding. 249 251 * @internal */ 250 252 #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) 252 254 253 255 /** 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) 255 259 /** Emit a SSMFIELD array entry for a custom made field. This is intended 256 260 * 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) 258 263 /** 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) 260 265 /** 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) 262 267 /** 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) 264 269 /** 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) 266 271 /** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that is only 267 272 * of interest as a NULL indicator. … … 270 275 * SSMSTRUCT_FLAGS_DONT_IGNORE is set, the pointer will be saved in its 271 276 * 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) 273 278 /** 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) 275 280 /** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that has 276 281 * 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) 278 283 /** Emit a SSMFIELD array entry for loading a 32-bit field into a 64-bit 279 284 * 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) 281 286 282 287 /** Emit a SSMFIELD array entry for a field that can be ignored. 283 288 * It is stored as zeros if SSMSTRUCT_FLAGS_DONT_IGNORE is specified to 284 289 * 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) 286 291 /** 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) 288 293 /** 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) 290 295 /** 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) 292 297 /** 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) 294 299 295 300 /** Emit a SSMFIELD array entry for an old field that should be ignored now. … … 335 340 { \ 336 341 (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>" \ 338 343 } 339 344 #else … … 341 346 { \ 342 347 (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>" \ 344 349 } 345 350 #endif … … 351 356 { \ 352 357 (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>" \ 354 359 } 355 360 #else … … 357 362 { \ 358 363 (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_MSC32_AUTO), \ 359 UINT32_MAX / 2, (cb), "<msc32-padding>" \364 UINT32_MAX / 2, (cb), 0, "<msc32-padding>" \ 360 365 } 361 366 #endif … … 363 368 /** Emit a SSMFIELD array entry for a field with a custom callback. */ 364 369 #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 } 366 371 /** 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 } 368 374 369 375 -
trunk/src/VBox/VMM/VMMR3/SSM.cpp
r55063 r55465 3714 3714 */ 3715 3715 rc = VINF_SUCCESS; 3716 uint32_t off= 0;3716 uint32_t off = 0; 3717 3717 for (PCSSMFIELD pCur = paFields; 3718 3718 pCur->cb != UINT32_MAX && pCur->off != UINT32_MAX; … … 6545 6545 pCur++) 6546 6546 { 6547 uint8_t *pbField = (uint8_t *)pvStruct + pCur->off; 6548 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 6549 { 6550 case SSMFIELDTRANS_NO_TRANSFORMATION: 6551 rc = ssmR3DataRead(pSSM, pbField, pCur->cb); 6552 break; 6553 6554 case SSMFIELDTRANS_GCPTR: 6555 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6556 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 6557 break; 6558 6559 case SSMFIELDTRANS_GCPHYS: 6560 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6561 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 6562 break; 6563 6564 case SSMFIELDTRANS_RCPTR: 6565 AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6566 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 6567 break; 6568 6569 case SSMFIELDTRANS_RCPTR_ARRAY: 6547 if (pCur->uFirstVer <= pSSM->u.Read.uCurUnitVer) 6548 { 6549 uint8_t *pbField = (uint8_t *)pvStruct + pCur->off; 6550 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 6570 6551 { 6571 uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR); 6572 AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6573 rc = VINF_SUCCESS; 6574 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6575 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 6576 break; 6552 case SSMFIELDTRANS_NO_TRANSFORMATION: 6553 rc = ssmR3DataRead(pSSM, pbField, pCur->cb); 6554 break; 6555 6556 case SSMFIELDTRANS_GCPTR: 6557 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6558 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 6559 break; 6560 6561 case SSMFIELDTRANS_GCPHYS: 6562 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6563 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 6564 break; 6565 6566 case SSMFIELDTRANS_RCPTR: 6567 AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6568 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 6569 break; 6570 6571 case SSMFIELDTRANS_RCPTR_ARRAY: 6572 { 6573 uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR); 6574 AssertMsgBreakStmt(pCur->cb == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", pCur->cb, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6575 rc = VINF_SUCCESS; 6576 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6577 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 6578 break; 6579 } 6580 6581 default: 6582 AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX); 6577 6583 } 6578 6579 default: 6580 AssertMsgFailedBreakStmt(("%#x\n", pCur->pfnGetPutOrTransformer), rc = VERR_SSM_FIELD_COMPLEX); 6581 } 6582 if (RT_FAILURE(rc)) 6583 { 6584 if (RT_SUCCESS(pSSM->rc)) 6585 pSSM->rc = rc; 6586 return rc; 6584 if (RT_FAILURE(rc)) 6585 { 6586 if (RT_SUCCESS(pSSM->rc)) 6587 pSSM->rc = rc; 6588 return rc; 6589 } 6587 6590 } 6588 6591 } … … 6708 6711 pSSM->rc = VERR_SSM_FIELD_NOT_CONSECUTIVE); 6709 6712 6710 rc = VINF_SUCCESS; 6711 uint8_t *pbField = (uint8_t *)pvStruct + offField; 6712 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 6713 { 6714 case SSMFIELDTRANS_NO_TRANSFORMATION: 6715 rc = ssmR3DataRead(pSSM, pbField, cbField); 6713 if (pCur->uFirstVer <= pSSM->u.Read.uCurUnitVer) 6714 { 6715 rc = VINF_SUCCESS; 6716 uint8_t *pbField = (uint8_t *)pvStruct + offField; 6717 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 6718 { 6719 case SSMFIELDTRANS_NO_TRANSFORMATION: 6720 rc = ssmR3DataRead(pSSM, pbField, cbField); 6721 break; 6722 6723 case SSMFIELDTRANS_GCPHYS: 6724 AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6725 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 6726 break; 6727 6728 case SSMFIELDTRANS_GCPTR: 6729 AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6730 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 6731 break; 6732 6733 case SSMFIELDTRANS_RCPTR: 6734 AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6735 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 6736 break; 6737 6738 case SSMFIELDTRANS_RCPTR_ARRAY: 6739 { 6740 uint32_t const cEntries = cbField / sizeof(RTRCPTR); 6741 AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6742 rc = VINF_SUCCESS; 6743 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6744 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 6745 break; 6746 } 6747 6748 case SSMFIELDTRANS_HCPTR_NI: 6749 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6750 rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags); 6751 break; 6752 6753 case SSMFIELDTRANS_HCPTR_NI_ARRAY: 6754 { 6755 uint32_t const cEntries = cbField / sizeof(void *); 6756 AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6757 rc = VINF_SUCCESS; 6758 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6759 rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags); 6760 break; 6761 } 6762 6763 case SSMFIELDTRANS_HCPTR_HACK_U32: 6764 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6765 *(uintptr_t *)pbField = 0; 6766 rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t)); 6767 if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64) 6768 { 6769 uint32_t u32; 6770 rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t)); 6771 AssertMsgBreakStmt(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM), 6772 ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName), 6773 rc = VERR_SSM_FIELD_INVALID_VALUE); 6774 } 6775 break; 6776 6777 case SSMFIELDTRANS_U32_ZX_U64: 6778 AssertMsgBreakStmt(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6779 ((uint32_t *)pbField)[1] = 0; 6780 rc = SSMR3GetU32(pSSM, (uint32_t *)pbField); 6781 break; 6782 6783 6784 case SSMFIELDTRANS_IGNORE: 6785 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6786 rc = SSMR3Skip(pSSM, cbField); 6787 break; 6788 6789 case SSMFIELDTRANS_IGN_GCPHYS: 6790 AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6791 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6792 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys); 6793 break; 6794 6795 case SSMFIELDTRANS_IGN_GCPTR: 6796 AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6797 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6798 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr); 6799 break; 6800 6801 case SSMFIELDTRANS_IGN_RCPTR: 6802 AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6803 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6804 rc = SSMR3Skip(pSSM, sizeof(RTRCPTR)); 6805 break; 6806 6807 case SSMFIELDTRANS_IGN_HCPTR: 6808 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6809 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6810 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 6811 break; 6812 6813 6814 case SSMFIELDTRANS_OLD: 6815 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6816 rc = SSMR3Skip(pSSM, pCur->cb); 6817 break; 6818 6819 case SSMFIELDTRANS_OLD_GCPHYS: 6820 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6821 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys); 6822 break; 6823 6824 case SSMFIELDTRANS_OLD_GCPTR: 6825 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6826 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr); 6827 break; 6828 6829 case SSMFIELDTRANS_OLD_RCPTR: 6830 AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6831 rc = SSMR3Skip(pSSM, sizeof(RTRCPTR)); 6832 break; 6833 6834 case SSMFIELDTRANS_OLD_HCPTR: 6835 AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6836 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 6837 break; 6838 6839 case SSMFIELDTRANS_OLD_PAD_HC: 6840 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6841 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb)); 6842 break; 6843 6844 case SSMFIELDTRANS_OLD_PAD_MSC32: 6845 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6846 if (ssmR3IsHostMsc32(pSSM)) 6847 rc = SSMR3Skip(pSSM, pCur->cb); 6848 break; 6849 6850 6851 case SSMFIELDTRANS_PAD_HC: 6852 case SSMFIELDTRANS_PAD_HC32: 6853 case SSMFIELDTRANS_PAD_HC64: 6854 case SSMFIELDTRANS_PAD_HC_AUTO: 6855 case SSMFIELDTRANS_PAD_MSC32_AUTO: 6856 { 6857 uint32_t cb32 = RT_BYTE1(pCur->cb); 6858 uint32_t cb64 = RT_BYTE2(pCur->cb); 6859 uint32_t cbCtx = HC_ARCH_BITS == 64 6860 || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6861 && !SSM_HOST_IS_MSC_32) 6862 ? cb64 : cb32; 6863 uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64 6864 || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6865 && !ssmR3IsHostMsc32(pSSM)) 6866 ? cb64 : cb32; 6867 AssertMsgBreakStmt( cbField == cbCtx 6868 && ( ( pCur->off == UINT32_MAX / 2 6869 && ( cbField == 0 6870 || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO 6871 || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6872 ) 6873 ) 6874 || (pCur->off != UINT32_MAX / 2 && cbField != 0) 6875 ) 6876 , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n", 6877 cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off), 6878 rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE); 6879 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6880 rc = SSMR3Skip(pSSM, cbSaved); 6881 break; 6882 } 6883 6884 default: 6885 AssertBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK); 6886 rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, pvStruct, fFlags, true /*fGetOrPut*/, pvUser); 6887 break; 6888 } 6889 if (RT_FAILURE(rc)) 6716 6890 break; 6717 6718 case SSMFIELDTRANS_GCPHYS: 6719 AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6720 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 6721 break; 6722 6723 case SSMFIELDTRANS_GCPTR: 6724 AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6725 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 6726 break; 6727 6728 case SSMFIELDTRANS_RCPTR: 6729 AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6730 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 6731 break; 6732 6733 case SSMFIELDTRANS_RCPTR_ARRAY: 6734 { 6735 uint32_t const cEntries = cbField / sizeof(RTRCPTR); 6736 AssertMsgBreakStmt(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6737 rc = VINF_SUCCESS; 6738 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6739 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 6740 break; 6741 } 6742 6743 case SSMFIELDTRANS_HCPTR_NI: 6744 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6745 rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags); 6746 break; 6747 6748 case SSMFIELDTRANS_HCPTR_NI_ARRAY: 6749 { 6750 uint32_t const cEntries = cbField / sizeof(void *); 6751 AssertMsgBreakStmt(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6752 rc = VINF_SUCCESS; 6753 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 6754 rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags); 6755 break; 6756 } 6757 6758 case SSMFIELDTRANS_HCPTR_HACK_U32: 6759 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6760 *(uintptr_t *)pbField = 0; 6761 rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t)); 6762 if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64) 6763 { 6764 uint32_t u32; 6765 rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t)); 6766 AssertMsgBreakStmt(RT_FAILURE(rc) || u32 == 0 || (fFlags & SSMSTRUCT_FLAGS_SAVED_AS_MEM), 6767 ("high=%#x low=%#x (%s)\n", u32, *(uint32_t *)pbField, pCur->pszName), 6768 rc = VERR_SSM_FIELD_INVALID_VALUE); 6769 } 6770 break; 6771 6772 case SSMFIELDTRANS_U32_ZX_U64: 6773 AssertMsgBreakStmt(cbField == sizeof(uint64_t), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6774 ((uint32_t *)pbField)[1] = 0; 6775 rc = SSMR3GetU32(pSSM, (uint32_t *)pbField); 6776 break; 6777 6778 6779 case SSMFIELDTRANS_IGNORE: 6780 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6781 rc = SSMR3Skip(pSSM, cbField); 6782 break; 6783 6784 case SSMFIELDTRANS_IGN_GCPHYS: 6785 AssertMsgBreakStmt(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6786 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6787 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys); 6788 break; 6789 6790 case SSMFIELDTRANS_IGN_GCPTR: 6791 AssertMsgBreakStmt(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6792 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6793 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr); 6794 break; 6795 6796 case SSMFIELDTRANS_IGN_RCPTR: 6797 AssertMsgBreakStmt(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6798 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6799 rc = SSMR3Skip(pSSM, sizeof(RTRCPTR)); 6800 break; 6801 6802 case SSMFIELDTRANS_IGN_HCPTR: 6803 AssertMsgBreakStmt(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6804 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6805 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 6806 break; 6807 6808 6809 case SSMFIELDTRANS_OLD: 6810 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6811 rc = SSMR3Skip(pSSM, pCur->cb); 6812 break; 6813 6814 case SSMFIELDTRANS_OLD_GCPHYS: 6815 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6816 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPhys); 6817 break; 6818 6819 case SSMFIELDTRANS_OLD_GCPTR: 6820 AssertMsgBreakStmt(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6821 rc = SSMR3Skip(pSSM, pSSM->u.Read.cbGCPtr); 6822 break; 6823 6824 case SSMFIELDTRANS_OLD_RCPTR: 6825 AssertMsgBreakStmt(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6826 rc = SSMR3Skip(pSSM, sizeof(RTRCPTR)); 6827 break; 6828 6829 case SSMFIELDTRANS_OLD_HCPTR: 6830 AssertMsgBreakStmt(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6831 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 6832 break; 6833 6834 case SSMFIELDTRANS_OLD_PAD_HC: 6835 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6836 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb)); 6837 break; 6838 6839 case SSMFIELDTRANS_OLD_PAD_MSC32: 6840 AssertMsgBreakStmt(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), rc = VERR_SSM_FIELD_INVALID_SIZE); 6841 if (ssmR3IsHostMsc32(pSSM)) 6842 rc = SSMR3Skip(pSSM, pCur->cb); 6843 break; 6844 6845 6846 case SSMFIELDTRANS_PAD_HC: 6847 case SSMFIELDTRANS_PAD_HC32: 6848 case SSMFIELDTRANS_PAD_HC64: 6849 case SSMFIELDTRANS_PAD_HC_AUTO: 6850 case SSMFIELDTRANS_PAD_MSC32_AUTO: 6851 { 6852 uint32_t cb32 = RT_BYTE1(pCur->cb); 6853 uint32_t cb64 = RT_BYTE2(pCur->cb); 6854 uint32_t cbCtx = HC_ARCH_BITS == 64 6855 || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6856 && !SSM_HOST_IS_MSC_32) 6857 ? cb64 : cb32; 6858 uint32_t cbSaved = ssmR3GetHostBits(pSSM) == 64 6859 || ( (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6860 && !ssmR3IsHostMsc32(pSSM)) 6861 ? cb64 : cb32; 6862 AssertMsgBreakStmt( cbField == cbCtx 6863 && ( ( pCur->off == UINT32_MAX / 2 6864 && ( cbField == 0 6865 || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_HC_AUTO 6866 || (uintptr_t)pCur->pfnGetPutOrTransformer == SSMFIELDTRANS_PAD_MSC32_AUTO 6867 ) 6868 ) 6869 || (pCur->off != UINT32_MAX / 2 && cbField != 0) 6870 ) 6871 , ("cbField=%#x cb32=%#x cb64=%#x HC_ARCH_BITS=%u cbCtx=%#x cbSaved=%#x off=%#x\n", 6872 cbField, cb32, cb64, HC_ARCH_BITS, cbCtx, cbSaved, pCur->off), 6873 rc = VERR_SSM_FIELD_INVALID_PADDING_SIZE); 6874 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6875 rc = SSMR3Skip(pSSM, cbSaved); 6876 break; 6877 } 6878 6879 default: 6880 AssertBreakStmt(pCur->pfnGetPutOrTransformer, rc = VERR_SSM_FIELD_INVALID_CALLBACK); 6881 rc = pCur->pfnGetPutOrTransformer(pSSM, pCur, pvStruct, fFlags, true /*fGetOrPut*/, pvUser); 6882 break; 6883 } 6884 if (RT_FAILURE(rc)) 6885 break; 6891 } 6886 6892 6887 6893 off = offField + cbField;
Note:
See TracChangeset
for help on using the changeset viewer.

