VirtualBox

Changeset 41899 in vbox for trunk/src/VBox/VMM/VMMR3


Ignore:
Timestamp:
Jun 23, 2012 7:07:03 PM (13 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
78752
Message:

CPUM: Working over the saved state code to put/get structures using field descriptors instead of memory blobs. Found a bustage restoring the 1.6 state wrt hyper state not being subjected to the same restore procedure as the guest one... Probably very relevant since nobody complained.

Location:
trunk/src/VBox/VMM/VMMR3
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/VMM/VMMR3/CPUM.cpp

    r41803 r41899  
    3838#include <VBox/vmm/cpum.h>
    3939#include <VBox/vmm/cpumdis.h>
     40#include <VBox/vmm/cpumctx-v1_6.h>
    4041#include <VBox/vmm/pgm.h>
    4142#include <VBox/vmm/mm.h>
     
    6364*   Defined Constants And Macros                                               *
    6465*******************************************************************************/
     66#if 0 /* later when actual changes have been made */
    6567/** The current saved state version. */
    66 #define CPUM_SAVED_STATE_VERSION                13
     68#define CPUM_SAVED_STATE_VERSION                14
     69#else
     70# define CPUM_SAVED_STATE_VERSION               CPUM_SAVED_STATE_VERSION_MEM
     71#endif
     72/** The current saved state version before using SSMR3PutStruct. */
     73#define CPUM_SAVED_STATE_VERSION_MEM            13
    6774/** The saved state version before introducing the MSR size field. */
    6875#define CPUM_SAVED_STATE_VERSION_NO_MSR_SIZE    12
     
    114121static DECLCALLBACK(void) cpumR3InfoHost(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
    115122static DECLCALLBACK(void) cpumR3CpuIdInfo(PVM pVM, PCDBGFINFOHLP pHlp, const char *pszArgs);
     123
     124
     125/*******************************************************************************
     126*   Global Variables                                                           *
     127*******************************************************************************/
     128/** Saved state field descriptors for CPUMCTX. */
     129static const SSMFIELD g_aCpumCtxFields[] =
     130{
     131    SSMFIELD_ENTRY(         CPUMCTX, fpu.FCW),
     132    SSMFIELD_ENTRY(         CPUMCTX, fpu.FSW),
     133    SSMFIELD_ENTRY(         CPUMCTX, fpu.FTW),
     134    SSMFIELD_ENTRY(         CPUMCTX, fpu.FOP),
     135    SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUIP),
     136    SSMFIELD_ENTRY(         CPUMCTX, fpu.CS),
     137    SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd1),
     138    SSMFIELD_ENTRY(         CPUMCTX, fpu.FPUDP),
     139    SSMFIELD_ENTRY(         CPUMCTX, fpu.DS),
     140    SSMFIELD_ENTRY(         CPUMCTX, fpu.Rsrvd2),
     141    SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR),
     142    SSMFIELD_ENTRY(         CPUMCTX, fpu.MXCSR_MASK),
     143    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[0]),
     144    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[1]),
     145    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[2]),
     146    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[3]),
     147    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[4]),
     148    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[5]),
     149    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[6]),
     150    SSMFIELD_ENTRY(         CPUMCTX, fpu.aRegs[7]),
     151    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[0]),
     152    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[1]),
     153    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[2]),
     154    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[3]),
     155    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[4]),
     156    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[5]),
     157    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[6]),
     158    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[7]),
     159    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[8]),
     160    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[9]),
     161    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[10]),
     162    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[11]),
     163    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[12]),
     164    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[13]),
     165    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[14]),
     166    SSMFIELD_ENTRY(         CPUMCTX, fpu.aXMM[15]),
     167    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, fpu.au32RsrvdRest),
     168    SSMFIELD_ENTRY(         CPUMCTX, rdi),
     169    SSMFIELD_ENTRY(         CPUMCTX, rsi),
     170    SSMFIELD_ENTRY(         CPUMCTX, rbp),
     171    SSMFIELD_ENTRY(         CPUMCTX, rax),
     172    SSMFIELD_ENTRY(         CPUMCTX, rbx),
     173    SSMFIELD_ENTRY(         CPUMCTX, rdx),
     174    SSMFIELD_ENTRY(         CPUMCTX, rcx),
     175    SSMFIELD_ENTRY(         CPUMCTX, rsp),
     176    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, lss_esp),
     177    SSMFIELD_ENTRY(         CPUMCTX, ss),
     178    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, ssPadding),
     179    SSMFIELD_ENTRY(         CPUMCTX, gs),
     180    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, gsPadding),
     181    SSMFIELD_ENTRY(         CPUMCTX, fs),
     182    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, fsPadding),
     183    SSMFIELD_ENTRY(         CPUMCTX, es),
     184    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, esPadding),
     185    SSMFIELD_ENTRY(         CPUMCTX, ds),
     186    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, dsPadding),
     187    SSMFIELD_ENTRY(         CPUMCTX, cs),
     188    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, csPadding),
     189    SSMFIELD_ENTRY(         CPUMCTX, rflags),
     190    SSMFIELD_ENTRY(         CPUMCTX, rip),
     191    SSMFIELD_ENTRY(         CPUMCTX, r8),
     192    SSMFIELD_ENTRY(         CPUMCTX, r9),
     193    SSMFIELD_ENTRY(         CPUMCTX, r10),
     194    SSMFIELD_ENTRY(         CPUMCTX, r11),
     195    SSMFIELD_ENTRY(         CPUMCTX, r12),
     196    SSMFIELD_ENTRY(         CPUMCTX, r13),
     197    SSMFIELD_ENTRY(         CPUMCTX, r14),
     198    SSMFIELD_ENTRY(         CPUMCTX, r15),
     199    SSMFIELD_ENTRY(         CPUMCTX, esHid.u64Base),
     200    SSMFIELD_ENTRY(         CPUMCTX, esHid.u32Limit),
     201    SSMFIELD_ENTRY(         CPUMCTX, esHid.Attr),
     202    SSMFIELD_ENTRY(         CPUMCTX, csHid.u64Base),
     203    SSMFIELD_ENTRY(         CPUMCTX, csHid.u32Limit),
     204    SSMFIELD_ENTRY(         CPUMCTX, csHid.Attr),
     205    SSMFIELD_ENTRY(         CPUMCTX, ssHid.u64Base),
     206    SSMFIELD_ENTRY(         CPUMCTX, ssHid.u32Limit),
     207    SSMFIELD_ENTRY(         CPUMCTX, ssHid.Attr),
     208    SSMFIELD_ENTRY(         CPUMCTX, dsHid.u64Base),
     209    SSMFIELD_ENTRY(         CPUMCTX, dsHid.u32Limit),
     210    SSMFIELD_ENTRY(         CPUMCTX, dsHid.Attr),
     211    SSMFIELD_ENTRY(         CPUMCTX, fsHid.u64Base),
     212    SSMFIELD_ENTRY(         CPUMCTX, fsHid.u32Limit),
     213    SSMFIELD_ENTRY(         CPUMCTX, fsHid.Attr),
     214    SSMFIELD_ENTRY(         CPUMCTX, gsHid.u64Base),
     215    SSMFIELD_ENTRY(         CPUMCTX, gsHid.u32Limit),
     216    SSMFIELD_ENTRY(         CPUMCTX, gsHid.Attr),
     217    SSMFIELD_ENTRY(         CPUMCTX, cr0),
     218    SSMFIELD_ENTRY(         CPUMCTX, cr2),
     219    SSMFIELD_ENTRY(         CPUMCTX, cr3),
     220    SSMFIELD_ENTRY(         CPUMCTX, cr4),
     221    SSMFIELD_ENTRY(         CPUMCTX, dr[0]),
     222    SSMFIELD_ENTRY(         CPUMCTX, dr[1]),
     223    SSMFIELD_ENTRY(         CPUMCTX, dr[2]),
     224    SSMFIELD_ENTRY(         CPUMCTX, dr[3]),
     225    SSMFIELD_ENTRY(         CPUMCTX, dr[4]),
     226    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, dr[5]),
     227    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, dr[6]),
     228    SSMFIELD_ENTRY(         CPUMCTX, dr[7]),
     229    SSMFIELD_ENTRY(         CPUMCTX, gdtr.cbGdt),
     230    SSMFIELD_ENTRY(         CPUMCTX, gdtr.pGdt),
     231    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, gdtrPadding),
     232    SSMFIELD_ENTRY(         CPUMCTX, idtr.cbIdt),
     233    SSMFIELD_ENTRY(         CPUMCTX, idtr.pIdt),
     234    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, idtrPadding),
     235    SSMFIELD_ENTRY(         CPUMCTX, ldtr),
     236    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, ldtrPadding),
     237    SSMFIELD_ENTRY(         CPUMCTX, tr),
     238    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, trPadding),
     239    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, SysEnter.cs),
     240    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, SysEnter.eip),
     241    SSMFIELD_ENTRY_IGNORE(  CPUMCTX, SysEnter.esp),
     242    SSMFIELD_ENTRY(         CPUMCTX, msrEFER),
     243    SSMFIELD_ENTRY(         CPUMCTX, msrSTAR),
     244    SSMFIELD_ENTRY(         CPUMCTX, msrPAT),
     245    SSMFIELD_ENTRY(         CPUMCTX, msrLSTAR),
     246    SSMFIELD_ENTRY(         CPUMCTX, msrCSTAR),
     247    SSMFIELD_ENTRY(         CPUMCTX, msrSFMASK),
     248    SSMFIELD_ENTRY(         CPUMCTX, msrKERNELGSBASE),
     249    SSMFIELD_ENTRY(         CPUMCTX, ldtrHid.u64Base),
     250    SSMFIELD_ENTRY(         CPUMCTX, ldtrHid.u32Limit),
     251    SSMFIELD_ENTRY(         CPUMCTX, ldtrHid.Attr),
     252    SSMFIELD_ENTRY(         CPUMCTX, trHid.u64Base),
     253    SSMFIELD_ENTRY(         CPUMCTX, trHid.u32Limit),
     254    SSMFIELD_ENTRY(         CPUMCTX, trHid.Attr),
     255    SSMFIELD_ENTRY_TERM()
     256};
     257
     258/** Saved state field descriptors for CPUMCTX_VER1_6. */
     259static const SSMFIELD g_aCpumCtxFieldsV16[] =
     260{
     261    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FCW),
     262    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FSW),
     263    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FTW),
     264    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FOP),
     265    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FPUIP),
     266    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.CS),
     267    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.Rsrvd1),
     268    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.FPUDP),
     269    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.DS),
     270    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.Rsrvd2),
     271    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.MXCSR),
     272    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.MXCSR_MASK),
     273    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[0]),
     274    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[1]),
     275    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[2]),
     276    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[3]),
     277    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[4]),
     278    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[5]),
     279    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[6]),
     280    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aRegs[7]),
     281    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[0]),
     282    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[1]),
     283    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[2]),
     284    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[3]),
     285    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[4]),
     286    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[5]),
     287    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[6]),
     288    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[7]),
     289    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[8]),
     290    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[9]),
     291    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[10]),
     292    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[11]),
     293    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[12]),
     294    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[13]),
     295    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[14]),
     296    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fpu.aXMM[15]),
     297    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, fpu.au32RsrvdRest),
     298    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rdi),
     299    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rsi),
     300    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rbp),
     301    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rax),
     302    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rbx),
     303    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rdx),
     304    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rcx),
     305    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, esp),
     306    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ss),
     307    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, ssPadding),
     308    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, rsp_notused),
     309    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gs),
     310    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, gsPadding),
     311    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fs),
     312    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, fsPadding),
     313    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, es),
     314    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, esPadding),
     315    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ds),
     316    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, dsPadding),
     317    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cs),
     318    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, csPadding),
     319    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rflags),
     320    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, rip),
     321    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r8),
     322    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r9),
     323    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r10),
     324    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r11),
     325    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r12),
     326    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r13),
     327    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r14),
     328    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, r15),
     329    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, esHid.u32Base),
     330    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, esHid.u32Limit),
     331    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, esHid.Attr),
     332    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, csHid.u32Base),
     333    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, csHid.u32Limit),
     334    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, csHid.Attr),
     335    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ssHid.u32Base),
     336    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ssHid.u32Limit),
     337    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ssHid.Attr),
     338    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dsHid.u32Base),
     339    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dsHid.u32Limit),
     340    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dsHid.Attr),
     341    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fsHid.u32Base),
     342    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fsHid.u32Limit),
     343    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, fsHid.Attr),
     344    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gsHid.u32Base),
     345    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gsHid.u32Limit),
     346    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gsHid.Attr),
     347    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cr0),
     348    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cr2),
     349    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cr3),
     350    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cr4),
     351    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, cr8),
     352    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr0),
     353    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr1),
     354    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr2),
     355    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr3),
     356    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr4),
     357    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, dr5),
     358    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, dr6),
     359    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, dr7),
     360    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gdtr.cbGdt),
     361    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, gdtr.pGdt),
     362    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, gdtrPadding),
     363    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, gdtrPadding64),
     364    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, idtr.cbIdt),
     365    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, idtr.pIdt),
     366    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, idtrPadding),
     367    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, idtrPadding64),
     368    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ldtr),
     369    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, ldtrPadding),
     370    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, tr),
     371    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, trPadding),
     372    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, SysEnter.cs),
     373    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, SysEnter.eip),
     374    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, SysEnter.esp),
     375    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrEFER),
     376    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrSTAR),
     377    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrPAT),
     378    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrLSTAR),
     379    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrCSTAR),
     380    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrSFMASK),
     381    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrFSBASE),
     382    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrGSBASE),
     383    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, msrKERNELGSBASE),
     384    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ldtrHid.u32Base),
     385    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ldtrHid.u32Limit),
     386    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, ldtrHid.Attr),
     387    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, trHid.u32Base),
     388    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, trHid.u32Limit),
     389    SSMFIELD_ENTRY(         CPUMCTX_VER1_6, trHid.Attr),
     390    SSMFIELD_ENTRY_IGNORE(  CPUMCTX_VER1_6, padding),
     391    SSMFIELD_ENTRY_TERM()
     392};
    116393
    117394
     
    19482225    {
    19492226        PVMCPU pVCpu = &pVM->aCpus[i];
    1950 
    1951         SSMR3PutMem(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper));
     2227        SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper), SSMSTRUCT_FLAGS_MEM_BAND_AID,
     2228                         g_aCpumCtxFields, NULL);
    19522229    }
    19532230
     
    19582235        PVMCPU pVCpu = &pVM->aCpus[i];
    19592236
    1960         SSMR3PutMem(pSSM, &pVCpu->cpum.s.Guest, sizeof(pVCpu->cpum.s.Guest));
     2237        SSMR3PutStructEx(pSSM, &pVCpu->cpum.s.Guest, sizeof(pVCpu->cpum.s.Guest), SSMSTRUCT_FLAGS_MEM_BAND_AID,
     2238                         g_aCpumCtxFields, NULL);
    19612239        SSMR3PutU32(pSSM, pVCpu->cpum.s.fUseFlags);
    19622240        SSMR3PutU32(pSSM, pVCpu->cpum.s.fChanged);
     
    20852363     */
    20862364    if (    uVersion != CPUM_SAVED_STATE_VERSION
     2365        &&  uVersion != CPUM_SAVED_STATE_VERSION_MEM
    20872366        &&  uVersion != CPUM_SAVED_STATE_VERSION_NO_MSR_SIZE
    20882367        &&  uVersion != CPUM_SAVED_STATE_VERSION_VER3_2
     
    21072386            SSMR3HandleSetGCPtrSize(pSSM, HC_ARCH_BITS == 32 ? sizeof(RTGCPTR32) : sizeof(RTGCPTR));
    21082387
     2388        PCSSMFIELD  paCpumCtxFields = g_aCpumCtxFields;
     2389        if (uVersion == CPUM_SAVED_STATE_VERSION_VER1_6)
     2390            paCpumCtxFields = g_aCpumCtxFieldsV16;
     2391        uint32_t    fLoad   = 0;
     2392        if (uVersion <= CPUM_SAVED_STATE_VERSION_MEM)
     2393            fLoad = SSMSTRUCT_FLAGS_MEM_BAND_AID;
     2394
    21092395        /*
    21102396         * Restore.
     
    21132399        {
    21142400            PVMCPU   pVCpu = &pVM->aCpus[i];
    2115             uint32_t uCR3  = pVCpu->cpum.s.Hyper.cr3;
    2116             uint32_t uESP  = pVCpu->cpum.s.Hyper.esp; /* see VMMR3Relocate(). */
    2117 
    2118             SSMR3GetMem(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper));
     2401            uint64_t uCR3  = pVCpu->cpum.s.Hyper.cr3;
     2402            uint64_t uRSP  = pVCpu->cpum.s.Hyper.rsp; /* see VMMR3Relocate(). */
     2403            SSMR3GetStructEx(pSSM, &pVCpu->cpum.s.Hyper, sizeof(pVCpu->cpum.s.Hyper), fLoad, paCpumCtxFields, NULL);
    21192404            pVCpu->cpum.s.Hyper.cr3 = uCR3;
    2120             pVCpu->cpum.s.Hyper.esp = uESP;
     2405            pVCpu->cpum.s.Hyper.rsp = uRSP;
    21212406        }
    21222407
     
    21252410            CPUMCTX_VER1_6 cpumctx16;
    21262411            memset(&pVM->aCpus[0].cpum.s.Guest, 0, sizeof(pVM->aCpus[0].cpum.s.Guest));
    2127             SSMR3GetMem(pSSM, &cpumctx16, sizeof(cpumctx16));
     2412            SSMR3GetStructEx(pSSM, &cpumctx16, sizeof(cpumctx16), fLoad,
     2413                             paCpumCtxFields, NULL);
    21282414
    21292415            /* Save the old cpumctx state into the new one. */
     
    21422428                                      VERR_SSM_UNEXPECTED_DATA);
    21432429            }
    2144             AssertLogRelMsgReturn(   uVersion != CPUM_SAVED_STATE_VERSION_VER2_0
     2430            AssertLogRelMsgReturn(   uVersion > CPUM_SAVED_STATE_VERSION_VER2_0
    21452431                                  || pVM->cCpus == 1,
    21462432                                  ("cCpus=%u\n", pVM->cCpus),
     
    21592445            for (VMCPUID i = 0; i < pVM->cCpus; i++)
    21602446            {
    2161                 SSMR3GetMem(pSSM, &pVM->aCpus[i].cpum.s.Guest, sizeof(pVM->aCpus[i].cpum.s.Guest));
     2447                SSMR3GetStructEx(pSSM, &pVM->aCpus[i].cpum.s.Guest, sizeof(pVM->aCpus[i].cpum.s.Guest), fLoad,
     2448                                 paCpumCtxFields, NULL);
    21622449                SSMR3GetU32(pSSM, &pVM->aCpus[i].cpum.s.fUseFlags);
    21632450                SSMR3GetU32(pSSM, &pVM->aCpus[i].cpum.s.fChanged);
  • trunk/src/VBox/VMM/VMMR3/PATMSSM.cpp

    r41800 r41899  
    2424#include <VBox/vmm/patm.h>
    2525#include <VBox/vmm/cpum.h>
     26#include <VBox/vmm/cpumctx-v1_6.h>
    2627#include <VBox/vmm/mm.h>
    2728#include <VBox/vmm/ssm.h>
     
    4950 * to avoid changing the saved state version for now (will come later).
    5051 */
    51 typedef struct _PATCHINFOSSM
     52typedef struct PATCHINFOSSM
    5253{
    5354    uint32_t              uState;
Note: See TracChangeset for help on using the changeset viewer.

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