Changeset 23764 in vbox
- Timestamp:
- Oct 14, 2009 2:46:55 PM (15 years ago)
- svn:sync-xref-src-repo-rev:
- 53500
- Location:
- trunk
- Files:
-
- 3 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/include/VBox/err.h
r23752 r23764 609 609 /** The field contains an invalid callback or transformation index. */ 610 610 #define VERR_SSM_FIELD_INVALID_CALLBACK (-1868) 611 /** The field contains an invalid padding size. */ 612 #define VERR_SSM_FIELD_INVALID_PADDING_SIZE (-1869) 611 613 /** @} */ 612 614 -
trunk/include/VBox/ssm.h
r23752 r23764 138 138 /** Guest context (GC) physical address. */ 139 139 SSMFIELDTRANS_GCPHYS, 140 /** Raw-mode context (RC) virtual address. */ 141 SSMFIELDTRANS_RCPTR, 142 /** Array of raw-mode context (RC) virtual addresses. */ 143 SSMFIELDTRANS_RCPTR_ARRAY, 144 /** Host context (HC) virtual address used as a NULL indicator. See 145 * SSMFIELD_ENTRY_HCPTR_NI. */ 146 SSMFIELDTRANS_HCPTR_NI, 147 /** Array of SSMFIELDTRANS_HCPTR_NI. */ 148 SSMFIELDTRANS_HCPTR_NI_ARRAY, 140 149 /** Ignorable Host context (HC) virtual address. See SSMFIELD_ENTRY_HCPTR. */ 141 150 SSMFIELDTRANS_HCPTR, 142 151 /** Ignorable field. See SSMFIELD_ENTRY_IGNORE. */ 143 SSMFIELDTRANS_IGNORE 152 SSMFIELDTRANS_IGNORE, 153 /** Padding that differs between 32-bit and 64-bit hosts. 154 * The first byte of SSMFIELD::cb contains the size for 32-bit hosts. 155 * The second byte of SSMFIELD::cb contains the size for 64-bit hosts. 156 * The upper word of SSMFIELD::cb contains the actual field size. 157 */ 158 SSMFIELDTRANS_PAD_HC, 159 /** Padding for 32-bit hosts only. 160 * SSMFIELD::cb has the same format as for SSMFIELDTRANS_PAD_HC. */ 161 SSMFIELDTRANS_PAD_HC32, 162 /** Padding for 64-bit hosts only. 163 * SSMFIELD::cb has the same format as for SSMFIELDTRANS_PAD_HC. */ 164 SSMFIELDTRANS_PAD_HC64, 165 /** Automatic compiler padding that may differ between 32-bit and 166 * 64-bit hosts. SSMFIELD::cb has the same format as for 167 * SSMFIELDTRANS_PAD_HC. */ 168 SSMFIELDTRANS_PAD_HC_AUTO 144 169 } SSMFIELDTRANS; 170 171 /** Tests if it's a padding field with the special SSMFIELD::cb format. 172 * @returns true / false. 173 * @param pfn The SSMFIELD::pfnGetPutOrTransformer value. 174 */ 175 #define SSMFIELDTRANS_IS_PADDING(pfn) \ 176 ( (uintptr_t)(pfn) >= SSMFIELDTRANS_PAD_HC && (uintptr_t)(pfn) <= SSMFIELDTRANS_PAD_HC_AUTO ) 145 177 146 178 /** … … 155 187 /** The size of the field. */ 156 188 uint32_t cb; 189 /** Field name. */ 190 const char *pszName; 157 191 } SSMFIELD; 158 192 … … 163 197 (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), \ 164 198 RT_OFFSETOF(Type, Field), \ 165 RT_SIZEOFMEMB(Type, Field) \ 199 RT_SIZEOFMEMB(Type, Field), \ 200 #Type "::" #Field \ 166 201 } 202 /** Emit a SSMFIELD array entry for an alignment padding. 203 * @internal */ 204 #define SSMFIELD_ENTRY_PAD_INT(Type, Field, cb32, cb64, enmTransformer) \ 205 { \ 206 (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), \ 207 RT_OFFSETOF(Type, Field), \ 208 (RT_SIZEOFMEMB(Type, Field) << 16) | (cb32) | ((cb64) << 8), \ 209 #Type "::" #Field \ 210 } 211 /** Emit a SSMFIELD array entry for an alignment padding. 212 * @internal */ 213 #define SSMFIELD_ENTRY_PAD_OTHER_INT(Type, Field, cb32, cb64, enmTransformer) \ 214 { \ 215 (PFNSSMFIELDGETPUT)(uintptr_t)(enmTransformer), \ 216 UINT32_MAX / 2, \ 217 (0 | (cb32) | ((cb64) << 8), \ 218 #Type "::" #Field \ 219 } 220 167 221 /** Emit a SSMFIELD array entry. */ 168 #define SSMFIELD_ENTRY(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION)222 #define SSMFIELD_ENTRY(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_NO_TRANSFORMATION) 169 223 /** Emit a SSMFIELD array entry for a RTGCPTR type. */ 170 #define SSMFIELD_ENTRY_GCPTR(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_GCPTR)224 #define SSMFIELD_ENTRY_GCPTR(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_GCPTR) 171 225 /** Emit a SSMFIELD array entry for a RTGCPHYS type. */ 172 #define SSMFIELD_ENTRY_GCPHYS(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_GCPHYS) 226 #define SSMFIELD_ENTRY_GCPHYS(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_GCPHYS) 227 /** Emit a SSMFIELD array entry for a raw-mode context pointer. */ 228 #define SSMFIELD_ENTRY_RCPTR(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_RCPTR) 229 /** Emit a SSMFIELD array entry for a raw-mode context pointer. */ 230 #define SSMFIELD_ENTRY_RCPTR_ARRAY(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_RCPTR_ARRAY) 231 /** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that is only 232 * of interest as a NULL indicator. 233 * 234 * This is always restored as a 0 (NULL) or 1 value. When 235 * SSMSTRUCT_FLAGS_DONT_IGNORE is set, the pointer will be saved in its 236 * entirety, when clear it will be saved as a boolean. */ 237 #define SSMFIELD_ENTRY_HCPTR_NI(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI) 238 /** Same as SSMFIELD_ENTRY_HCPTR_NI, except it's an array of the buggers. */ 239 #define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY) 173 240 /** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that is 174 241 * of no real interest to the saved state. It follows the same save and restore 175 242 * rules as SSMFIELD_ENTRY_IGNORE. */ 176 #define SSMFIELD_ENTRY_HCPTR(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR)243 #define SSMFIELD_ENTRY_HCPTR(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR) 177 244 /** Emit a SSMFIELD array entry for a field that can be ignored. 178 245 * It is stored as zeros if SSMSTRUCT_FLAGS_DONT_IGNORE is specified to 179 246 * SSMR3PutStructEx. The member is never touched upon restore. */ 180 #define SSMFIELD_ENTRY_IGNORE(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_IGNORE) 247 #define SSMFIELD_ENTRY_IGNORE(Type, Field) SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_IGNORE) 248 /** Emit a SSMFIELD array entry for a padding that differs in size between 249 * 64-bit and 32-bit hosts. */ 250 #define SSMFIELD_ENTRY_PAD_HC(Type, Field, cb32, cb64) SSMFIELD_ENTRY_PAD_INT( Type, Field, cb32, cb64, SSMFIELDTRANS_PAD_HC) 251 /** Emit a SSMFIELD array entry for a padding that is exclusive to 64-bit hosts. */ 252 #if HC_ARCH_BITS == 64 253 # define SSMFIELD_ENTRY_PAD_HC64(Type, Field, cb) SSMFIELD_ENTRY_PAD_INT( Type, Field, 0, cb, SSMFIELDTRANS_PAD_HC64) 254 #else 255 # define SSMFIELD_ENTRY_PAD_HC64(Type, Field, cb) SSMFIELD_ENTRY_PAD_OTHER_INT(Type, Field, 0, cb, SSMFIELDTRANS_PAD_HC64) 256 #endif 257 /** Emit a SSMFIELD array entry for a 32-bit padding for on 64-bits hosts. */ 258 #if HC_ARCH_BITS == 32 259 # define SSMFIELD_ENTRY_PAD_HC32(Type, Field, cb) SSMFIELD_ENTRY_PAD_INT( Type, Field, cb, 0, SSMFIELDTRANS_PAD_HC32) 260 #else 261 # define SSMFIELD_ENTRY_PAD_HC32(Type, Field, cb) SSMFIELD_ENTRY_PAD_OTHER_INT(Type, Field, cb, 0, SSMFIELDTRANS_PAD_HC32) 262 #endif 263 /** Emit a SSMFIELD array entry for an automatic compiler padding that may 264 * differ in size between 64-bit and 32-bit hosts. */ 265 #if HC_ARCH_BITS == 64 266 # define SSMFIELD_ENTRY_PAD_HC_AUTO(cb32, cb64) \ 267 { \ 268 (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \ 269 UINT32_MAX / 2, \ 270 (cb64 << 16) | (cb32) | ((cb64) << 8), \ 271 "<compiler-padding>" \ 272 } 273 #else 274 # define SSMFIELD_ENTRY_PAD_HC_AUTO(cb32, cb64) \ 275 { \ 276 (PFNSSMFIELDGETPUT)(uintptr_t)(SSMFIELDTRANS_PAD_HC_AUTO), \ 277 UINT32_MAX / 2, \ 278 (cb32 << 16) | (cb32) | ((cb64) << 8), \ 279 "<compiler-padding>" \ 280 } 281 #endif 282 181 283 /** Emit a SSMFIELD array entry for a field with a custom callback. */ 182 284 #define SSMFIELD_ENTRY_CALLBACK(Type, Field, pfnGetPut) \ 183 { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field) }285 { (pfnGetPut), RT_OFFSETOF(Type, Field), RT_SIZEOFMEMB(Type, Field), #Type "::" #Field } 184 286 /** Emit the terminating entry of a SSMFIELD array. */ 185 #define SSMFIELD_ENTRY_TERM() { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX }287 #define SSMFIELD_ENTRY_TERM() { (PFNSSMFIELDGETPUT)(uintptr_t)SSMFIELDTRANS_INVALID, UINT32_MAX, UINT32_MAX, NULL } 186 288 187 289 … … 827 929 VMMR3DECL(SSMAFTER) SSMR3HandleGetAfter(PSSMHANDLE pSSM); 828 930 VMMR3DECL(bool) SSMR3HandleIsLiveSave(PSSMHANDLE pSSM); 931 VMMR3DECL(uint32_t) SSMR3HandleHostBits(PSSMHANDLE pSSM); 829 932 VMMR3_INT_DECL(int) SSMR3SetGCPtrSize(PSSMHANDLE pSSM, unsigned cbGCPtr); 830 933 VMMR3DECL(int) SSMR3Cancel(PVM pVM); -
trunk/src/VBox/VMM/SSM.cpp
r23761 r23764 2079 2079 if (pStrm->hIoThread != NIL_RTTHREAD) 2080 2080 { 2081 int rc2 = RTSemEventSignal(pStrm->hEvt Head);2081 int rc2 = RTSemEventSignal(pStrm->hEvtFree); 2082 2082 AssertLogRelRC(rc2); 2083 2083 int rc3 = RTThreadWait(pStrm->hIoThread, RT_INDEFINITE_WAIT, NULL); … … 2818 2818 2819 2819 /** 2820 * Gets the host bit count. 2821 * 2822 * Works for on both save and load handles. 2823 * 2824 * @returns 32 or 64. 2825 * @param pSSM The saved state handle. 2826 */ 2827 DECLINLINE(uint32_t) ssmR3GetHostBits(PSSMHANDLE pSSM) 2828 { 2829 if (pSSM->enmOp >= SSMSTATE_LOAD_PREP) 2830 { 2831 uint32_t cBits = pSSM->u.Read.cHostBits; 2832 if (cBits) 2833 return cBits; 2834 } 2835 return HC_ARCH_BITS; 2836 } 2837 2838 2839 /** 2820 2840 * Finishes a data unit. 2821 2841 * All buffers and compressor instances are flushed and destroyed. 2822 2842 * 2823 2843 * @returns VBox status. 2824 * @param pSSM SSM operationhandle.2844 * @param pSSM The saved state handle. 2825 2845 */ 2826 2846 static int ssmR3DataWriteFinish(PSSMHANDLE pSSM) … … 3176 3196 3177 3197 case SSMFIELDTRANS_GCPTR: 3178 AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x \n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);3198 AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3179 3199 rc = SSMR3PutGCPtr(pSSM, *(PRTGCPTR)pbField); 3180 3200 break; 3181 3201 3182 3202 case SSMFIELDTRANS_GCPHYS: 3183 AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x \n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);3203 AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3184 3204 rc = SSMR3PutGCPhys(pSSM, *(PRTGCPHYS)pbField); 3185 3205 break; 3186 3206 3207 case SSMFIELDTRANS_RCPTR: 3208 AssertMsgReturn(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3209 rc = SSMR3PutRCPtr(pSSM, *(PRTRCPTR)pbField); 3210 break; 3211 3212 case SSMFIELDTRANS_RCPTR_ARRAY: 3213 { 3214 uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR); 3215 AssertMsgReturn(pCur->cb == cEntries * sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3216 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 3217 rc = SSMR3PutRCPtr(pSSM, ((PRTRCPTR)pbField)[i]); 3218 break; 3219 } 3220 3187 3221 default: 3188 3222 AssertMsgFailedReturn(("%#x\n", pCur->pfnGetPutOrTransformer), VERR_SSM_FIELD_COMPLEX); … … 3194 3228 /* end marker */ 3195 3229 return SSMR3PutU32(pSSM, SSMR3STRUCT_END); 3230 } 3231 3232 3233 /** 3234 * SSMR3PutStructEx helper that puts a HCPTR that is used as a NULL indicator. 3235 * 3236 * @returns VBox status code. 3237 * 3238 * @param pSSM The saved state handle. 3239 * @param pv The value to put. 3240 * @param fFlags SSMSTRUCT_FLAGS_XXX. 3241 */ 3242 DECLINLINE(int) ssmR3PutHCPtrNI(PSSMHANDLE pSSM, void *pv, uint32_t fFlags) 3243 { 3244 int rc; 3245 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3246 rc = ssmR3DataWrite(pSSM, &pv, sizeof(void *)); 3247 else 3248 rc = SSMR3PutBool(pSSM, pv != NULL); 3249 return rc; 3196 3250 } 3197 3251 … … 3244 3298 pCur++) 3245 3299 { 3246 AssertMsgReturn( pCur->cb <= cbStruct 3247 && pCur->off + pCur->cb <= cbStruct 3248 && pCur->off + pCur->cb > pCur->off, 3249 ("off=%#x cb=%#x cbStruct=%#x\n", pCur->cb, pCur->off, cbStruct), 3300 uint32_t const offField = !SSMFIELDTRANS_IS_PADDING(pCur->pfnGetPutOrTransformer) || pCur->off != UINT32_MAX / 2 3301 ? pCur->off 3302 : off; 3303 uint32_t const cbField = !SSMFIELDTRANS_IS_PADDING(pCur->pfnGetPutOrTransformer) 3304 ? pCur->cb 3305 : RT_HIWORD(pCur->cb); 3306 AssertMsgReturn( cbField <= cbStruct 3307 && offField + cbField <= cbStruct 3308 && offField + cbField >= offField, 3309 ("off=%#x cb=%#x cbStruct=%#x (%s)\n", cbField, offField, cbStruct, pCur->pszName), 3250 3310 VERR_SSM_FIELD_OUT_OF_BOUNDS); 3251 3311 AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT) 3252 || off == pCur->off,3253 ("off=%#x pCur->off=%#x\n", off, pCur->off),3312 || off == offField, 3313 ("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName), 3254 3314 VERR_SSM_FIELD_NOT_CONSECUTIVE); 3255 3315 3256 uint8_t const *pbField = (uint8_t const *)pvStruct + pCur->off;3316 uint8_t const *pbField = (uint8_t const *)pvStruct + offField; 3257 3317 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 3258 3318 { 3259 3319 case SSMFIELDTRANS_NO_TRANSFORMATION: 3260 rc = ssmR3DataWrite(pSSM, pbField, pCur->cb);3320 rc = ssmR3DataWrite(pSSM, pbField, cbField); 3261 3321 break; 3262 3322 3263 3323 case SSMFIELDTRANS_GCPTR: 3264 AssertMsgReturn( pCur->cb == sizeof(RTGCPTR), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);3324 AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3265 3325 rc = SSMR3PutGCPtr(pSSM, *(PRTGCPTR)pbField); 3266 3326 break; 3267 3327 3268 3328 case SSMFIELDTRANS_GCPHYS: 3269 AssertMsgReturn( pCur->cb == sizeof(RTGCPHYS), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);3329 AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3270 3330 rc = SSMR3PutGCPhys(pSSM, *(PRTGCPHYS)pbField); 3271 3331 break; 3272 3332 3333 case SSMFIELDTRANS_RCPTR: 3334 AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3335 rc = SSMR3PutRCPtr(pSSM, *(PRTRCPTR)pbField); 3336 break; 3337 3338 case SSMFIELDTRANS_RCPTR_ARRAY: 3339 { 3340 uint32_t const cEntries = cbField / sizeof(RTRCPTR); 3341 AssertMsgReturn(cbField == cEntries * sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3342 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 3343 rc = SSMR3PutRCPtr(pSSM, ((PRTRCPTR)pbField)[i]); 3344 break; 3345 } 3346 3347 case SSMFIELDTRANS_HCPTR_NI: 3348 AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3349 rc = ssmR3PutHCPtrNI(pSSM, *(void * const *)pbField, fFlags); 3350 break; 3351 3352 case SSMFIELDTRANS_HCPTR_NI_ARRAY: 3353 { 3354 uint32_t const cEntries = cbField / sizeof(void *); 3355 AssertMsgReturn(cbField == cEntries * sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3356 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 3357 rc = ssmR3PutHCPtrNI(pSSM, ((void * const *)pbField)[i], fFlags); 3358 break; 3359 } 3360 3273 3361 case SSMFIELDTRANS_HCPTR: 3274 AssertMsgReturn( pCur->cb == sizeof(void *), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);3362 AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 3275 3363 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3276 3364 rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(void *)); … … 3281 3369 { 3282 3370 uint32_t cb; 3283 for (uint32_t cbLeft = pCur->cb; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb)3371 for (uint32_t cbLeft = cbField; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb) 3284 3372 { 3285 3373 cb = RT_MIN(sizeof(s_abZero), cbLeft); … … 3289 3377 break; 3290 3378 3379 case SSMFIELDTRANS_PAD_HC: 3380 case SSMFIELDTRANS_PAD_HC32: 3381 case SSMFIELDTRANS_PAD_HC64: 3382 case SSMFIELDTRANS_PAD_HC_AUTO: 3383 { 3384 uint32_t cb32 = RT_BYTE1(pCur->cb); 3385 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; 3388 AssertMsgReturn( cbField == cbCtx 3389 && ( ( pCur->off == UINT32_MAX / 2 3390 && ( 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), 3395 VERR_SSM_FIELD_INVALID_PADDING_SIZE); 3396 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 3397 { 3398 uint32_t cb; 3399 for (uint32_t cbLeft = cbSaved; cbLeft > 0 && RT_SUCCESS(rc); cbLeft -= cb) 3400 { 3401 cb = RT_MIN(sizeof(s_abZero), cbLeft); 3402 rc = ssmR3DataWrite(pSSM, s_abZero, cb); 3403 } 3404 } 3405 break; 3406 } 3407 3291 3408 default: 3292 3409 AssertPtrReturn(pCur->pfnGetPutOrTransformer, VERR_SSM_FIELD_INVALID_CALLBACK); … … 3297 3414 return rc; 3298 3415 3299 off = pCur->off + pCur->cb;3416 off = offField + cbField; 3300 3417 } 3301 3418 AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT) … … 3322 3439 * 3323 3440 * @returns VBox status. 3324 * @param pSSM SSM operationhandle.3441 * @param pSSM The saved state handle. 3325 3442 * @param fBool Item to save. 3326 3443 */ … … 3338 3455 * 3339 3456 * @returns VBox status. 3340 * @param pSSM SSM operationhandle.3457 * @param pSSM The saved state handle. 3341 3458 * @param u8 Item to save. 3342 3459 */ … … 3353 3470 * 3354 3471 * @returns VBox status. 3355 * @param pSSM SSM operationhandle.3472 * @param pSSM The saved state handle. 3356 3473 * @param i8 Item to save. 3357 3474 */ … … 3368 3485 * 3369 3486 * @returns VBox status. 3370 * @param pSSM SSM operationhandle.3487 * @param pSSM The saved state handle. 3371 3488 * @param u16 Item to save. 3372 3489 */ … … 3383 3500 * 3384 3501 * @returns VBox status. 3385 * @param pSSM SSM operationhandle.3502 * @param pSSM The saved state handle. 3386 3503 * @param i16 Item to save. 3387 3504 */ … … 3398 3515 * 3399 3516 * @returns VBox status. 3400 * @param pSSM SSM operationhandle.3517 * @param pSSM The saved state handle. 3401 3518 * @param u32 Item to save. 3402 3519 */ … … 3413 3530 * 3414 3531 * @returns VBox status. 3415 * @param pSSM SSM operationhandle.3532 * @param pSSM The saved state handle. 3416 3533 * @param i32 Item to save. 3417 3534 */ … … 3428 3545 * 3429 3546 * @returns VBox status. 3430 * @param pSSM SSM operationhandle.3547 * @param pSSM The saved state handle. 3431 3548 * @param u64 Item to save. 3432 3549 */ … … 3443 3560 * 3444 3561 * @returns VBox status. 3445 * @param pSSM SSM operationhandle.3562 * @param pSSM The saved state handle. 3446 3563 * @param i64 Item to save. 3447 3564 */ … … 3458 3575 * 3459 3576 * @returns VBox status. 3460 * @param pSSM SSM operationhandle.3577 * @param pSSM The saved state handle. 3461 3578 * @param u128 Item to save. 3462 3579 */ … … 3473 3590 * 3474 3591 * @returns VBox status. 3475 * @param pSSM SSM operationhandle.3592 * @param pSSM The saved state handle. 3476 3593 * @param i128 Item to save. 3477 3594 */ … … 3488 3605 * 3489 3606 * @returns VBox status. 3490 * @param pSSM SSM operationhandle.3607 * @param pSSM The saved state handle. 3491 3608 * @param u Item to save. 3492 3609 */ … … 3503 3620 * 3504 3621 * @returns VBox status. 3505 * @param pSSM SSM operationhandle.3622 * @param pSSM The saved state handle. 3506 3623 * @param i Item to save. 3507 3624 */ … … 3518 3635 * 3519 3636 * @returns VBox status. 3520 * @param pSSM SSM operationhandle.3637 * @param pSSM The saved state handle. 3521 3638 * @param u Item to save. 3522 3639 * … … 3535 3652 * 3536 3653 * @returns VBox status. 3537 * @param pSSM SSM operationhandle.3654 * @param pSSM The saved state handle. 3538 3655 * @param u Item to save. 3539 3656 */ … … 3550 3667 * 3551 3668 * @returns VBox status. 3552 * @param pSSM SSM operationhandle.3669 * @param pSSM The saved state handle. 3553 3670 * @param GCPhys The item to save 3554 3671 */ … … 3565 3682 * 3566 3683 * @returns VBox status. 3567 * @param pSSM SSM operationhandle.3684 * @param pSSM The saved state handle. 3568 3685 * @param GCPhys The item to save 3569 3686 */ … … 3580 3697 * 3581 3698 * @returns VBox status. 3582 * @param pSSM SSM operationhandle.3699 * @param pSSM The saved state handle. 3583 3700 * @param GCPhys The item to save 3584 3701 */ … … 3595 3712 * 3596 3713 * @returns VBox status. 3597 * @param pSSM SSM operationhandle.3714 * @param pSSM The saved state handle. 3598 3715 * @param GCPtr The item to save. 3599 3716 */ … … 3610 3727 * 3611 3728 * @returns VBox status. 3612 * @param pSSM SSM operationhandle.3729 * @param pSSM The saved state handle. 3613 3730 * @param RCPtr The item to save. 3614 3731 */ … … 3625 3742 * 3626 3743 * @returns VBox status. 3627 * @param pSSM SSM operationhandle.3744 * @param pSSM The saved state handle. 3628 3745 * @param GCPtr The item to save. 3629 3746 */ … … 3640 3757 * 3641 3758 * @returns VBox status. 3642 * @param pSSM SSM operationhandle.3759 * @param pSSM The saved state handle. 3643 3760 * @param IOPort The item to save. 3644 3761 */ … … 3655 3772 * 3656 3773 * @returns VBox status. 3657 * @param pSSM SSM operationhandle.3774 * @param pSSM The saved state handle. 3658 3775 * @param Sel The item to save. 3659 3776 */ … … 3670 3787 * 3671 3788 * @returns VBox status. 3672 * @param pSSM SSM operationhandle.3789 * @param pSSM The saved state handle. 3673 3790 * @param pv Item to save. 3674 3791 * @param cb Size of the item. … … 3686 3803 * 3687 3804 * @returns VBox status. 3688 * @param pSSM SSM operationhandle.3805 * @param pSSM The saved state handle. 3689 3806 * @param psz Item to save. 3690 3807 */ … … 4931 5048 * 4932 5049 * @returns pSSM->rc. 4933 * @param pSSM SSM operationhandle.5050 * @param pSSM The saved state handle. 4934 5051 */ 4935 5052 static int ssmR3DataReadFinishV1(PSSMHANDLE pSSM) … … 4985 5102 * Internal read worker for reading data from a version 1 unit. 4986 5103 * 4987 * @param pSSM SSM operationhandle.5104 * @param pSSM The saved state handle. 4988 5105 * @param pvBuf Where to store the read data. 4989 5106 * @param cbBuf Number of bytes to read. … … 5021 5138 * pSSM->rc will be set on error. 5022 5139 * 5023 * @param pSSM SSM operationhandle.5140 * @param pSSM The saved state handle. 5024 5141 */ 5025 5142 static void ssmR3DataReadBeginV2(PSSMHANDLE pSSM) … … 5043 5160 * 5044 5161 * @returns pSSM->rc. 5045 * @param pSSM SSM operationhandle.5162 * @param pSSM The saved state handle. 5046 5163 */ 5047 5164 static int ssmR3DataReadFinishV2(PSSMHANDLE pSSM) … … 5375 5492 * Buffer miss, do an unbuffered read. 5376 5493 * 5377 * @param pSSM SSM operationhandle.5494 * @param pSSM The saved state handle. 5378 5495 * @param pvBuf Where to store the read data. 5379 5496 * @param cbBuf Number of bytes to read. … … 5492 5609 * Buffer miss, do a buffered read. 5493 5610 * 5494 * @param pSSM SSM operationhandle.5611 * @param pSSM The saved state handle. 5495 5612 * @param pvBuf Where to store the read data. 5496 5613 * @param cbBuf Number of bytes to read. … … 5599 5716 * Inlined worker that handles format checks and buffered reads. 5600 5717 * 5601 * @param pSSM SSM operationhandle.5718 * @param pSSM The saved state handle. 5602 5719 * @param pvBuf Where to store the read data. 5603 5720 * @param cbBuf Number of bytes to read. … … 5673 5790 5674 5791 case SSMFIELDTRANS_GCPTR: 5675 AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x \n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);5792 AssertMsgReturn(pCur->cb == sizeof(RTGCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5676 5793 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 5677 5794 break; 5678 5795 5679 5796 case SSMFIELDTRANS_GCPHYS: 5680 AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x \n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);5797 AssertMsgReturn(pCur->cb == sizeof(RTGCPHYS), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5681 5798 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 5682 5799 break; 5800 5801 case SSMFIELDTRANS_RCPTR: 5802 AssertMsgReturn(pCur->cb == sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5803 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 5804 break; 5805 5806 case SSMFIELDTRANS_RCPTR_ARRAY: 5807 { 5808 uint32_t const cEntries = pCur->cb / sizeof(RTRCPTR); 5809 AssertMsgReturn(pCur->cb == cEntries * sizeof(RTRCPTR), ("%#x (%s)\n", pCur->cb, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5810 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 5811 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 5812 break; 5813 } 5683 5814 5684 5815 default: … … 5694 5825 return rc; 5695 5826 AssertMsgReturn(u32Magic == SSMR3STRUCT_END, ("u32Magic=%#RX32\n", u32Magic), VERR_SSM_STRUCTURE_MAGIC); 5827 return rc; 5828 } 5829 5830 5831 /** 5832 * SSMR3GetStructEx helper that gets a HCPTR that is used as a NULL indicator. 5833 * 5834 * @returns VBox status code. 5835 * 5836 * @param pSSM The saved state handle. 5837 * @param ppv Where to return the value (0/1). 5838 * @param fFlags SSMSTRUCT_FLAGS_XXX. 5839 */ 5840 DECLINLINE(int) ssmR3GetHCPtrNI(PSSMHANDLE pSSM, void **ppv, uint32_t fFlags) 5841 { 5842 int rc; 5843 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 5844 { 5845 if (ssmR3GetHostBits(pSSM) == 64) 5846 { 5847 uint64_t u; 5848 rc = ssmR3DataRead(pSSM, &u, sizeof(u)); 5849 if (RT_SUCCESS(rc)) 5850 *ppv = (void *)(u ? 1 : 0); 5851 } 5852 else 5853 { 5854 uint32_t u; 5855 rc = ssmR3DataRead(pSSM, &u, sizeof(u)); 5856 if (RT_SUCCESS(rc)) 5857 *ppv = (void *)(u ? 1 : 0); 5858 } 5859 } 5860 else 5861 { 5862 bool f; 5863 rc = SSMR3GetBool(pSSM, &f); 5864 if (RT_SUCCESS(rc)) 5865 *ppv = (void *)(f ? 1 : 0); 5866 } 5696 5867 return rc; 5697 5868 } … … 5745 5916 pCur++) 5746 5917 { 5747 AssertMsgReturn( pCur->cb <= cbStruct 5748 && pCur->off + pCur->cb <= cbStruct 5749 && pCur->off + pCur->cb > pCur->off, 5750 ("off=%#x cb=%#x cbStruct=%#x\n", pCur->cb, pCur->off, cbStruct), 5918 uint32_t const offField = !SSMFIELDTRANS_IS_PADDING(pCur->pfnGetPutOrTransformer) || pCur->off != UINT32_MAX / 2 5919 ? pCur->off 5920 : off; 5921 uint32_t const cbField = !SSMFIELDTRANS_IS_PADDING(pCur->pfnGetPutOrTransformer) 5922 ? pCur->cb 5923 : RT_HIWORD(pCur->cb); 5924 AssertMsgReturn( cbField <= cbStruct 5925 && offField + cbField <= cbStruct 5926 && offField + cbField >= offField, 5927 ("off=%#x cb=%#x cbStruct=%#x (%s)\n", cbField, offField, cbStruct, pCur->pszName), 5751 5928 VERR_SSM_FIELD_OUT_OF_BOUNDS); 5752 5929 AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT) 5753 || off == pCur->off,5754 ("off=%#x pCur->off=%#x\n", off, pCur->off),5930 || off == offField, 5931 ("off=%#x offField=%#x (%s)\n", off, offField, pCur->pszName), 5755 5932 VERR_SSM_FIELD_NOT_CONSECUTIVE); 5756 5933 5757 uint8_t *pbField = (uint8_t *)pvStruct + pCur->off;5934 uint8_t *pbField = (uint8_t *)pvStruct + offField; 5758 5935 switch ((uintptr_t)pCur->pfnGetPutOrTransformer) 5759 5936 { 5760 5937 case SSMFIELDTRANS_NO_TRANSFORMATION: 5761 rc = ssmR3DataRead(pSSM, pbField, pCur->cb);5938 rc = ssmR3DataRead(pSSM, pbField, cbField); 5762 5939 break; 5763 5940 5764 5941 case SSMFIELDTRANS_GCPTR: 5765 AssertMsgReturn( pCur->cb == sizeof(RTGCPTR), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);5942 AssertMsgReturn(cbField == sizeof(RTGCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5766 5943 rc = SSMR3GetGCPtr(pSSM, (PRTGCPTR)pbField); 5767 5944 break; 5768 5945 5769 5946 case SSMFIELDTRANS_GCPHYS: 5770 AssertMsgReturn( pCur->cb == sizeof(RTGCPHYS), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);5947 AssertMsgReturn(cbField == sizeof(RTGCPHYS), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5771 5948 rc = SSMR3GetGCPhys(pSSM, (PRTGCPHYS)pbField); 5772 5949 break; 5773 5950 5951 case SSMFIELDTRANS_RCPTR: 5952 AssertMsgReturn(cbField == sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5953 rc = SSMR3GetRCPtr(pSSM, (PRTRCPTR)pbField); 5954 break; 5955 5956 case SSMFIELDTRANS_RCPTR_ARRAY: 5957 { 5958 uint32_t const cEntries = cbField / sizeof(RTRCPTR); 5959 AssertMsgReturn(cbField == cEntries * sizeof(RTRCPTR), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5960 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 5961 rc = SSMR3GetRCPtr(pSSM, &((PRTRCPTR)pbField)[i]); 5962 break; 5963 } 5964 5965 case SSMFIELDTRANS_HCPTR_NI: 5966 AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5967 rc = ssmR3GetHCPtrNI(pSSM, (void **)pbField, fFlags); 5968 break; 5969 5970 case SSMFIELDTRANS_HCPTR_NI_ARRAY: 5971 { 5972 uint32_t const cEntries = cbField / sizeof(void *); 5973 AssertMsgReturn(cbField == cEntries * sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5974 for (uint32_t i = 0; i < cEntries && RT_SUCCESS(rc); i++) 5975 rc = ssmR3GetHCPtrNI(pSSM, &((void **)pbField)[i], fFlags); 5976 break; 5977 } 5978 5774 5979 case SSMFIELDTRANS_HCPTR: 5775 AssertMsgReturn( pCur->cb == sizeof(void *), ("%#x\n", pCur->cb), VERR_SSM_FIELD_INVALID_SIZE);5980 AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE); 5776 5981 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 5777 rc = SSMR3Skip(pSSM, pSSM->u.Read.cHostBits/ 8);5982 rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8); 5778 5983 break; 5779 5984 5780 5985 case SSMFIELDTRANS_IGNORE: 5781 5986 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 5782 rc = SSMR3Skip(pSSM, pCur->cb);5987 rc = SSMR3Skip(pSSM, cbField); 5783 5988 break; 5989 5990 case SSMFIELDTRANS_PAD_HC: 5991 case SSMFIELDTRANS_PAD_HC32: 5992 case SSMFIELDTRANS_PAD_HC64: 5993 case SSMFIELDTRANS_PAD_HC_AUTO: 5994 { 5995 uint32_t cb32 = RT_BYTE1(pCur->cb); 5996 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; 5999 AssertMsgReturn( cbField == cbCtx 6000 && ( ( pCur->off == UINT32_MAX / 2 6001 && ( 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), 6006 VERR_SSM_FIELD_INVALID_PADDING_SIZE); 6007 if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) 6008 rc = SSMR3Skip(pSSM, cbSaved); 6009 break; 6010 } 5784 6011 5785 6012 default: … … 5791 6018 return rc; 5792 6019 5793 off = pCur->off + pCur->cb;6020 off = offField + cbField; 5794 6021 } 5795 6022 AssertMsgReturn( !(fFlags & SSMSTRUCT_FLAGS_FULL_STRUCT) … … 5817 6044 * 5818 6045 * @returns VBox status. 5819 * @param pSSM SSM operationhandle.6046 * @param pSSM The saved state handle. 5820 6047 * @param pfBool Where to store the item. 5821 6048 */ … … 5839 6066 * 5840 6067 * @returns VBox status. 5841 * @param pSSM SSM operationhandle.6068 * @param pSSM The saved state handle. 5842 6069 * @param pu8 Where to store the item. 5843 6070 */ … … 5854 6081 * 5855 6082 * @returns VBox status. 5856 * @param pSSM SSM operationhandle.6083 * @param pSSM The saved state handle. 5857 6084 * @param pi8 Where to store the item. 5858 6085 */ … … 5869 6096 * 5870 6097 * @returns VBox status. 5871 * @param pSSM SSM operationhandle.6098 * @param pSSM The saved state handle. 5872 6099 * @param pu16 Where to store the item. 5873 6100 */ … … 5884 6111 * 5885 6112 * @returns VBox status. 5886 * @param pSSM SSM operationhandle.6113 * @param pSSM The saved state handle. 5887 6114 * @param pi16 Where to store the item. 5888 6115 */ … … 5899 6126 * 5900 6127 * @returns VBox status. 5901 * @param pSSM SSM operationhandle.6128 * @param pSSM The saved state handle. 5902 6129 * @param pu32 Where to store the item. 5903 6130 */ … … 5914 6141 * 5915 6142 * @returns VBox status. 5916 * @param pSSM SSM operationhandle.6143 * @param pSSM The saved state handle. 5917 6144 * @param pi32 Where to store the item. 5918 6145 */ … … 5929 6156 * 5930 6157 * @returns VBox status. 5931 * @param pSSM SSM operationhandle.6158 * @param pSSM The saved state handle. 5932 6159 * @param pu64 Where to store the item. 5933 6160 */ … … 5944 6171 * 5945 6172 * @returns VBox status. 5946 * @param pSSM SSM operationhandle.6173 * @param pSSM The saved state handle. 5947 6174 * @param pi64 Where to store the item. 5948 6175 */ … … 5959 6186 * 5960 6187 * @returns VBox status. 5961 * @param pSSM SSM operationhandle.6188 * @param pSSM The saved state handle. 5962 6189 * @param pu128 Where to store the item. 5963 6190 */ … … 5974 6201 * 5975 6202 * @returns VBox status. 5976 * @param pSSM SSM operationhandle.6203 * @param pSSM The saved state handle. 5977 6204 * @param pi128 Where to store the item. 5978 6205 */ … … 5989 6216 * 5990 6217 * @returns VBox status. 5991 * @param pSSM SSM operationhandle.6218 * @param pSSM The saved state handle. 5992 6219 * @param pu Where to store the integer. 5993 6220 */ … … 6004 6231 * 6005 6232 * @returns VBox status. 6006 * @param pSSM SSM operationhandle.6233 * @param pSSM The saved state handle. 6007 6234 * @param pi Where to store the integer. 6008 6235 */ … … 6019 6246 * 6020 6247 * @returns VBox status. 6021 * @param pSSM SSM operationhandle.6248 * @param pSSM The saved state handle. 6022 6249 * @param pu Where to store the integer. 6023 6250 * … … 6035 6262 * 6036 6263 * @returns VBox status. 6037 * @param pSSM SSM operationhandle.6264 * @param pSSM The saved state handle. 6038 6265 * @param pu Where to store the integer. 6039 6266 */ … … 6049 6276 * 6050 6277 * @returns VBox status. 6051 * @param pSSM SSM operationhandle.6278 * @param pSSM The saved state handle. 6052 6279 * @param pGCPhys Where to store the GC physical address. 6053 6280 */ … … 6064 6291 * 6065 6292 * @returns VBox status. 6066 * @param pSSM SSM operationhandle.6293 * @param pSSM The saved state handle. 6067 6294 * @param pGCPhys Where to store the GC physical address. 6068 6295 */ … … 6079 6306 * 6080 6307 * @returns VBox status. 6081 * @param pSSM SSM operationhandle.6308 * @param pSSM The saved state handle. 6082 6309 * @param pGCPhys Where to store the GC physical address. 6083 6310 */ … … 6129 6356 * 6130 6357 * @returns VBox status. 6131 * @param pSSM SSM operationhandle.6358 * @param pSSM The saved state handle. 6132 6359 * @param cbGCPtr Size of RTGCPTR 6133 6360 * … … 6157 6384 * 6158 6385 * @returns VBox status. 6159 * @param pSSM SSM operationhandle.6386 * @param pSSM The saved state handle. 6160 6387 * @param pGCPtr Where to store the GC virtual address. 6161 6388 */ … … 6199 6426 * 6200 6427 * @returns VBox status. 6201 * @param pSSM SSM operationhandle.6428 * @param pSSM The saved state handle. 6202 6429 * @param pGCPtr Where to store the GC virtual address. 6203 6430 */ … … 6213 6440 * 6214 6441 * @returns VBox status. 6215 * @param pSSM SSM operationhandle.6442 * @param pSSM The saved state handle. 6216 6443 * @param pRCPtr Where to store the RC virtual address. 6217 6444 */ … … 6228 6455 * 6229 6456 * @returns VBox status. 6230 * @param pSSM SSM operationhandle.6457 * @param pSSM The saved state handle. 6231 6458 * @param pIOPort Where to store the I/O port address. 6232 6459 */ … … 6243 6470 * 6244 6471 * @returns VBox status. 6245 * @param pSSM SSM operationhandle.6472 * @param pSSM The saved state handle. 6246 6473 * @param pSel Where to store the selector. 6247 6474 */ … … 6258 6485 * 6259 6486 * @returns VBox status. 6260 * @param pSSM SSM operationhandle.6487 * @param pSSM The saved state handle. 6261 6488 * @param pv Where to store the item. 6262 6489 * @param cb Size of the item. … … 6274 6501 * 6275 6502 * @returns VBox status. 6276 * @param pSSM SSM operationhandle.6503 * @param pSSM The saved state handle. 6277 6504 * @param psz Where to store the item. 6278 6505 * @param cbMax Max size of the item (including '\\0'). … … 6288 6515 * 6289 6516 * @returns VBox status. 6290 * @param pSSM SSM operationhandle.6517 * @param pSSM The saved state handle. 6291 6518 * @param psz Where to store the item. 6292 6519 * @param cbMax Max size of the item (including '\\0'). … … 7962 8189 * 7963 8190 * @returns SSMAFTER enum value. 7964 * @param pSSM SSM operationhandle.8191 * @param pSSM The saved state handle. 7965 8192 */ 7966 8193 VMMR3DECL(int) SSMR3HandleGetStatus(PSSMHANDLE pSSM) … … 7979 8206 * 7980 8207 * @returns VBox status code of the handle, or VERR_INVALID_PARAMETER. 7981 * @param pSSM SSM operationhandle.8208 * @param pSSM The saved state handle. 7982 8209 * @param iStatus Failure status code. This MUST be a VERR_*. 7983 8210 */ … … 8002 8229 * 8003 8230 * @returns SSMAFTER enum value. 8004 * @param pSSM SSM operationhandle.8231 * @param pSSM The saved state handle. 8005 8232 */ 8006 8233 VMMR3DECL(SSMAFTER) SSMR3HandleGetAfter(PSSMHANDLE pSSM) … … 8015 8242 * 8016 8243 * @returns True if it is, false if it isn't. 8017 * @param pSSM SSM operationhandle.8244 * @param pSSM The saved state handle. 8018 8245 */ 8019 8246 VMMR3DECL(bool) SSMR3HandleIsLiveSave(PSSMHANDLE pSSM) … … 8021 8248 SSM_ASSERT_VALID_HANDLE(pSSM); 8022 8249 return pSSM->fLiveSave; 8250 } 8251 8252 8253 /** 8254 * Gets the host bit count of a saved state. 8255 * 8256 * @returns 32 or 64. If pSSM is invalid, 0 is returned. 8257 * @param pSSM The saved state handle. 8258 */ 8259 VMMR3DECL(uint32_t) SSMR3HandleHostBits(PSSMHANDLE pSSM) 8260 { 8261 SSM_ASSERT_VALID_HANDLE(pSSM); 8262 return ssmR3GetHostBits(pSSM); 8023 8263 } 8024 8264
Note:
See TracChangeset
for help on using the changeset viewer.