1b6a0aa05SPeter Maydell #include "qemu/osdep.h" 233c11879SPaolo Bonzini #include "cpu.h" 363c91552SPaolo Bonzini #include "exec/exec-all.h" 48dd3dca3Saurel32 #include "hw/hw.h" 58dd3dca3Saurel32 #include "hw/boards.h" 60d09e41aSPaolo Bonzini #include "hw/i386/pc.h" 70d09e41aSPaolo Bonzini #include "hw/isa/isa.h" 81e00b8d5SPaolo Bonzini #include "migration/cpu.h" 9606c34bfSRoman Kagan #include "hyperv.h" 108dd3dca3Saurel32 119c17d615SPaolo Bonzini #include "sysemu/kvm.h" 1214a48c1dSMarkus Armbruster #include "sysemu/tcg.h" 138dd3dca3Saurel32 1436f96c4bSHaozhong Zhang #include "qemu/error-report.h" 1536f96c4bSHaozhong Zhang 1666e6d55bSJuan Quintela static const VMStateDescription vmstate_segment = { 1766e6d55bSJuan Quintela .name = "segment", 1866e6d55bSJuan Quintela .version_id = 1, 1966e6d55bSJuan Quintela .minimum_version_id = 1, 2066e6d55bSJuan Quintela .fields = (VMStateField[]) { 2166e6d55bSJuan Quintela VMSTATE_UINT32(selector, SegmentCache), 2266e6d55bSJuan Quintela VMSTATE_UINTTL(base, SegmentCache), 2366e6d55bSJuan Quintela VMSTATE_UINT32(limit, SegmentCache), 2466e6d55bSJuan Quintela VMSTATE_UINT32(flags, SegmentCache), 2566e6d55bSJuan Quintela VMSTATE_END_OF_LIST() 2666e6d55bSJuan Quintela } 2766e6d55bSJuan Quintela }; 2866e6d55bSJuan Quintela 290cb892aaSJuan Quintela #define VMSTATE_SEGMENT(_field, _state) { \ 300cb892aaSJuan Quintela .name = (stringify(_field)), \ 310cb892aaSJuan Quintela .size = sizeof(SegmentCache), \ 320cb892aaSJuan Quintela .vmsd = &vmstate_segment, \ 330cb892aaSJuan Quintela .flags = VMS_STRUCT, \ 340cb892aaSJuan Quintela .offset = offsetof(_state, _field) \ 350cb892aaSJuan Quintela + type_check(SegmentCache,typeof_field(_state, _field)) \ 368dd3dca3Saurel32 } 378dd3dca3Saurel32 380cb892aaSJuan Quintela #define VMSTATE_SEGMENT_ARRAY(_field, _state, _n) \ 390cb892aaSJuan Quintela VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_segment, SegmentCache) 408dd3dca3Saurel32 41fc3b0aa2SJuan Quintela static const VMStateDescription vmstate_xmm_reg = { 42fc3b0aa2SJuan Quintela .name = "xmm_reg", 43fc3b0aa2SJuan Quintela .version_id = 1, 44fc3b0aa2SJuan Quintela .minimum_version_id = 1, 45fc3b0aa2SJuan Quintela .fields = (VMStateField[]) { 4619cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(0), ZMMReg), 4719cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(1), ZMMReg), 48fc3b0aa2SJuan Quintela VMSTATE_END_OF_LIST() 49fc3b0aa2SJuan Quintela } 50fc3b0aa2SJuan Quintela }; 51fc3b0aa2SJuan Quintela 52a03c3e90SPaolo Bonzini #define VMSTATE_XMM_REGS(_field, _state, _start) \ 53a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 54fa451874SEduardo Habkost vmstate_xmm_reg, ZMMReg) 55fc3b0aa2SJuan Quintela 56b7711471SPaolo Bonzini /* YMMH format is the same as XMM, but for bits 128-255 */ 57f1665b21SSheng Yang static const VMStateDescription vmstate_ymmh_reg = { 58f1665b21SSheng Yang .name = "ymmh_reg", 59f1665b21SSheng Yang .version_id = 1, 60f1665b21SSheng Yang .minimum_version_id = 1, 61f1665b21SSheng Yang .fields = (VMStateField[]) { 6219cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(2), ZMMReg), 6319cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(3), ZMMReg), 64f1665b21SSheng Yang VMSTATE_END_OF_LIST() 65f1665b21SSheng Yang } 66f1665b21SSheng Yang }; 67f1665b21SSheng Yang 68a03c3e90SPaolo Bonzini #define VMSTATE_YMMH_REGS_VARS(_field, _state, _start, _v) \ 69a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, _v, \ 70fa451874SEduardo Habkost vmstate_ymmh_reg, ZMMReg) 71f1665b21SSheng Yang 729aecd6f8SChao Peng static const VMStateDescription vmstate_zmmh_reg = { 739aecd6f8SChao Peng .name = "zmmh_reg", 749aecd6f8SChao Peng .version_id = 1, 759aecd6f8SChao Peng .minimum_version_id = 1, 769aecd6f8SChao Peng .fields = (VMStateField[]) { 7719cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(4), ZMMReg), 7819cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(5), ZMMReg), 7919cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(6), ZMMReg), 8019cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(7), ZMMReg), 819aecd6f8SChao Peng VMSTATE_END_OF_LIST() 829aecd6f8SChao Peng } 839aecd6f8SChao Peng }; 849aecd6f8SChao Peng 85a03c3e90SPaolo Bonzini #define VMSTATE_ZMMH_REGS_VARS(_field, _state, _start) \ 86a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 87fa451874SEduardo Habkost vmstate_zmmh_reg, ZMMReg) 889aecd6f8SChao Peng 899aecd6f8SChao Peng #ifdef TARGET_X86_64 909aecd6f8SChao Peng static const VMStateDescription vmstate_hi16_zmm_reg = { 919aecd6f8SChao Peng .name = "hi16_zmm_reg", 929aecd6f8SChao Peng .version_id = 1, 939aecd6f8SChao Peng .minimum_version_id = 1, 949aecd6f8SChao Peng .fields = (VMStateField[]) { 9519cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(0), ZMMReg), 9619cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(1), ZMMReg), 9719cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(2), ZMMReg), 9819cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(3), ZMMReg), 9919cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(4), ZMMReg), 10019cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(5), ZMMReg), 10119cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(6), ZMMReg), 10219cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(7), ZMMReg), 1039aecd6f8SChao Peng VMSTATE_END_OF_LIST() 1049aecd6f8SChao Peng } 1059aecd6f8SChao Peng }; 1069aecd6f8SChao Peng 107a03c3e90SPaolo Bonzini #define VMSTATE_Hi16_ZMM_REGS_VARS(_field, _state, _start) \ 108a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 109fa451874SEduardo Habkost vmstate_hi16_zmm_reg, ZMMReg) 1109aecd6f8SChao Peng #endif 1119aecd6f8SChao Peng 11279e9ebebSLiu Jinsong static const VMStateDescription vmstate_bnd_regs = { 11379e9ebebSLiu Jinsong .name = "bnd_regs", 11479e9ebebSLiu Jinsong .version_id = 1, 11579e9ebebSLiu Jinsong .minimum_version_id = 1, 11679e9ebebSLiu Jinsong .fields = (VMStateField[]) { 11779e9ebebSLiu Jinsong VMSTATE_UINT64(lb, BNDReg), 11879e9ebebSLiu Jinsong VMSTATE_UINT64(ub, BNDReg), 11979e9ebebSLiu Jinsong VMSTATE_END_OF_LIST() 12079e9ebebSLiu Jinsong } 12179e9ebebSLiu Jinsong }; 12279e9ebebSLiu Jinsong 12379e9ebebSLiu Jinsong #define VMSTATE_BND_REGS(_field, _state, _n) \ 12479e9ebebSLiu Jinsong VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_bnd_regs, BNDReg) 12579e9ebebSLiu Jinsong 126216c07c3SJuan Quintela static const VMStateDescription vmstate_mtrr_var = { 127216c07c3SJuan Quintela .name = "mtrr_var", 128216c07c3SJuan Quintela .version_id = 1, 129216c07c3SJuan Quintela .minimum_version_id = 1, 130216c07c3SJuan Quintela .fields = (VMStateField[]) { 131216c07c3SJuan Quintela VMSTATE_UINT64(base, MTRRVar), 132216c07c3SJuan Quintela VMSTATE_UINT64(mask, MTRRVar), 133216c07c3SJuan Quintela VMSTATE_END_OF_LIST() 134216c07c3SJuan Quintela } 135216c07c3SJuan Quintela }; 136216c07c3SJuan Quintela 1370cb892aaSJuan Quintela #define VMSTATE_MTRR_VARS(_field, _state, _n, _v) \ 1380cb892aaSJuan Quintela VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_mtrr_var, MTRRVar) 139216c07c3SJuan Quintela 140ab808276SDr. David Alan Gilbert typedef struct x86_FPReg_tmp { 141ab808276SDr. David Alan Gilbert FPReg *parent; 142ab808276SDr. David Alan Gilbert uint64_t tmp_mant; 143ab808276SDr. David Alan Gilbert uint16_t tmp_exp; 144ab808276SDr. David Alan Gilbert } x86_FPReg_tmp; 1453c8ce630SJuan Quintela 146db573d2cSYang Zhong static void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f) 147db573d2cSYang Zhong { 148db573d2cSYang Zhong CPU_LDoubleU temp; 149db573d2cSYang Zhong 150db573d2cSYang Zhong temp.d = f; 151db573d2cSYang Zhong *pmant = temp.l.lower; 152db573d2cSYang Zhong *pexp = temp.l.upper; 153db573d2cSYang Zhong } 154db573d2cSYang Zhong 155db573d2cSYang Zhong static floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper) 156db573d2cSYang Zhong { 157db573d2cSYang Zhong CPU_LDoubleU temp; 158db573d2cSYang Zhong 159db573d2cSYang Zhong temp.l.upper = upper; 160db573d2cSYang Zhong temp.l.lower = mant; 161db573d2cSYang Zhong return temp.d; 162db573d2cSYang Zhong } 163db573d2cSYang Zhong 16444b1ff31SDr. David Alan Gilbert static int fpreg_pre_save(void *opaque) 1653c8ce630SJuan Quintela { 166ab808276SDr. David Alan Gilbert x86_FPReg_tmp *tmp = opaque; 167ab808276SDr. David Alan Gilbert 1683c8ce630SJuan Quintela /* we save the real CPU data (in case of MMX usage only 'mant' 1693c8ce630SJuan Quintela contains the MMX register */ 170ab808276SDr. David Alan Gilbert cpu_get_fp80(&tmp->tmp_mant, &tmp->tmp_exp, tmp->parent->d); 17144b1ff31SDr. David Alan Gilbert 17244b1ff31SDr. David Alan Gilbert return 0; 173ab808276SDr. David Alan Gilbert } 1742c21ee76SJianjun Duan 175ab808276SDr. David Alan Gilbert static int fpreg_post_load(void *opaque, int version) 176ab808276SDr. David Alan Gilbert { 177ab808276SDr. David Alan Gilbert x86_FPReg_tmp *tmp = opaque; 178ab808276SDr. David Alan Gilbert 179ab808276SDr. David Alan Gilbert tmp->parent->d = cpu_set_fp80(tmp->tmp_mant, tmp->tmp_exp); 1802c21ee76SJianjun Duan return 0; 1813c8ce630SJuan Quintela } 1823c8ce630SJuan Quintela 183ab808276SDr. David Alan Gilbert static const VMStateDescription vmstate_fpreg_tmp = { 184ab808276SDr. David Alan Gilbert .name = "fpreg_tmp", 185ab808276SDr. David Alan Gilbert .post_load = fpreg_post_load, 186ab808276SDr. David Alan Gilbert .pre_save = fpreg_pre_save, 187ab808276SDr. David Alan Gilbert .fields = (VMStateField[]) { 188ab808276SDr. David Alan Gilbert VMSTATE_UINT64(tmp_mant, x86_FPReg_tmp), 189ab808276SDr. David Alan Gilbert VMSTATE_UINT16(tmp_exp, x86_FPReg_tmp), 190ab808276SDr. David Alan Gilbert VMSTATE_END_OF_LIST() 191ab808276SDr. David Alan Gilbert } 192ab808276SDr. David Alan Gilbert }; 193ab808276SDr. David Alan Gilbert 194ab808276SDr. David Alan Gilbert static const VMStateDescription vmstate_fpreg = { 1950cb892aaSJuan Quintela .name = "fpreg", 196ab808276SDr. David Alan Gilbert .fields = (VMStateField[]) { 197ab808276SDr. David Alan Gilbert VMSTATE_WITH_TMP(FPReg, x86_FPReg_tmp, vmstate_fpreg_tmp), 198ab808276SDr. David Alan Gilbert VMSTATE_END_OF_LIST() 199ab808276SDr. David Alan Gilbert } 2000cb892aaSJuan Quintela }; 2010cb892aaSJuan Quintela 20244b1ff31SDr. David Alan Gilbert static int cpu_pre_save(void *opaque) 2038dd3dca3Saurel32 { 204f56e3a14SAndreas Färber X86CPU *cpu = opaque; 205f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 2060e607a80SJan Kiszka int i; 2078dd3dca3Saurel32 2088dd3dca3Saurel32 /* FPU */ 20967b8f419SJuan Quintela env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; 210cdc0c58fSJuan Quintela env->fptag_vmstate = 0; 2118dd3dca3Saurel32 for(i = 0; i < 8; i++) { 212cdc0c58fSJuan Quintela env->fptag_vmstate |= ((!env->fptags[i]) << i); 2138dd3dca3Saurel32 } 2148dd3dca3Saurel32 21560a902f1SJuan Quintela env->fpregs_format_vmstate = 0; 2163e47c249SOrit Wasserman 2173e47c249SOrit Wasserman /* 2183e47c249SOrit Wasserman * Real mode guest segments register DPL should be zero. 2193e47c249SOrit Wasserman * Older KVM version were setting it wrongly. 2203e47c249SOrit Wasserman * Fixing it will allow live migration to host with unrestricted guest 2213e47c249SOrit Wasserman * support (otherwise the migration will fail with invalid guest state 2223e47c249SOrit Wasserman * error). 2233e47c249SOrit Wasserman */ 2243e47c249SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 2253e47c249SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 2263e47c249SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 2273e47c249SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 2283e47c249SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 2293e47c249SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 2303e47c249SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 2313e47c249SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 2323e47c249SOrit Wasserman } 2333e47c249SOrit Wasserman 234ebbfef2fSLiran Alon #ifdef CONFIG_KVM 235ebbfef2fSLiran Alon /* Verify we have nested virtualization state from kernel if required */ 23612604092SLiran Alon if (kvm_enabled() && cpu_has_vmx(env) && !env->nested_state) { 237ebbfef2fSLiran Alon error_report("Guest enabled nested virtualization but kernel " 238ebbfef2fSLiran Alon "does not support saving of nested state"); 239ebbfef2fSLiran Alon return -EINVAL; 240ebbfef2fSLiran Alon } 241ebbfef2fSLiran Alon #endif 242ebbfef2fSLiran Alon 243fd13f23bSLiran Alon /* 244fd13f23bSLiran Alon * When vCPU is running L2 and exception is still pending, 245fd13f23bSLiran Alon * it can potentially be intercepted by L1 hypervisor. 246fd13f23bSLiran Alon * In contrast to an injected exception which cannot be 247fd13f23bSLiran Alon * intercepted anymore. 248fd13f23bSLiran Alon * 249fd13f23bSLiran Alon * Furthermore, when a L2 exception is intercepted by L1 250fd13f23bSLiran Alon * hypervisor, it's exception payload (CR2/DR6 on #PF/#DB) 251fd13f23bSLiran Alon * should not be set yet in the respective vCPU register. 252fd13f23bSLiran Alon * Thus, in case an exception is pending, it is 253fd13f23bSLiran Alon * important to save the exception payload seperately. 254fd13f23bSLiran Alon * 255fd13f23bSLiran Alon * Therefore, if an exception is not in a pending state 256fd13f23bSLiran Alon * or vCPU is not in guest-mode, it is not important to 257fd13f23bSLiran Alon * distinguish between a pending and injected exception 258fd13f23bSLiran Alon * and we don't need to store seperately the exception payload. 259fd13f23bSLiran Alon * 260fd13f23bSLiran Alon * In order to preserve better backwards-compatabile migration, 261fd13f23bSLiran Alon * convert a pending exception to an injected exception in 262fd13f23bSLiran Alon * case it is not important to distingiush between them 263fd13f23bSLiran Alon * as described above. 264fd13f23bSLiran Alon */ 265fd13f23bSLiran Alon if (env->exception_pending && !(env->hflags & HF_GUEST_MASK)) { 266fd13f23bSLiran Alon env->exception_pending = 0; 267fd13f23bSLiran Alon env->exception_injected = 1; 268fd13f23bSLiran Alon 269fd13f23bSLiran Alon if (env->exception_has_payload) { 270fd13f23bSLiran Alon if (env->exception_nr == EXCP01_DB) { 271fd13f23bSLiran Alon env->dr[6] = env->exception_payload; 272fd13f23bSLiran Alon } else if (env->exception_nr == EXCP0E_PAGE) { 273fd13f23bSLiran Alon env->cr[2] = env->exception_payload; 274fd13f23bSLiran Alon } 275fd13f23bSLiran Alon } 276fd13f23bSLiran Alon } 277fd13f23bSLiran Alon 27844b1ff31SDr. David Alan Gilbert return 0; 279c4c38c8cSJuan Quintela } 280c4c38c8cSJuan Quintela 281468f6581SJuan Quintela static int cpu_post_load(void *opaque, int version_id) 282468f6581SJuan Quintela { 283f56e3a14SAndreas Färber X86CPU *cpu = opaque; 28475a34036SAndreas Färber CPUState *cs = CPU(cpu); 285f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 286468f6581SJuan Quintela int i; 287468f6581SJuan Quintela 28836f96c4bSHaozhong Zhang if (env->tsc_khz && env->user_tsc_khz && 28936f96c4bSHaozhong Zhang env->tsc_khz != env->user_tsc_khz) { 29036f96c4bSHaozhong Zhang error_report("Mismatch between user-specified TSC frequency and " 29136f96c4bSHaozhong Zhang "migrated TSC frequency"); 29236f96c4bSHaozhong Zhang return -EINVAL; 29336f96c4bSHaozhong Zhang } 29436f96c4bSHaozhong Zhang 29546baa900SDr. David Alan Gilbert if (env->fpregs_format_vmstate) { 29646baa900SDr. David Alan Gilbert error_report("Unsupported old non-softfloat CPU state"); 29746baa900SDr. David Alan Gilbert return -EINVAL; 29846baa900SDr. David Alan Gilbert } 299444ba679SOrit Wasserman /* 300444ba679SOrit Wasserman * Real mode guest segments register DPL should be zero. 301444ba679SOrit Wasserman * Older KVM version were setting it wrongly. 302444ba679SOrit Wasserman * Fixing it will allow live migration from such host that don't have 303444ba679SOrit Wasserman * restricted guest support to a host with unrestricted guest support 304444ba679SOrit Wasserman * (otherwise the migration will fail with invalid guest state 305444ba679SOrit Wasserman * error). 306444ba679SOrit Wasserman */ 307444ba679SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 308444ba679SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 309444ba679SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 310444ba679SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 311444ba679SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 312444ba679SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 313444ba679SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 314444ba679SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 315444ba679SOrit Wasserman } 316444ba679SOrit Wasserman 3177125c937SPaolo Bonzini /* Older versions of QEMU incorrectly used CS.DPL as the CPL when 3187125c937SPaolo Bonzini * running under KVM. This is wrong for conforming code segments. 3197125c937SPaolo Bonzini * Luckily, in our implementation the CPL field of hflags is redundant 3207125c937SPaolo Bonzini * and we can get the right value from the SS descriptor privilege level. 3217125c937SPaolo Bonzini */ 3227125c937SPaolo Bonzini env->hflags &= ~HF_CPL_MASK; 3237125c937SPaolo Bonzini env->hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; 3247125c937SPaolo Bonzini 325ebbfef2fSLiran Alon #ifdef CONFIG_KVM 326ebbfef2fSLiran Alon if ((env->hflags & HF_GUEST_MASK) && 327ebbfef2fSLiran Alon (!env->nested_state || 328ebbfef2fSLiran Alon !(env->nested_state->flags & KVM_STATE_NESTED_GUEST_MODE))) { 329ebbfef2fSLiran Alon error_report("vCPU set in guest-mode inconsistent with " 330ebbfef2fSLiran Alon "migrated kernel nested state"); 331ebbfef2fSLiran Alon return -EINVAL; 332ebbfef2fSLiran Alon } 333ebbfef2fSLiran Alon #endif 334ebbfef2fSLiran Alon 335fd13f23bSLiran Alon /* 336fd13f23bSLiran Alon * There are cases that we can get valid exception_nr with both 337fd13f23bSLiran Alon * exception_pending and exception_injected being cleared. 338fd13f23bSLiran Alon * This can happen in one of the following scenarios: 339fd13f23bSLiran Alon * 1) Source is older QEMU without KVM_CAP_EXCEPTION_PAYLOAD support. 340fd13f23bSLiran Alon * 2) Source is running on kernel without KVM_CAP_EXCEPTION_PAYLOAD support. 341fd13f23bSLiran Alon * 3) "cpu/exception_info" subsection not sent because there is no exception 342fd13f23bSLiran Alon * pending or guest wasn't running L2 (See comment in cpu_pre_save()). 343fd13f23bSLiran Alon * 344fd13f23bSLiran Alon * In those cases, we can just deduce that a valid exception_nr means 345fd13f23bSLiran Alon * we can treat the exception as already injected. 346fd13f23bSLiran Alon */ 347fd13f23bSLiran Alon if ((env->exception_nr != -1) && 348fd13f23bSLiran Alon !env->exception_pending && !env->exception_injected) { 349fd13f23bSLiran Alon env->exception_injected = 1; 350fd13f23bSLiran Alon } 351fd13f23bSLiran Alon 352468f6581SJuan Quintela env->fpstt = (env->fpus_vmstate >> 11) & 7; 353468f6581SJuan Quintela env->fpus = env->fpus_vmstate & ~0x3800; 354468f6581SJuan Quintela env->fptag_vmstate ^= 0xff; 355468f6581SJuan Quintela for(i = 0; i < 8; i++) { 356468f6581SJuan Quintela env->fptags[i] = (env->fptag_vmstate >> i) & 1; 357468f6581SJuan Quintela } 3581d8ad165SYang Zhong if (tcg_enabled()) { 35979c664f6SYang Zhong target_ulong dr7; 3605bde1407SPavel Dovgalyuk update_fp_status(env); 3611d8ad165SYang Zhong update_mxcsr_status(env); 362468f6581SJuan Quintela 363b3310ab3SAndreas Färber cpu_breakpoint_remove_all(cs, BP_CPU); 36475a34036SAndreas Färber cpu_watchpoint_remove_all(cs, BP_CPU); 36579c664f6SYang Zhong 36693d00d0fSRichard Henderson /* Indicate all breakpoints disabled, as they are, then 36793d00d0fSRichard Henderson let the helper re-enable them. */ 36879c664f6SYang Zhong dr7 = env->dr[7]; 36993d00d0fSRichard Henderson env->dr[7] = dr7 & ~(DR7_GLOBAL_BP_MASK | DR7_LOCAL_BP_MASK); 37093d00d0fSRichard Henderson cpu_x86_update_dr7(env, dr7); 371428065ceSliguang } 372d10eb08fSAlex Bennée tlb_flush(cs); 3731e7fbc6dSJuan Quintela return 0; 374468f6581SJuan Quintela } 375468f6581SJuan Quintela 376f6584ee2SGleb Natapov static bool async_pf_msr_needed(void *opaque) 377f6584ee2SGleb Natapov { 378f56e3a14SAndreas Färber X86CPU *cpu = opaque; 379f6584ee2SGleb Natapov 380f56e3a14SAndreas Färber return cpu->env.async_pf_en_msr != 0; 381f6584ee2SGleb Natapov } 382f6584ee2SGleb Natapov 383bc9a839dSMichael S. Tsirkin static bool pv_eoi_msr_needed(void *opaque) 384bc9a839dSMichael S. Tsirkin { 385f56e3a14SAndreas Färber X86CPU *cpu = opaque; 386bc9a839dSMichael S. Tsirkin 387f56e3a14SAndreas Färber return cpu->env.pv_eoi_en_msr != 0; 388bc9a839dSMichael S. Tsirkin } 389bc9a839dSMichael S. Tsirkin 390917367aaSMarcelo Tosatti static bool steal_time_msr_needed(void *opaque) 391917367aaSMarcelo Tosatti { 3920e503577SMarcelo Tosatti X86CPU *cpu = opaque; 393917367aaSMarcelo Tosatti 3940e503577SMarcelo Tosatti return cpu->env.steal_time_msr != 0; 395917367aaSMarcelo Tosatti } 396917367aaSMarcelo Tosatti 397fd13f23bSLiran Alon static bool exception_info_needed(void *opaque) 398fd13f23bSLiran Alon { 399fd13f23bSLiran Alon X86CPU *cpu = opaque; 400fd13f23bSLiran Alon CPUX86State *env = &cpu->env; 401fd13f23bSLiran Alon 402fd13f23bSLiran Alon /* 403fd13f23bSLiran Alon * It is important to save exception-info only in case 404fd13f23bSLiran Alon * we need to distingiush between a pending and injected 405fd13f23bSLiran Alon * exception. Which is only required in case there is a 406fd13f23bSLiran Alon * pending exception and vCPU is running L2. 407fd13f23bSLiran Alon * For more info, refer to comment in cpu_pre_save(). 408fd13f23bSLiran Alon */ 409fd13f23bSLiran Alon return env->exception_pending && (env->hflags & HF_GUEST_MASK); 410fd13f23bSLiran Alon } 411fd13f23bSLiran Alon 412fd13f23bSLiran Alon static const VMStateDescription vmstate_exception_info = { 413fd13f23bSLiran Alon .name = "cpu/exception_info", 414fd13f23bSLiran Alon .version_id = 1, 415fd13f23bSLiran Alon .minimum_version_id = 1, 416fd13f23bSLiran Alon .needed = exception_info_needed, 417fd13f23bSLiran Alon .fields = (VMStateField[]) { 418fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_pending, X86CPU), 419fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_injected, X86CPU), 420fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_has_payload, X86CPU), 421fd13f23bSLiran Alon VMSTATE_UINT64(env.exception_payload, X86CPU), 422fd13f23bSLiran Alon VMSTATE_END_OF_LIST() 423fd13f23bSLiran Alon } 424fd13f23bSLiran Alon }; 425fd13f23bSLiran Alon 426917367aaSMarcelo Tosatti static const VMStateDescription vmstate_steal_time_msr = { 427917367aaSMarcelo Tosatti .name = "cpu/steal_time_msr", 428917367aaSMarcelo Tosatti .version_id = 1, 429917367aaSMarcelo Tosatti .minimum_version_id = 1, 4305cd8cadaSJuan Quintela .needed = steal_time_msr_needed, 431917367aaSMarcelo Tosatti .fields = (VMStateField[]) { 4320e503577SMarcelo Tosatti VMSTATE_UINT64(env.steal_time_msr, X86CPU), 433917367aaSMarcelo Tosatti VMSTATE_END_OF_LIST() 434917367aaSMarcelo Tosatti } 435917367aaSMarcelo Tosatti }; 436917367aaSMarcelo Tosatti 437f6584ee2SGleb Natapov static const VMStateDescription vmstate_async_pf_msr = { 438f6584ee2SGleb Natapov .name = "cpu/async_pf_msr", 439f6584ee2SGleb Natapov .version_id = 1, 440f6584ee2SGleb Natapov .minimum_version_id = 1, 4415cd8cadaSJuan Quintela .needed = async_pf_msr_needed, 442f6584ee2SGleb Natapov .fields = (VMStateField[]) { 443f56e3a14SAndreas Färber VMSTATE_UINT64(env.async_pf_en_msr, X86CPU), 444f6584ee2SGleb Natapov VMSTATE_END_OF_LIST() 445f6584ee2SGleb Natapov } 446f6584ee2SGleb Natapov }; 447f6584ee2SGleb Natapov 448bc9a839dSMichael S. Tsirkin static const VMStateDescription vmstate_pv_eoi_msr = { 449bc9a839dSMichael S. Tsirkin .name = "cpu/async_pv_eoi_msr", 450bc9a839dSMichael S. Tsirkin .version_id = 1, 451bc9a839dSMichael S. Tsirkin .minimum_version_id = 1, 4525cd8cadaSJuan Quintela .needed = pv_eoi_msr_needed, 453bc9a839dSMichael S. Tsirkin .fields = (VMStateField[]) { 454f56e3a14SAndreas Färber VMSTATE_UINT64(env.pv_eoi_en_msr, X86CPU), 455bc9a839dSMichael S. Tsirkin VMSTATE_END_OF_LIST() 456bc9a839dSMichael S. Tsirkin } 457bc9a839dSMichael S. Tsirkin }; 458bc9a839dSMichael S. Tsirkin 45942cc8fa6SJan Kiszka static bool fpop_ip_dp_needed(void *opaque) 46042cc8fa6SJan Kiszka { 461f56e3a14SAndreas Färber X86CPU *cpu = opaque; 462f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 46342cc8fa6SJan Kiszka 46442cc8fa6SJan Kiszka return env->fpop != 0 || env->fpip != 0 || env->fpdp != 0; 46542cc8fa6SJan Kiszka } 46642cc8fa6SJan Kiszka 46742cc8fa6SJan Kiszka static const VMStateDescription vmstate_fpop_ip_dp = { 46842cc8fa6SJan Kiszka .name = "cpu/fpop_ip_dp", 46942cc8fa6SJan Kiszka .version_id = 1, 47042cc8fa6SJan Kiszka .minimum_version_id = 1, 4715cd8cadaSJuan Quintela .needed = fpop_ip_dp_needed, 47242cc8fa6SJan Kiszka .fields = (VMStateField[]) { 473f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpop, X86CPU), 474f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpip, X86CPU), 475f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpdp, X86CPU), 47642cc8fa6SJan Kiszka VMSTATE_END_OF_LIST() 47742cc8fa6SJan Kiszka } 47842cc8fa6SJan Kiszka }; 47942cc8fa6SJan Kiszka 480f28558d3SWill Auld static bool tsc_adjust_needed(void *opaque) 481f28558d3SWill Auld { 482f56e3a14SAndreas Färber X86CPU *cpu = opaque; 483f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 484f28558d3SWill Auld 485f28558d3SWill Auld return env->tsc_adjust != 0; 486f28558d3SWill Auld } 487f28558d3SWill Auld 488f28558d3SWill Auld static const VMStateDescription vmstate_msr_tsc_adjust = { 489f28558d3SWill Auld .name = "cpu/msr_tsc_adjust", 490f28558d3SWill Auld .version_id = 1, 491f28558d3SWill Auld .minimum_version_id = 1, 4925cd8cadaSJuan Quintela .needed = tsc_adjust_needed, 493f28558d3SWill Auld .fields = (VMStateField[]) { 494f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_adjust, X86CPU), 495f28558d3SWill Auld VMSTATE_END_OF_LIST() 496f28558d3SWill Auld } 497f28558d3SWill Auld }; 498f28558d3SWill Auld 499e13713dbSLiran Alon static bool msr_smi_count_needed(void *opaque) 500e13713dbSLiran Alon { 501e13713dbSLiran Alon X86CPU *cpu = opaque; 502e13713dbSLiran Alon CPUX86State *env = &cpu->env; 503e13713dbSLiran Alon 504990e0be2SPaolo Bonzini return cpu->migrate_smi_count && env->msr_smi_count != 0; 505e13713dbSLiran Alon } 506e13713dbSLiran Alon 507e13713dbSLiran Alon static const VMStateDescription vmstate_msr_smi_count = { 508e13713dbSLiran Alon .name = "cpu/msr_smi_count", 509e13713dbSLiran Alon .version_id = 1, 510e13713dbSLiran Alon .minimum_version_id = 1, 511e13713dbSLiran Alon .needed = msr_smi_count_needed, 512e13713dbSLiran Alon .fields = (VMStateField[]) { 513e13713dbSLiran Alon VMSTATE_UINT64(env.msr_smi_count, X86CPU), 514e13713dbSLiran Alon VMSTATE_END_OF_LIST() 515e13713dbSLiran Alon } 516e13713dbSLiran Alon }; 517e13713dbSLiran Alon 518aa82ba54SLiu, Jinsong static bool tscdeadline_needed(void *opaque) 519aa82ba54SLiu, Jinsong { 520f56e3a14SAndreas Färber X86CPU *cpu = opaque; 521f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 522aa82ba54SLiu, Jinsong 523aa82ba54SLiu, Jinsong return env->tsc_deadline != 0; 524aa82ba54SLiu, Jinsong } 525aa82ba54SLiu, Jinsong 526aa82ba54SLiu, Jinsong static const VMStateDescription vmstate_msr_tscdeadline = { 527aa82ba54SLiu, Jinsong .name = "cpu/msr_tscdeadline", 528aa82ba54SLiu, Jinsong .version_id = 1, 529aa82ba54SLiu, Jinsong .minimum_version_id = 1, 5305cd8cadaSJuan Quintela .needed = tscdeadline_needed, 531aa82ba54SLiu, Jinsong .fields = (VMStateField[]) { 532f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_deadline, X86CPU), 533aa82ba54SLiu, Jinsong VMSTATE_END_OF_LIST() 534aa82ba54SLiu, Jinsong } 535aa82ba54SLiu, Jinsong }; 536aa82ba54SLiu, Jinsong 53721e87c46SAvi Kivity static bool misc_enable_needed(void *opaque) 53821e87c46SAvi Kivity { 539f56e3a14SAndreas Färber X86CPU *cpu = opaque; 540f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 54121e87c46SAvi Kivity 54221e87c46SAvi Kivity return env->msr_ia32_misc_enable != MSR_IA32_MISC_ENABLE_DEFAULT; 54321e87c46SAvi Kivity } 54421e87c46SAvi Kivity 5450779caebSArthur Chunqi Li static bool feature_control_needed(void *opaque) 5460779caebSArthur Chunqi Li { 5470779caebSArthur Chunqi Li X86CPU *cpu = opaque; 5480779caebSArthur Chunqi Li CPUX86State *env = &cpu->env; 5490779caebSArthur Chunqi Li 5500779caebSArthur Chunqi Li return env->msr_ia32_feature_control != 0; 5510779caebSArthur Chunqi Li } 5520779caebSArthur Chunqi Li 55321e87c46SAvi Kivity static const VMStateDescription vmstate_msr_ia32_misc_enable = { 55421e87c46SAvi Kivity .name = "cpu/msr_ia32_misc_enable", 55521e87c46SAvi Kivity .version_id = 1, 55621e87c46SAvi Kivity .minimum_version_id = 1, 5575cd8cadaSJuan Quintela .needed = misc_enable_needed, 55821e87c46SAvi Kivity .fields = (VMStateField[]) { 559f56e3a14SAndreas Färber VMSTATE_UINT64(env.msr_ia32_misc_enable, X86CPU), 56021e87c46SAvi Kivity VMSTATE_END_OF_LIST() 56121e87c46SAvi Kivity } 56221e87c46SAvi Kivity }; 56321e87c46SAvi Kivity 5640779caebSArthur Chunqi Li static const VMStateDescription vmstate_msr_ia32_feature_control = { 5650779caebSArthur Chunqi Li .name = "cpu/msr_ia32_feature_control", 5660779caebSArthur Chunqi Li .version_id = 1, 5670779caebSArthur Chunqi Li .minimum_version_id = 1, 5685cd8cadaSJuan Quintela .needed = feature_control_needed, 5690779caebSArthur Chunqi Li .fields = (VMStateField[]) { 5700779caebSArthur Chunqi Li VMSTATE_UINT64(env.msr_ia32_feature_control, X86CPU), 5710779caebSArthur Chunqi Li VMSTATE_END_OF_LIST() 5720779caebSArthur Chunqi Li } 5730779caebSArthur Chunqi Li }; 5740779caebSArthur Chunqi Li 5750d894367SPaolo Bonzini static bool pmu_enable_needed(void *opaque) 5760d894367SPaolo Bonzini { 5770d894367SPaolo Bonzini X86CPU *cpu = opaque; 5780d894367SPaolo Bonzini CPUX86State *env = &cpu->env; 5790d894367SPaolo Bonzini int i; 5800d894367SPaolo Bonzini 5810d894367SPaolo Bonzini if (env->msr_fixed_ctr_ctrl || env->msr_global_ctrl || 5820d894367SPaolo Bonzini env->msr_global_status || env->msr_global_ovf_ctrl) { 5830d894367SPaolo Bonzini return true; 5840d894367SPaolo Bonzini } 5850d894367SPaolo Bonzini for (i = 0; i < MAX_FIXED_COUNTERS; i++) { 5860d894367SPaolo Bonzini if (env->msr_fixed_counters[i]) { 5870d894367SPaolo Bonzini return true; 5880d894367SPaolo Bonzini } 5890d894367SPaolo Bonzini } 5900d894367SPaolo Bonzini for (i = 0; i < MAX_GP_COUNTERS; i++) { 5910d894367SPaolo Bonzini if (env->msr_gp_counters[i] || env->msr_gp_evtsel[i]) { 5920d894367SPaolo Bonzini return true; 5930d894367SPaolo Bonzini } 5940d894367SPaolo Bonzini } 5950d894367SPaolo Bonzini 5960d894367SPaolo Bonzini return false; 5970d894367SPaolo Bonzini } 5980d894367SPaolo Bonzini 5990d894367SPaolo Bonzini static const VMStateDescription vmstate_msr_architectural_pmu = { 6000d894367SPaolo Bonzini .name = "cpu/msr_architectural_pmu", 6010d894367SPaolo Bonzini .version_id = 1, 6020d894367SPaolo Bonzini .minimum_version_id = 1, 6035cd8cadaSJuan Quintela .needed = pmu_enable_needed, 6040d894367SPaolo Bonzini .fields = (VMStateField[]) { 6050d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_fixed_ctr_ctrl, X86CPU), 6060d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ctrl, X86CPU), 6070d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_status, X86CPU), 6080d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ovf_ctrl, X86CPU), 6090d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_fixed_counters, X86CPU, MAX_FIXED_COUNTERS), 6100d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_counters, X86CPU, MAX_GP_COUNTERS), 6110d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_evtsel, X86CPU, MAX_GP_COUNTERS), 6120d894367SPaolo Bonzini VMSTATE_END_OF_LIST() 6130d894367SPaolo Bonzini } 6140d894367SPaolo Bonzini }; 6150d894367SPaolo Bonzini 61679e9ebebSLiu Jinsong static bool mpx_needed(void *opaque) 61779e9ebebSLiu Jinsong { 61879e9ebebSLiu Jinsong X86CPU *cpu = opaque; 61979e9ebebSLiu Jinsong CPUX86State *env = &cpu->env; 62079e9ebebSLiu Jinsong unsigned int i; 62179e9ebebSLiu Jinsong 62279e9ebebSLiu Jinsong for (i = 0; i < 4; i++) { 62379e9ebebSLiu Jinsong if (env->bnd_regs[i].lb || env->bnd_regs[i].ub) { 62479e9ebebSLiu Jinsong return true; 62579e9ebebSLiu Jinsong } 62679e9ebebSLiu Jinsong } 62779e9ebebSLiu Jinsong 62879e9ebebSLiu Jinsong if (env->bndcs_regs.cfgu || env->bndcs_regs.sts) { 62979e9ebebSLiu Jinsong return true; 63079e9ebebSLiu Jinsong } 63179e9ebebSLiu Jinsong 63279e9ebebSLiu Jinsong return !!env->msr_bndcfgs; 63379e9ebebSLiu Jinsong } 63479e9ebebSLiu Jinsong 63579e9ebebSLiu Jinsong static const VMStateDescription vmstate_mpx = { 63679e9ebebSLiu Jinsong .name = "cpu/mpx", 63779e9ebebSLiu Jinsong .version_id = 1, 63879e9ebebSLiu Jinsong .minimum_version_id = 1, 6395cd8cadaSJuan Quintela .needed = mpx_needed, 64079e9ebebSLiu Jinsong .fields = (VMStateField[]) { 64179e9ebebSLiu Jinsong VMSTATE_BND_REGS(env.bnd_regs, X86CPU, 4), 64279e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.cfgu, X86CPU), 64379e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.sts, X86CPU), 64479e9ebebSLiu Jinsong VMSTATE_UINT64(env.msr_bndcfgs, X86CPU), 64579e9ebebSLiu Jinsong VMSTATE_END_OF_LIST() 64679e9ebebSLiu Jinsong } 64779e9ebebSLiu Jinsong }; 64879e9ebebSLiu Jinsong 6491c90ef26SVadim Rozenfeld static bool hyperv_hypercall_enable_needed(void *opaque) 6501c90ef26SVadim Rozenfeld { 6511c90ef26SVadim Rozenfeld X86CPU *cpu = opaque; 6521c90ef26SVadim Rozenfeld CPUX86State *env = &cpu->env; 6531c90ef26SVadim Rozenfeld 6541c90ef26SVadim Rozenfeld return env->msr_hv_hypercall != 0 || env->msr_hv_guest_os_id != 0; 6551c90ef26SVadim Rozenfeld } 6561c90ef26SVadim Rozenfeld 6571c90ef26SVadim Rozenfeld static const VMStateDescription vmstate_msr_hypercall_hypercall = { 6581c90ef26SVadim Rozenfeld .name = "cpu/msr_hyperv_hypercall", 6591c90ef26SVadim Rozenfeld .version_id = 1, 6601c90ef26SVadim Rozenfeld .minimum_version_id = 1, 6615cd8cadaSJuan Quintela .needed = hyperv_hypercall_enable_needed, 6621c90ef26SVadim Rozenfeld .fields = (VMStateField[]) { 6631c90ef26SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_guest_os_id, X86CPU), 664466e6e9dSPaolo Bonzini VMSTATE_UINT64(env.msr_hv_hypercall, X86CPU), 6651c90ef26SVadim Rozenfeld VMSTATE_END_OF_LIST() 6661c90ef26SVadim Rozenfeld } 6671c90ef26SVadim Rozenfeld }; 6681c90ef26SVadim Rozenfeld 6695ef68987SVadim Rozenfeld static bool hyperv_vapic_enable_needed(void *opaque) 6705ef68987SVadim Rozenfeld { 6715ef68987SVadim Rozenfeld X86CPU *cpu = opaque; 6725ef68987SVadim Rozenfeld CPUX86State *env = &cpu->env; 6735ef68987SVadim Rozenfeld 6745ef68987SVadim Rozenfeld return env->msr_hv_vapic != 0; 6755ef68987SVadim Rozenfeld } 6765ef68987SVadim Rozenfeld 6775ef68987SVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_vapic = { 6785ef68987SVadim Rozenfeld .name = "cpu/msr_hyperv_vapic", 6795ef68987SVadim Rozenfeld .version_id = 1, 6805ef68987SVadim Rozenfeld .minimum_version_id = 1, 6815cd8cadaSJuan Quintela .needed = hyperv_vapic_enable_needed, 6825ef68987SVadim Rozenfeld .fields = (VMStateField[]) { 6835ef68987SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_vapic, X86CPU), 6845ef68987SVadim Rozenfeld VMSTATE_END_OF_LIST() 6855ef68987SVadim Rozenfeld } 6865ef68987SVadim Rozenfeld }; 6875ef68987SVadim Rozenfeld 68848a5f3bcSVadim Rozenfeld static bool hyperv_time_enable_needed(void *opaque) 68948a5f3bcSVadim Rozenfeld { 69048a5f3bcSVadim Rozenfeld X86CPU *cpu = opaque; 69148a5f3bcSVadim Rozenfeld CPUX86State *env = &cpu->env; 69248a5f3bcSVadim Rozenfeld 69348a5f3bcSVadim Rozenfeld return env->msr_hv_tsc != 0; 69448a5f3bcSVadim Rozenfeld } 69548a5f3bcSVadim Rozenfeld 69648a5f3bcSVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_time = { 69748a5f3bcSVadim Rozenfeld .name = "cpu/msr_hyperv_time", 69848a5f3bcSVadim Rozenfeld .version_id = 1, 69948a5f3bcSVadim Rozenfeld .minimum_version_id = 1, 7005cd8cadaSJuan Quintela .needed = hyperv_time_enable_needed, 70148a5f3bcSVadim Rozenfeld .fields = (VMStateField[]) { 70248a5f3bcSVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_tsc, X86CPU), 70348a5f3bcSVadim Rozenfeld VMSTATE_END_OF_LIST() 70448a5f3bcSVadim Rozenfeld } 70548a5f3bcSVadim Rozenfeld }; 70648a5f3bcSVadim Rozenfeld 707f2a53c9eSAndrey Smetanin static bool hyperv_crash_enable_needed(void *opaque) 708f2a53c9eSAndrey Smetanin { 709f2a53c9eSAndrey Smetanin X86CPU *cpu = opaque; 710f2a53c9eSAndrey Smetanin CPUX86State *env = &cpu->env; 711f2a53c9eSAndrey Smetanin int i; 712f2a53c9eSAndrey Smetanin 7135e953812SRoman Kagan for (i = 0; i < HV_CRASH_PARAMS; i++) { 714f2a53c9eSAndrey Smetanin if (env->msr_hv_crash_params[i]) { 715f2a53c9eSAndrey Smetanin return true; 716f2a53c9eSAndrey Smetanin } 717f2a53c9eSAndrey Smetanin } 718f2a53c9eSAndrey Smetanin return false; 719f2a53c9eSAndrey Smetanin } 720f2a53c9eSAndrey Smetanin 721f2a53c9eSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_crash = { 722f2a53c9eSAndrey Smetanin .name = "cpu/msr_hyperv_crash", 723f2a53c9eSAndrey Smetanin .version_id = 1, 724f2a53c9eSAndrey Smetanin .minimum_version_id = 1, 725f2a53c9eSAndrey Smetanin .needed = hyperv_crash_enable_needed, 726f2a53c9eSAndrey Smetanin .fields = (VMStateField[]) { 7275e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_crash_params, X86CPU, HV_CRASH_PARAMS), 728f2a53c9eSAndrey Smetanin VMSTATE_END_OF_LIST() 729f2a53c9eSAndrey Smetanin } 730f2a53c9eSAndrey Smetanin }; 731f2a53c9eSAndrey Smetanin 73246eb8f98SAndrey Smetanin static bool hyperv_runtime_enable_needed(void *opaque) 73346eb8f98SAndrey Smetanin { 73446eb8f98SAndrey Smetanin X86CPU *cpu = opaque; 73546eb8f98SAndrey Smetanin CPUX86State *env = &cpu->env; 73646eb8f98SAndrey Smetanin 7372d384d7cSVitaly Kuznetsov if (!hyperv_feat_enabled(cpu, HYPERV_FEAT_RUNTIME)) { 73851227875SZhuangYanying return false; 73951227875SZhuangYanying } 74051227875SZhuangYanying 74146eb8f98SAndrey Smetanin return env->msr_hv_runtime != 0; 74246eb8f98SAndrey Smetanin } 74346eb8f98SAndrey Smetanin 74446eb8f98SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_runtime = { 74546eb8f98SAndrey Smetanin .name = "cpu/msr_hyperv_runtime", 74646eb8f98SAndrey Smetanin .version_id = 1, 74746eb8f98SAndrey Smetanin .minimum_version_id = 1, 74846eb8f98SAndrey Smetanin .needed = hyperv_runtime_enable_needed, 74946eb8f98SAndrey Smetanin .fields = (VMStateField[]) { 75046eb8f98SAndrey Smetanin VMSTATE_UINT64(env.msr_hv_runtime, X86CPU), 75146eb8f98SAndrey Smetanin VMSTATE_END_OF_LIST() 75246eb8f98SAndrey Smetanin } 75346eb8f98SAndrey Smetanin }; 75446eb8f98SAndrey Smetanin 755866eea9aSAndrey Smetanin static bool hyperv_synic_enable_needed(void *opaque) 756866eea9aSAndrey Smetanin { 757866eea9aSAndrey Smetanin X86CPU *cpu = opaque; 758866eea9aSAndrey Smetanin CPUX86State *env = &cpu->env; 759866eea9aSAndrey Smetanin int i; 760866eea9aSAndrey Smetanin 761866eea9aSAndrey Smetanin if (env->msr_hv_synic_control != 0 || 762866eea9aSAndrey Smetanin env->msr_hv_synic_evt_page != 0 || 763866eea9aSAndrey Smetanin env->msr_hv_synic_msg_page != 0) { 764866eea9aSAndrey Smetanin return true; 765866eea9aSAndrey Smetanin } 766866eea9aSAndrey Smetanin 767866eea9aSAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { 768866eea9aSAndrey Smetanin if (env->msr_hv_synic_sint[i] != 0) { 769866eea9aSAndrey Smetanin return true; 770866eea9aSAndrey Smetanin } 771866eea9aSAndrey Smetanin } 772866eea9aSAndrey Smetanin 773866eea9aSAndrey Smetanin return false; 774866eea9aSAndrey Smetanin } 775866eea9aSAndrey Smetanin 776606c34bfSRoman Kagan static int hyperv_synic_post_load(void *opaque, int version_id) 777606c34bfSRoman Kagan { 778606c34bfSRoman Kagan X86CPU *cpu = opaque; 779606c34bfSRoman Kagan hyperv_x86_synic_update(cpu); 780606c34bfSRoman Kagan return 0; 781606c34bfSRoman Kagan } 782606c34bfSRoman Kagan 783866eea9aSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_synic = { 784866eea9aSAndrey Smetanin .name = "cpu/msr_hyperv_synic", 785866eea9aSAndrey Smetanin .version_id = 1, 786866eea9aSAndrey Smetanin .minimum_version_id = 1, 787866eea9aSAndrey Smetanin .needed = hyperv_synic_enable_needed, 788606c34bfSRoman Kagan .post_load = hyperv_synic_post_load, 789866eea9aSAndrey Smetanin .fields = (VMStateField[]) { 790866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_control, X86CPU), 791866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_evt_page, X86CPU), 792866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_msg_page, X86CPU), 7935e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_synic_sint, X86CPU, HV_SINT_COUNT), 794866eea9aSAndrey Smetanin VMSTATE_END_OF_LIST() 795866eea9aSAndrey Smetanin } 796866eea9aSAndrey Smetanin }; 797866eea9aSAndrey Smetanin 798ff99aa64SAndrey Smetanin static bool hyperv_stimer_enable_needed(void *opaque) 799ff99aa64SAndrey Smetanin { 800ff99aa64SAndrey Smetanin X86CPU *cpu = opaque; 801ff99aa64SAndrey Smetanin CPUX86State *env = &cpu->env; 802ff99aa64SAndrey Smetanin int i; 803ff99aa64SAndrey Smetanin 804ff99aa64SAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_stimer_config); i++) { 805ff99aa64SAndrey Smetanin if (env->msr_hv_stimer_config[i] || env->msr_hv_stimer_count[i]) { 806ff99aa64SAndrey Smetanin return true; 807ff99aa64SAndrey Smetanin } 808ff99aa64SAndrey Smetanin } 809ff99aa64SAndrey Smetanin return false; 810ff99aa64SAndrey Smetanin } 811ff99aa64SAndrey Smetanin 812ff99aa64SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_stimer = { 813ff99aa64SAndrey Smetanin .name = "cpu/msr_hyperv_stimer", 814ff99aa64SAndrey Smetanin .version_id = 1, 815ff99aa64SAndrey Smetanin .minimum_version_id = 1, 816ff99aa64SAndrey Smetanin .needed = hyperv_stimer_enable_needed, 817ff99aa64SAndrey Smetanin .fields = (VMStateField[]) { 8185e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_config, X86CPU, 8195e953812SRoman Kagan HV_STIMER_COUNT), 8205e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_count, X86CPU, HV_STIMER_COUNT), 821ff99aa64SAndrey Smetanin VMSTATE_END_OF_LIST() 822ff99aa64SAndrey Smetanin } 823ff99aa64SAndrey Smetanin }; 824ff99aa64SAndrey Smetanin 825ba6a4fd9SVitaly Kuznetsov static bool hyperv_reenlightenment_enable_needed(void *opaque) 826ba6a4fd9SVitaly Kuznetsov { 827ba6a4fd9SVitaly Kuznetsov X86CPU *cpu = opaque; 828ba6a4fd9SVitaly Kuznetsov CPUX86State *env = &cpu->env; 829ba6a4fd9SVitaly Kuznetsov 830ba6a4fd9SVitaly Kuznetsov return env->msr_hv_reenlightenment_control != 0 || 831ba6a4fd9SVitaly Kuznetsov env->msr_hv_tsc_emulation_control != 0 || 832ba6a4fd9SVitaly Kuznetsov env->msr_hv_tsc_emulation_status != 0; 833ba6a4fd9SVitaly Kuznetsov } 834ba6a4fd9SVitaly Kuznetsov 835ba6a4fd9SVitaly Kuznetsov static const VMStateDescription vmstate_msr_hyperv_reenlightenment = { 836ba6a4fd9SVitaly Kuznetsov .name = "cpu/msr_hyperv_reenlightenment", 837ba6a4fd9SVitaly Kuznetsov .version_id = 1, 838ba6a4fd9SVitaly Kuznetsov .minimum_version_id = 1, 839ba6a4fd9SVitaly Kuznetsov .needed = hyperv_reenlightenment_enable_needed, 840ba6a4fd9SVitaly Kuznetsov .fields = (VMStateField[]) { 841ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_reenlightenment_control, X86CPU), 842ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_tsc_emulation_control, X86CPU), 843ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_tsc_emulation_status, X86CPU), 844ba6a4fd9SVitaly Kuznetsov VMSTATE_END_OF_LIST() 845ba6a4fd9SVitaly Kuznetsov } 846ba6a4fd9SVitaly Kuznetsov }; 847ba6a4fd9SVitaly Kuznetsov 8489aecd6f8SChao Peng static bool avx512_needed(void *opaque) 8499aecd6f8SChao Peng { 8509aecd6f8SChao Peng X86CPU *cpu = opaque; 8519aecd6f8SChao Peng CPUX86State *env = &cpu->env; 8529aecd6f8SChao Peng unsigned int i; 8539aecd6f8SChao Peng 8549aecd6f8SChao Peng for (i = 0; i < NB_OPMASK_REGS; i++) { 8559aecd6f8SChao Peng if (env->opmask_regs[i]) { 8569aecd6f8SChao Peng return true; 8579aecd6f8SChao Peng } 8589aecd6f8SChao Peng } 8599aecd6f8SChao Peng 8609aecd6f8SChao Peng for (i = 0; i < CPU_NB_REGS; i++) { 86119cbd87cSEduardo Habkost #define ENV_XMM(reg, field) (env->xmm_regs[reg].ZMM_Q(field)) 862b7711471SPaolo Bonzini if (ENV_XMM(i, 4) || ENV_XMM(i, 6) || 863b7711471SPaolo Bonzini ENV_XMM(i, 5) || ENV_XMM(i, 7)) { 8649aecd6f8SChao Peng return true; 8659aecd6f8SChao Peng } 8669aecd6f8SChao Peng #ifdef TARGET_X86_64 867b7711471SPaolo Bonzini if (ENV_XMM(i+16, 0) || ENV_XMM(i+16, 1) || 868b7711471SPaolo Bonzini ENV_XMM(i+16, 2) || ENV_XMM(i+16, 3) || 869b7711471SPaolo Bonzini ENV_XMM(i+16, 4) || ENV_XMM(i+16, 5) || 870b7711471SPaolo Bonzini ENV_XMM(i+16, 6) || ENV_XMM(i+16, 7)) { 8719aecd6f8SChao Peng return true; 8729aecd6f8SChao Peng } 8739aecd6f8SChao Peng #endif 8749aecd6f8SChao Peng } 8759aecd6f8SChao Peng 8769aecd6f8SChao Peng return false; 8779aecd6f8SChao Peng } 8789aecd6f8SChao Peng 8799aecd6f8SChao Peng static const VMStateDescription vmstate_avx512 = { 8809aecd6f8SChao Peng .name = "cpu/avx512", 8819aecd6f8SChao Peng .version_id = 1, 8829aecd6f8SChao Peng .minimum_version_id = 1, 8835cd8cadaSJuan Quintela .needed = avx512_needed, 8849aecd6f8SChao Peng .fields = (VMStateField[]) { 8859aecd6f8SChao Peng VMSTATE_UINT64_ARRAY(env.opmask_regs, X86CPU, NB_OPMASK_REGS), 886b7711471SPaolo Bonzini VMSTATE_ZMMH_REGS_VARS(env.xmm_regs, X86CPU, 0), 8879aecd6f8SChao Peng #ifdef TARGET_X86_64 888b7711471SPaolo Bonzini VMSTATE_Hi16_ZMM_REGS_VARS(env.xmm_regs, X86CPU, 16), 8899aecd6f8SChao Peng #endif 8909aecd6f8SChao Peng VMSTATE_END_OF_LIST() 8919aecd6f8SChao Peng } 8929aecd6f8SChao Peng }; 8939aecd6f8SChao Peng 89418cd2c17SWanpeng Li static bool xss_needed(void *opaque) 89518cd2c17SWanpeng Li { 89618cd2c17SWanpeng Li X86CPU *cpu = opaque; 89718cd2c17SWanpeng Li CPUX86State *env = &cpu->env; 89818cd2c17SWanpeng Li 89918cd2c17SWanpeng Li return env->xss != 0; 90018cd2c17SWanpeng Li } 90118cd2c17SWanpeng Li 90218cd2c17SWanpeng Li static const VMStateDescription vmstate_xss = { 90318cd2c17SWanpeng Li .name = "cpu/xss", 90418cd2c17SWanpeng Li .version_id = 1, 90518cd2c17SWanpeng Li .minimum_version_id = 1, 9065cd8cadaSJuan Quintela .needed = xss_needed, 90718cd2c17SWanpeng Li .fields = (VMStateField[]) { 90818cd2c17SWanpeng Li VMSTATE_UINT64(env.xss, X86CPU), 90918cd2c17SWanpeng Li VMSTATE_END_OF_LIST() 91018cd2c17SWanpeng Li } 91118cd2c17SWanpeng Li }; 91218cd2c17SWanpeng Li 913f74eefe0SHuaitong Han #ifdef TARGET_X86_64 914f74eefe0SHuaitong Han static bool pkru_needed(void *opaque) 915f74eefe0SHuaitong Han { 916f74eefe0SHuaitong Han X86CPU *cpu = opaque; 917f74eefe0SHuaitong Han CPUX86State *env = &cpu->env; 918f74eefe0SHuaitong Han 919f74eefe0SHuaitong Han return env->pkru != 0; 920f74eefe0SHuaitong Han } 921f74eefe0SHuaitong Han 922f74eefe0SHuaitong Han static const VMStateDescription vmstate_pkru = { 923f74eefe0SHuaitong Han .name = "cpu/pkru", 924f74eefe0SHuaitong Han .version_id = 1, 925f74eefe0SHuaitong Han .minimum_version_id = 1, 926f74eefe0SHuaitong Han .needed = pkru_needed, 927f74eefe0SHuaitong Han .fields = (VMStateField[]){ 928f74eefe0SHuaitong Han VMSTATE_UINT32(env.pkru, X86CPU), 929f74eefe0SHuaitong Han VMSTATE_END_OF_LIST() 930f74eefe0SHuaitong Han } 931f74eefe0SHuaitong Han }; 932f74eefe0SHuaitong Han #endif 933f74eefe0SHuaitong Han 93436f96c4bSHaozhong Zhang static bool tsc_khz_needed(void *opaque) 93536f96c4bSHaozhong Zhang { 93636f96c4bSHaozhong Zhang X86CPU *cpu = opaque; 93736f96c4bSHaozhong Zhang CPUX86State *env = &cpu->env; 93836f96c4bSHaozhong Zhang MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); 93936f96c4bSHaozhong Zhang PCMachineClass *pcmc = PC_MACHINE_CLASS(mc); 94036f96c4bSHaozhong Zhang return env->tsc_khz && pcmc->save_tsc_khz; 94136f96c4bSHaozhong Zhang } 94236f96c4bSHaozhong Zhang 94336f96c4bSHaozhong Zhang static const VMStateDescription vmstate_tsc_khz = { 94436f96c4bSHaozhong Zhang .name = "cpu/tsc_khz", 94536f96c4bSHaozhong Zhang .version_id = 1, 94636f96c4bSHaozhong Zhang .minimum_version_id = 1, 94736f96c4bSHaozhong Zhang .needed = tsc_khz_needed, 94836f96c4bSHaozhong Zhang .fields = (VMStateField[]) { 94936f96c4bSHaozhong Zhang VMSTATE_INT64(env.tsc_khz, X86CPU), 95036f96c4bSHaozhong Zhang VMSTATE_END_OF_LIST() 95136f96c4bSHaozhong Zhang } 95236f96c4bSHaozhong Zhang }; 95336f96c4bSHaozhong Zhang 954ebbfef2fSLiran Alon #ifdef CONFIG_KVM 955ebbfef2fSLiran Alon 956ebbfef2fSLiran Alon static bool vmx_vmcs12_needed(void *opaque) 957ebbfef2fSLiran Alon { 958ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 959ebbfef2fSLiran Alon return (nested_state->size > 960ebbfef2fSLiran Alon offsetof(struct kvm_nested_state, data.vmx[0].vmcs12)); 961ebbfef2fSLiran Alon } 962ebbfef2fSLiran Alon 963ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_vmcs12 = { 964ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx/vmcs12", 965ebbfef2fSLiran Alon .version_id = 1, 966ebbfef2fSLiran Alon .minimum_version_id = 1, 967ebbfef2fSLiran Alon .needed = vmx_vmcs12_needed, 968ebbfef2fSLiran Alon .fields = (VMStateField[]) { 969ebbfef2fSLiran Alon VMSTATE_UINT8_ARRAY(data.vmx[0].vmcs12, 970ebbfef2fSLiran Alon struct kvm_nested_state, 971ebbfef2fSLiran Alon KVM_STATE_NESTED_VMX_VMCS_SIZE), 972ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 973ebbfef2fSLiran Alon } 974ebbfef2fSLiran Alon }; 975ebbfef2fSLiran Alon 976ebbfef2fSLiran Alon static bool vmx_shadow_vmcs12_needed(void *opaque) 977ebbfef2fSLiran Alon { 978ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 979ebbfef2fSLiran Alon return (nested_state->size > 980ebbfef2fSLiran Alon offsetof(struct kvm_nested_state, data.vmx[0].shadow_vmcs12)); 981ebbfef2fSLiran Alon } 982ebbfef2fSLiran Alon 983ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_shadow_vmcs12 = { 984ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx/shadow_vmcs12", 985ebbfef2fSLiran Alon .version_id = 1, 986ebbfef2fSLiran Alon .minimum_version_id = 1, 987ebbfef2fSLiran Alon .needed = vmx_shadow_vmcs12_needed, 988ebbfef2fSLiran Alon .fields = (VMStateField[]) { 989ebbfef2fSLiran Alon VMSTATE_UINT8_ARRAY(data.vmx[0].shadow_vmcs12, 990ebbfef2fSLiran Alon struct kvm_nested_state, 991ebbfef2fSLiran Alon KVM_STATE_NESTED_VMX_VMCS_SIZE), 992ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 993ebbfef2fSLiran Alon } 994ebbfef2fSLiran Alon }; 995ebbfef2fSLiran Alon 996ebbfef2fSLiran Alon static bool vmx_nested_state_needed(void *opaque) 997ebbfef2fSLiran Alon { 998ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 999ebbfef2fSLiran Alon 1000*ec7b1bbdSLiran Alon return (nested_state->format == KVM_STATE_NESTED_FORMAT_VMX && 1001*ec7b1bbdSLiran Alon nested_state->hdr.vmx.vmxon_pa != -1ull); 1002ebbfef2fSLiran Alon } 1003ebbfef2fSLiran Alon 1004ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_nested_state = { 1005ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx", 1006ebbfef2fSLiran Alon .version_id = 1, 1007ebbfef2fSLiran Alon .minimum_version_id = 1, 1008ebbfef2fSLiran Alon .needed = vmx_nested_state_needed, 1009ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1010ebbfef2fSLiran Alon VMSTATE_U64(hdr.vmx.vmxon_pa, struct kvm_nested_state), 1011ebbfef2fSLiran Alon VMSTATE_U64(hdr.vmx.vmcs12_pa, struct kvm_nested_state), 1012ebbfef2fSLiran Alon VMSTATE_U16(hdr.vmx.smm.flags, struct kvm_nested_state), 1013ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1014ebbfef2fSLiran Alon }, 1015ebbfef2fSLiran Alon .subsections = (const VMStateDescription*[]) { 1016ebbfef2fSLiran Alon &vmstate_vmx_vmcs12, 1017ebbfef2fSLiran Alon &vmstate_vmx_shadow_vmcs12, 1018ebbfef2fSLiran Alon NULL, 1019ebbfef2fSLiran Alon } 1020ebbfef2fSLiran Alon }; 1021ebbfef2fSLiran Alon 1022ebbfef2fSLiran Alon static bool svm_nested_state_needed(void *opaque) 1023ebbfef2fSLiran Alon { 1024ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 1025ebbfef2fSLiran Alon 1026ebbfef2fSLiran Alon return (nested_state->format == KVM_STATE_NESTED_FORMAT_SVM); 1027ebbfef2fSLiran Alon } 1028ebbfef2fSLiran Alon 1029ebbfef2fSLiran Alon static const VMStateDescription vmstate_svm_nested_state = { 1030ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/svm", 1031ebbfef2fSLiran Alon .version_id = 1, 1032ebbfef2fSLiran Alon .minimum_version_id = 1, 1033ebbfef2fSLiran Alon .needed = svm_nested_state_needed, 1034ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1035ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1036ebbfef2fSLiran Alon } 1037ebbfef2fSLiran Alon }; 1038ebbfef2fSLiran Alon 1039ebbfef2fSLiran Alon static bool nested_state_needed(void *opaque) 1040ebbfef2fSLiran Alon { 1041ebbfef2fSLiran Alon X86CPU *cpu = opaque; 1042ebbfef2fSLiran Alon CPUX86State *env = &cpu->env; 1043ebbfef2fSLiran Alon 1044ebbfef2fSLiran Alon return (env->nested_state && 1045ebbfef2fSLiran Alon (vmx_nested_state_needed(env->nested_state) || 1046ebbfef2fSLiran Alon svm_nested_state_needed(env->nested_state))); 1047ebbfef2fSLiran Alon } 1048ebbfef2fSLiran Alon 1049ebbfef2fSLiran Alon static int nested_state_post_load(void *opaque, int version_id) 1050ebbfef2fSLiran Alon { 1051ebbfef2fSLiran Alon X86CPU *cpu = opaque; 1052ebbfef2fSLiran Alon CPUX86State *env = &cpu->env; 1053ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = env->nested_state; 1054ebbfef2fSLiran Alon int min_nested_state_len = offsetof(struct kvm_nested_state, data); 1055ebbfef2fSLiran Alon int max_nested_state_len = kvm_max_nested_state_length(); 1056ebbfef2fSLiran Alon 1057ebbfef2fSLiran Alon /* 1058ebbfef2fSLiran Alon * If our kernel don't support setting nested state 1059ebbfef2fSLiran Alon * and we have received nested state from migration stream, 1060ebbfef2fSLiran Alon * we need to fail migration 1061ebbfef2fSLiran Alon */ 1062ebbfef2fSLiran Alon if (max_nested_state_len <= 0) { 1063ebbfef2fSLiran Alon error_report("Received nested state when kernel cannot restore it"); 1064ebbfef2fSLiran Alon return -EINVAL; 1065ebbfef2fSLiran Alon } 1066ebbfef2fSLiran Alon 1067ebbfef2fSLiran Alon /* 1068ebbfef2fSLiran Alon * Verify that the size of received nested_state struct 1069ebbfef2fSLiran Alon * at least cover required header and is not larger 1070ebbfef2fSLiran Alon * than the max size that our kernel support 1071ebbfef2fSLiran Alon */ 1072ebbfef2fSLiran Alon if (nested_state->size < min_nested_state_len) { 1073ebbfef2fSLiran Alon error_report("Received nested state size less than min: " 1074ebbfef2fSLiran Alon "len=%d, min=%d", 1075ebbfef2fSLiran Alon nested_state->size, min_nested_state_len); 1076ebbfef2fSLiran Alon return -EINVAL; 1077ebbfef2fSLiran Alon } 1078ebbfef2fSLiran Alon if (nested_state->size > max_nested_state_len) { 1079ebbfef2fSLiran Alon error_report("Recieved unsupported nested state size: " 1080ebbfef2fSLiran Alon "nested_state->size=%d, max=%d", 1081ebbfef2fSLiran Alon nested_state->size, max_nested_state_len); 1082ebbfef2fSLiran Alon return -EINVAL; 1083ebbfef2fSLiran Alon } 1084ebbfef2fSLiran Alon 1085ebbfef2fSLiran Alon /* Verify format is valid */ 1086ebbfef2fSLiran Alon if ((nested_state->format != KVM_STATE_NESTED_FORMAT_VMX) && 1087ebbfef2fSLiran Alon (nested_state->format != KVM_STATE_NESTED_FORMAT_SVM)) { 1088ebbfef2fSLiran Alon error_report("Received invalid nested state format: %d", 1089ebbfef2fSLiran Alon nested_state->format); 1090ebbfef2fSLiran Alon return -EINVAL; 1091ebbfef2fSLiran Alon } 1092ebbfef2fSLiran Alon 1093ebbfef2fSLiran Alon return 0; 1094ebbfef2fSLiran Alon } 1095ebbfef2fSLiran Alon 1096ebbfef2fSLiran Alon static const VMStateDescription vmstate_kvm_nested_state = { 1097ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state", 1098ebbfef2fSLiran Alon .version_id = 1, 1099ebbfef2fSLiran Alon .minimum_version_id = 1, 1100ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1101ebbfef2fSLiran Alon VMSTATE_U16(flags, struct kvm_nested_state), 1102ebbfef2fSLiran Alon VMSTATE_U16(format, struct kvm_nested_state), 1103ebbfef2fSLiran Alon VMSTATE_U32(size, struct kvm_nested_state), 1104ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1105ebbfef2fSLiran Alon }, 1106ebbfef2fSLiran Alon .subsections = (const VMStateDescription*[]) { 1107ebbfef2fSLiran Alon &vmstate_vmx_nested_state, 1108ebbfef2fSLiran Alon &vmstate_svm_nested_state, 1109ebbfef2fSLiran Alon NULL 1110ebbfef2fSLiran Alon } 1111ebbfef2fSLiran Alon }; 1112ebbfef2fSLiran Alon 1113ebbfef2fSLiran Alon static const VMStateDescription vmstate_nested_state = { 1114ebbfef2fSLiran Alon .name = "cpu/nested_state", 1115ebbfef2fSLiran Alon .version_id = 1, 1116ebbfef2fSLiran Alon .minimum_version_id = 1, 1117ebbfef2fSLiran Alon .needed = nested_state_needed, 1118ebbfef2fSLiran Alon .post_load = nested_state_post_load, 1119ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1120ebbfef2fSLiran Alon VMSTATE_STRUCT_POINTER(env.nested_state, X86CPU, 1121ebbfef2fSLiran Alon vmstate_kvm_nested_state, 1122ebbfef2fSLiran Alon struct kvm_nested_state), 1123ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1124ebbfef2fSLiran Alon } 1125ebbfef2fSLiran Alon }; 1126ebbfef2fSLiran Alon 1127ebbfef2fSLiran Alon #endif 1128ebbfef2fSLiran Alon 112987f8b626SAshok Raj static bool mcg_ext_ctl_needed(void *opaque) 113087f8b626SAshok Raj { 113187f8b626SAshok Raj X86CPU *cpu = opaque; 113287f8b626SAshok Raj CPUX86State *env = &cpu->env; 113387f8b626SAshok Raj return cpu->enable_lmce && env->mcg_ext_ctl; 113487f8b626SAshok Raj } 113587f8b626SAshok Raj 113687f8b626SAshok Raj static const VMStateDescription vmstate_mcg_ext_ctl = { 113787f8b626SAshok Raj .name = "cpu/mcg_ext_ctl", 113887f8b626SAshok Raj .version_id = 1, 113987f8b626SAshok Raj .minimum_version_id = 1, 114087f8b626SAshok Raj .needed = mcg_ext_ctl_needed, 114187f8b626SAshok Raj .fields = (VMStateField[]) { 114287f8b626SAshok Raj VMSTATE_UINT64(env.mcg_ext_ctl, X86CPU), 114387f8b626SAshok Raj VMSTATE_END_OF_LIST() 114487f8b626SAshok Raj } 114587f8b626SAshok Raj }; 114687f8b626SAshok Raj 1147a33a2cfeSPaolo Bonzini static bool spec_ctrl_needed(void *opaque) 1148a33a2cfeSPaolo Bonzini { 1149a33a2cfeSPaolo Bonzini X86CPU *cpu = opaque; 1150a33a2cfeSPaolo Bonzini CPUX86State *env = &cpu->env; 1151a33a2cfeSPaolo Bonzini 1152a33a2cfeSPaolo Bonzini return env->spec_ctrl != 0; 1153a33a2cfeSPaolo Bonzini } 1154a33a2cfeSPaolo Bonzini 1155a33a2cfeSPaolo Bonzini static const VMStateDescription vmstate_spec_ctrl = { 1156a33a2cfeSPaolo Bonzini .name = "cpu/spec_ctrl", 1157a33a2cfeSPaolo Bonzini .version_id = 1, 1158a33a2cfeSPaolo Bonzini .minimum_version_id = 1, 1159a33a2cfeSPaolo Bonzini .needed = spec_ctrl_needed, 1160a33a2cfeSPaolo Bonzini .fields = (VMStateField[]){ 1161a33a2cfeSPaolo Bonzini VMSTATE_UINT64(env.spec_ctrl, X86CPU), 1162a33a2cfeSPaolo Bonzini VMSTATE_END_OF_LIST() 1163a33a2cfeSPaolo Bonzini } 1164a33a2cfeSPaolo Bonzini }; 1165a33a2cfeSPaolo Bonzini 1166b77146e9SChao Peng static bool intel_pt_enable_needed(void *opaque) 1167b77146e9SChao Peng { 1168b77146e9SChao Peng X86CPU *cpu = opaque; 1169b77146e9SChao Peng CPUX86State *env = &cpu->env; 1170b77146e9SChao Peng int i; 1171b77146e9SChao Peng 1172b77146e9SChao Peng if (env->msr_rtit_ctrl || env->msr_rtit_status || 1173b77146e9SChao Peng env->msr_rtit_output_base || env->msr_rtit_output_mask || 1174b77146e9SChao Peng env->msr_rtit_cr3_match) { 1175b77146e9SChao Peng return true; 1176b77146e9SChao Peng } 1177b77146e9SChao Peng 1178b77146e9SChao Peng for (i = 0; i < MAX_RTIT_ADDRS; i++) { 1179b77146e9SChao Peng if (env->msr_rtit_addrs[i]) { 1180b77146e9SChao Peng return true; 1181b77146e9SChao Peng } 1182b77146e9SChao Peng } 1183b77146e9SChao Peng 1184b77146e9SChao Peng return false; 1185b77146e9SChao Peng } 1186b77146e9SChao Peng 1187b77146e9SChao Peng static const VMStateDescription vmstate_msr_intel_pt = { 1188b77146e9SChao Peng .name = "cpu/intel_pt", 1189b77146e9SChao Peng .version_id = 1, 1190b77146e9SChao Peng .minimum_version_id = 1, 1191b77146e9SChao Peng .needed = intel_pt_enable_needed, 1192b77146e9SChao Peng .fields = (VMStateField[]) { 1193b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_ctrl, X86CPU), 1194b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_status, X86CPU), 1195b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_output_base, X86CPU), 1196b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_output_mask, X86CPU), 1197b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_cr3_match, X86CPU), 1198b77146e9SChao Peng VMSTATE_UINT64_ARRAY(env.msr_rtit_addrs, X86CPU, MAX_RTIT_ADDRS), 1199b77146e9SChao Peng VMSTATE_END_OF_LIST() 1200b77146e9SChao Peng } 1201b77146e9SChao Peng }; 1202b77146e9SChao Peng 1203cfeea0c0SKonrad Rzeszutek Wilk static bool virt_ssbd_needed(void *opaque) 1204cfeea0c0SKonrad Rzeszutek Wilk { 1205cfeea0c0SKonrad Rzeszutek Wilk X86CPU *cpu = opaque; 1206cfeea0c0SKonrad Rzeszutek Wilk CPUX86State *env = &cpu->env; 1207cfeea0c0SKonrad Rzeszutek Wilk 1208cfeea0c0SKonrad Rzeszutek Wilk return env->virt_ssbd != 0; 1209cfeea0c0SKonrad Rzeszutek Wilk } 1210cfeea0c0SKonrad Rzeszutek Wilk 1211cfeea0c0SKonrad Rzeszutek Wilk static const VMStateDescription vmstate_msr_virt_ssbd = { 1212cfeea0c0SKonrad Rzeszutek Wilk .name = "cpu/virt_ssbd", 1213cfeea0c0SKonrad Rzeszutek Wilk .version_id = 1, 1214cfeea0c0SKonrad Rzeszutek Wilk .minimum_version_id = 1, 1215cfeea0c0SKonrad Rzeszutek Wilk .needed = virt_ssbd_needed, 1216cfeea0c0SKonrad Rzeszutek Wilk .fields = (VMStateField[]){ 1217cfeea0c0SKonrad Rzeszutek Wilk VMSTATE_UINT64(env.virt_ssbd, X86CPU), 1218cfeea0c0SKonrad Rzeszutek Wilk VMSTATE_END_OF_LIST() 1219cfeea0c0SKonrad Rzeszutek Wilk } 1220cfeea0c0SKonrad Rzeszutek Wilk }; 1221cfeea0c0SKonrad Rzeszutek Wilk 1222fe441054SJan Kiszka static bool svm_npt_needed(void *opaque) 1223fe441054SJan Kiszka { 1224fe441054SJan Kiszka X86CPU *cpu = opaque; 1225fe441054SJan Kiszka CPUX86State *env = &cpu->env; 1226fe441054SJan Kiszka 1227fe441054SJan Kiszka return !!(env->hflags2 & HF2_NPT_MASK); 1228fe441054SJan Kiszka } 1229fe441054SJan Kiszka 1230fe441054SJan Kiszka static const VMStateDescription vmstate_svm_npt = { 1231fe441054SJan Kiszka .name = "cpu/svn_npt", 1232fe441054SJan Kiszka .version_id = 1, 1233fe441054SJan Kiszka .minimum_version_id = 1, 1234fe441054SJan Kiszka .needed = svm_npt_needed, 1235fe441054SJan Kiszka .fields = (VMStateField[]){ 1236fe441054SJan Kiszka VMSTATE_UINT64(env.nested_cr3, X86CPU), 1237fe441054SJan Kiszka VMSTATE_UINT32(env.nested_pg_mode, X86CPU), 1238fe441054SJan Kiszka VMSTATE_END_OF_LIST() 1239fe441054SJan Kiszka } 1240fe441054SJan Kiszka }; 1241fe441054SJan Kiszka 124289a44a10SPavel Dovgalyuk #ifndef TARGET_X86_64 124389a44a10SPavel Dovgalyuk static bool intel_efer32_needed(void *opaque) 124489a44a10SPavel Dovgalyuk { 124589a44a10SPavel Dovgalyuk X86CPU *cpu = opaque; 124689a44a10SPavel Dovgalyuk CPUX86State *env = &cpu->env; 124789a44a10SPavel Dovgalyuk 124889a44a10SPavel Dovgalyuk return env->efer != 0; 124989a44a10SPavel Dovgalyuk } 125089a44a10SPavel Dovgalyuk 125189a44a10SPavel Dovgalyuk static const VMStateDescription vmstate_efer32 = { 125289a44a10SPavel Dovgalyuk .name = "cpu/efer32", 125389a44a10SPavel Dovgalyuk .version_id = 1, 125489a44a10SPavel Dovgalyuk .minimum_version_id = 1, 125589a44a10SPavel Dovgalyuk .needed = intel_efer32_needed, 125689a44a10SPavel Dovgalyuk .fields = (VMStateField[]) { 125789a44a10SPavel Dovgalyuk VMSTATE_UINT64(env.efer, X86CPU), 125889a44a10SPavel Dovgalyuk VMSTATE_END_OF_LIST() 125989a44a10SPavel Dovgalyuk } 126089a44a10SPavel Dovgalyuk }; 126189a44a10SPavel Dovgalyuk #endif 126289a44a10SPavel Dovgalyuk 126368bfd0adSMarcelo Tosatti VMStateDescription vmstate_x86_cpu = { 12640cb892aaSJuan Quintela .name = "cpu", 1265f56e3a14SAndreas Färber .version_id = 12, 126608b277acSDr. David Alan Gilbert .minimum_version_id = 11, 12670cb892aaSJuan Quintela .pre_save = cpu_pre_save, 12680cb892aaSJuan Quintela .post_load = cpu_post_load, 12690cb892aaSJuan Quintela .fields = (VMStateField[]) { 1270f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.regs, X86CPU, CPU_NB_REGS), 1271f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eip, X86CPU), 1272f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eflags, X86CPU), 1273f56e3a14SAndreas Färber VMSTATE_UINT32(env.hflags, X86CPU), 12740cb892aaSJuan Quintela /* FPU */ 1275f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpuc, X86CPU), 1276f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpus_vmstate, X86CPU), 1277f56e3a14SAndreas Färber VMSTATE_UINT16(env.fptag_vmstate, X86CPU), 1278f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpregs_format_vmstate, X86CPU), 127946baa900SDr. David Alan Gilbert 128046baa900SDr. David Alan Gilbert VMSTATE_STRUCT_ARRAY(env.fpregs, X86CPU, 8, 0, vmstate_fpreg, FPReg), 12818dd3dca3Saurel32 1282f56e3a14SAndreas Färber VMSTATE_SEGMENT_ARRAY(env.segs, X86CPU, 6), 1283f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.ldt, X86CPU), 1284f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.tr, X86CPU), 1285f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.gdt, X86CPU), 1286f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.idt, X86CPU), 1287468f6581SJuan Quintela 1288f56e3a14SAndreas Färber VMSTATE_UINT32(env.sysenter_cs, X86CPU), 1289f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_esp, X86CPU), 1290f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_eip, X86CPU), 12918dd3dca3Saurel32 1292f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[0], X86CPU), 1293f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[2], X86CPU), 1294f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[3], X86CPU), 1295f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[4], X86CPU), 1296f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.dr, X86CPU, 8), 12970cb892aaSJuan Quintela /* MMU */ 1298f56e3a14SAndreas Färber VMSTATE_INT32(env.a20_mask, X86CPU), 12990cb892aaSJuan Quintela /* XMM */ 1300f56e3a14SAndreas Färber VMSTATE_UINT32(env.mxcsr, X86CPU), 1301a03c3e90SPaolo Bonzini VMSTATE_XMM_REGS(env.xmm_regs, X86CPU, 0), 13028dd3dca3Saurel32 13038dd3dca3Saurel32 #ifdef TARGET_X86_64 1304f56e3a14SAndreas Färber VMSTATE_UINT64(env.efer, X86CPU), 1305f56e3a14SAndreas Färber VMSTATE_UINT64(env.star, X86CPU), 1306f56e3a14SAndreas Färber VMSTATE_UINT64(env.lstar, X86CPU), 1307f56e3a14SAndreas Färber VMSTATE_UINT64(env.cstar, X86CPU), 1308f56e3a14SAndreas Färber VMSTATE_UINT64(env.fmask, X86CPU), 1309f56e3a14SAndreas Färber VMSTATE_UINT64(env.kernelgsbase, X86CPU), 13108dd3dca3Saurel32 #endif 131108b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.smbase, X86CPU), 13128dd3dca3Saurel32 131308b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.pat, X86CPU), 131408b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.hflags2, X86CPU), 1315dd5e3b17Saliguori 131608b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.vm_hsave, X86CPU), 131708b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.vm_vmcb, X86CPU), 131808b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc_offset, X86CPU), 131908b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.intercept, X86CPU), 132008b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_cr_read, X86CPU), 132108b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_cr_write, X86CPU), 132208b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_dr_read, X86CPU), 132308b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_dr_write, X86CPU), 132408b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.intercept_exceptions, X86CPU), 132508b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.v_tpr, X86CPU), 1326dd5e3b17Saliguori /* MTRRs */ 132708b277acSDr. David Alan Gilbert VMSTATE_UINT64_ARRAY(env.mtrr_fixed, X86CPU, 11), 132808b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mtrr_deftype, X86CPU), 1329d8b5c67bSAlex Williamson VMSTATE_MTRR_VARS(env.mtrr_var, X86CPU, MSR_MTRRcap_VCNT, 8), 13300cb892aaSJuan Quintela /* KVM-related states */ 133108b277acSDr. David Alan Gilbert VMSTATE_INT32(env.interrupt_injected, X86CPU), 133208b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.mp_state, X86CPU), 133308b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc, X86CPU), 1334fd13f23bSLiran Alon VMSTATE_INT32(env.exception_nr, X86CPU), 133508b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.soft_interrupt, X86CPU), 133608b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.nmi_injected, X86CPU), 133708b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.nmi_pending, X86CPU), 133808b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.has_error_code, X86CPU), 133908b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.sipi_vector, X86CPU), 13400cb892aaSJuan Quintela /* MCE */ 134108b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_cap, X86CPU), 134208b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_status, X86CPU), 134308b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_ctl, X86CPU), 134408b277acSDr. David Alan Gilbert VMSTATE_UINT64_ARRAY(env.mce_banks, X86CPU, MCE_BANKS_DEF * 4), 13450cb892aaSJuan Quintela /* rdtscp */ 134608b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc_aux, X86CPU), 13471a03675dSGlauber Costa /* KVM pvclock msr */ 134808b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.system_time_msr, X86CPU), 134908b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.wall_clock_msr, X86CPU), 1350f1665b21SSheng Yang /* XSAVE related fields */ 1351f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xcr0, X86CPU, 12), 1352f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xstate_bv, X86CPU, 12), 1353b7711471SPaolo Bonzini VMSTATE_YMMH_REGS_VARS(env.xmm_regs, X86CPU, 0, 12), 13540cb892aaSJuan Quintela VMSTATE_END_OF_LIST() 1355a0fb002cSJan Kiszka /* The above list is not sorted /wrt version numbers, watch out! */ 1356f6584ee2SGleb Natapov }, 13575cd8cadaSJuan Quintela .subsections = (const VMStateDescription*[]) { 1358fd13f23bSLiran Alon &vmstate_exception_info, 13595cd8cadaSJuan Quintela &vmstate_async_pf_msr, 13605cd8cadaSJuan Quintela &vmstate_pv_eoi_msr, 13615cd8cadaSJuan Quintela &vmstate_steal_time_msr, 13625cd8cadaSJuan Quintela &vmstate_fpop_ip_dp, 13635cd8cadaSJuan Quintela &vmstate_msr_tsc_adjust, 13645cd8cadaSJuan Quintela &vmstate_msr_tscdeadline, 13655cd8cadaSJuan Quintela &vmstate_msr_ia32_misc_enable, 13665cd8cadaSJuan Quintela &vmstate_msr_ia32_feature_control, 13675cd8cadaSJuan Quintela &vmstate_msr_architectural_pmu, 13685cd8cadaSJuan Quintela &vmstate_mpx, 13695cd8cadaSJuan Quintela &vmstate_msr_hypercall_hypercall, 13705cd8cadaSJuan Quintela &vmstate_msr_hyperv_vapic, 13715cd8cadaSJuan Quintela &vmstate_msr_hyperv_time, 1372f2a53c9eSAndrey Smetanin &vmstate_msr_hyperv_crash, 137346eb8f98SAndrey Smetanin &vmstate_msr_hyperv_runtime, 1374866eea9aSAndrey Smetanin &vmstate_msr_hyperv_synic, 1375ff99aa64SAndrey Smetanin &vmstate_msr_hyperv_stimer, 1376ba6a4fd9SVitaly Kuznetsov &vmstate_msr_hyperv_reenlightenment, 13775cd8cadaSJuan Quintela &vmstate_avx512, 13785cd8cadaSJuan Quintela &vmstate_xss, 137936f96c4bSHaozhong Zhang &vmstate_tsc_khz, 1380e13713dbSLiran Alon &vmstate_msr_smi_count, 1381f74eefe0SHuaitong Han #ifdef TARGET_X86_64 1382f74eefe0SHuaitong Han &vmstate_pkru, 1383f74eefe0SHuaitong Han #endif 1384a33a2cfeSPaolo Bonzini &vmstate_spec_ctrl, 138587f8b626SAshok Raj &vmstate_mcg_ext_ctl, 1386b77146e9SChao Peng &vmstate_msr_intel_pt, 1387cfeea0c0SKonrad Rzeszutek Wilk &vmstate_msr_virt_ssbd, 1388fe441054SJan Kiszka &vmstate_svm_npt, 138989a44a10SPavel Dovgalyuk #ifndef TARGET_X86_64 139089a44a10SPavel Dovgalyuk &vmstate_efer32, 139189a44a10SPavel Dovgalyuk #endif 1392ebbfef2fSLiran Alon #ifdef CONFIG_KVM 1393ebbfef2fSLiran Alon &vmstate_nested_state, 1394ebbfef2fSLiran Alon #endif 13955cd8cadaSJuan Quintela NULL 1396dd5e3b17Saliguori } 13970cb892aaSJuan Quintela }; 1398