VirtualBox

Changeset 23783 in vbox


Ignore:
Timestamp:
Oct 14, 2009 11:21:29 PM (15 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
53521
Message:

SSM: Added _HCPTR_HACK_U32 to deal with two PATM fields.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/err.h

    r23764 r23783  
    611611/** The field contains an invalid padding size. */
    612612#define VERR_SSM_FIELD_INVALID_PADDING_SIZE     (-1869)
     613/** The field contains a value that is out of range. */
     614#define VERR_SSM_FIELD_INVALID_VALUE            (-1870)
    613615/** @} */
    614616
  • trunk/include/VBox/ssm.h

    r23780 r23783  
    147147    /** Array of SSMFIELDTRANS_HCPTR_NI. */
    148148    SSMFIELDTRANS_HCPTR_NI_ARRAY,
     149    /** Host context (HC) virtual address used to hold a unsigned 32-bit value. */
     150    SSMFIELDTRANS_HCPTR_HACK_U32,
    149151
    150152    /** Ignorable field. See SSMFIELD_ENTRY_IGNORE. */
     
    250252/** Same as SSMFIELD_ENTRY_HCPTR_NI, except it's an array of the buggers. */
    251253#define SSMFIELD_ENTRY_HCPTR_NI_ARRAY(Type, Field)  SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR_NI_ARRAY)
     254/** Emit a SSMFIELD array entry for a ring-0 or ring-3 pointer type that has
     255 * been hacked such that it will never exceed 32-bit.  No sign extenending. */
     256#define SSMFIELD_ENTRY_HCPTR_HACK_U32(Type, Field)  SSMFIELD_ENTRY_INT(Type, Field, SSMFIELDTRANS_HCPTR_HACK_U32)
    252257
    253258/** Emit a SSMFIELD array entry for a field that can be ignored.
  • trunk/src/VBox/VMM/SSM.cpp

    r23780 r23783  
    34043404            }
    34053405
     3406            case SSMFIELDTRANS_HCPTR_HACK_U32:
     3407                AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
     3408                AssertMsgReturn(*(uintptr_t *)pbField <= UINT32_MAX, ("%p (%s)\n", *(uintptr_t *)pbField, pCur->pszName), VERR_SSM_FIELD_INVALID_VALUE);
     3409                rc = ssmR3DataWrite(pSSM, pbField, sizeof(uint32_t));
     3410                if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && sizeof(void *) != sizeof(uint32_t))
     3411                    rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(uint32_t));
     3412                break;
     3413
     3414
    34063415            case SSMFIELDTRANS_IGNORE:
    34073416                if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
     
    34393448                    rc = ssmR3DataWrite(pSSM, s_abZero, sizeof(void *));
    34403449                break;
     3450
    34413451
    34423452            case SSMFIELDTRANS_PAD_HC:
     
    60546064            }
    60556065
     6066            case SSMFIELDTRANS_HCPTR_HACK_U32:
     6067                AssertMsgReturn(cbField == sizeof(void *), ("%#x (%s)\n", cbField, pCur->pszName), VERR_SSM_FIELD_INVALID_SIZE);
     6068                *(uintptr_t *)pbField = 0;
     6069                rc = ssmR3DataRead(pSSM, pbField, sizeof(uint32_t));
     6070                if ((fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE) && ssmR3GetHostBits(pSSM) == 64)
     6071                {
     6072                    uint32_t u32;
     6073                    rc = ssmR3DataRead(pSSM, &u32, sizeof(uint32_t));
     6074                    AssertMsgReturn(u32 == 0 || RT_FAILURE(rc), ("%#x\n", u32), VERR_SSM_FIELD_INVALID_VALUE);
     6075                }
     6076                break;
     6077
     6078
    60566079            case SSMFIELDTRANS_IGNORE:
    60576080                if (fFlags & SSMSTRUCT_FLAGS_DONT_IGNORE)
     
    60826105                    rc = SSMR3Skip(pSSM, ssmR3GetHostBits(pSSM) / 8);
    60836106                break;
     6107
    60846108
    60856109            case SSMFIELDTRANS_PAD_HC:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette