1b6a0aa05SPeter Maydell #include "qemu/osdep.h" 233c11879SPaolo Bonzini #include "cpu.h" 363c91552SPaolo Bonzini #include "exec/exec-all.h" 40d09e41aSPaolo Bonzini #include "hw/isa/isa.h" 51e00b8d5SPaolo Bonzini #include "migration/cpu.h" 6a9dc68d9SClaudio Fontana #include "kvm/hyperv.h" 789a289c7SPaolo Bonzini #include "hw/i386/x86.h" 8a9dc68d9SClaudio Fontana #include "kvm/kvm_i386.h" 98dd3dca3Saurel32 109c17d615SPaolo Bonzini #include "sysemu/kvm.h" 1114a48c1dSMarkus Armbruster #include "sysemu/tcg.h" 128dd3dca3Saurel32 1336f96c4bSHaozhong Zhang #include "qemu/error-report.h" 1436f96c4bSHaozhong Zhang 1566e6d55bSJuan Quintela static const VMStateDescription vmstate_segment = { 1666e6d55bSJuan Quintela .name = "segment", 1766e6d55bSJuan Quintela .version_id = 1, 1866e6d55bSJuan Quintela .minimum_version_id = 1, 1966e6d55bSJuan Quintela .fields = (VMStateField[]) { 2066e6d55bSJuan Quintela VMSTATE_UINT32(selector, SegmentCache), 2166e6d55bSJuan Quintela VMSTATE_UINTTL(base, SegmentCache), 2266e6d55bSJuan Quintela VMSTATE_UINT32(limit, SegmentCache), 2366e6d55bSJuan Quintela VMSTATE_UINT32(flags, SegmentCache), 2466e6d55bSJuan Quintela VMSTATE_END_OF_LIST() 2566e6d55bSJuan Quintela } 2666e6d55bSJuan Quintela }; 2766e6d55bSJuan Quintela 280cb892aaSJuan Quintela #define VMSTATE_SEGMENT(_field, _state) { \ 290cb892aaSJuan Quintela .name = (stringify(_field)), \ 300cb892aaSJuan Quintela .size = sizeof(SegmentCache), \ 310cb892aaSJuan Quintela .vmsd = &vmstate_segment, \ 320cb892aaSJuan Quintela .flags = VMS_STRUCT, \ 330cb892aaSJuan Quintela .offset = offsetof(_state, _field) \ 340cb892aaSJuan Quintela + type_check(SegmentCache,typeof_field(_state, _field)) \ 358dd3dca3Saurel32 } 368dd3dca3Saurel32 370cb892aaSJuan Quintela #define VMSTATE_SEGMENT_ARRAY(_field, _state, _n) \ 380cb892aaSJuan Quintela VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_segment, SegmentCache) 398dd3dca3Saurel32 40fc3b0aa2SJuan Quintela static const VMStateDescription vmstate_xmm_reg = { 41fc3b0aa2SJuan Quintela .name = "xmm_reg", 42fc3b0aa2SJuan Quintela .version_id = 1, 43fc3b0aa2SJuan Quintela .minimum_version_id = 1, 44fc3b0aa2SJuan Quintela .fields = (VMStateField[]) { 4519cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(0), ZMMReg), 4619cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(1), ZMMReg), 47fc3b0aa2SJuan Quintela VMSTATE_END_OF_LIST() 48fc3b0aa2SJuan Quintela } 49fc3b0aa2SJuan Quintela }; 50fc3b0aa2SJuan Quintela 51a03c3e90SPaolo Bonzini #define VMSTATE_XMM_REGS(_field, _state, _start) \ 52a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 53fa451874SEduardo Habkost vmstate_xmm_reg, ZMMReg) 54fc3b0aa2SJuan Quintela 55b7711471SPaolo Bonzini /* YMMH format is the same as XMM, but for bits 128-255 */ 56f1665b21SSheng Yang static const VMStateDescription vmstate_ymmh_reg = { 57f1665b21SSheng Yang .name = "ymmh_reg", 58f1665b21SSheng Yang .version_id = 1, 59f1665b21SSheng Yang .minimum_version_id = 1, 60f1665b21SSheng Yang .fields = (VMStateField[]) { 6119cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(2), ZMMReg), 6219cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(3), ZMMReg), 63f1665b21SSheng Yang VMSTATE_END_OF_LIST() 64f1665b21SSheng Yang } 65f1665b21SSheng Yang }; 66f1665b21SSheng Yang 67a03c3e90SPaolo Bonzini #define VMSTATE_YMMH_REGS_VARS(_field, _state, _start, _v) \ 68a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, _v, \ 69fa451874SEduardo Habkost vmstate_ymmh_reg, ZMMReg) 70f1665b21SSheng Yang 719aecd6f8SChao Peng static const VMStateDescription vmstate_zmmh_reg = { 729aecd6f8SChao Peng .name = "zmmh_reg", 739aecd6f8SChao Peng .version_id = 1, 749aecd6f8SChao Peng .minimum_version_id = 1, 759aecd6f8SChao Peng .fields = (VMStateField[]) { 7619cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(4), ZMMReg), 7719cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(5), ZMMReg), 7819cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(6), ZMMReg), 7919cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(7), ZMMReg), 809aecd6f8SChao Peng VMSTATE_END_OF_LIST() 819aecd6f8SChao Peng } 829aecd6f8SChao Peng }; 839aecd6f8SChao Peng 84a03c3e90SPaolo Bonzini #define VMSTATE_ZMMH_REGS_VARS(_field, _state, _start) \ 85a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 86fa451874SEduardo Habkost vmstate_zmmh_reg, ZMMReg) 879aecd6f8SChao Peng 889aecd6f8SChao Peng #ifdef TARGET_X86_64 899aecd6f8SChao Peng static const VMStateDescription vmstate_hi16_zmm_reg = { 909aecd6f8SChao Peng .name = "hi16_zmm_reg", 919aecd6f8SChao Peng .version_id = 1, 929aecd6f8SChao Peng .minimum_version_id = 1, 939aecd6f8SChao Peng .fields = (VMStateField[]) { 9419cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(0), ZMMReg), 9519cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(1), ZMMReg), 9619cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(2), ZMMReg), 9719cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(3), ZMMReg), 9819cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(4), ZMMReg), 9919cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(5), ZMMReg), 10019cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(6), ZMMReg), 10119cbd87cSEduardo Habkost VMSTATE_UINT64(ZMM_Q(7), ZMMReg), 1029aecd6f8SChao Peng VMSTATE_END_OF_LIST() 1039aecd6f8SChao Peng } 1049aecd6f8SChao Peng }; 1059aecd6f8SChao Peng 106a03c3e90SPaolo Bonzini #define VMSTATE_Hi16_ZMM_REGS_VARS(_field, _state, _start) \ 107a03c3e90SPaolo Bonzini VMSTATE_STRUCT_SUB_ARRAY(_field, _state, _start, CPU_NB_REGS, 0, \ 108fa451874SEduardo Habkost vmstate_hi16_zmm_reg, ZMMReg) 1099aecd6f8SChao Peng #endif 1109aecd6f8SChao Peng 11179e9ebebSLiu Jinsong static const VMStateDescription vmstate_bnd_regs = { 11279e9ebebSLiu Jinsong .name = "bnd_regs", 11379e9ebebSLiu Jinsong .version_id = 1, 11479e9ebebSLiu Jinsong .minimum_version_id = 1, 11579e9ebebSLiu Jinsong .fields = (VMStateField[]) { 11679e9ebebSLiu Jinsong VMSTATE_UINT64(lb, BNDReg), 11779e9ebebSLiu Jinsong VMSTATE_UINT64(ub, BNDReg), 11879e9ebebSLiu Jinsong VMSTATE_END_OF_LIST() 11979e9ebebSLiu Jinsong } 12079e9ebebSLiu Jinsong }; 12179e9ebebSLiu Jinsong 12279e9ebebSLiu Jinsong #define VMSTATE_BND_REGS(_field, _state, _n) \ 12379e9ebebSLiu Jinsong VMSTATE_STRUCT_ARRAY(_field, _state, _n, 0, vmstate_bnd_regs, BNDReg) 12479e9ebebSLiu Jinsong 125216c07c3SJuan Quintela static const VMStateDescription vmstate_mtrr_var = { 126216c07c3SJuan Quintela .name = "mtrr_var", 127216c07c3SJuan Quintela .version_id = 1, 128216c07c3SJuan Quintela .minimum_version_id = 1, 129216c07c3SJuan Quintela .fields = (VMStateField[]) { 130216c07c3SJuan Quintela VMSTATE_UINT64(base, MTRRVar), 131216c07c3SJuan Quintela VMSTATE_UINT64(mask, MTRRVar), 132216c07c3SJuan Quintela VMSTATE_END_OF_LIST() 133216c07c3SJuan Quintela } 134216c07c3SJuan Quintela }; 135216c07c3SJuan Quintela 1360cb892aaSJuan Quintela #define VMSTATE_MTRR_VARS(_field, _state, _n, _v) \ 1370cb892aaSJuan Quintela VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_mtrr_var, MTRRVar) 138216c07c3SJuan Quintela 139f2e7c2fcSYang Weijiang static const VMStateDescription vmstate_lbr_records_var = { 140f2e7c2fcSYang Weijiang .name = "lbr_records_var", 141f2e7c2fcSYang Weijiang .version_id = 1, 142f2e7c2fcSYang Weijiang .minimum_version_id = 1, 143f2e7c2fcSYang Weijiang .fields = (VMStateField[]) { 144f2e7c2fcSYang Weijiang VMSTATE_UINT64(from, LBREntry), 145f2e7c2fcSYang Weijiang VMSTATE_UINT64(to, LBREntry), 146f2e7c2fcSYang Weijiang VMSTATE_UINT64(info, LBREntry), 147f2e7c2fcSYang Weijiang VMSTATE_END_OF_LIST() 148f2e7c2fcSYang Weijiang } 149f2e7c2fcSYang Weijiang }; 150f2e7c2fcSYang Weijiang 151f2e7c2fcSYang Weijiang #define VMSTATE_LBR_VARS(_field, _state, _n, _v) \ 152f2e7c2fcSYang Weijiang VMSTATE_STRUCT_ARRAY(_field, _state, _n, _v, vmstate_lbr_records_var, \ 153f2e7c2fcSYang Weijiang LBREntry) 154f2e7c2fcSYang Weijiang 155ab808276SDr. David Alan Gilbert typedef struct x86_FPReg_tmp { 156ab808276SDr. David Alan Gilbert FPReg *parent; 157ab808276SDr. David Alan Gilbert uint64_t tmp_mant; 158ab808276SDr. David Alan Gilbert uint16_t tmp_exp; 159ab808276SDr. David Alan Gilbert } x86_FPReg_tmp; 1603c8ce630SJuan Quintela 161db573d2cSYang Zhong static void cpu_get_fp80(uint64_t *pmant, uint16_t *pexp, floatx80 f) 162db573d2cSYang Zhong { 163db573d2cSYang Zhong CPU_LDoubleU temp; 164db573d2cSYang Zhong 165db573d2cSYang Zhong temp.d = f; 166db573d2cSYang Zhong *pmant = temp.l.lower; 167db573d2cSYang Zhong *pexp = temp.l.upper; 168db573d2cSYang Zhong } 169db573d2cSYang Zhong 170db573d2cSYang Zhong static floatx80 cpu_set_fp80(uint64_t mant, uint16_t upper) 171db573d2cSYang Zhong { 172db573d2cSYang Zhong CPU_LDoubleU temp; 173db573d2cSYang Zhong 174db573d2cSYang Zhong temp.l.upper = upper; 175db573d2cSYang Zhong temp.l.lower = mant; 176db573d2cSYang Zhong return temp.d; 177db573d2cSYang Zhong } 178db573d2cSYang Zhong 17944b1ff31SDr. David Alan Gilbert static int fpreg_pre_save(void *opaque) 1803c8ce630SJuan Quintela { 181ab808276SDr. David Alan Gilbert x86_FPReg_tmp *tmp = opaque; 182ab808276SDr. David Alan Gilbert 1833c8ce630SJuan Quintela /* we save the real CPU data (in case of MMX usage only 'mant' 1843c8ce630SJuan Quintela contains the MMX register */ 185ab808276SDr. David Alan Gilbert cpu_get_fp80(&tmp->tmp_mant, &tmp->tmp_exp, tmp->parent->d); 18644b1ff31SDr. David Alan Gilbert 18744b1ff31SDr. David Alan Gilbert return 0; 188ab808276SDr. David Alan Gilbert } 1892c21ee76SJianjun Duan 190ab808276SDr. David Alan Gilbert static int fpreg_post_load(void *opaque, int version) 191ab808276SDr. David Alan Gilbert { 192ab808276SDr. David Alan Gilbert x86_FPReg_tmp *tmp = opaque; 193ab808276SDr. David Alan Gilbert 194ab808276SDr. David Alan Gilbert tmp->parent->d = cpu_set_fp80(tmp->tmp_mant, tmp->tmp_exp); 1952c21ee76SJianjun Duan return 0; 1963c8ce630SJuan Quintela } 1973c8ce630SJuan Quintela 198ab808276SDr. David Alan Gilbert static const VMStateDescription vmstate_fpreg_tmp = { 199ab808276SDr. David Alan Gilbert .name = "fpreg_tmp", 200ab808276SDr. David Alan Gilbert .post_load = fpreg_post_load, 201ab808276SDr. David Alan Gilbert .pre_save = fpreg_pre_save, 202ab808276SDr. David Alan Gilbert .fields = (VMStateField[]) { 203ab808276SDr. David Alan Gilbert VMSTATE_UINT64(tmp_mant, x86_FPReg_tmp), 204ab808276SDr. David Alan Gilbert VMSTATE_UINT16(tmp_exp, x86_FPReg_tmp), 205ab808276SDr. David Alan Gilbert VMSTATE_END_OF_LIST() 206ab808276SDr. David Alan Gilbert } 207ab808276SDr. David Alan Gilbert }; 208ab808276SDr. David Alan Gilbert 209ab808276SDr. David Alan Gilbert static const VMStateDescription vmstate_fpreg = { 2100cb892aaSJuan Quintela .name = "fpreg", 211ab808276SDr. David Alan Gilbert .fields = (VMStateField[]) { 212ab808276SDr. David Alan Gilbert VMSTATE_WITH_TMP(FPReg, x86_FPReg_tmp, vmstate_fpreg_tmp), 213ab808276SDr. David Alan Gilbert VMSTATE_END_OF_LIST() 214ab808276SDr. David Alan Gilbert } 2150cb892aaSJuan Quintela }; 2160cb892aaSJuan Quintela 21744b1ff31SDr. David Alan Gilbert static int cpu_pre_save(void *opaque) 2188dd3dca3Saurel32 { 219f56e3a14SAndreas Färber X86CPU *cpu = opaque; 220f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 2210e607a80SJan Kiszka int i; 222e3126a5cSLara Lazier env->v_tpr = env->int_ctl & V_TPR_MASK; 2238dd3dca3Saurel32 /* FPU */ 22467b8f419SJuan Quintela env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; 225cdc0c58fSJuan Quintela env->fptag_vmstate = 0; 2268dd3dca3Saurel32 for(i = 0; i < 8; i++) { 227cdc0c58fSJuan Quintela env->fptag_vmstate |= ((!env->fptags[i]) << i); 2288dd3dca3Saurel32 } 2298dd3dca3Saurel32 23060a902f1SJuan Quintela env->fpregs_format_vmstate = 0; 2313e47c249SOrit Wasserman 2323e47c249SOrit Wasserman /* 2333e47c249SOrit Wasserman * Real mode guest segments register DPL should be zero. 2343e47c249SOrit Wasserman * Older KVM version were setting it wrongly. 2353e47c249SOrit Wasserman * Fixing it will allow live migration to host with unrestricted guest 2363e47c249SOrit Wasserman * support (otherwise the migration will fail with invalid guest state 2373e47c249SOrit Wasserman * error). 2383e47c249SOrit Wasserman */ 2393e47c249SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 2403e47c249SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 2413e47c249SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 2423e47c249SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 2433e47c249SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 2443e47c249SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 2453e47c249SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 2463e47c249SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 2473e47c249SOrit Wasserman } 2483e47c249SOrit Wasserman 249ebbfef2fSLiran Alon #ifdef CONFIG_KVM 25079a197abSLiran Alon /* 25179a197abSLiran Alon * In case vCPU may have enabled VMX, we need to make sure kernel have 25279a197abSLiran Alon * required capabilities in order to perform migration correctly: 25379a197abSLiran Alon * 25479a197abSLiran Alon * 1) We must be able to extract vCPU nested-state from KVM. 25579a197abSLiran Alon * 25679a197abSLiran Alon * 2) In case vCPU is running in guest-mode and it has a pending exception, 25779a197abSLiran Alon * we must be able to determine if it's in a pending or injected state. 25879a197abSLiran Alon * Note that in case KVM don't have required capability to do so, 25979a197abSLiran Alon * a pending/injected exception will always appear as an 26079a197abSLiran Alon * injected exception. 26179a197abSLiran Alon */ 26279a197abSLiran Alon if (kvm_enabled() && cpu_vmx_maybe_enabled(env) && 26379a197abSLiran Alon (!env->nested_state || 26479a197abSLiran Alon (!kvm_has_exception_payload() && (env->hflags & HF_GUEST_MASK) && 26579a197abSLiran Alon env->exception_injected))) { 26679a197abSLiran Alon error_report("Guest maybe enabled nested virtualization but kernel " 26779a197abSLiran Alon "does not support required capabilities to save vCPU " 26879a197abSLiran Alon "nested state"); 269ebbfef2fSLiran Alon return -EINVAL; 270ebbfef2fSLiran Alon } 271ebbfef2fSLiran Alon #endif 272ebbfef2fSLiran Alon 273fd13f23bSLiran Alon /* 274fd13f23bSLiran Alon * When vCPU is running L2 and exception is still pending, 275fd13f23bSLiran Alon * it can potentially be intercepted by L1 hypervisor. 276fd13f23bSLiran Alon * In contrast to an injected exception which cannot be 277fd13f23bSLiran Alon * intercepted anymore. 278fd13f23bSLiran Alon * 279fd13f23bSLiran Alon * Furthermore, when a L2 exception is intercepted by L1 2807332a4a4SCameron Esfahani * hypervisor, its exception payload (CR2/DR6 on #PF/#DB) 281fd13f23bSLiran Alon * should not be set yet in the respective vCPU register. 282fd13f23bSLiran Alon * Thus, in case an exception is pending, it is 283fd13f23bSLiran Alon * important to save the exception payload seperately. 284fd13f23bSLiran Alon * 285fd13f23bSLiran Alon * Therefore, if an exception is not in a pending state 286fd13f23bSLiran Alon * or vCPU is not in guest-mode, it is not important to 287fd13f23bSLiran Alon * distinguish between a pending and injected exception 288fd13f23bSLiran Alon * and we don't need to store seperately the exception payload. 289fd13f23bSLiran Alon * 2907332a4a4SCameron Esfahani * In order to preserve better backwards-compatible migration, 291fd13f23bSLiran Alon * convert a pending exception to an injected exception in 2927332a4a4SCameron Esfahani * case it is not important to distinguish between them 293fd13f23bSLiran Alon * as described above. 294fd13f23bSLiran Alon */ 295fd13f23bSLiran Alon if (env->exception_pending && !(env->hflags & HF_GUEST_MASK)) { 296fd13f23bSLiran Alon env->exception_pending = 0; 297fd13f23bSLiran Alon env->exception_injected = 1; 298fd13f23bSLiran Alon 299fd13f23bSLiran Alon if (env->exception_has_payload) { 300fd13f23bSLiran Alon if (env->exception_nr == EXCP01_DB) { 301fd13f23bSLiran Alon env->dr[6] = env->exception_payload; 302fd13f23bSLiran Alon } else if (env->exception_nr == EXCP0E_PAGE) { 303fd13f23bSLiran Alon env->cr[2] = env->exception_payload; 304fd13f23bSLiran Alon } 305fd13f23bSLiran Alon } 306fd13f23bSLiran Alon } 307fd13f23bSLiran Alon 30844b1ff31SDr. David Alan Gilbert return 0; 309c4c38c8cSJuan Quintela } 310c4c38c8cSJuan Quintela 311468f6581SJuan Quintela static int cpu_post_load(void *opaque, int version_id) 312468f6581SJuan Quintela { 313f56e3a14SAndreas Färber X86CPU *cpu = opaque; 31475a34036SAndreas Färber CPUState *cs = CPU(cpu); 315f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 316468f6581SJuan Quintela int i; 317468f6581SJuan Quintela 31836f96c4bSHaozhong Zhang if (env->tsc_khz && env->user_tsc_khz && 31936f96c4bSHaozhong Zhang env->tsc_khz != env->user_tsc_khz) { 32036f96c4bSHaozhong Zhang error_report("Mismatch between user-specified TSC frequency and " 32136f96c4bSHaozhong Zhang "migrated TSC frequency"); 32236f96c4bSHaozhong Zhang return -EINVAL; 32336f96c4bSHaozhong Zhang } 32436f96c4bSHaozhong Zhang 32546baa900SDr. David Alan Gilbert if (env->fpregs_format_vmstate) { 32646baa900SDr. David Alan Gilbert error_report("Unsupported old non-softfloat CPU state"); 32746baa900SDr. David Alan Gilbert return -EINVAL; 32846baa900SDr. David Alan Gilbert } 329444ba679SOrit Wasserman /* 330444ba679SOrit Wasserman * Real mode guest segments register DPL should be zero. 331444ba679SOrit Wasserman * Older KVM version were setting it wrongly. 332444ba679SOrit Wasserman * Fixing it will allow live migration from such host that don't have 333444ba679SOrit Wasserman * restricted guest support to a host with unrestricted guest support 334444ba679SOrit Wasserman * (otherwise the migration will fail with invalid guest state 335444ba679SOrit Wasserman * error). 336444ba679SOrit Wasserman */ 337444ba679SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 338444ba679SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 339444ba679SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 340444ba679SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 341444ba679SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 342444ba679SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 343444ba679SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 344444ba679SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 345444ba679SOrit Wasserman } 346444ba679SOrit Wasserman 3477125c937SPaolo Bonzini /* Older versions of QEMU incorrectly used CS.DPL as the CPL when 3487125c937SPaolo Bonzini * running under KVM. This is wrong for conforming code segments. 3497125c937SPaolo Bonzini * Luckily, in our implementation the CPL field of hflags is redundant 3507125c937SPaolo Bonzini * and we can get the right value from the SS descriptor privilege level. 3517125c937SPaolo Bonzini */ 3527125c937SPaolo Bonzini env->hflags &= ~HF_CPL_MASK; 3537125c937SPaolo Bonzini env->hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; 3547125c937SPaolo Bonzini 355ebbfef2fSLiran Alon #ifdef CONFIG_KVM 356ebbfef2fSLiran Alon if ((env->hflags & HF_GUEST_MASK) && 357ebbfef2fSLiran Alon (!env->nested_state || 358ebbfef2fSLiran Alon !(env->nested_state->flags & KVM_STATE_NESTED_GUEST_MODE))) { 359ebbfef2fSLiran Alon error_report("vCPU set in guest-mode inconsistent with " 360ebbfef2fSLiran Alon "migrated kernel nested state"); 361ebbfef2fSLiran Alon return -EINVAL; 362ebbfef2fSLiran Alon } 363ebbfef2fSLiran Alon #endif 364ebbfef2fSLiran Alon 365fd13f23bSLiran Alon /* 366fd13f23bSLiran Alon * There are cases that we can get valid exception_nr with both 367fd13f23bSLiran Alon * exception_pending and exception_injected being cleared. 368fd13f23bSLiran Alon * This can happen in one of the following scenarios: 369fd13f23bSLiran Alon * 1) Source is older QEMU without KVM_CAP_EXCEPTION_PAYLOAD support. 370fd13f23bSLiran Alon * 2) Source is running on kernel without KVM_CAP_EXCEPTION_PAYLOAD support. 371fd13f23bSLiran Alon * 3) "cpu/exception_info" subsection not sent because there is no exception 372fd13f23bSLiran Alon * pending or guest wasn't running L2 (See comment in cpu_pre_save()). 373fd13f23bSLiran Alon * 374fd13f23bSLiran Alon * In those cases, we can just deduce that a valid exception_nr means 375fd13f23bSLiran Alon * we can treat the exception as already injected. 376fd13f23bSLiran Alon */ 377fd13f23bSLiran Alon if ((env->exception_nr != -1) && 378fd13f23bSLiran Alon !env->exception_pending && !env->exception_injected) { 379fd13f23bSLiran Alon env->exception_injected = 1; 380fd13f23bSLiran Alon } 381fd13f23bSLiran Alon 382468f6581SJuan Quintela env->fpstt = (env->fpus_vmstate >> 11) & 7; 383468f6581SJuan Quintela env->fpus = env->fpus_vmstate & ~0x3800; 384468f6581SJuan Quintela env->fptag_vmstate ^= 0xff; 385468f6581SJuan Quintela for(i = 0; i < 8; i++) { 386468f6581SJuan Quintela env->fptags[i] = (env->fptag_vmstate >> i) & 1; 387468f6581SJuan Quintela } 3881d8ad165SYang Zhong if (tcg_enabled()) { 38979c664f6SYang Zhong target_ulong dr7; 3905bde1407SPavel Dovgalyuk update_fp_status(env); 3911d8ad165SYang Zhong update_mxcsr_status(env); 392468f6581SJuan Quintela 393b3310ab3SAndreas Färber cpu_breakpoint_remove_all(cs, BP_CPU); 39475a34036SAndreas Färber cpu_watchpoint_remove_all(cs, BP_CPU); 39579c664f6SYang Zhong 39693d00d0fSRichard Henderson /* Indicate all breakpoints disabled, as they are, then 39793d00d0fSRichard Henderson let the helper re-enable them. */ 39879c664f6SYang Zhong dr7 = env->dr[7]; 39993d00d0fSRichard Henderson env->dr[7] = dr7 & ~(DR7_GLOBAL_BP_MASK | DR7_LOCAL_BP_MASK); 40093d00d0fSRichard Henderson cpu_x86_update_dr7(env, dr7); 401428065ceSliguang } 402d10eb08fSAlex Bennée tlb_flush(cs); 4031e7fbc6dSJuan Quintela return 0; 404468f6581SJuan Quintela } 405468f6581SJuan Quintela 406f6584ee2SGleb Natapov static bool async_pf_msr_needed(void *opaque) 407f6584ee2SGleb Natapov { 408f56e3a14SAndreas Färber X86CPU *cpu = opaque; 409f6584ee2SGleb Natapov 410f56e3a14SAndreas Färber return cpu->env.async_pf_en_msr != 0; 411f6584ee2SGleb Natapov } 412f6584ee2SGleb Natapov 413db5daafaSVitaly Kuznetsov static bool async_pf_int_msr_needed(void *opaque) 414db5daafaSVitaly Kuznetsov { 415db5daafaSVitaly Kuznetsov X86CPU *cpu = opaque; 416db5daafaSVitaly Kuznetsov 417db5daafaSVitaly Kuznetsov return cpu->env.async_pf_int_msr != 0; 418db5daafaSVitaly Kuznetsov } 419db5daafaSVitaly Kuznetsov 420bc9a839dSMichael S. Tsirkin static bool pv_eoi_msr_needed(void *opaque) 421bc9a839dSMichael S. Tsirkin { 422f56e3a14SAndreas Färber X86CPU *cpu = opaque; 423bc9a839dSMichael S. Tsirkin 424f56e3a14SAndreas Färber return cpu->env.pv_eoi_en_msr != 0; 425bc9a839dSMichael S. Tsirkin } 426bc9a839dSMichael S. Tsirkin 427917367aaSMarcelo Tosatti static bool steal_time_msr_needed(void *opaque) 428917367aaSMarcelo Tosatti { 4290e503577SMarcelo Tosatti X86CPU *cpu = opaque; 430917367aaSMarcelo Tosatti 4310e503577SMarcelo Tosatti return cpu->env.steal_time_msr != 0; 432917367aaSMarcelo Tosatti } 433917367aaSMarcelo Tosatti 434fd13f23bSLiran Alon static bool exception_info_needed(void *opaque) 435fd13f23bSLiran Alon { 436fd13f23bSLiran Alon X86CPU *cpu = opaque; 437fd13f23bSLiran Alon CPUX86State *env = &cpu->env; 438fd13f23bSLiran Alon 439fd13f23bSLiran Alon /* 440fd13f23bSLiran Alon * It is important to save exception-info only in case 4417332a4a4SCameron Esfahani * we need to distinguish between a pending and injected 442fd13f23bSLiran Alon * exception. Which is only required in case there is a 443fd13f23bSLiran Alon * pending exception and vCPU is running L2. 444fd13f23bSLiran Alon * For more info, refer to comment in cpu_pre_save(). 445fd13f23bSLiran Alon */ 446fd13f23bSLiran Alon return env->exception_pending && (env->hflags & HF_GUEST_MASK); 447fd13f23bSLiran Alon } 448fd13f23bSLiran Alon 449fd13f23bSLiran Alon static const VMStateDescription vmstate_exception_info = { 450fd13f23bSLiran Alon .name = "cpu/exception_info", 451fd13f23bSLiran Alon .version_id = 1, 452fd13f23bSLiran Alon .minimum_version_id = 1, 453fd13f23bSLiran Alon .needed = exception_info_needed, 454fd13f23bSLiran Alon .fields = (VMStateField[]) { 455fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_pending, X86CPU), 456fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_injected, X86CPU), 457fd13f23bSLiran Alon VMSTATE_UINT8(env.exception_has_payload, X86CPU), 458fd13f23bSLiran Alon VMSTATE_UINT64(env.exception_payload, X86CPU), 459fd13f23bSLiran Alon VMSTATE_END_OF_LIST() 460fd13f23bSLiran Alon } 461fd13f23bSLiran Alon }; 462fd13f23bSLiran Alon 463d645e132SMarcelo Tosatti /* Poll control MSR enabled by default */ 464d645e132SMarcelo Tosatti static bool poll_control_msr_needed(void *opaque) 465d645e132SMarcelo Tosatti { 466d645e132SMarcelo Tosatti X86CPU *cpu = opaque; 467d645e132SMarcelo Tosatti 468d645e132SMarcelo Tosatti return cpu->env.poll_control_msr != 1; 469d645e132SMarcelo Tosatti } 470d645e132SMarcelo Tosatti 471917367aaSMarcelo Tosatti static const VMStateDescription vmstate_steal_time_msr = { 472917367aaSMarcelo Tosatti .name = "cpu/steal_time_msr", 473917367aaSMarcelo Tosatti .version_id = 1, 474917367aaSMarcelo Tosatti .minimum_version_id = 1, 4755cd8cadaSJuan Quintela .needed = steal_time_msr_needed, 476917367aaSMarcelo Tosatti .fields = (VMStateField[]) { 4770e503577SMarcelo Tosatti VMSTATE_UINT64(env.steal_time_msr, X86CPU), 478917367aaSMarcelo Tosatti VMSTATE_END_OF_LIST() 479917367aaSMarcelo Tosatti } 480917367aaSMarcelo Tosatti }; 481917367aaSMarcelo Tosatti 482f6584ee2SGleb Natapov static const VMStateDescription vmstate_async_pf_msr = { 483f6584ee2SGleb Natapov .name = "cpu/async_pf_msr", 484f6584ee2SGleb Natapov .version_id = 1, 485f6584ee2SGleb Natapov .minimum_version_id = 1, 4865cd8cadaSJuan Quintela .needed = async_pf_msr_needed, 487f6584ee2SGleb Natapov .fields = (VMStateField[]) { 488f56e3a14SAndreas Färber VMSTATE_UINT64(env.async_pf_en_msr, X86CPU), 489f6584ee2SGleb Natapov VMSTATE_END_OF_LIST() 490f6584ee2SGleb Natapov } 491f6584ee2SGleb Natapov }; 492f6584ee2SGleb Natapov 493db5daafaSVitaly Kuznetsov static const VMStateDescription vmstate_async_pf_int_msr = { 494db5daafaSVitaly Kuznetsov .name = "cpu/async_pf_int_msr", 495db5daafaSVitaly Kuznetsov .version_id = 1, 496db5daafaSVitaly Kuznetsov .minimum_version_id = 1, 497db5daafaSVitaly Kuznetsov .needed = async_pf_int_msr_needed, 498db5daafaSVitaly Kuznetsov .fields = (VMStateField[]) { 499db5daafaSVitaly Kuznetsov VMSTATE_UINT64(env.async_pf_int_msr, X86CPU), 500db5daafaSVitaly Kuznetsov VMSTATE_END_OF_LIST() 501db5daafaSVitaly Kuznetsov } 502db5daafaSVitaly Kuznetsov }; 503db5daafaSVitaly Kuznetsov 504bc9a839dSMichael S. Tsirkin static const VMStateDescription vmstate_pv_eoi_msr = { 505bc9a839dSMichael S. Tsirkin .name = "cpu/async_pv_eoi_msr", 506bc9a839dSMichael S. Tsirkin .version_id = 1, 507bc9a839dSMichael S. Tsirkin .minimum_version_id = 1, 5085cd8cadaSJuan Quintela .needed = pv_eoi_msr_needed, 509bc9a839dSMichael S. Tsirkin .fields = (VMStateField[]) { 510f56e3a14SAndreas Färber VMSTATE_UINT64(env.pv_eoi_en_msr, X86CPU), 511bc9a839dSMichael S. Tsirkin VMSTATE_END_OF_LIST() 512bc9a839dSMichael S. Tsirkin } 513bc9a839dSMichael S. Tsirkin }; 514bc9a839dSMichael S. Tsirkin 515d645e132SMarcelo Tosatti static const VMStateDescription vmstate_poll_control_msr = { 516d645e132SMarcelo Tosatti .name = "cpu/poll_control_msr", 517d645e132SMarcelo Tosatti .version_id = 1, 518d645e132SMarcelo Tosatti .minimum_version_id = 1, 519d645e132SMarcelo Tosatti .needed = poll_control_msr_needed, 520d645e132SMarcelo Tosatti .fields = (VMStateField[]) { 521d645e132SMarcelo Tosatti VMSTATE_UINT64(env.poll_control_msr, X86CPU), 522d645e132SMarcelo Tosatti VMSTATE_END_OF_LIST() 523d645e132SMarcelo Tosatti } 524d645e132SMarcelo Tosatti }; 525d645e132SMarcelo Tosatti 52642cc8fa6SJan Kiszka static bool fpop_ip_dp_needed(void *opaque) 52742cc8fa6SJan Kiszka { 528f56e3a14SAndreas Färber X86CPU *cpu = opaque; 529f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 53042cc8fa6SJan Kiszka 53142cc8fa6SJan Kiszka return env->fpop != 0 || env->fpip != 0 || env->fpdp != 0; 53242cc8fa6SJan Kiszka } 53342cc8fa6SJan Kiszka 53442cc8fa6SJan Kiszka static const VMStateDescription vmstate_fpop_ip_dp = { 53542cc8fa6SJan Kiszka .name = "cpu/fpop_ip_dp", 53642cc8fa6SJan Kiszka .version_id = 1, 53742cc8fa6SJan Kiszka .minimum_version_id = 1, 5385cd8cadaSJuan Quintela .needed = fpop_ip_dp_needed, 53942cc8fa6SJan Kiszka .fields = (VMStateField[]) { 540f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpop, X86CPU), 541f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpip, X86CPU), 542f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpdp, X86CPU), 54342cc8fa6SJan Kiszka VMSTATE_END_OF_LIST() 54442cc8fa6SJan Kiszka } 54542cc8fa6SJan Kiszka }; 54642cc8fa6SJan Kiszka 547f28558d3SWill Auld static bool tsc_adjust_needed(void *opaque) 548f28558d3SWill Auld { 549f56e3a14SAndreas Färber X86CPU *cpu = opaque; 550f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 551f28558d3SWill Auld 552f28558d3SWill Auld return env->tsc_adjust != 0; 553f28558d3SWill Auld } 554f28558d3SWill Auld 555f28558d3SWill Auld static const VMStateDescription vmstate_msr_tsc_adjust = { 556f28558d3SWill Auld .name = "cpu/msr_tsc_adjust", 557f28558d3SWill Auld .version_id = 1, 558f28558d3SWill Auld .minimum_version_id = 1, 5595cd8cadaSJuan Quintela .needed = tsc_adjust_needed, 560f28558d3SWill Auld .fields = (VMStateField[]) { 561f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_adjust, X86CPU), 562f28558d3SWill Auld VMSTATE_END_OF_LIST() 563f28558d3SWill Auld } 564f28558d3SWill Auld }; 565f28558d3SWill Auld 566e13713dbSLiran Alon static bool msr_smi_count_needed(void *opaque) 567e13713dbSLiran Alon { 568e13713dbSLiran Alon X86CPU *cpu = opaque; 569e13713dbSLiran Alon CPUX86State *env = &cpu->env; 570e13713dbSLiran Alon 571990e0be2SPaolo Bonzini return cpu->migrate_smi_count && env->msr_smi_count != 0; 572e13713dbSLiran Alon } 573e13713dbSLiran Alon 574e13713dbSLiran Alon static const VMStateDescription vmstate_msr_smi_count = { 575e13713dbSLiran Alon .name = "cpu/msr_smi_count", 576e13713dbSLiran Alon .version_id = 1, 577e13713dbSLiran Alon .minimum_version_id = 1, 578e13713dbSLiran Alon .needed = msr_smi_count_needed, 579e13713dbSLiran Alon .fields = (VMStateField[]) { 580e13713dbSLiran Alon VMSTATE_UINT64(env.msr_smi_count, X86CPU), 581e13713dbSLiran Alon VMSTATE_END_OF_LIST() 582e13713dbSLiran Alon } 583e13713dbSLiran Alon }; 584e13713dbSLiran Alon 585aa82ba54SLiu, Jinsong static bool tscdeadline_needed(void *opaque) 586aa82ba54SLiu, Jinsong { 587f56e3a14SAndreas Färber X86CPU *cpu = opaque; 588f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 589aa82ba54SLiu, Jinsong 590aa82ba54SLiu, Jinsong return env->tsc_deadline != 0; 591aa82ba54SLiu, Jinsong } 592aa82ba54SLiu, Jinsong 593aa82ba54SLiu, Jinsong static const VMStateDescription vmstate_msr_tscdeadline = { 594aa82ba54SLiu, Jinsong .name = "cpu/msr_tscdeadline", 595aa82ba54SLiu, Jinsong .version_id = 1, 596aa82ba54SLiu, Jinsong .minimum_version_id = 1, 5975cd8cadaSJuan Quintela .needed = tscdeadline_needed, 598aa82ba54SLiu, Jinsong .fields = (VMStateField[]) { 599f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_deadline, X86CPU), 600aa82ba54SLiu, Jinsong VMSTATE_END_OF_LIST() 601aa82ba54SLiu, Jinsong } 602aa82ba54SLiu, Jinsong }; 603aa82ba54SLiu, Jinsong 60421e87c46SAvi Kivity static bool misc_enable_needed(void *opaque) 60521e87c46SAvi Kivity { 606f56e3a14SAndreas Färber X86CPU *cpu = opaque; 607f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 60821e87c46SAvi Kivity 60921e87c46SAvi Kivity return env->msr_ia32_misc_enable != MSR_IA32_MISC_ENABLE_DEFAULT; 61021e87c46SAvi Kivity } 61121e87c46SAvi Kivity 6120779caebSArthur Chunqi Li static bool feature_control_needed(void *opaque) 6130779caebSArthur Chunqi Li { 6140779caebSArthur Chunqi Li X86CPU *cpu = opaque; 6150779caebSArthur Chunqi Li CPUX86State *env = &cpu->env; 6160779caebSArthur Chunqi Li 6170779caebSArthur Chunqi Li return env->msr_ia32_feature_control != 0; 6180779caebSArthur Chunqi Li } 6190779caebSArthur Chunqi Li 62021e87c46SAvi Kivity static const VMStateDescription vmstate_msr_ia32_misc_enable = { 62121e87c46SAvi Kivity .name = "cpu/msr_ia32_misc_enable", 62221e87c46SAvi Kivity .version_id = 1, 62321e87c46SAvi Kivity .minimum_version_id = 1, 6245cd8cadaSJuan Quintela .needed = misc_enable_needed, 62521e87c46SAvi Kivity .fields = (VMStateField[]) { 626f56e3a14SAndreas Färber VMSTATE_UINT64(env.msr_ia32_misc_enable, X86CPU), 62721e87c46SAvi Kivity VMSTATE_END_OF_LIST() 62821e87c46SAvi Kivity } 62921e87c46SAvi Kivity }; 63021e87c46SAvi Kivity 6310779caebSArthur Chunqi Li static const VMStateDescription vmstate_msr_ia32_feature_control = { 6320779caebSArthur Chunqi Li .name = "cpu/msr_ia32_feature_control", 6330779caebSArthur Chunqi Li .version_id = 1, 6340779caebSArthur Chunqi Li .minimum_version_id = 1, 6355cd8cadaSJuan Quintela .needed = feature_control_needed, 6360779caebSArthur Chunqi Li .fields = (VMStateField[]) { 6370779caebSArthur Chunqi Li VMSTATE_UINT64(env.msr_ia32_feature_control, X86CPU), 6380779caebSArthur Chunqi Li VMSTATE_END_OF_LIST() 6390779caebSArthur Chunqi Li } 6400779caebSArthur Chunqi Li }; 6410779caebSArthur Chunqi Li 6420d894367SPaolo Bonzini static bool pmu_enable_needed(void *opaque) 6430d894367SPaolo Bonzini { 6440d894367SPaolo Bonzini X86CPU *cpu = opaque; 6450d894367SPaolo Bonzini CPUX86State *env = &cpu->env; 6460d894367SPaolo Bonzini int i; 6470d894367SPaolo Bonzini 6480d894367SPaolo Bonzini if (env->msr_fixed_ctr_ctrl || env->msr_global_ctrl || 6490d894367SPaolo Bonzini env->msr_global_status || env->msr_global_ovf_ctrl) { 6500d894367SPaolo Bonzini return true; 6510d894367SPaolo Bonzini } 6520d894367SPaolo Bonzini for (i = 0; i < MAX_FIXED_COUNTERS; i++) { 6530d894367SPaolo Bonzini if (env->msr_fixed_counters[i]) { 6540d894367SPaolo Bonzini return true; 6550d894367SPaolo Bonzini } 6560d894367SPaolo Bonzini } 6570d894367SPaolo Bonzini for (i = 0; i < MAX_GP_COUNTERS; i++) { 6580d894367SPaolo Bonzini if (env->msr_gp_counters[i] || env->msr_gp_evtsel[i]) { 6590d894367SPaolo Bonzini return true; 6600d894367SPaolo Bonzini } 6610d894367SPaolo Bonzini } 6620d894367SPaolo Bonzini 6630d894367SPaolo Bonzini return false; 6640d894367SPaolo Bonzini } 6650d894367SPaolo Bonzini 6660d894367SPaolo Bonzini static const VMStateDescription vmstate_msr_architectural_pmu = { 6670d894367SPaolo Bonzini .name = "cpu/msr_architectural_pmu", 6680d894367SPaolo Bonzini .version_id = 1, 6690d894367SPaolo Bonzini .minimum_version_id = 1, 6705cd8cadaSJuan Quintela .needed = pmu_enable_needed, 6710d894367SPaolo Bonzini .fields = (VMStateField[]) { 6720d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_fixed_ctr_ctrl, X86CPU), 6730d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ctrl, X86CPU), 6740d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_status, X86CPU), 6750d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ovf_ctrl, X86CPU), 6760d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_fixed_counters, X86CPU, MAX_FIXED_COUNTERS), 6770d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_counters, X86CPU, MAX_GP_COUNTERS), 6780d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_evtsel, X86CPU, MAX_GP_COUNTERS), 6790d894367SPaolo Bonzini VMSTATE_END_OF_LIST() 6800d894367SPaolo Bonzini } 6810d894367SPaolo Bonzini }; 6820d894367SPaolo Bonzini 68379e9ebebSLiu Jinsong static bool mpx_needed(void *opaque) 68479e9ebebSLiu Jinsong { 68579e9ebebSLiu Jinsong X86CPU *cpu = opaque; 68679e9ebebSLiu Jinsong CPUX86State *env = &cpu->env; 68779e9ebebSLiu Jinsong unsigned int i; 68879e9ebebSLiu Jinsong 68979e9ebebSLiu Jinsong for (i = 0; i < 4; i++) { 69079e9ebebSLiu Jinsong if (env->bnd_regs[i].lb || env->bnd_regs[i].ub) { 69179e9ebebSLiu Jinsong return true; 69279e9ebebSLiu Jinsong } 69379e9ebebSLiu Jinsong } 69479e9ebebSLiu Jinsong 69579e9ebebSLiu Jinsong if (env->bndcs_regs.cfgu || env->bndcs_regs.sts) { 69679e9ebebSLiu Jinsong return true; 69779e9ebebSLiu Jinsong } 69879e9ebebSLiu Jinsong 69979e9ebebSLiu Jinsong return !!env->msr_bndcfgs; 70079e9ebebSLiu Jinsong } 70179e9ebebSLiu Jinsong 70279e9ebebSLiu Jinsong static const VMStateDescription vmstate_mpx = { 70379e9ebebSLiu Jinsong .name = "cpu/mpx", 70479e9ebebSLiu Jinsong .version_id = 1, 70579e9ebebSLiu Jinsong .minimum_version_id = 1, 7065cd8cadaSJuan Quintela .needed = mpx_needed, 70779e9ebebSLiu Jinsong .fields = (VMStateField[]) { 70879e9ebebSLiu Jinsong VMSTATE_BND_REGS(env.bnd_regs, X86CPU, 4), 70979e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.cfgu, X86CPU), 71079e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.sts, X86CPU), 71179e9ebebSLiu Jinsong VMSTATE_UINT64(env.msr_bndcfgs, X86CPU), 71279e9ebebSLiu Jinsong VMSTATE_END_OF_LIST() 71379e9ebebSLiu Jinsong } 71479e9ebebSLiu Jinsong }; 71579e9ebebSLiu Jinsong 7161c90ef26SVadim Rozenfeld static bool hyperv_hypercall_enable_needed(void *opaque) 7171c90ef26SVadim Rozenfeld { 7181c90ef26SVadim Rozenfeld X86CPU *cpu = opaque; 7191c90ef26SVadim Rozenfeld CPUX86State *env = &cpu->env; 7201c90ef26SVadim Rozenfeld 7211c90ef26SVadim Rozenfeld return env->msr_hv_hypercall != 0 || env->msr_hv_guest_os_id != 0; 7221c90ef26SVadim Rozenfeld } 7231c90ef26SVadim Rozenfeld 724816d20c9SVitaly Kuznetsov static const VMStateDescription vmstate_msr_hyperv_hypercall = { 7251c90ef26SVadim Rozenfeld .name = "cpu/msr_hyperv_hypercall", 7261c90ef26SVadim Rozenfeld .version_id = 1, 7271c90ef26SVadim Rozenfeld .minimum_version_id = 1, 7285cd8cadaSJuan Quintela .needed = hyperv_hypercall_enable_needed, 7291c90ef26SVadim Rozenfeld .fields = (VMStateField[]) { 7301c90ef26SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_guest_os_id, X86CPU), 731466e6e9dSPaolo Bonzini VMSTATE_UINT64(env.msr_hv_hypercall, X86CPU), 7321c90ef26SVadim Rozenfeld VMSTATE_END_OF_LIST() 7331c90ef26SVadim Rozenfeld } 7341c90ef26SVadim Rozenfeld }; 7351c90ef26SVadim Rozenfeld 7365ef68987SVadim Rozenfeld static bool hyperv_vapic_enable_needed(void *opaque) 7375ef68987SVadim Rozenfeld { 7385ef68987SVadim Rozenfeld X86CPU *cpu = opaque; 7395ef68987SVadim Rozenfeld CPUX86State *env = &cpu->env; 7405ef68987SVadim Rozenfeld 7415ef68987SVadim Rozenfeld return env->msr_hv_vapic != 0; 7425ef68987SVadim Rozenfeld } 7435ef68987SVadim Rozenfeld 7445ef68987SVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_vapic = { 7455ef68987SVadim Rozenfeld .name = "cpu/msr_hyperv_vapic", 7465ef68987SVadim Rozenfeld .version_id = 1, 7475ef68987SVadim Rozenfeld .minimum_version_id = 1, 7485cd8cadaSJuan Quintela .needed = hyperv_vapic_enable_needed, 7495ef68987SVadim Rozenfeld .fields = (VMStateField[]) { 7505ef68987SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_vapic, X86CPU), 7515ef68987SVadim Rozenfeld VMSTATE_END_OF_LIST() 7525ef68987SVadim Rozenfeld } 7535ef68987SVadim Rozenfeld }; 7545ef68987SVadim Rozenfeld 75548a5f3bcSVadim Rozenfeld static bool hyperv_time_enable_needed(void *opaque) 75648a5f3bcSVadim Rozenfeld { 75748a5f3bcSVadim Rozenfeld X86CPU *cpu = opaque; 75848a5f3bcSVadim Rozenfeld CPUX86State *env = &cpu->env; 75948a5f3bcSVadim Rozenfeld 76048a5f3bcSVadim Rozenfeld return env->msr_hv_tsc != 0; 76148a5f3bcSVadim Rozenfeld } 76248a5f3bcSVadim Rozenfeld 76348a5f3bcSVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_time = { 76448a5f3bcSVadim Rozenfeld .name = "cpu/msr_hyperv_time", 76548a5f3bcSVadim Rozenfeld .version_id = 1, 76648a5f3bcSVadim Rozenfeld .minimum_version_id = 1, 7675cd8cadaSJuan Quintela .needed = hyperv_time_enable_needed, 76848a5f3bcSVadim Rozenfeld .fields = (VMStateField[]) { 76948a5f3bcSVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_tsc, X86CPU), 77048a5f3bcSVadim Rozenfeld VMSTATE_END_OF_LIST() 77148a5f3bcSVadim Rozenfeld } 77248a5f3bcSVadim Rozenfeld }; 77348a5f3bcSVadim Rozenfeld 774f2a53c9eSAndrey Smetanin static bool hyperv_crash_enable_needed(void *opaque) 775f2a53c9eSAndrey Smetanin { 776f2a53c9eSAndrey Smetanin X86CPU *cpu = opaque; 777f2a53c9eSAndrey Smetanin CPUX86State *env = &cpu->env; 778f2a53c9eSAndrey Smetanin int i; 779f2a53c9eSAndrey Smetanin 7805e953812SRoman Kagan for (i = 0; i < HV_CRASH_PARAMS; i++) { 781f2a53c9eSAndrey Smetanin if (env->msr_hv_crash_params[i]) { 782f2a53c9eSAndrey Smetanin return true; 783f2a53c9eSAndrey Smetanin } 784f2a53c9eSAndrey Smetanin } 785f2a53c9eSAndrey Smetanin return false; 786f2a53c9eSAndrey Smetanin } 787f2a53c9eSAndrey Smetanin 788f2a53c9eSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_crash = { 789f2a53c9eSAndrey Smetanin .name = "cpu/msr_hyperv_crash", 790f2a53c9eSAndrey Smetanin .version_id = 1, 791f2a53c9eSAndrey Smetanin .minimum_version_id = 1, 792f2a53c9eSAndrey Smetanin .needed = hyperv_crash_enable_needed, 793f2a53c9eSAndrey Smetanin .fields = (VMStateField[]) { 7945e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_crash_params, X86CPU, HV_CRASH_PARAMS), 795f2a53c9eSAndrey Smetanin VMSTATE_END_OF_LIST() 796f2a53c9eSAndrey Smetanin } 797f2a53c9eSAndrey Smetanin }; 798f2a53c9eSAndrey Smetanin 79946eb8f98SAndrey Smetanin static bool hyperv_runtime_enable_needed(void *opaque) 80046eb8f98SAndrey Smetanin { 80146eb8f98SAndrey Smetanin X86CPU *cpu = opaque; 80246eb8f98SAndrey Smetanin CPUX86State *env = &cpu->env; 80346eb8f98SAndrey Smetanin 8042d384d7cSVitaly Kuznetsov if (!hyperv_feat_enabled(cpu, HYPERV_FEAT_RUNTIME)) { 80551227875SZhuangYanying return false; 80651227875SZhuangYanying } 80751227875SZhuangYanying 80846eb8f98SAndrey Smetanin return env->msr_hv_runtime != 0; 80946eb8f98SAndrey Smetanin } 81046eb8f98SAndrey Smetanin 81146eb8f98SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_runtime = { 81246eb8f98SAndrey Smetanin .name = "cpu/msr_hyperv_runtime", 81346eb8f98SAndrey Smetanin .version_id = 1, 81446eb8f98SAndrey Smetanin .minimum_version_id = 1, 81546eb8f98SAndrey Smetanin .needed = hyperv_runtime_enable_needed, 81646eb8f98SAndrey Smetanin .fields = (VMStateField[]) { 81746eb8f98SAndrey Smetanin VMSTATE_UINT64(env.msr_hv_runtime, X86CPU), 81846eb8f98SAndrey Smetanin VMSTATE_END_OF_LIST() 81946eb8f98SAndrey Smetanin } 82046eb8f98SAndrey Smetanin }; 82146eb8f98SAndrey Smetanin 822866eea9aSAndrey Smetanin static bool hyperv_synic_enable_needed(void *opaque) 823866eea9aSAndrey Smetanin { 824866eea9aSAndrey Smetanin X86CPU *cpu = opaque; 825866eea9aSAndrey Smetanin CPUX86State *env = &cpu->env; 826866eea9aSAndrey Smetanin int i; 827866eea9aSAndrey Smetanin 828866eea9aSAndrey Smetanin if (env->msr_hv_synic_control != 0 || 829866eea9aSAndrey Smetanin env->msr_hv_synic_evt_page != 0 || 830866eea9aSAndrey Smetanin env->msr_hv_synic_msg_page != 0) { 831866eea9aSAndrey Smetanin return true; 832866eea9aSAndrey Smetanin } 833866eea9aSAndrey Smetanin 834866eea9aSAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { 835866eea9aSAndrey Smetanin if (env->msr_hv_synic_sint[i] != 0) { 836866eea9aSAndrey Smetanin return true; 837866eea9aSAndrey Smetanin } 838866eea9aSAndrey Smetanin } 839866eea9aSAndrey Smetanin 840866eea9aSAndrey Smetanin return false; 841866eea9aSAndrey Smetanin } 842866eea9aSAndrey Smetanin 843606c34bfSRoman Kagan static int hyperv_synic_post_load(void *opaque, int version_id) 844606c34bfSRoman Kagan { 845606c34bfSRoman Kagan X86CPU *cpu = opaque; 846606c34bfSRoman Kagan hyperv_x86_synic_update(cpu); 847606c34bfSRoman Kagan return 0; 848606c34bfSRoman Kagan } 849606c34bfSRoman Kagan 850866eea9aSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_synic = { 851866eea9aSAndrey Smetanin .name = "cpu/msr_hyperv_synic", 852866eea9aSAndrey Smetanin .version_id = 1, 853866eea9aSAndrey Smetanin .minimum_version_id = 1, 854866eea9aSAndrey Smetanin .needed = hyperv_synic_enable_needed, 855606c34bfSRoman Kagan .post_load = hyperv_synic_post_load, 856866eea9aSAndrey Smetanin .fields = (VMStateField[]) { 857866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_control, X86CPU), 858866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_evt_page, X86CPU), 859866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_msg_page, X86CPU), 8605e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_synic_sint, X86CPU, HV_SINT_COUNT), 861866eea9aSAndrey Smetanin VMSTATE_END_OF_LIST() 862866eea9aSAndrey Smetanin } 863866eea9aSAndrey Smetanin }; 864866eea9aSAndrey Smetanin 865ff99aa64SAndrey Smetanin static bool hyperv_stimer_enable_needed(void *opaque) 866ff99aa64SAndrey Smetanin { 867ff99aa64SAndrey Smetanin X86CPU *cpu = opaque; 868ff99aa64SAndrey Smetanin CPUX86State *env = &cpu->env; 869ff99aa64SAndrey Smetanin int i; 870ff99aa64SAndrey Smetanin 871ff99aa64SAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_stimer_config); i++) { 872ff99aa64SAndrey Smetanin if (env->msr_hv_stimer_config[i] || env->msr_hv_stimer_count[i]) { 873ff99aa64SAndrey Smetanin return true; 874ff99aa64SAndrey Smetanin } 875ff99aa64SAndrey Smetanin } 876ff99aa64SAndrey Smetanin return false; 877ff99aa64SAndrey Smetanin } 878ff99aa64SAndrey Smetanin 879ff99aa64SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_stimer = { 880ff99aa64SAndrey Smetanin .name = "cpu/msr_hyperv_stimer", 881ff99aa64SAndrey Smetanin .version_id = 1, 882ff99aa64SAndrey Smetanin .minimum_version_id = 1, 883ff99aa64SAndrey Smetanin .needed = hyperv_stimer_enable_needed, 884ff99aa64SAndrey Smetanin .fields = (VMStateField[]) { 8855e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_config, X86CPU, 8865e953812SRoman Kagan HV_STIMER_COUNT), 8875e953812SRoman Kagan VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_count, X86CPU, HV_STIMER_COUNT), 888ff99aa64SAndrey Smetanin VMSTATE_END_OF_LIST() 889ff99aa64SAndrey Smetanin } 890ff99aa64SAndrey Smetanin }; 891ff99aa64SAndrey Smetanin 892ba6a4fd9SVitaly Kuznetsov static bool hyperv_reenlightenment_enable_needed(void *opaque) 893ba6a4fd9SVitaly Kuznetsov { 894ba6a4fd9SVitaly Kuznetsov X86CPU *cpu = opaque; 895ba6a4fd9SVitaly Kuznetsov CPUX86State *env = &cpu->env; 896ba6a4fd9SVitaly Kuznetsov 897ba6a4fd9SVitaly Kuznetsov return env->msr_hv_reenlightenment_control != 0 || 898ba6a4fd9SVitaly Kuznetsov env->msr_hv_tsc_emulation_control != 0 || 899ba6a4fd9SVitaly Kuznetsov env->msr_hv_tsc_emulation_status != 0; 900ba6a4fd9SVitaly Kuznetsov } 901ba6a4fd9SVitaly Kuznetsov 902561dbb41SVitaly Kuznetsov static int hyperv_reenlightenment_post_load(void *opaque, int version_id) 903561dbb41SVitaly Kuznetsov { 904561dbb41SVitaly Kuznetsov X86CPU *cpu = opaque; 905561dbb41SVitaly Kuznetsov CPUX86State *env = &cpu->env; 906561dbb41SVitaly Kuznetsov 907561dbb41SVitaly Kuznetsov /* 908561dbb41SVitaly Kuznetsov * KVM doesn't fully support re-enlightenment notifications so we need to 909561dbb41SVitaly Kuznetsov * make sure TSC frequency doesn't change upon migration. 910561dbb41SVitaly Kuznetsov */ 911561dbb41SVitaly Kuznetsov if ((env->msr_hv_reenlightenment_control & HV_REENLIGHTENMENT_ENABLE_BIT) && 912561dbb41SVitaly Kuznetsov !env->user_tsc_khz) { 913561dbb41SVitaly Kuznetsov error_report("Guest enabled re-enlightenment notifications, " 914561dbb41SVitaly Kuznetsov "'tsc-frequency=' has to be specified"); 915561dbb41SVitaly Kuznetsov return -EINVAL; 916561dbb41SVitaly Kuznetsov } 917561dbb41SVitaly Kuznetsov 918561dbb41SVitaly Kuznetsov return 0; 919561dbb41SVitaly Kuznetsov } 920561dbb41SVitaly Kuznetsov 921ba6a4fd9SVitaly Kuznetsov static const VMStateDescription vmstate_msr_hyperv_reenlightenment = { 922ba6a4fd9SVitaly Kuznetsov .name = "cpu/msr_hyperv_reenlightenment", 923ba6a4fd9SVitaly Kuznetsov .version_id = 1, 924ba6a4fd9SVitaly Kuznetsov .minimum_version_id = 1, 925ba6a4fd9SVitaly Kuznetsov .needed = hyperv_reenlightenment_enable_needed, 926561dbb41SVitaly Kuznetsov .post_load = hyperv_reenlightenment_post_load, 927ba6a4fd9SVitaly Kuznetsov .fields = (VMStateField[]) { 928ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_reenlightenment_control, X86CPU), 929ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_tsc_emulation_control, X86CPU), 930ba6a4fd9SVitaly Kuznetsov VMSTATE_UINT64(env.msr_hv_tsc_emulation_status, X86CPU), 931ba6a4fd9SVitaly Kuznetsov VMSTATE_END_OF_LIST() 932ba6a4fd9SVitaly Kuznetsov } 933ba6a4fd9SVitaly Kuznetsov }; 934ba6a4fd9SVitaly Kuznetsov 9359aecd6f8SChao Peng static bool avx512_needed(void *opaque) 9369aecd6f8SChao Peng { 9379aecd6f8SChao Peng X86CPU *cpu = opaque; 9389aecd6f8SChao Peng CPUX86State *env = &cpu->env; 9399aecd6f8SChao Peng unsigned int i; 9409aecd6f8SChao Peng 9419aecd6f8SChao Peng for (i = 0; i < NB_OPMASK_REGS; i++) { 9429aecd6f8SChao Peng if (env->opmask_regs[i]) { 9439aecd6f8SChao Peng return true; 9449aecd6f8SChao Peng } 9459aecd6f8SChao Peng } 9469aecd6f8SChao Peng 9479aecd6f8SChao Peng for (i = 0; i < CPU_NB_REGS; i++) { 94819cbd87cSEduardo Habkost #define ENV_XMM(reg, field) (env->xmm_regs[reg].ZMM_Q(field)) 949b7711471SPaolo Bonzini if (ENV_XMM(i, 4) || ENV_XMM(i, 6) || 950b7711471SPaolo Bonzini ENV_XMM(i, 5) || ENV_XMM(i, 7)) { 9519aecd6f8SChao Peng return true; 9529aecd6f8SChao Peng } 9539aecd6f8SChao Peng #ifdef TARGET_X86_64 954b7711471SPaolo Bonzini if (ENV_XMM(i+16, 0) || ENV_XMM(i+16, 1) || 955b7711471SPaolo Bonzini ENV_XMM(i+16, 2) || ENV_XMM(i+16, 3) || 956b7711471SPaolo Bonzini ENV_XMM(i+16, 4) || ENV_XMM(i+16, 5) || 957b7711471SPaolo Bonzini ENV_XMM(i+16, 6) || ENV_XMM(i+16, 7)) { 9589aecd6f8SChao Peng return true; 9599aecd6f8SChao Peng } 9609aecd6f8SChao Peng #endif 9619aecd6f8SChao Peng } 9629aecd6f8SChao Peng 9639aecd6f8SChao Peng return false; 9649aecd6f8SChao Peng } 9659aecd6f8SChao Peng 9669aecd6f8SChao Peng static const VMStateDescription vmstate_avx512 = { 9679aecd6f8SChao Peng .name = "cpu/avx512", 9689aecd6f8SChao Peng .version_id = 1, 9699aecd6f8SChao Peng .minimum_version_id = 1, 9705cd8cadaSJuan Quintela .needed = avx512_needed, 9719aecd6f8SChao Peng .fields = (VMStateField[]) { 9729aecd6f8SChao Peng VMSTATE_UINT64_ARRAY(env.opmask_regs, X86CPU, NB_OPMASK_REGS), 973b7711471SPaolo Bonzini VMSTATE_ZMMH_REGS_VARS(env.xmm_regs, X86CPU, 0), 9749aecd6f8SChao Peng #ifdef TARGET_X86_64 975b7711471SPaolo Bonzini VMSTATE_Hi16_ZMM_REGS_VARS(env.xmm_regs, X86CPU, 16), 9769aecd6f8SChao Peng #endif 9779aecd6f8SChao Peng VMSTATE_END_OF_LIST() 9789aecd6f8SChao Peng } 9799aecd6f8SChao Peng }; 9809aecd6f8SChao Peng 98118cd2c17SWanpeng Li static bool xss_needed(void *opaque) 98218cd2c17SWanpeng Li { 98318cd2c17SWanpeng Li X86CPU *cpu = opaque; 98418cd2c17SWanpeng Li CPUX86State *env = &cpu->env; 98518cd2c17SWanpeng Li 98618cd2c17SWanpeng Li return env->xss != 0; 98718cd2c17SWanpeng Li } 98818cd2c17SWanpeng Li 98918cd2c17SWanpeng Li static const VMStateDescription vmstate_xss = { 99018cd2c17SWanpeng Li .name = "cpu/xss", 99118cd2c17SWanpeng Li .version_id = 1, 99218cd2c17SWanpeng Li .minimum_version_id = 1, 9935cd8cadaSJuan Quintela .needed = xss_needed, 99418cd2c17SWanpeng Li .fields = (VMStateField[]) { 99518cd2c17SWanpeng Li VMSTATE_UINT64(env.xss, X86CPU), 99618cd2c17SWanpeng Li VMSTATE_END_OF_LIST() 99718cd2c17SWanpeng Li } 99818cd2c17SWanpeng Li }; 99918cd2c17SWanpeng Li 100065087997STao Xu static bool umwait_needed(void *opaque) 100165087997STao Xu { 100265087997STao Xu X86CPU *cpu = opaque; 100365087997STao Xu CPUX86State *env = &cpu->env; 100465087997STao Xu 100565087997STao Xu return env->umwait != 0; 100665087997STao Xu } 100765087997STao Xu 100865087997STao Xu static const VMStateDescription vmstate_umwait = { 100965087997STao Xu .name = "cpu/umwait", 101065087997STao Xu .version_id = 1, 101165087997STao Xu .minimum_version_id = 1, 101265087997STao Xu .needed = umwait_needed, 101365087997STao Xu .fields = (VMStateField[]) { 101465087997STao Xu VMSTATE_UINT32(env.umwait, X86CPU), 101565087997STao Xu VMSTATE_END_OF_LIST() 101665087997STao Xu } 101765087997STao Xu }; 101865087997STao Xu 1019f74eefe0SHuaitong Han static bool pkru_needed(void *opaque) 1020f74eefe0SHuaitong Han { 1021f74eefe0SHuaitong Han X86CPU *cpu = opaque; 1022f74eefe0SHuaitong Han CPUX86State *env = &cpu->env; 1023f74eefe0SHuaitong Han 1024f74eefe0SHuaitong Han return env->pkru != 0; 1025f74eefe0SHuaitong Han } 1026f74eefe0SHuaitong Han 1027f74eefe0SHuaitong Han static const VMStateDescription vmstate_pkru = { 1028f74eefe0SHuaitong Han .name = "cpu/pkru", 1029f74eefe0SHuaitong Han .version_id = 1, 1030f74eefe0SHuaitong Han .minimum_version_id = 1, 1031f74eefe0SHuaitong Han .needed = pkru_needed, 1032f74eefe0SHuaitong Han .fields = (VMStateField[]){ 1033f74eefe0SHuaitong Han VMSTATE_UINT32(env.pkru, X86CPU), 1034f74eefe0SHuaitong Han VMSTATE_END_OF_LIST() 1035f74eefe0SHuaitong Han } 1036f74eefe0SHuaitong Han }; 1037e7e7bdabSPaolo Bonzini 1038e7e7bdabSPaolo Bonzini static bool pkrs_needed(void *opaque) 1039e7e7bdabSPaolo Bonzini { 1040e7e7bdabSPaolo Bonzini X86CPU *cpu = opaque; 1041e7e7bdabSPaolo Bonzini CPUX86State *env = &cpu->env; 1042e7e7bdabSPaolo Bonzini 1043e7e7bdabSPaolo Bonzini return env->pkrs != 0; 1044e7e7bdabSPaolo Bonzini } 1045e7e7bdabSPaolo Bonzini 1046e7e7bdabSPaolo Bonzini static const VMStateDescription vmstate_pkrs = { 1047e7e7bdabSPaolo Bonzini .name = "cpu/pkrs", 1048e7e7bdabSPaolo Bonzini .version_id = 1, 1049e7e7bdabSPaolo Bonzini .minimum_version_id = 1, 1050e7e7bdabSPaolo Bonzini .needed = pkrs_needed, 1051e7e7bdabSPaolo Bonzini .fields = (VMStateField[]){ 1052e7e7bdabSPaolo Bonzini VMSTATE_UINT32(env.pkrs, X86CPU), 1053e7e7bdabSPaolo Bonzini VMSTATE_END_OF_LIST() 1054e7e7bdabSPaolo Bonzini } 1055e7e7bdabSPaolo Bonzini }; 1056f74eefe0SHuaitong Han 105736f96c4bSHaozhong Zhang static bool tsc_khz_needed(void *opaque) 105836f96c4bSHaozhong Zhang { 105936f96c4bSHaozhong Zhang X86CPU *cpu = opaque; 106036f96c4bSHaozhong Zhang CPUX86State *env = &cpu->env; 106136f96c4bSHaozhong Zhang MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); 10622f34ebf2SLiam Merwick X86MachineClass *x86mc = X86_MACHINE_CLASS(mc); 10632f34ebf2SLiam Merwick return env->tsc_khz && x86mc->save_tsc_khz; 106436f96c4bSHaozhong Zhang } 106536f96c4bSHaozhong Zhang 106636f96c4bSHaozhong Zhang static const VMStateDescription vmstate_tsc_khz = { 106736f96c4bSHaozhong Zhang .name = "cpu/tsc_khz", 106836f96c4bSHaozhong Zhang .version_id = 1, 106936f96c4bSHaozhong Zhang .minimum_version_id = 1, 107036f96c4bSHaozhong Zhang .needed = tsc_khz_needed, 107136f96c4bSHaozhong Zhang .fields = (VMStateField[]) { 107236f96c4bSHaozhong Zhang VMSTATE_INT64(env.tsc_khz, X86CPU), 107336f96c4bSHaozhong Zhang VMSTATE_END_OF_LIST() 107436f96c4bSHaozhong Zhang } 107536f96c4bSHaozhong Zhang }; 107636f96c4bSHaozhong Zhang 1077ebbfef2fSLiran Alon #ifdef CONFIG_KVM 1078ebbfef2fSLiran Alon 1079ebbfef2fSLiran Alon static bool vmx_vmcs12_needed(void *opaque) 1080ebbfef2fSLiran Alon { 1081ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 1082ebbfef2fSLiran Alon return (nested_state->size > 1083ebbfef2fSLiran Alon offsetof(struct kvm_nested_state, data.vmx[0].vmcs12)); 1084ebbfef2fSLiran Alon } 1085ebbfef2fSLiran Alon 1086ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_vmcs12 = { 1087ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx/vmcs12", 1088ebbfef2fSLiran Alon .version_id = 1, 1089ebbfef2fSLiran Alon .minimum_version_id = 1, 1090ebbfef2fSLiran Alon .needed = vmx_vmcs12_needed, 1091ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1092ebbfef2fSLiran Alon VMSTATE_UINT8_ARRAY(data.vmx[0].vmcs12, 1093ebbfef2fSLiran Alon struct kvm_nested_state, 1094ebbfef2fSLiran Alon KVM_STATE_NESTED_VMX_VMCS_SIZE), 1095ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1096ebbfef2fSLiran Alon } 1097ebbfef2fSLiran Alon }; 1098ebbfef2fSLiran Alon 1099ebbfef2fSLiran Alon static bool vmx_shadow_vmcs12_needed(void *opaque) 1100ebbfef2fSLiran Alon { 1101ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 1102ebbfef2fSLiran Alon return (nested_state->size > 1103ebbfef2fSLiran Alon offsetof(struct kvm_nested_state, data.vmx[0].shadow_vmcs12)); 1104ebbfef2fSLiran Alon } 1105ebbfef2fSLiran Alon 1106ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_shadow_vmcs12 = { 1107ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx/shadow_vmcs12", 1108ebbfef2fSLiran Alon .version_id = 1, 1109ebbfef2fSLiran Alon .minimum_version_id = 1, 1110ebbfef2fSLiran Alon .needed = vmx_shadow_vmcs12_needed, 1111ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1112ebbfef2fSLiran Alon VMSTATE_UINT8_ARRAY(data.vmx[0].shadow_vmcs12, 1113ebbfef2fSLiran Alon struct kvm_nested_state, 1114ebbfef2fSLiran Alon KVM_STATE_NESTED_VMX_VMCS_SIZE), 1115ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1116ebbfef2fSLiran Alon } 1117ebbfef2fSLiran Alon }; 1118ebbfef2fSLiran Alon 1119ebbfef2fSLiran Alon static bool vmx_nested_state_needed(void *opaque) 1120ebbfef2fSLiran Alon { 1121ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = opaque; 1122ebbfef2fSLiran Alon 1123ec7b1bbdSLiran Alon return (nested_state->format == KVM_STATE_NESTED_FORMAT_VMX && 1124ec7b1bbdSLiran Alon nested_state->hdr.vmx.vmxon_pa != -1ull); 1125ebbfef2fSLiran Alon } 1126ebbfef2fSLiran Alon 1127ebbfef2fSLiran Alon static const VMStateDescription vmstate_vmx_nested_state = { 1128ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state/vmx", 1129ebbfef2fSLiran Alon .version_id = 1, 1130ebbfef2fSLiran Alon .minimum_version_id = 1, 1131ebbfef2fSLiran Alon .needed = vmx_nested_state_needed, 1132ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1133ebbfef2fSLiran Alon VMSTATE_U64(hdr.vmx.vmxon_pa, struct kvm_nested_state), 1134ebbfef2fSLiran Alon VMSTATE_U64(hdr.vmx.vmcs12_pa, struct kvm_nested_state), 1135ebbfef2fSLiran Alon VMSTATE_U16(hdr.vmx.smm.flags, struct kvm_nested_state), 1136ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1137ebbfef2fSLiran Alon }, 1138ebbfef2fSLiran Alon .subsections = (const VMStateDescription*[]) { 1139ebbfef2fSLiran Alon &vmstate_vmx_vmcs12, 1140ebbfef2fSLiran Alon &vmstate_vmx_shadow_vmcs12, 1141ebbfef2fSLiran Alon NULL, 1142ebbfef2fSLiran Alon } 1143ebbfef2fSLiran Alon }; 1144ebbfef2fSLiran Alon 1145b16c0e20SPaolo Bonzini static bool svm_nested_state_needed(void *opaque) 1146b16c0e20SPaolo Bonzini { 1147b16c0e20SPaolo Bonzini struct kvm_nested_state *nested_state = opaque; 1148b16c0e20SPaolo Bonzini 1149b16c0e20SPaolo Bonzini /* 1150b16c0e20SPaolo Bonzini * HF_GUEST_MASK and HF2_GIF_MASK are already serialized 1151b16c0e20SPaolo Bonzini * via hflags and hflags2, all that's left is the opaque 1152b16c0e20SPaolo Bonzini * nested state blob. 1153b16c0e20SPaolo Bonzini */ 1154b16c0e20SPaolo Bonzini return (nested_state->format == KVM_STATE_NESTED_FORMAT_SVM && 1155b16c0e20SPaolo Bonzini nested_state->size > offsetof(struct kvm_nested_state, data)); 1156b16c0e20SPaolo Bonzini } 1157b16c0e20SPaolo Bonzini 1158b16c0e20SPaolo Bonzini static const VMStateDescription vmstate_svm_nested_state = { 1159b16c0e20SPaolo Bonzini .name = "cpu/kvm_nested_state/svm", 1160b16c0e20SPaolo Bonzini .version_id = 1, 1161b16c0e20SPaolo Bonzini .minimum_version_id = 1, 1162b16c0e20SPaolo Bonzini .needed = svm_nested_state_needed, 1163b16c0e20SPaolo Bonzini .fields = (VMStateField[]) { 1164b16c0e20SPaolo Bonzini VMSTATE_U64(hdr.svm.vmcb_pa, struct kvm_nested_state), 1165b16c0e20SPaolo Bonzini VMSTATE_UINT8_ARRAY(data.svm[0].vmcb12, 1166b16c0e20SPaolo Bonzini struct kvm_nested_state, 1167b16c0e20SPaolo Bonzini KVM_STATE_NESTED_SVM_VMCB_SIZE), 1168b16c0e20SPaolo Bonzini VMSTATE_END_OF_LIST() 1169b16c0e20SPaolo Bonzini } 1170b16c0e20SPaolo Bonzini }; 1171b16c0e20SPaolo Bonzini 1172ebbfef2fSLiran Alon static bool nested_state_needed(void *opaque) 1173ebbfef2fSLiran Alon { 1174ebbfef2fSLiran Alon X86CPU *cpu = opaque; 1175ebbfef2fSLiran Alon CPUX86State *env = &cpu->env; 1176ebbfef2fSLiran Alon 1177ebbfef2fSLiran Alon return (env->nested_state && 1178b16c0e20SPaolo Bonzini (vmx_nested_state_needed(env->nested_state) || 1179b16c0e20SPaolo Bonzini svm_nested_state_needed(env->nested_state))); 1180ebbfef2fSLiran Alon } 1181ebbfef2fSLiran Alon 1182ebbfef2fSLiran Alon static int nested_state_post_load(void *opaque, int version_id) 1183ebbfef2fSLiran Alon { 1184ebbfef2fSLiran Alon X86CPU *cpu = opaque; 1185ebbfef2fSLiran Alon CPUX86State *env = &cpu->env; 1186ebbfef2fSLiran Alon struct kvm_nested_state *nested_state = env->nested_state; 1187ebbfef2fSLiran Alon int min_nested_state_len = offsetof(struct kvm_nested_state, data); 1188ebbfef2fSLiran Alon int max_nested_state_len = kvm_max_nested_state_length(); 1189ebbfef2fSLiran Alon 1190ebbfef2fSLiran Alon /* 1191ebbfef2fSLiran Alon * If our kernel don't support setting nested state 1192ebbfef2fSLiran Alon * and we have received nested state from migration stream, 1193ebbfef2fSLiran Alon * we need to fail migration 1194ebbfef2fSLiran Alon */ 1195ebbfef2fSLiran Alon if (max_nested_state_len <= 0) { 1196ebbfef2fSLiran Alon error_report("Received nested state when kernel cannot restore it"); 1197ebbfef2fSLiran Alon return -EINVAL; 1198ebbfef2fSLiran Alon } 1199ebbfef2fSLiran Alon 1200ebbfef2fSLiran Alon /* 1201ebbfef2fSLiran Alon * Verify that the size of received nested_state struct 1202ebbfef2fSLiran Alon * at least cover required header and is not larger 1203ebbfef2fSLiran Alon * than the max size that our kernel support 1204ebbfef2fSLiran Alon */ 1205ebbfef2fSLiran Alon if (nested_state->size < min_nested_state_len) { 1206ebbfef2fSLiran Alon error_report("Received nested state size less than min: " 1207ebbfef2fSLiran Alon "len=%d, min=%d", 1208ebbfef2fSLiran Alon nested_state->size, min_nested_state_len); 1209ebbfef2fSLiran Alon return -EINVAL; 1210ebbfef2fSLiran Alon } 1211ebbfef2fSLiran Alon if (nested_state->size > max_nested_state_len) { 1212cba42d61SMichael Tokarev error_report("Received unsupported nested state size: " 1213ebbfef2fSLiran Alon "nested_state->size=%d, max=%d", 1214ebbfef2fSLiran Alon nested_state->size, max_nested_state_len); 1215ebbfef2fSLiran Alon return -EINVAL; 1216ebbfef2fSLiran Alon } 1217ebbfef2fSLiran Alon 1218ebbfef2fSLiran Alon /* Verify format is valid */ 1219ebbfef2fSLiran Alon if ((nested_state->format != KVM_STATE_NESTED_FORMAT_VMX) && 1220ebbfef2fSLiran Alon (nested_state->format != KVM_STATE_NESTED_FORMAT_SVM)) { 1221ebbfef2fSLiran Alon error_report("Received invalid nested state format: %d", 1222ebbfef2fSLiran Alon nested_state->format); 1223ebbfef2fSLiran Alon return -EINVAL; 1224ebbfef2fSLiran Alon } 1225ebbfef2fSLiran Alon 1226ebbfef2fSLiran Alon return 0; 1227ebbfef2fSLiran Alon } 1228ebbfef2fSLiran Alon 1229ebbfef2fSLiran Alon static const VMStateDescription vmstate_kvm_nested_state = { 1230ebbfef2fSLiran Alon .name = "cpu/kvm_nested_state", 1231ebbfef2fSLiran Alon .version_id = 1, 1232ebbfef2fSLiran Alon .minimum_version_id = 1, 1233ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1234ebbfef2fSLiran Alon VMSTATE_U16(flags, struct kvm_nested_state), 1235ebbfef2fSLiran Alon VMSTATE_U16(format, struct kvm_nested_state), 1236ebbfef2fSLiran Alon VMSTATE_U32(size, struct kvm_nested_state), 1237ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1238ebbfef2fSLiran Alon }, 1239ebbfef2fSLiran Alon .subsections = (const VMStateDescription*[]) { 1240ebbfef2fSLiran Alon &vmstate_vmx_nested_state, 1241b16c0e20SPaolo Bonzini &vmstate_svm_nested_state, 1242ebbfef2fSLiran Alon NULL 1243ebbfef2fSLiran Alon } 1244ebbfef2fSLiran Alon }; 1245ebbfef2fSLiran Alon 1246ebbfef2fSLiran Alon static const VMStateDescription vmstate_nested_state = { 1247ebbfef2fSLiran Alon .name = "cpu/nested_state", 1248ebbfef2fSLiran Alon .version_id = 1, 1249ebbfef2fSLiran Alon .minimum_version_id = 1, 1250ebbfef2fSLiran Alon .needed = nested_state_needed, 1251ebbfef2fSLiran Alon .post_load = nested_state_post_load, 1252ebbfef2fSLiran Alon .fields = (VMStateField[]) { 1253ebbfef2fSLiran Alon VMSTATE_STRUCT_POINTER(env.nested_state, X86CPU, 1254ebbfef2fSLiran Alon vmstate_kvm_nested_state, 1255ebbfef2fSLiran Alon struct kvm_nested_state), 1256ebbfef2fSLiran Alon VMSTATE_END_OF_LIST() 1257ebbfef2fSLiran Alon } 1258ebbfef2fSLiran Alon }; 1259ebbfef2fSLiran Alon 1260ebbfef2fSLiran Alon #endif 1261ebbfef2fSLiran Alon 126287f8b626SAshok Raj static bool mcg_ext_ctl_needed(void *opaque) 126387f8b626SAshok Raj { 126487f8b626SAshok Raj X86CPU *cpu = opaque; 126587f8b626SAshok Raj CPUX86State *env = &cpu->env; 126687f8b626SAshok Raj return cpu->enable_lmce && env->mcg_ext_ctl; 126787f8b626SAshok Raj } 126887f8b626SAshok Raj 126987f8b626SAshok Raj static const VMStateDescription vmstate_mcg_ext_ctl = { 127087f8b626SAshok Raj .name = "cpu/mcg_ext_ctl", 127187f8b626SAshok Raj .version_id = 1, 127287f8b626SAshok Raj .minimum_version_id = 1, 127387f8b626SAshok Raj .needed = mcg_ext_ctl_needed, 127487f8b626SAshok Raj .fields = (VMStateField[]) { 127587f8b626SAshok Raj VMSTATE_UINT64(env.mcg_ext_ctl, X86CPU), 127687f8b626SAshok Raj VMSTATE_END_OF_LIST() 127787f8b626SAshok Raj } 127887f8b626SAshok Raj }; 127987f8b626SAshok Raj 1280a33a2cfeSPaolo Bonzini static bool spec_ctrl_needed(void *opaque) 1281a33a2cfeSPaolo Bonzini { 1282a33a2cfeSPaolo Bonzini X86CPU *cpu = opaque; 1283a33a2cfeSPaolo Bonzini CPUX86State *env = &cpu->env; 1284a33a2cfeSPaolo Bonzini 1285a33a2cfeSPaolo Bonzini return env->spec_ctrl != 0; 1286a33a2cfeSPaolo Bonzini } 1287a33a2cfeSPaolo Bonzini 1288a33a2cfeSPaolo Bonzini static const VMStateDescription vmstate_spec_ctrl = { 1289a33a2cfeSPaolo Bonzini .name = "cpu/spec_ctrl", 1290a33a2cfeSPaolo Bonzini .version_id = 1, 1291a33a2cfeSPaolo Bonzini .minimum_version_id = 1, 1292a33a2cfeSPaolo Bonzini .needed = spec_ctrl_needed, 1293a33a2cfeSPaolo Bonzini .fields = (VMStateField[]){ 1294a33a2cfeSPaolo Bonzini VMSTATE_UINT64(env.spec_ctrl, X86CPU), 1295a33a2cfeSPaolo Bonzini VMSTATE_END_OF_LIST() 1296a33a2cfeSPaolo Bonzini } 1297a33a2cfeSPaolo Bonzini }; 1298a33a2cfeSPaolo Bonzini 1299cabf9862SMaxim Levitsky 1300cabf9862SMaxim Levitsky static bool amd_tsc_scale_msr_needed(void *opaque) 1301cabf9862SMaxim Levitsky { 1302cabf9862SMaxim Levitsky X86CPU *cpu = opaque; 1303cabf9862SMaxim Levitsky CPUX86State *env = &cpu->env; 1304cabf9862SMaxim Levitsky 1305cabf9862SMaxim Levitsky return (env->features[FEAT_SVM] & CPUID_SVM_TSCSCALE); 1306cabf9862SMaxim Levitsky } 1307cabf9862SMaxim Levitsky 1308cabf9862SMaxim Levitsky static const VMStateDescription amd_tsc_scale_msr_ctrl = { 1309cabf9862SMaxim Levitsky .name = "cpu/amd_tsc_scale_msr", 1310cabf9862SMaxim Levitsky .version_id = 1, 1311cabf9862SMaxim Levitsky .minimum_version_id = 1, 1312cabf9862SMaxim Levitsky .needed = amd_tsc_scale_msr_needed, 1313cabf9862SMaxim Levitsky .fields = (VMStateField[]){ 1314cabf9862SMaxim Levitsky VMSTATE_UINT64(env.amd_tsc_scale_msr, X86CPU), 1315cabf9862SMaxim Levitsky VMSTATE_END_OF_LIST() 1316cabf9862SMaxim Levitsky } 1317cabf9862SMaxim Levitsky }; 1318cabf9862SMaxim Levitsky 1319cabf9862SMaxim Levitsky 1320b77146e9SChao Peng static bool intel_pt_enable_needed(void *opaque) 1321b77146e9SChao Peng { 1322b77146e9SChao Peng X86CPU *cpu = opaque; 1323b77146e9SChao Peng CPUX86State *env = &cpu->env; 1324b77146e9SChao Peng int i; 1325b77146e9SChao Peng 1326b77146e9SChao Peng if (env->msr_rtit_ctrl || env->msr_rtit_status || 1327b77146e9SChao Peng env->msr_rtit_output_base || env->msr_rtit_output_mask || 1328b77146e9SChao Peng env->msr_rtit_cr3_match) { 1329b77146e9SChao Peng return true; 1330b77146e9SChao Peng } 1331b77146e9SChao Peng 1332b77146e9SChao Peng for (i = 0; i < MAX_RTIT_ADDRS; i++) { 1333b77146e9SChao Peng if (env->msr_rtit_addrs[i]) { 1334b77146e9SChao Peng return true; 1335b77146e9SChao Peng } 1336b77146e9SChao Peng } 1337b77146e9SChao Peng 1338b77146e9SChao Peng return false; 1339b77146e9SChao Peng } 1340b77146e9SChao Peng 1341b77146e9SChao Peng static const VMStateDescription vmstate_msr_intel_pt = { 1342b77146e9SChao Peng .name = "cpu/intel_pt", 1343b77146e9SChao Peng .version_id = 1, 1344b77146e9SChao Peng .minimum_version_id = 1, 1345b77146e9SChao Peng .needed = intel_pt_enable_needed, 1346b77146e9SChao Peng .fields = (VMStateField[]) { 1347b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_ctrl, X86CPU), 1348b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_status, X86CPU), 1349b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_output_base, X86CPU), 1350b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_output_mask, X86CPU), 1351b77146e9SChao Peng VMSTATE_UINT64(env.msr_rtit_cr3_match, X86CPU), 1352b77146e9SChao Peng VMSTATE_UINT64_ARRAY(env.msr_rtit_addrs, X86CPU, MAX_RTIT_ADDRS), 1353b77146e9SChao Peng VMSTATE_END_OF_LIST() 1354b77146e9SChao Peng } 1355b77146e9SChao Peng }; 1356b77146e9SChao Peng 1357cfeea0c0SKonrad Rzeszutek Wilk static bool virt_ssbd_needed(void *opaque) 1358cfeea0c0SKonrad Rzeszutek Wilk { 1359cfeea0c0SKonrad Rzeszutek Wilk X86CPU *cpu = opaque; 1360cfeea0c0SKonrad Rzeszutek Wilk CPUX86State *env = &cpu->env; 1361cfeea0c0SKonrad Rzeszutek Wilk 1362cfeea0c0SKonrad Rzeszutek Wilk return env->virt_ssbd != 0; 1363cfeea0c0SKonrad Rzeszutek Wilk } 1364cfeea0c0SKonrad Rzeszutek Wilk 1365cfeea0c0SKonrad Rzeszutek Wilk static const VMStateDescription vmstate_msr_virt_ssbd = { 1366cfeea0c0SKonrad Rzeszutek Wilk .name = "cpu/virt_ssbd", 1367cfeea0c0SKonrad Rzeszutek Wilk .version_id = 1, 1368cfeea0c0SKonrad Rzeszutek Wilk .minimum_version_id = 1, 1369cfeea0c0SKonrad Rzeszutek Wilk .needed = virt_ssbd_needed, 1370cfeea0c0SKonrad Rzeszutek Wilk .fields = (VMStateField[]){ 1371cfeea0c0SKonrad Rzeszutek Wilk VMSTATE_UINT64(env.virt_ssbd, X86CPU), 1372cfeea0c0SKonrad Rzeszutek Wilk VMSTATE_END_OF_LIST() 1373cfeea0c0SKonrad Rzeszutek Wilk } 1374cfeea0c0SKonrad Rzeszutek Wilk }; 1375cfeea0c0SKonrad Rzeszutek Wilk 1376fe441054SJan Kiszka static bool svm_npt_needed(void *opaque) 1377fe441054SJan Kiszka { 1378fe441054SJan Kiszka X86CPU *cpu = opaque; 1379fe441054SJan Kiszka CPUX86State *env = &cpu->env; 1380fe441054SJan Kiszka 1381fe441054SJan Kiszka return !!(env->hflags2 & HF2_NPT_MASK); 1382fe441054SJan Kiszka } 1383fe441054SJan Kiszka 1384fe441054SJan Kiszka static const VMStateDescription vmstate_svm_npt = { 1385fe441054SJan Kiszka .name = "cpu/svn_npt", 1386fe441054SJan Kiszka .version_id = 1, 1387fe441054SJan Kiszka .minimum_version_id = 1, 1388fe441054SJan Kiszka .needed = svm_npt_needed, 1389fe441054SJan Kiszka .fields = (VMStateField[]){ 1390fe441054SJan Kiszka VMSTATE_UINT64(env.nested_cr3, X86CPU), 1391fe441054SJan Kiszka VMSTATE_UINT32(env.nested_pg_mode, X86CPU), 1392fe441054SJan Kiszka VMSTATE_END_OF_LIST() 1393fe441054SJan Kiszka } 1394fe441054SJan Kiszka }; 1395fe441054SJan Kiszka 1396e3126a5cSLara Lazier static bool svm_guest_needed(void *opaque) 1397e3126a5cSLara Lazier { 1398e3126a5cSLara Lazier X86CPU *cpu = opaque; 1399e3126a5cSLara Lazier CPUX86State *env = &cpu->env; 1400e3126a5cSLara Lazier 1401e3126a5cSLara Lazier return tcg_enabled() && env->int_ctl; 1402e3126a5cSLara Lazier } 1403e3126a5cSLara Lazier 1404e3126a5cSLara Lazier static const VMStateDescription vmstate_svm_guest = { 1405e3126a5cSLara Lazier .name = "cpu/svm_guest", 1406e3126a5cSLara Lazier .version_id = 1, 1407e3126a5cSLara Lazier .minimum_version_id = 1, 1408e3126a5cSLara Lazier .needed = svm_guest_needed, 1409e3126a5cSLara Lazier .fields = (VMStateField[]){ 1410e3126a5cSLara Lazier VMSTATE_UINT32(env.int_ctl, X86CPU), 1411e3126a5cSLara Lazier VMSTATE_END_OF_LIST() 1412e3126a5cSLara Lazier } 1413e3126a5cSLara Lazier }; 1414e3126a5cSLara Lazier 141589a44a10SPavel Dovgalyuk #ifndef TARGET_X86_64 141689a44a10SPavel Dovgalyuk static bool intel_efer32_needed(void *opaque) 141789a44a10SPavel Dovgalyuk { 141889a44a10SPavel Dovgalyuk X86CPU *cpu = opaque; 141989a44a10SPavel Dovgalyuk CPUX86State *env = &cpu->env; 142089a44a10SPavel Dovgalyuk 142189a44a10SPavel Dovgalyuk return env->efer != 0; 142289a44a10SPavel Dovgalyuk } 142389a44a10SPavel Dovgalyuk 142489a44a10SPavel Dovgalyuk static const VMStateDescription vmstate_efer32 = { 142589a44a10SPavel Dovgalyuk .name = "cpu/efer32", 142689a44a10SPavel Dovgalyuk .version_id = 1, 142789a44a10SPavel Dovgalyuk .minimum_version_id = 1, 142889a44a10SPavel Dovgalyuk .needed = intel_efer32_needed, 142989a44a10SPavel Dovgalyuk .fields = (VMStateField[]) { 143089a44a10SPavel Dovgalyuk VMSTATE_UINT64(env.efer, X86CPU), 143189a44a10SPavel Dovgalyuk VMSTATE_END_OF_LIST() 143289a44a10SPavel Dovgalyuk } 143389a44a10SPavel Dovgalyuk }; 143489a44a10SPavel Dovgalyuk #endif 143589a44a10SPavel Dovgalyuk 14362a9758c5SPaolo Bonzini static bool msr_tsx_ctrl_needed(void *opaque) 14372a9758c5SPaolo Bonzini { 14382a9758c5SPaolo Bonzini X86CPU *cpu = opaque; 14392a9758c5SPaolo Bonzini CPUX86State *env = &cpu->env; 14402a9758c5SPaolo Bonzini 14412a9758c5SPaolo Bonzini return env->features[FEAT_ARCH_CAPABILITIES] & ARCH_CAP_TSX_CTRL_MSR; 14422a9758c5SPaolo Bonzini } 14432a9758c5SPaolo Bonzini 14442a9758c5SPaolo Bonzini static const VMStateDescription vmstate_msr_tsx_ctrl = { 14452a9758c5SPaolo Bonzini .name = "cpu/msr_tsx_ctrl", 14462a9758c5SPaolo Bonzini .version_id = 1, 14472a9758c5SPaolo Bonzini .minimum_version_id = 1, 14482a9758c5SPaolo Bonzini .needed = msr_tsx_ctrl_needed, 14492a9758c5SPaolo Bonzini .fields = (VMStateField[]) { 14502a9758c5SPaolo Bonzini VMSTATE_UINT32(env.tsx_ctrl, X86CPU), 14512a9758c5SPaolo Bonzini VMSTATE_END_OF_LIST() 14522a9758c5SPaolo Bonzini } 14532a9758c5SPaolo Bonzini }; 14542a9758c5SPaolo Bonzini 1455db888065SSean Christopherson static bool intel_sgx_msrs_needed(void *opaque) 1456db888065SSean Christopherson { 1457db888065SSean Christopherson X86CPU *cpu = opaque; 1458db888065SSean Christopherson CPUX86State *env = &cpu->env; 1459db888065SSean Christopherson 1460db888065SSean Christopherson return !!(env->features[FEAT_7_0_ECX] & CPUID_7_0_ECX_SGX_LC); 1461db888065SSean Christopherson } 1462db888065SSean Christopherson 1463db888065SSean Christopherson static const VMStateDescription vmstate_msr_intel_sgx = { 1464db888065SSean Christopherson .name = "cpu/intel_sgx", 1465db888065SSean Christopherson .version_id = 1, 1466db888065SSean Christopherson .minimum_version_id = 1, 1467db888065SSean Christopherson .needed = intel_sgx_msrs_needed, 1468db888065SSean Christopherson .fields = (VMStateField[]) { 1469db888065SSean Christopherson VMSTATE_UINT64_ARRAY(env.msr_ia32_sgxlepubkeyhash, X86CPU, 4), 1470db888065SSean Christopherson VMSTATE_END_OF_LIST() 1471db888065SSean Christopherson } 1472db888065SSean Christopherson }; 1473db888065SSean Christopherson 14748f515d38SMaxim Levitsky static bool pdptrs_needed(void *opaque) 14758f515d38SMaxim Levitsky { 14768f515d38SMaxim Levitsky X86CPU *cpu = opaque; 14778f515d38SMaxim Levitsky CPUX86State *env = &cpu->env; 14788f515d38SMaxim Levitsky return env->pdptrs_valid; 14798f515d38SMaxim Levitsky } 14808f515d38SMaxim Levitsky 14818f515d38SMaxim Levitsky static int pdptrs_post_load(void *opaque, int version_id) 14828f515d38SMaxim Levitsky { 14838f515d38SMaxim Levitsky X86CPU *cpu = opaque; 14848f515d38SMaxim Levitsky CPUX86State *env = &cpu->env; 14858f515d38SMaxim Levitsky env->pdptrs_valid = true; 14868f515d38SMaxim Levitsky return 0; 14878f515d38SMaxim Levitsky } 14888f515d38SMaxim Levitsky 14898f515d38SMaxim Levitsky 14908f515d38SMaxim Levitsky static const VMStateDescription vmstate_pdptrs = { 14918f515d38SMaxim Levitsky .name = "cpu/pdptrs", 14928f515d38SMaxim Levitsky .version_id = 1, 14938f515d38SMaxim Levitsky .minimum_version_id = 1, 14948f515d38SMaxim Levitsky .needed = pdptrs_needed, 14958f515d38SMaxim Levitsky .post_load = pdptrs_post_load, 14968f515d38SMaxim Levitsky .fields = (VMStateField[]) { 14978f515d38SMaxim Levitsky VMSTATE_UINT64_ARRAY(env.pdptrs, X86CPU, 4), 14988f515d38SMaxim Levitsky VMSTATE_END_OF_LIST() 14998f515d38SMaxim Levitsky } 15008f515d38SMaxim Levitsky }; 15018f515d38SMaxim Levitsky 1502cdec2b75SZeng Guang static bool xfd_msrs_needed(void *opaque) 1503cdec2b75SZeng Guang { 1504cdec2b75SZeng Guang X86CPU *cpu = opaque; 1505cdec2b75SZeng Guang CPUX86State *env = &cpu->env; 1506cdec2b75SZeng Guang 1507cdec2b75SZeng Guang return !!(env->features[FEAT_XSAVE] & CPUID_D_1_EAX_XFD); 1508cdec2b75SZeng Guang } 1509cdec2b75SZeng Guang 1510cdec2b75SZeng Guang static const VMStateDescription vmstate_msr_xfd = { 1511cdec2b75SZeng Guang .name = "cpu/msr_xfd", 1512cdec2b75SZeng Guang .version_id = 1, 1513cdec2b75SZeng Guang .minimum_version_id = 1, 1514cdec2b75SZeng Guang .needed = xfd_msrs_needed, 1515cdec2b75SZeng Guang .fields = (VMStateField[]) { 1516cdec2b75SZeng Guang VMSTATE_UINT64(env.msr_xfd, X86CPU), 1517cdec2b75SZeng Guang VMSTATE_UINT64(env.msr_xfd_err, X86CPU), 1518cdec2b75SZeng Guang VMSTATE_END_OF_LIST() 1519cdec2b75SZeng Guang } 1520cdec2b75SZeng Guang }; 1521cdec2b75SZeng Guang 1522cdec2b75SZeng Guang #ifdef TARGET_X86_64 1523cdec2b75SZeng Guang static bool amx_xtile_needed(void *opaque) 1524cdec2b75SZeng Guang { 1525cdec2b75SZeng Guang X86CPU *cpu = opaque; 1526cdec2b75SZeng Guang CPUX86State *env = &cpu->env; 1527cdec2b75SZeng Guang 1528cdec2b75SZeng Guang return !!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_AMX_TILE); 1529cdec2b75SZeng Guang } 1530cdec2b75SZeng Guang 1531cdec2b75SZeng Guang static const VMStateDescription vmstate_amx_xtile = { 1532cdec2b75SZeng Guang .name = "cpu/intel_amx_xtile", 1533cdec2b75SZeng Guang .version_id = 1, 1534cdec2b75SZeng Guang .minimum_version_id = 1, 1535cdec2b75SZeng Guang .needed = amx_xtile_needed, 1536cdec2b75SZeng Guang .fields = (VMStateField[]) { 1537cdec2b75SZeng Guang VMSTATE_UINT8_ARRAY(env.xtilecfg, X86CPU, 64), 1538cdec2b75SZeng Guang VMSTATE_UINT8_ARRAY(env.xtiledata, X86CPU, 8192), 1539cdec2b75SZeng Guang VMSTATE_END_OF_LIST() 1540cdec2b75SZeng Guang } 1541cdec2b75SZeng Guang }; 1542cdec2b75SZeng Guang #endif 1543cdec2b75SZeng Guang 1544f2e7c2fcSYang Weijiang static bool arch_lbr_needed(void *opaque) 1545f2e7c2fcSYang Weijiang { 1546f2e7c2fcSYang Weijiang X86CPU *cpu = opaque; 1547f2e7c2fcSYang Weijiang CPUX86State *env = &cpu->env; 1548f2e7c2fcSYang Weijiang 1549f2e7c2fcSYang Weijiang return !!(env->features[FEAT_7_0_EDX] & CPUID_7_0_EDX_ARCH_LBR); 1550f2e7c2fcSYang Weijiang } 1551f2e7c2fcSYang Weijiang 1552f2e7c2fcSYang Weijiang static const VMStateDescription vmstate_arch_lbr = { 1553f2e7c2fcSYang Weijiang .name = "cpu/arch_lbr", 1554f2e7c2fcSYang Weijiang .version_id = 1, 1555f2e7c2fcSYang Weijiang .minimum_version_id = 1, 1556f2e7c2fcSYang Weijiang .needed = arch_lbr_needed, 1557f2e7c2fcSYang Weijiang .fields = (VMStateField[]) { 1558f2e7c2fcSYang Weijiang VMSTATE_UINT64(env.msr_lbr_ctl, X86CPU), 1559f2e7c2fcSYang Weijiang VMSTATE_UINT64(env.msr_lbr_depth, X86CPU), 1560f2e7c2fcSYang Weijiang VMSTATE_LBR_VARS(env.lbr_records, X86CPU, ARCH_LBR_NR_ENTRIES, 1), 1561f2e7c2fcSYang Weijiang VMSTATE_END_OF_LIST() 1562f2e7c2fcSYang Weijiang } 1563f2e7c2fcSYang Weijiang }; 1564f2e7c2fcSYang Weijiang 1565*12f89a39SChenyi Qiang static bool triple_fault_needed(void *opaque) 1566*12f89a39SChenyi Qiang { 1567*12f89a39SChenyi Qiang X86CPU *cpu = opaque; 1568*12f89a39SChenyi Qiang CPUX86State *env = &cpu->env; 1569*12f89a39SChenyi Qiang 1570*12f89a39SChenyi Qiang return env->triple_fault_pending; 1571*12f89a39SChenyi Qiang } 1572*12f89a39SChenyi Qiang 1573*12f89a39SChenyi Qiang static const VMStateDescription vmstate_triple_fault = { 1574*12f89a39SChenyi Qiang .name = "cpu/triple_fault", 1575*12f89a39SChenyi Qiang .version_id = 1, 1576*12f89a39SChenyi Qiang .minimum_version_id = 1, 1577*12f89a39SChenyi Qiang .needed = triple_fault_needed, 1578*12f89a39SChenyi Qiang .fields = (VMStateField[]) { 1579*12f89a39SChenyi Qiang VMSTATE_UINT8(env.triple_fault_pending, X86CPU), 1580*12f89a39SChenyi Qiang VMSTATE_END_OF_LIST() 1581*12f89a39SChenyi Qiang } 1582*12f89a39SChenyi Qiang }; 1583*12f89a39SChenyi Qiang 1584ac701a4fSKeqian Zhu const VMStateDescription vmstate_x86_cpu = { 15850cb892aaSJuan Quintela .name = "cpu", 1586f56e3a14SAndreas Färber .version_id = 12, 158708b277acSDr. David Alan Gilbert .minimum_version_id = 11, 15880cb892aaSJuan Quintela .pre_save = cpu_pre_save, 15890cb892aaSJuan Quintela .post_load = cpu_post_load, 15900cb892aaSJuan Quintela .fields = (VMStateField[]) { 1591f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.regs, X86CPU, CPU_NB_REGS), 1592f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eip, X86CPU), 1593f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eflags, X86CPU), 1594f56e3a14SAndreas Färber VMSTATE_UINT32(env.hflags, X86CPU), 15950cb892aaSJuan Quintela /* FPU */ 1596f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpuc, X86CPU), 1597f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpus_vmstate, X86CPU), 1598f56e3a14SAndreas Färber VMSTATE_UINT16(env.fptag_vmstate, X86CPU), 1599f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpregs_format_vmstate, X86CPU), 160046baa900SDr. David Alan Gilbert 160146baa900SDr. David Alan Gilbert VMSTATE_STRUCT_ARRAY(env.fpregs, X86CPU, 8, 0, vmstate_fpreg, FPReg), 16028dd3dca3Saurel32 1603f56e3a14SAndreas Färber VMSTATE_SEGMENT_ARRAY(env.segs, X86CPU, 6), 1604f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.ldt, X86CPU), 1605f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.tr, X86CPU), 1606f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.gdt, X86CPU), 1607f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.idt, X86CPU), 1608468f6581SJuan Quintela 1609f56e3a14SAndreas Färber VMSTATE_UINT32(env.sysenter_cs, X86CPU), 1610f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_esp, X86CPU), 1611f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_eip, X86CPU), 16128dd3dca3Saurel32 1613f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[0], X86CPU), 1614f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[2], X86CPU), 1615f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[3], X86CPU), 1616f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[4], X86CPU), 1617f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.dr, X86CPU, 8), 16180cb892aaSJuan Quintela /* MMU */ 1619f56e3a14SAndreas Färber VMSTATE_INT32(env.a20_mask, X86CPU), 16200cb892aaSJuan Quintela /* XMM */ 1621f56e3a14SAndreas Färber VMSTATE_UINT32(env.mxcsr, X86CPU), 1622a03c3e90SPaolo Bonzini VMSTATE_XMM_REGS(env.xmm_regs, X86CPU, 0), 16238dd3dca3Saurel32 16248dd3dca3Saurel32 #ifdef TARGET_X86_64 1625f56e3a14SAndreas Färber VMSTATE_UINT64(env.efer, X86CPU), 1626f56e3a14SAndreas Färber VMSTATE_UINT64(env.star, X86CPU), 1627f56e3a14SAndreas Färber VMSTATE_UINT64(env.lstar, X86CPU), 1628f56e3a14SAndreas Färber VMSTATE_UINT64(env.cstar, X86CPU), 1629f56e3a14SAndreas Färber VMSTATE_UINT64(env.fmask, X86CPU), 1630f56e3a14SAndreas Färber VMSTATE_UINT64(env.kernelgsbase, X86CPU), 16318dd3dca3Saurel32 #endif 163208b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.smbase, X86CPU), 16338dd3dca3Saurel32 163408b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.pat, X86CPU), 163508b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.hflags2, X86CPU), 1636dd5e3b17Saliguori 163708b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.vm_hsave, X86CPU), 163808b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.vm_vmcb, X86CPU), 163908b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc_offset, X86CPU), 164008b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.intercept, X86CPU), 164108b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_cr_read, X86CPU), 164208b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_cr_write, X86CPU), 164308b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_dr_read, X86CPU), 164408b277acSDr. David Alan Gilbert VMSTATE_UINT16(env.intercept_dr_write, X86CPU), 164508b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.intercept_exceptions, X86CPU), 164608b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.v_tpr, X86CPU), 1647dd5e3b17Saliguori /* MTRRs */ 164808b277acSDr. David Alan Gilbert VMSTATE_UINT64_ARRAY(env.mtrr_fixed, X86CPU, 11), 164908b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mtrr_deftype, X86CPU), 1650d8b5c67bSAlex Williamson VMSTATE_MTRR_VARS(env.mtrr_var, X86CPU, MSR_MTRRcap_VCNT, 8), 16510cb892aaSJuan Quintela /* KVM-related states */ 165208b277acSDr. David Alan Gilbert VMSTATE_INT32(env.interrupt_injected, X86CPU), 165308b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.mp_state, X86CPU), 165408b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc, X86CPU), 1655fd13f23bSLiran Alon VMSTATE_INT32(env.exception_nr, X86CPU), 165608b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.soft_interrupt, X86CPU), 165708b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.nmi_injected, X86CPU), 165808b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.nmi_pending, X86CPU), 165908b277acSDr. David Alan Gilbert VMSTATE_UINT8(env.has_error_code, X86CPU), 166008b277acSDr. David Alan Gilbert VMSTATE_UINT32(env.sipi_vector, X86CPU), 16610cb892aaSJuan Quintela /* MCE */ 166208b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_cap, X86CPU), 166308b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_status, X86CPU), 166408b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.mcg_ctl, X86CPU), 166508b277acSDr. David Alan Gilbert VMSTATE_UINT64_ARRAY(env.mce_banks, X86CPU, MCE_BANKS_DEF * 4), 16660cb892aaSJuan Quintela /* rdtscp */ 166708b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.tsc_aux, X86CPU), 16681a03675dSGlauber Costa /* KVM pvclock msr */ 166908b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.system_time_msr, X86CPU), 167008b277acSDr. David Alan Gilbert VMSTATE_UINT64(env.wall_clock_msr, X86CPU), 1671f1665b21SSheng Yang /* XSAVE related fields */ 1672f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xcr0, X86CPU, 12), 1673f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xstate_bv, X86CPU, 12), 1674b7711471SPaolo Bonzini VMSTATE_YMMH_REGS_VARS(env.xmm_regs, X86CPU, 0, 12), 16750cb892aaSJuan Quintela VMSTATE_END_OF_LIST() 1676a0fb002cSJan Kiszka /* The above list is not sorted /wrt version numbers, watch out! */ 1677f6584ee2SGleb Natapov }, 16785cd8cadaSJuan Quintela .subsections = (const VMStateDescription*[]) { 1679fd13f23bSLiran Alon &vmstate_exception_info, 16805cd8cadaSJuan Quintela &vmstate_async_pf_msr, 1681db5daafaSVitaly Kuznetsov &vmstate_async_pf_int_msr, 16825cd8cadaSJuan Quintela &vmstate_pv_eoi_msr, 16835cd8cadaSJuan Quintela &vmstate_steal_time_msr, 1684d645e132SMarcelo Tosatti &vmstate_poll_control_msr, 16855cd8cadaSJuan Quintela &vmstate_fpop_ip_dp, 16865cd8cadaSJuan Quintela &vmstate_msr_tsc_adjust, 16875cd8cadaSJuan Quintela &vmstate_msr_tscdeadline, 16885cd8cadaSJuan Quintela &vmstate_msr_ia32_misc_enable, 16895cd8cadaSJuan Quintela &vmstate_msr_ia32_feature_control, 16905cd8cadaSJuan Quintela &vmstate_msr_architectural_pmu, 16915cd8cadaSJuan Quintela &vmstate_mpx, 1692816d20c9SVitaly Kuznetsov &vmstate_msr_hyperv_hypercall, 16935cd8cadaSJuan Quintela &vmstate_msr_hyperv_vapic, 16945cd8cadaSJuan Quintela &vmstate_msr_hyperv_time, 1695f2a53c9eSAndrey Smetanin &vmstate_msr_hyperv_crash, 169646eb8f98SAndrey Smetanin &vmstate_msr_hyperv_runtime, 1697866eea9aSAndrey Smetanin &vmstate_msr_hyperv_synic, 1698ff99aa64SAndrey Smetanin &vmstate_msr_hyperv_stimer, 1699ba6a4fd9SVitaly Kuznetsov &vmstate_msr_hyperv_reenlightenment, 17005cd8cadaSJuan Quintela &vmstate_avx512, 17015cd8cadaSJuan Quintela &vmstate_xss, 170265087997STao Xu &vmstate_umwait, 170336f96c4bSHaozhong Zhang &vmstate_tsc_khz, 1704e13713dbSLiran Alon &vmstate_msr_smi_count, 1705f74eefe0SHuaitong Han &vmstate_pkru, 1706e7e7bdabSPaolo Bonzini &vmstate_pkrs, 1707a33a2cfeSPaolo Bonzini &vmstate_spec_ctrl, 1708cabf9862SMaxim Levitsky &amd_tsc_scale_msr_ctrl, 170987f8b626SAshok Raj &vmstate_mcg_ext_ctl, 1710b77146e9SChao Peng &vmstate_msr_intel_pt, 1711cfeea0c0SKonrad Rzeszutek Wilk &vmstate_msr_virt_ssbd, 1712fe441054SJan Kiszka &vmstate_svm_npt, 1713e3126a5cSLara Lazier &vmstate_svm_guest, 171489a44a10SPavel Dovgalyuk #ifndef TARGET_X86_64 171589a44a10SPavel Dovgalyuk &vmstate_efer32, 171689a44a10SPavel Dovgalyuk #endif 1717ebbfef2fSLiran Alon #ifdef CONFIG_KVM 1718ebbfef2fSLiran Alon &vmstate_nested_state, 1719ebbfef2fSLiran Alon #endif 17202a9758c5SPaolo Bonzini &vmstate_msr_tsx_ctrl, 1721db888065SSean Christopherson &vmstate_msr_intel_sgx, 17228f515d38SMaxim Levitsky &vmstate_pdptrs, 1723cdec2b75SZeng Guang &vmstate_msr_xfd, 1724cdec2b75SZeng Guang #ifdef TARGET_X86_64 1725cdec2b75SZeng Guang &vmstate_amx_xtile, 1726cdec2b75SZeng Guang #endif 1727f2e7c2fcSYang Weijiang &vmstate_arch_lbr, 1728*12f89a39SChenyi Qiang &vmstate_triple_fault, 17295cd8cadaSJuan Quintela NULL 1730dd5e3b17Saliguori } 17310cb892aaSJuan Quintela }; 1732