- Timestamp:
- Oct 19, 2009 2:49:13 PM (16 years ago)
- svn:sync-xref-src-repo-rev:
- 53643
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
TabularUnified trunk/src/VBox/VMM/SSM.cpp ¶
r23816 r23872 838 838 /** Pointer to a const footer. */ 839 839 typedef SSMFILEFTR const *PCSSMFILEFTR; 840 841 842 /******************************************************************************* 843 * Global Variables * 844 *******************************************************************************/ 845 /** Zeros used by the struct putter. 846 * This must be at least 8 bytes or the code breaks. */ 847 static uint8_t const g_abZero[_1K] = {0}; 840 848 841 849 … … 3295 3303 3296 3304 /** 3305 * SSMR3PutStructEx helper that puts an arbitrary number of zeros. 3306 * 3307 * @returns VBox status code. 3308 * @param pSSM The saved state handle. 3309 * @param cbToFill The number of zeros to stuff into the state. 3310 */ 3311 static int ssmR3PutZeros(PSSMHANDLE pSSM, uint32_t cbToFill) 3312 { 3313 while (cbToFill > 0) 3314 { 3315 size_t cb = RT_MIN(sizeof(g_abZero), cbToFill); 3316 int rc = ssmR3DataWrite(pSSM, g_abZero, cb); 3317 if (RT_FAILURE(rc)) 3318 return rc; 3319 cbToFill -= cb; 3320 } 3321 return VINF_SUCCESS; 3322 } 3323 3324 3325 /** 3297 3326 * Puts a structure, extended API. 3298 3327 * … … 3310 3339 uint32_t fFlags, PCSSMFIELD paFields, void *pvUser) 3311 3340 { 3312 static uint8_t const s_abZero[_1K] = {0};3313 3341 int rc; 3314 3342 … … 3360 3388 VERR_SSM_FIELD_NOT_CONSECUTIVE); 3361 3389 3390 rc = VINF_SUCCESS; 3362 3391 uint8_t const *pbField = (uint8_t const *)pvStruct + offField; 3363 3392 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) … … 3386 3415 uint32_t const cEntries = cbField / sizeof(RTRCPTR); 3387 3416 AssertMsgReturn(cbField == cEntries * sizeof(RTRCPTR) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3388 rc = VINF_SUCCESS;3389 3417 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 3390 3418 rc = SSMR3PutRCPtr(pSSM, ((PRTRCPTR)pbField)[i]); … … 3401 3429 uint32_t const cEntries = cbField / sizeof(void *); 3402 3430 AssertMsgReturn(cbField == cEntries * sizeof(void *) && cEntries, ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3403 rc = VINF_SUCCESS;3404 3431 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 3405 3432 rc = ssmR3PutHCPtrNI(pSSM, ((void * const *)pbField)[i], fFlags); … … 3412 3439 rc = ssmR3DataWrite(pSSM, pbField, sizeof(uint32_t)); 3413 3440 if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && sizeof(void *) != sizeof(uint32_t)) 3414 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(uint32_t));3441 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(uint32_t)); 3415 3442 break; 3416 3443 … … 3418 3445 case SSMFIELDTRANS_IGNORE: 3419 3446 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3420 { 3421 uint32_t cb; 3422 for (uint32_t cbLeft = cbField; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb) 3423 { 3424 cb = RT_MIN(sizeof(s_abZero), cbLeft); 3425 rc = ssmR3DataWrite(pSSM, s_abZero, cb); 3426 } 3427 } 3447 rc = ssmR3PutZeros(pSSM, cbField); 3428 3448 break; 3429 3449 … … 3431 3451 AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3432 3452 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3433 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTGCPHYS));3453 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPHYS)); 3434 3454 break; 3435 3455 … … 3437 3457 AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3438 3458 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3439 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTGCPTR));3459 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPTR)); 3440 3460 break; 3441 3461 … … 3443 3463 AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3444 3464 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3445 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTRCPTR));3465 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTRCPTR)); 3446 3466 break; 3447 3467 … … 3449 3469 AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3450 3470 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3451 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(void *));3471 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(void *)); 3452 3472 break; 3453 3473 3454 3474 3455 3475 case SSMFIELDTRANS_OLD: 3456 { 3457 uint32_t cb; 3458 for (uint32_t cbLeft = pCur->cb; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb) 3459 { 3460 cb = RT_MIN(sizeof(s_abZero), cbLeft); 3461 rc = ssmR3DataWrite(pSSM, s_abZero, cb); 3462 } 3476 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3477 rc = ssmR3PutZeros(pSSM, pCur->cb); 3463 3478 break; 3464 }3465 3479 3466 3480 case SSMFIELDTRANS_OLD_GCPHYS: 3467 3481 AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3468 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTGCPHYS));3482 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPHYS)); 3469 3483 break; 3470 3484 3471 3485 case SSMFIELDTRANS_OLD_GCPTR: 3472 3486 AssertMsgReturn(pCur->cb == sizeof(RTGCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3473 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTGCPTR));3487 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTGCPTR)); 3474 3488 break; 3475 3489 3476 3490 case SSMFIELDTRANS_OLD_RCPTR: 3477 3491 AssertMsgReturn(pCur->cb == sizeof(RTRCPTR) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3478 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(RTRCPTR));3492 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(RTRCPTR)); 3479 3493 break; 3480 3494 3481 3495 case SSMFIELDTRANS_OLD_HCPTR: 3482 3496 AssertMsgReturn(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3483 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(void *)); 3497 rc = ssmR3DataWrite(pSSM, g_abZero, sizeof(void *)); 3498 break; 3499 3500 case SSMFIELDTRANS_OLD_PAD_HC: 3501 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3502 rc = ssmR3PutZeros(pSSM, HC_ARCH_BITS == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb)); 3503 break; 3504 3505 case SSMFIELDTRANS_OLD_PAD_MSC32: 3506 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3507 if (SSM_HOST_IS_MSC_32) 3508 rc = ssmR3PutZeros(pSSM, pCur->cb); 3484 3509 break; 3485 3510 … … 3514 3539 VERR_SSM_FIELD_INVALID_PADDING_SIZE); 3515 3540 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3516 { 3517 uint32_t cb; 3518 for (uint32_t cbLeft = cbSaved; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb) 3519 { 3520 cb = RT_MIN(sizeof(s_abZero), cbLeft); 3521 rc = ssmR3DataWrite(pSSM, s_abZero, cb); 3522 } 3523 } 3541 rc = ssmR3PutZeros(pSSM, cbSaved); 3524 3542 break; 3525 3543 } … … 6055 6073 VERR_SSM_FIELD_NOT_CONSECUTIVE); 6056 6074 6075 rc = VINF_SUCCESS; 6057 6076 uint8_t *pbField = (uint8_t *)pvStruct + offField; 6058 6077 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) … … 6148 6167 6149 6168 case SSMFIELDTRANS_OLD: 6169 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 6150 6170 rc = SSMR3Skip(pSSM, pCur->cb); 6151 6171 break; … … 6169 6189 AssertMsgReturn(pCur->cb == sizeof(void *) && pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 6170 6190 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 6191 break; 6192 6193 case SSMFIELDTRANS_OLD_PAD_HC: 6194 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 6195 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) == 64 ? RT_HIWORD(pCur->cb) : RT_LOWORD(pCur->cb)); 6196 break; 6197 6198 case SSMFIELDTRANS_OLD_PAD_MSC32: 6199 AssertMsgReturn(pCur->off == UINT32_MAX / 2, ("%#x %#x (%s)\n", pCur->cb, pCur->off, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 6200 if (ssmR3IsHostMsc32(pSSM)) 6201 rc = SSMR3Skip(pSSM, pCur->cb); 6171 6202 break; 6172 6203
Note:
See TracChangeset
for help on using the changeset viewer.