1b6a0aa05SPeter Maydell #include "qemu/osdep.h" 233c11879SPaolo Bonzini #include "qemu-common.h" 333c11879SPaolo Bonzini #include "cpu.h" 463c91552SPaolo Bonzini #include "exec/exec-all.h" 58dd3dca3Saurel32 #include "hw/hw.h" 68dd3dca3Saurel32 #include "hw/boards.h" 70d09e41aSPaolo Bonzini #include "hw/i386/pc.h" 80d09e41aSPaolo Bonzini #include "hw/isa/isa.h" 91e00b8d5SPaolo Bonzini #include "migration/cpu.h" 108dd3dca3Saurel32 119c17d615SPaolo Bonzini #include "sysemu/kvm.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 1390cb892aaSJuan Quintela static void put_fpreg_error(QEMUFile *f, void *opaque, size_t size) 140216c07c3SJuan Quintela { 1410cb892aaSJuan Quintela fprintf(stderr, "call put_fpreg() with invalid arguments\n"); 1420cb892aaSJuan Quintela exit(0); 143216c07c3SJuan Quintela } 144216c07c3SJuan Quintela 1453c8ce630SJuan Quintela /* XXX: add that in a FPU generic layer */ 1463c8ce630SJuan Quintela union x86_longdouble { 1473c8ce630SJuan Quintela uint64_t mant; 1483c8ce630SJuan Quintela uint16_t exp; 1493c8ce630SJuan Quintela }; 1503c8ce630SJuan Quintela 1513c8ce630SJuan Quintela #define MANTD1(fp) (fp & ((1LL << 52) - 1)) 1523c8ce630SJuan Quintela #define EXPBIAS1 1023 1533c8ce630SJuan Quintela #define EXPD1(fp) ((fp >> 52) & 0x7FF) 1543c8ce630SJuan Quintela #define SIGND1(fp) ((fp >> 32) & 0x80000000) 1553c8ce630SJuan Quintela 1563c8ce630SJuan Quintela static void fp64_to_fp80(union x86_longdouble *p, uint64_t temp) 1573c8ce630SJuan Quintela { 1583c8ce630SJuan Quintela int e; 1593c8ce630SJuan Quintela /* mantissa */ 1603c8ce630SJuan Quintela p->mant = (MANTD1(temp) << 11) | (1LL << 63); 1613c8ce630SJuan Quintela /* exponent + sign */ 1623c8ce630SJuan Quintela e = EXPD1(temp) - EXPBIAS1 + 16383; 1633c8ce630SJuan Quintela e |= SIGND1(temp) >> 16; 1643c8ce630SJuan Quintela p->exp = e; 1653c8ce630SJuan Quintela } 1663c8ce630SJuan Quintela 1673c8ce630SJuan Quintela static int get_fpreg(QEMUFile *f, void *opaque, size_t size) 1683c8ce630SJuan Quintela { 1693c8ce630SJuan Quintela FPReg *fp_reg = opaque; 1703c8ce630SJuan Quintela uint64_t mant; 1713c8ce630SJuan Quintela uint16_t exp; 1723c8ce630SJuan Quintela 1733c8ce630SJuan Quintela qemu_get_be64s(f, &mant); 1743c8ce630SJuan Quintela qemu_get_be16s(f, &exp); 1753c8ce630SJuan Quintela fp_reg->d = cpu_set_fp80(mant, exp); 1763c8ce630SJuan Quintela return 0; 1773c8ce630SJuan Quintela } 1783c8ce630SJuan Quintela 1793c8ce630SJuan Quintela static void put_fpreg(QEMUFile *f, void *opaque, size_t size) 1803c8ce630SJuan Quintela { 1813c8ce630SJuan Quintela FPReg *fp_reg = opaque; 1823c8ce630SJuan Quintela uint64_t mant; 1833c8ce630SJuan Quintela uint16_t exp; 1843c8ce630SJuan Quintela /* we save the real CPU data (in case of MMX usage only 'mant' 1853c8ce630SJuan Quintela contains the MMX register */ 1863c8ce630SJuan Quintela cpu_get_fp80(&mant, &exp, fp_reg->d); 1873c8ce630SJuan Quintela qemu_put_be64s(f, &mant); 1883c8ce630SJuan Quintela qemu_put_be16s(f, &exp); 1893c8ce630SJuan Quintela } 1903c8ce630SJuan Quintela 191976b2037SBlue Swirl static const VMStateInfo vmstate_fpreg = { 1920cb892aaSJuan Quintela .name = "fpreg", 1930cb892aaSJuan Quintela .get = get_fpreg, 1940cb892aaSJuan Quintela .put = put_fpreg, 1950cb892aaSJuan Quintela }; 1960cb892aaSJuan Quintela 1973c8ce630SJuan Quintela static int get_fpreg_1_mmx(QEMUFile *f, void *opaque, size_t size) 1983c8ce630SJuan Quintela { 1993c8ce630SJuan Quintela union x86_longdouble *p = opaque; 2003c8ce630SJuan Quintela uint64_t mant; 2013c8ce630SJuan Quintela 2023c8ce630SJuan Quintela qemu_get_be64s(f, &mant); 2033c8ce630SJuan Quintela p->mant = mant; 2043c8ce630SJuan Quintela p->exp = 0xffff; 2053c8ce630SJuan Quintela return 0; 2063c8ce630SJuan Quintela } 2073c8ce630SJuan Quintela 208976b2037SBlue Swirl static const VMStateInfo vmstate_fpreg_1_mmx = { 2090cb892aaSJuan Quintela .name = "fpreg_1_mmx", 2100cb892aaSJuan Quintela .get = get_fpreg_1_mmx, 2110cb892aaSJuan Quintela .put = put_fpreg_error, 2120cb892aaSJuan Quintela }; 2130cb892aaSJuan Quintela 2143c8ce630SJuan Quintela static int get_fpreg_1_no_mmx(QEMUFile *f, void *opaque, size_t size) 2153c8ce630SJuan Quintela { 2163c8ce630SJuan Quintela union x86_longdouble *p = opaque; 2173c8ce630SJuan Quintela uint64_t mant; 2183c8ce630SJuan Quintela 2193c8ce630SJuan Quintela qemu_get_be64s(f, &mant); 2203c8ce630SJuan Quintela fp64_to_fp80(p, mant); 2213c8ce630SJuan Quintela return 0; 2223c8ce630SJuan Quintela } 2233c8ce630SJuan Quintela 224976b2037SBlue Swirl static const VMStateInfo vmstate_fpreg_1_no_mmx = { 2250cb892aaSJuan Quintela .name = "fpreg_1_no_mmx", 2260cb892aaSJuan Quintela .get = get_fpreg_1_no_mmx, 2270cb892aaSJuan Quintela .put = put_fpreg_error, 2280cb892aaSJuan Quintela }; 2290cb892aaSJuan Quintela 2300cb892aaSJuan Quintela static bool fpregs_is_0(void *opaque, int version_id) 2310cb892aaSJuan Quintela { 232f56e3a14SAndreas Färber X86CPU *cpu = opaque; 233f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 2340cb892aaSJuan Quintela 2350cb892aaSJuan Quintela return (env->fpregs_format_vmstate == 0); 2360cb892aaSJuan Quintela } 2370cb892aaSJuan Quintela 2380cb892aaSJuan Quintela static bool fpregs_is_1_mmx(void *opaque, int version_id) 2390cb892aaSJuan Quintela { 240f56e3a14SAndreas Färber X86CPU *cpu = opaque; 241f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 2420cb892aaSJuan Quintela int guess_mmx; 2430cb892aaSJuan Quintela 2440cb892aaSJuan Quintela guess_mmx = ((env->fptag_vmstate == 0xff) && 2450cb892aaSJuan Quintela (env->fpus_vmstate & 0x3800) == 0); 2460cb892aaSJuan Quintela return (guess_mmx && (env->fpregs_format_vmstate == 1)); 2470cb892aaSJuan Quintela } 2480cb892aaSJuan Quintela 2490cb892aaSJuan Quintela static bool fpregs_is_1_no_mmx(void *opaque, int version_id) 2500cb892aaSJuan Quintela { 251f56e3a14SAndreas Färber X86CPU *cpu = opaque; 252f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 2530cb892aaSJuan Quintela int guess_mmx; 2540cb892aaSJuan Quintela 2550cb892aaSJuan Quintela guess_mmx = ((env->fptag_vmstate == 0xff) && 2560cb892aaSJuan Quintela (env->fpus_vmstate & 0x3800) == 0); 2570cb892aaSJuan Quintela return (!guess_mmx && (env->fpregs_format_vmstate == 1)); 2580cb892aaSJuan Quintela } 2590cb892aaSJuan Quintela 2600cb892aaSJuan Quintela #define VMSTATE_FP_REGS(_field, _state, _n) \ 2610cb892aaSJuan Quintela VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_0, vmstate_fpreg, FPReg), \ 2620cb892aaSJuan Quintela VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_1_mmx, vmstate_fpreg_1_mmx, FPReg), \ 2630cb892aaSJuan Quintela VMSTATE_ARRAY_TEST(_field, _state, _n, fpregs_is_1_no_mmx, vmstate_fpreg_1_no_mmx, FPReg) 2640cb892aaSJuan Quintela 2650cb892aaSJuan Quintela static bool version_is_5(void *opaque, int version_id) 2660cb892aaSJuan Quintela { 2670cb892aaSJuan Quintela return version_id == 5; 2680cb892aaSJuan Quintela } 2690cb892aaSJuan Quintela 2700cb892aaSJuan Quintela #ifdef TARGET_X86_64 2710cb892aaSJuan Quintela static bool less_than_7(void *opaque, int version_id) 2720cb892aaSJuan Quintela { 2730cb892aaSJuan Quintela return version_id < 7; 2740cb892aaSJuan Quintela } 2750cb892aaSJuan Quintela 2760cb892aaSJuan Quintela static int get_uint64_as_uint32(QEMUFile *f, void *pv, size_t size) 2770cb892aaSJuan Quintela { 2780cb892aaSJuan Quintela uint64_t *v = pv; 2790cb892aaSJuan Quintela *v = qemu_get_be32(f); 2800cb892aaSJuan Quintela return 0; 2810cb892aaSJuan Quintela } 2820cb892aaSJuan Quintela 2830cb892aaSJuan Quintela static void put_uint64_as_uint32(QEMUFile *f, void *pv, size_t size) 2840cb892aaSJuan Quintela { 2850cb892aaSJuan Quintela uint64_t *v = pv; 2860cb892aaSJuan Quintela qemu_put_be32(f, *v); 2870cb892aaSJuan Quintela } 2880cb892aaSJuan Quintela 289976b2037SBlue Swirl static const VMStateInfo vmstate_hack_uint64_as_uint32 = { 2900cb892aaSJuan Quintela .name = "uint64_as_uint32", 2910cb892aaSJuan Quintela .get = get_uint64_as_uint32, 2920cb892aaSJuan Quintela .put = put_uint64_as_uint32, 2930cb892aaSJuan Quintela }; 2940cb892aaSJuan Quintela 2950cb892aaSJuan Quintela #define VMSTATE_HACK_UINT32(_f, _s, _t) \ 296d4829d49SJuan Quintela VMSTATE_SINGLE_TEST(_f, _s, _t, 0, vmstate_hack_uint64_as_uint32, uint64_t) 2970cb892aaSJuan Quintela #endif 2980cb892aaSJuan Quintela 299c4c38c8cSJuan Quintela static void cpu_pre_save(void *opaque) 3008dd3dca3Saurel32 { 301f56e3a14SAndreas Färber X86CPU *cpu = opaque; 302f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 3030e607a80SJan Kiszka int i; 3048dd3dca3Saurel32 3058dd3dca3Saurel32 /* FPU */ 30667b8f419SJuan Quintela env->fpus_vmstate = (env->fpus & ~0x3800) | (env->fpstt & 0x7) << 11; 307cdc0c58fSJuan Quintela env->fptag_vmstate = 0; 3088dd3dca3Saurel32 for(i = 0; i < 8; i++) { 309cdc0c58fSJuan Quintela env->fptag_vmstate |= ((!env->fptags[i]) << i); 3108dd3dca3Saurel32 } 3118dd3dca3Saurel32 31260a902f1SJuan Quintela env->fpregs_format_vmstate = 0; 3133e47c249SOrit Wasserman 3143e47c249SOrit Wasserman /* 3153e47c249SOrit Wasserman * Real mode guest segments register DPL should be zero. 3163e47c249SOrit Wasserman * Older KVM version were setting it wrongly. 3173e47c249SOrit Wasserman * Fixing it will allow live migration to host with unrestricted guest 3183e47c249SOrit Wasserman * support (otherwise the migration will fail with invalid guest state 3193e47c249SOrit Wasserman * error). 3203e47c249SOrit Wasserman */ 3213e47c249SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 3223e47c249SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 3233e47c249SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 3243e47c249SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 3253e47c249SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 3263e47c249SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 3273e47c249SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 3283e47c249SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 3293e47c249SOrit Wasserman } 3303e47c249SOrit Wasserman 331c4c38c8cSJuan Quintela } 332c4c38c8cSJuan Quintela 333468f6581SJuan Quintela static int cpu_post_load(void *opaque, int version_id) 334468f6581SJuan Quintela { 335f56e3a14SAndreas Färber X86CPU *cpu = opaque; 33675a34036SAndreas Färber CPUState *cs = CPU(cpu); 337f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 338468f6581SJuan Quintela int i; 339468f6581SJuan Quintela 34036f96c4bSHaozhong Zhang if (env->tsc_khz && env->user_tsc_khz && 34136f96c4bSHaozhong Zhang env->tsc_khz != env->user_tsc_khz) { 34236f96c4bSHaozhong Zhang error_report("Mismatch between user-specified TSC frequency and " 34336f96c4bSHaozhong Zhang "migrated TSC frequency"); 34436f96c4bSHaozhong Zhang return -EINVAL; 34536f96c4bSHaozhong Zhang } 34636f96c4bSHaozhong Zhang 347444ba679SOrit Wasserman /* 348444ba679SOrit Wasserman * Real mode guest segments register DPL should be zero. 349444ba679SOrit Wasserman * Older KVM version were setting it wrongly. 350444ba679SOrit Wasserman * Fixing it will allow live migration from such host that don't have 351444ba679SOrit Wasserman * restricted guest support to a host with unrestricted guest support 352444ba679SOrit Wasserman * (otherwise the migration will fail with invalid guest state 353444ba679SOrit Wasserman * error). 354444ba679SOrit Wasserman */ 355444ba679SOrit Wasserman if (!(env->cr[0] & CR0_PE_MASK) && 356444ba679SOrit Wasserman (env->segs[R_CS].flags >> DESC_DPL_SHIFT & 3) != 0) { 357444ba679SOrit Wasserman env->segs[R_CS].flags &= ~(env->segs[R_CS].flags & DESC_DPL_MASK); 358444ba679SOrit Wasserman env->segs[R_DS].flags &= ~(env->segs[R_DS].flags & DESC_DPL_MASK); 359444ba679SOrit Wasserman env->segs[R_ES].flags &= ~(env->segs[R_ES].flags & DESC_DPL_MASK); 360444ba679SOrit Wasserman env->segs[R_FS].flags &= ~(env->segs[R_FS].flags & DESC_DPL_MASK); 361444ba679SOrit Wasserman env->segs[R_GS].flags &= ~(env->segs[R_GS].flags & DESC_DPL_MASK); 362444ba679SOrit Wasserman env->segs[R_SS].flags &= ~(env->segs[R_SS].flags & DESC_DPL_MASK); 363444ba679SOrit Wasserman } 364444ba679SOrit Wasserman 3657125c937SPaolo Bonzini /* Older versions of QEMU incorrectly used CS.DPL as the CPL when 3667125c937SPaolo Bonzini * running under KVM. This is wrong for conforming code segments. 3677125c937SPaolo Bonzini * Luckily, in our implementation the CPL field of hflags is redundant 3687125c937SPaolo Bonzini * and we can get the right value from the SS descriptor privilege level. 3697125c937SPaolo Bonzini */ 3707125c937SPaolo Bonzini env->hflags &= ~HF_CPL_MASK; 3717125c937SPaolo Bonzini env->hflags |= (env->segs[R_SS].flags >> DESC_DPL_SHIFT) & HF_CPL_MASK; 3727125c937SPaolo Bonzini 373468f6581SJuan Quintela env->fpstt = (env->fpus_vmstate >> 11) & 7; 374468f6581SJuan Quintela env->fpus = env->fpus_vmstate & ~0x3800; 375468f6581SJuan Quintela env->fptag_vmstate ^= 0xff; 376468f6581SJuan Quintela for(i = 0; i < 8; i++) { 377468f6581SJuan Quintela env->fptags[i] = (env->fptag_vmstate >> i) & 1; 378468f6581SJuan Quintela } 3795bde1407SPavel Dovgalyuk update_fp_status(env); 380468f6581SJuan Quintela 381b3310ab3SAndreas Färber cpu_breakpoint_remove_all(cs, BP_CPU); 38275a34036SAndreas Färber cpu_watchpoint_remove_all(cs, BP_CPU); 38393d00d0fSRichard Henderson { 38493d00d0fSRichard Henderson /* Indicate all breakpoints disabled, as they are, then 38593d00d0fSRichard Henderson let the helper re-enable them. */ 38693d00d0fSRichard Henderson target_ulong dr7 = env->dr[7]; 38793d00d0fSRichard Henderson env->dr[7] = dr7 & ~(DR7_GLOBAL_BP_MASK | DR7_LOCAL_BP_MASK); 38893d00d0fSRichard Henderson cpu_x86_update_dr7(env, dr7); 389428065ceSliguang } 390*d10eb08fSAlex Bennée tlb_flush(cs); 391428065ceSliguang 392f809c605SPaolo Bonzini if (tcg_enabled()) { 393f809c605SPaolo Bonzini cpu_smm_update(cpu); 394f809c605SPaolo Bonzini } 3951e7fbc6dSJuan Quintela return 0; 396468f6581SJuan Quintela } 397468f6581SJuan Quintela 398f6584ee2SGleb Natapov static bool async_pf_msr_needed(void *opaque) 399f6584ee2SGleb Natapov { 400f56e3a14SAndreas Färber X86CPU *cpu = opaque; 401f6584ee2SGleb Natapov 402f56e3a14SAndreas Färber return cpu->env.async_pf_en_msr != 0; 403f6584ee2SGleb Natapov } 404f6584ee2SGleb Natapov 405bc9a839dSMichael S. Tsirkin static bool pv_eoi_msr_needed(void *opaque) 406bc9a839dSMichael S. Tsirkin { 407f56e3a14SAndreas Färber X86CPU *cpu = opaque; 408bc9a839dSMichael S. Tsirkin 409f56e3a14SAndreas Färber return cpu->env.pv_eoi_en_msr != 0; 410bc9a839dSMichael S. Tsirkin } 411bc9a839dSMichael S. Tsirkin 412917367aaSMarcelo Tosatti static bool steal_time_msr_needed(void *opaque) 413917367aaSMarcelo Tosatti { 4140e503577SMarcelo Tosatti X86CPU *cpu = opaque; 415917367aaSMarcelo Tosatti 4160e503577SMarcelo Tosatti return cpu->env.steal_time_msr != 0; 417917367aaSMarcelo Tosatti } 418917367aaSMarcelo Tosatti 419917367aaSMarcelo Tosatti static const VMStateDescription vmstate_steal_time_msr = { 420917367aaSMarcelo Tosatti .name = "cpu/steal_time_msr", 421917367aaSMarcelo Tosatti .version_id = 1, 422917367aaSMarcelo Tosatti .minimum_version_id = 1, 4235cd8cadaSJuan Quintela .needed = steal_time_msr_needed, 424917367aaSMarcelo Tosatti .fields = (VMStateField[]) { 4250e503577SMarcelo Tosatti VMSTATE_UINT64(env.steal_time_msr, X86CPU), 426917367aaSMarcelo Tosatti VMSTATE_END_OF_LIST() 427917367aaSMarcelo Tosatti } 428917367aaSMarcelo Tosatti }; 429917367aaSMarcelo Tosatti 430f6584ee2SGleb Natapov static const VMStateDescription vmstate_async_pf_msr = { 431f6584ee2SGleb Natapov .name = "cpu/async_pf_msr", 432f6584ee2SGleb Natapov .version_id = 1, 433f6584ee2SGleb Natapov .minimum_version_id = 1, 4345cd8cadaSJuan Quintela .needed = async_pf_msr_needed, 435f6584ee2SGleb Natapov .fields = (VMStateField[]) { 436f56e3a14SAndreas Färber VMSTATE_UINT64(env.async_pf_en_msr, X86CPU), 437f6584ee2SGleb Natapov VMSTATE_END_OF_LIST() 438f6584ee2SGleb Natapov } 439f6584ee2SGleb Natapov }; 440f6584ee2SGleb Natapov 441bc9a839dSMichael S. Tsirkin static const VMStateDescription vmstate_pv_eoi_msr = { 442bc9a839dSMichael S. Tsirkin .name = "cpu/async_pv_eoi_msr", 443bc9a839dSMichael S. Tsirkin .version_id = 1, 444bc9a839dSMichael S. Tsirkin .minimum_version_id = 1, 4455cd8cadaSJuan Quintela .needed = pv_eoi_msr_needed, 446bc9a839dSMichael S. Tsirkin .fields = (VMStateField[]) { 447f56e3a14SAndreas Färber VMSTATE_UINT64(env.pv_eoi_en_msr, X86CPU), 448bc9a839dSMichael S. Tsirkin VMSTATE_END_OF_LIST() 449bc9a839dSMichael S. Tsirkin } 450bc9a839dSMichael S. Tsirkin }; 451bc9a839dSMichael S. Tsirkin 45242cc8fa6SJan Kiszka static bool fpop_ip_dp_needed(void *opaque) 45342cc8fa6SJan Kiszka { 454f56e3a14SAndreas Färber X86CPU *cpu = opaque; 455f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 45642cc8fa6SJan Kiszka 45742cc8fa6SJan Kiszka return env->fpop != 0 || env->fpip != 0 || env->fpdp != 0; 45842cc8fa6SJan Kiszka } 45942cc8fa6SJan Kiszka 46042cc8fa6SJan Kiszka static const VMStateDescription vmstate_fpop_ip_dp = { 46142cc8fa6SJan Kiszka .name = "cpu/fpop_ip_dp", 46242cc8fa6SJan Kiszka .version_id = 1, 46342cc8fa6SJan Kiszka .minimum_version_id = 1, 4645cd8cadaSJuan Quintela .needed = fpop_ip_dp_needed, 46542cc8fa6SJan Kiszka .fields = (VMStateField[]) { 466f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpop, X86CPU), 467f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpip, X86CPU), 468f56e3a14SAndreas Färber VMSTATE_UINT64(env.fpdp, X86CPU), 46942cc8fa6SJan Kiszka VMSTATE_END_OF_LIST() 47042cc8fa6SJan Kiszka } 47142cc8fa6SJan Kiszka }; 47242cc8fa6SJan Kiszka 473f28558d3SWill Auld static bool tsc_adjust_needed(void *opaque) 474f28558d3SWill Auld { 475f56e3a14SAndreas Färber X86CPU *cpu = opaque; 476f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 477f28558d3SWill Auld 478f28558d3SWill Auld return env->tsc_adjust != 0; 479f28558d3SWill Auld } 480f28558d3SWill Auld 481f28558d3SWill Auld static const VMStateDescription vmstate_msr_tsc_adjust = { 482f28558d3SWill Auld .name = "cpu/msr_tsc_adjust", 483f28558d3SWill Auld .version_id = 1, 484f28558d3SWill Auld .minimum_version_id = 1, 4855cd8cadaSJuan Quintela .needed = tsc_adjust_needed, 486f28558d3SWill Auld .fields = (VMStateField[]) { 487f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_adjust, X86CPU), 488f28558d3SWill Auld VMSTATE_END_OF_LIST() 489f28558d3SWill Auld } 490f28558d3SWill Auld }; 491f28558d3SWill Auld 492aa82ba54SLiu, Jinsong static bool tscdeadline_needed(void *opaque) 493aa82ba54SLiu, Jinsong { 494f56e3a14SAndreas Färber X86CPU *cpu = opaque; 495f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 496aa82ba54SLiu, Jinsong 497aa82ba54SLiu, Jinsong return env->tsc_deadline != 0; 498aa82ba54SLiu, Jinsong } 499aa82ba54SLiu, Jinsong 500aa82ba54SLiu, Jinsong static const VMStateDescription vmstate_msr_tscdeadline = { 501aa82ba54SLiu, Jinsong .name = "cpu/msr_tscdeadline", 502aa82ba54SLiu, Jinsong .version_id = 1, 503aa82ba54SLiu, Jinsong .minimum_version_id = 1, 5045cd8cadaSJuan Quintela .needed = tscdeadline_needed, 505aa82ba54SLiu, Jinsong .fields = (VMStateField[]) { 506f56e3a14SAndreas Färber VMSTATE_UINT64(env.tsc_deadline, X86CPU), 507aa82ba54SLiu, Jinsong VMSTATE_END_OF_LIST() 508aa82ba54SLiu, Jinsong } 509aa82ba54SLiu, Jinsong }; 510aa82ba54SLiu, Jinsong 51121e87c46SAvi Kivity static bool misc_enable_needed(void *opaque) 51221e87c46SAvi Kivity { 513f56e3a14SAndreas Färber X86CPU *cpu = opaque; 514f56e3a14SAndreas Färber CPUX86State *env = &cpu->env; 51521e87c46SAvi Kivity 51621e87c46SAvi Kivity return env->msr_ia32_misc_enable != MSR_IA32_MISC_ENABLE_DEFAULT; 51721e87c46SAvi Kivity } 51821e87c46SAvi Kivity 5190779caebSArthur Chunqi Li static bool feature_control_needed(void *opaque) 5200779caebSArthur Chunqi Li { 5210779caebSArthur Chunqi Li X86CPU *cpu = opaque; 5220779caebSArthur Chunqi Li CPUX86State *env = &cpu->env; 5230779caebSArthur Chunqi Li 5240779caebSArthur Chunqi Li return env->msr_ia32_feature_control != 0; 5250779caebSArthur Chunqi Li } 5260779caebSArthur Chunqi Li 52721e87c46SAvi Kivity static const VMStateDescription vmstate_msr_ia32_misc_enable = { 52821e87c46SAvi Kivity .name = "cpu/msr_ia32_misc_enable", 52921e87c46SAvi Kivity .version_id = 1, 53021e87c46SAvi Kivity .minimum_version_id = 1, 5315cd8cadaSJuan Quintela .needed = misc_enable_needed, 53221e87c46SAvi Kivity .fields = (VMStateField[]) { 533f56e3a14SAndreas Färber VMSTATE_UINT64(env.msr_ia32_misc_enable, X86CPU), 53421e87c46SAvi Kivity VMSTATE_END_OF_LIST() 53521e87c46SAvi Kivity } 53621e87c46SAvi Kivity }; 53721e87c46SAvi Kivity 5380779caebSArthur Chunqi Li static const VMStateDescription vmstate_msr_ia32_feature_control = { 5390779caebSArthur Chunqi Li .name = "cpu/msr_ia32_feature_control", 5400779caebSArthur Chunqi Li .version_id = 1, 5410779caebSArthur Chunqi Li .minimum_version_id = 1, 5425cd8cadaSJuan Quintela .needed = feature_control_needed, 5430779caebSArthur Chunqi Li .fields = (VMStateField[]) { 5440779caebSArthur Chunqi Li VMSTATE_UINT64(env.msr_ia32_feature_control, X86CPU), 5450779caebSArthur Chunqi Li VMSTATE_END_OF_LIST() 5460779caebSArthur Chunqi Li } 5470779caebSArthur Chunqi Li }; 5480779caebSArthur Chunqi Li 5490d894367SPaolo Bonzini static bool pmu_enable_needed(void *opaque) 5500d894367SPaolo Bonzini { 5510d894367SPaolo Bonzini X86CPU *cpu = opaque; 5520d894367SPaolo Bonzini CPUX86State *env = &cpu->env; 5530d894367SPaolo Bonzini int i; 5540d894367SPaolo Bonzini 5550d894367SPaolo Bonzini if (env->msr_fixed_ctr_ctrl || env->msr_global_ctrl || 5560d894367SPaolo Bonzini env->msr_global_status || env->msr_global_ovf_ctrl) { 5570d894367SPaolo Bonzini return true; 5580d894367SPaolo Bonzini } 5590d894367SPaolo Bonzini for (i = 0; i < MAX_FIXED_COUNTERS; i++) { 5600d894367SPaolo Bonzini if (env->msr_fixed_counters[i]) { 5610d894367SPaolo Bonzini return true; 5620d894367SPaolo Bonzini } 5630d894367SPaolo Bonzini } 5640d894367SPaolo Bonzini for (i = 0; i < MAX_GP_COUNTERS; i++) { 5650d894367SPaolo Bonzini if (env->msr_gp_counters[i] || env->msr_gp_evtsel[i]) { 5660d894367SPaolo Bonzini return true; 5670d894367SPaolo Bonzini } 5680d894367SPaolo Bonzini } 5690d894367SPaolo Bonzini 5700d894367SPaolo Bonzini return false; 5710d894367SPaolo Bonzini } 5720d894367SPaolo Bonzini 5730d894367SPaolo Bonzini static const VMStateDescription vmstate_msr_architectural_pmu = { 5740d894367SPaolo Bonzini .name = "cpu/msr_architectural_pmu", 5750d894367SPaolo Bonzini .version_id = 1, 5760d894367SPaolo Bonzini .minimum_version_id = 1, 5775cd8cadaSJuan Quintela .needed = pmu_enable_needed, 5780d894367SPaolo Bonzini .fields = (VMStateField[]) { 5790d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_fixed_ctr_ctrl, X86CPU), 5800d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ctrl, X86CPU), 5810d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_status, X86CPU), 5820d894367SPaolo Bonzini VMSTATE_UINT64(env.msr_global_ovf_ctrl, X86CPU), 5830d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_fixed_counters, X86CPU, MAX_FIXED_COUNTERS), 5840d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_counters, X86CPU, MAX_GP_COUNTERS), 5850d894367SPaolo Bonzini VMSTATE_UINT64_ARRAY(env.msr_gp_evtsel, X86CPU, MAX_GP_COUNTERS), 5860d894367SPaolo Bonzini VMSTATE_END_OF_LIST() 5870d894367SPaolo Bonzini } 5880d894367SPaolo Bonzini }; 5890d894367SPaolo Bonzini 59079e9ebebSLiu Jinsong static bool mpx_needed(void *opaque) 59179e9ebebSLiu Jinsong { 59279e9ebebSLiu Jinsong X86CPU *cpu = opaque; 59379e9ebebSLiu Jinsong CPUX86State *env = &cpu->env; 59479e9ebebSLiu Jinsong unsigned int i; 59579e9ebebSLiu Jinsong 59679e9ebebSLiu Jinsong for (i = 0; i < 4; i++) { 59779e9ebebSLiu Jinsong if (env->bnd_regs[i].lb || env->bnd_regs[i].ub) { 59879e9ebebSLiu Jinsong return true; 59979e9ebebSLiu Jinsong } 60079e9ebebSLiu Jinsong } 60179e9ebebSLiu Jinsong 60279e9ebebSLiu Jinsong if (env->bndcs_regs.cfgu || env->bndcs_regs.sts) { 60379e9ebebSLiu Jinsong return true; 60479e9ebebSLiu Jinsong } 60579e9ebebSLiu Jinsong 60679e9ebebSLiu Jinsong return !!env->msr_bndcfgs; 60779e9ebebSLiu Jinsong } 60879e9ebebSLiu Jinsong 60979e9ebebSLiu Jinsong static const VMStateDescription vmstate_mpx = { 61079e9ebebSLiu Jinsong .name = "cpu/mpx", 61179e9ebebSLiu Jinsong .version_id = 1, 61279e9ebebSLiu Jinsong .minimum_version_id = 1, 6135cd8cadaSJuan Quintela .needed = mpx_needed, 61479e9ebebSLiu Jinsong .fields = (VMStateField[]) { 61579e9ebebSLiu Jinsong VMSTATE_BND_REGS(env.bnd_regs, X86CPU, 4), 61679e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.cfgu, X86CPU), 61779e9ebebSLiu Jinsong VMSTATE_UINT64(env.bndcs_regs.sts, X86CPU), 61879e9ebebSLiu Jinsong VMSTATE_UINT64(env.msr_bndcfgs, X86CPU), 61979e9ebebSLiu Jinsong VMSTATE_END_OF_LIST() 62079e9ebebSLiu Jinsong } 62179e9ebebSLiu Jinsong }; 62279e9ebebSLiu Jinsong 6231c90ef26SVadim Rozenfeld static bool hyperv_hypercall_enable_needed(void *opaque) 6241c90ef26SVadim Rozenfeld { 6251c90ef26SVadim Rozenfeld X86CPU *cpu = opaque; 6261c90ef26SVadim Rozenfeld CPUX86State *env = &cpu->env; 6271c90ef26SVadim Rozenfeld 6281c90ef26SVadim Rozenfeld return env->msr_hv_hypercall != 0 || env->msr_hv_guest_os_id != 0; 6291c90ef26SVadim Rozenfeld } 6301c90ef26SVadim Rozenfeld 6311c90ef26SVadim Rozenfeld static const VMStateDescription vmstate_msr_hypercall_hypercall = { 6321c90ef26SVadim Rozenfeld .name = "cpu/msr_hyperv_hypercall", 6331c90ef26SVadim Rozenfeld .version_id = 1, 6341c90ef26SVadim Rozenfeld .minimum_version_id = 1, 6355cd8cadaSJuan Quintela .needed = hyperv_hypercall_enable_needed, 6361c90ef26SVadim Rozenfeld .fields = (VMStateField[]) { 6371c90ef26SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_guest_os_id, X86CPU), 638466e6e9dSPaolo Bonzini VMSTATE_UINT64(env.msr_hv_hypercall, X86CPU), 6391c90ef26SVadim Rozenfeld VMSTATE_END_OF_LIST() 6401c90ef26SVadim Rozenfeld } 6411c90ef26SVadim Rozenfeld }; 6421c90ef26SVadim Rozenfeld 6435ef68987SVadim Rozenfeld static bool hyperv_vapic_enable_needed(void *opaque) 6445ef68987SVadim Rozenfeld { 6455ef68987SVadim Rozenfeld X86CPU *cpu = opaque; 6465ef68987SVadim Rozenfeld CPUX86State *env = &cpu->env; 6475ef68987SVadim Rozenfeld 6485ef68987SVadim Rozenfeld return env->msr_hv_vapic != 0; 6495ef68987SVadim Rozenfeld } 6505ef68987SVadim Rozenfeld 6515ef68987SVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_vapic = { 6525ef68987SVadim Rozenfeld .name = "cpu/msr_hyperv_vapic", 6535ef68987SVadim Rozenfeld .version_id = 1, 6545ef68987SVadim Rozenfeld .minimum_version_id = 1, 6555cd8cadaSJuan Quintela .needed = hyperv_vapic_enable_needed, 6565ef68987SVadim Rozenfeld .fields = (VMStateField[]) { 6575ef68987SVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_vapic, X86CPU), 6585ef68987SVadim Rozenfeld VMSTATE_END_OF_LIST() 6595ef68987SVadim Rozenfeld } 6605ef68987SVadim Rozenfeld }; 6615ef68987SVadim Rozenfeld 66248a5f3bcSVadim Rozenfeld static bool hyperv_time_enable_needed(void *opaque) 66348a5f3bcSVadim Rozenfeld { 66448a5f3bcSVadim Rozenfeld X86CPU *cpu = opaque; 66548a5f3bcSVadim Rozenfeld CPUX86State *env = &cpu->env; 66648a5f3bcSVadim Rozenfeld 66748a5f3bcSVadim Rozenfeld return env->msr_hv_tsc != 0; 66848a5f3bcSVadim Rozenfeld } 66948a5f3bcSVadim Rozenfeld 67048a5f3bcSVadim Rozenfeld static const VMStateDescription vmstate_msr_hyperv_time = { 67148a5f3bcSVadim Rozenfeld .name = "cpu/msr_hyperv_time", 67248a5f3bcSVadim Rozenfeld .version_id = 1, 67348a5f3bcSVadim Rozenfeld .minimum_version_id = 1, 6745cd8cadaSJuan Quintela .needed = hyperv_time_enable_needed, 67548a5f3bcSVadim Rozenfeld .fields = (VMStateField[]) { 67648a5f3bcSVadim Rozenfeld VMSTATE_UINT64(env.msr_hv_tsc, X86CPU), 67748a5f3bcSVadim Rozenfeld VMSTATE_END_OF_LIST() 67848a5f3bcSVadim Rozenfeld } 67948a5f3bcSVadim Rozenfeld }; 68048a5f3bcSVadim Rozenfeld 681f2a53c9eSAndrey Smetanin static bool hyperv_crash_enable_needed(void *opaque) 682f2a53c9eSAndrey Smetanin { 683f2a53c9eSAndrey Smetanin X86CPU *cpu = opaque; 684f2a53c9eSAndrey Smetanin CPUX86State *env = &cpu->env; 685f2a53c9eSAndrey Smetanin int i; 686f2a53c9eSAndrey Smetanin 687f2a53c9eSAndrey Smetanin for (i = 0; i < HV_X64_MSR_CRASH_PARAMS; i++) { 688f2a53c9eSAndrey Smetanin if (env->msr_hv_crash_params[i]) { 689f2a53c9eSAndrey Smetanin return true; 690f2a53c9eSAndrey Smetanin } 691f2a53c9eSAndrey Smetanin } 692f2a53c9eSAndrey Smetanin return false; 693f2a53c9eSAndrey Smetanin } 694f2a53c9eSAndrey Smetanin 695f2a53c9eSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_crash = { 696f2a53c9eSAndrey Smetanin .name = "cpu/msr_hyperv_crash", 697f2a53c9eSAndrey Smetanin .version_id = 1, 698f2a53c9eSAndrey Smetanin .minimum_version_id = 1, 699f2a53c9eSAndrey Smetanin .needed = hyperv_crash_enable_needed, 700f2a53c9eSAndrey Smetanin .fields = (VMStateField[]) { 701f2a53c9eSAndrey Smetanin VMSTATE_UINT64_ARRAY(env.msr_hv_crash_params, 702f2a53c9eSAndrey Smetanin X86CPU, HV_X64_MSR_CRASH_PARAMS), 703f2a53c9eSAndrey Smetanin VMSTATE_END_OF_LIST() 704f2a53c9eSAndrey Smetanin } 705f2a53c9eSAndrey Smetanin }; 706f2a53c9eSAndrey Smetanin 70746eb8f98SAndrey Smetanin static bool hyperv_runtime_enable_needed(void *opaque) 70846eb8f98SAndrey Smetanin { 70946eb8f98SAndrey Smetanin X86CPU *cpu = opaque; 71046eb8f98SAndrey Smetanin CPUX86State *env = &cpu->env; 71146eb8f98SAndrey Smetanin 71251227875SZhuangYanying if (!cpu->hyperv_runtime) { 71351227875SZhuangYanying return false; 71451227875SZhuangYanying } 71551227875SZhuangYanying 71646eb8f98SAndrey Smetanin return env->msr_hv_runtime != 0; 71746eb8f98SAndrey Smetanin } 71846eb8f98SAndrey Smetanin 71946eb8f98SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_runtime = { 72046eb8f98SAndrey Smetanin .name = "cpu/msr_hyperv_runtime", 72146eb8f98SAndrey Smetanin .version_id = 1, 72246eb8f98SAndrey Smetanin .minimum_version_id = 1, 72346eb8f98SAndrey Smetanin .needed = hyperv_runtime_enable_needed, 72446eb8f98SAndrey Smetanin .fields = (VMStateField[]) { 72546eb8f98SAndrey Smetanin VMSTATE_UINT64(env.msr_hv_runtime, X86CPU), 72646eb8f98SAndrey Smetanin VMSTATE_END_OF_LIST() 72746eb8f98SAndrey Smetanin } 72846eb8f98SAndrey Smetanin }; 72946eb8f98SAndrey Smetanin 730866eea9aSAndrey Smetanin static bool hyperv_synic_enable_needed(void *opaque) 731866eea9aSAndrey Smetanin { 732866eea9aSAndrey Smetanin X86CPU *cpu = opaque; 733866eea9aSAndrey Smetanin CPUX86State *env = &cpu->env; 734866eea9aSAndrey Smetanin int i; 735866eea9aSAndrey Smetanin 736866eea9aSAndrey Smetanin if (env->msr_hv_synic_control != 0 || 737866eea9aSAndrey Smetanin env->msr_hv_synic_evt_page != 0 || 738866eea9aSAndrey Smetanin env->msr_hv_synic_msg_page != 0) { 739866eea9aSAndrey Smetanin return true; 740866eea9aSAndrey Smetanin } 741866eea9aSAndrey Smetanin 742866eea9aSAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_synic_sint); i++) { 743866eea9aSAndrey Smetanin if (env->msr_hv_synic_sint[i] != 0) { 744866eea9aSAndrey Smetanin return true; 745866eea9aSAndrey Smetanin } 746866eea9aSAndrey Smetanin } 747866eea9aSAndrey Smetanin 748866eea9aSAndrey Smetanin return false; 749866eea9aSAndrey Smetanin } 750866eea9aSAndrey Smetanin 751866eea9aSAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_synic = { 752866eea9aSAndrey Smetanin .name = "cpu/msr_hyperv_synic", 753866eea9aSAndrey Smetanin .version_id = 1, 754866eea9aSAndrey Smetanin .minimum_version_id = 1, 755866eea9aSAndrey Smetanin .needed = hyperv_synic_enable_needed, 756866eea9aSAndrey Smetanin .fields = (VMStateField[]) { 757866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_control, X86CPU), 758866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_evt_page, X86CPU), 759866eea9aSAndrey Smetanin VMSTATE_UINT64(env.msr_hv_synic_msg_page, X86CPU), 760866eea9aSAndrey Smetanin VMSTATE_UINT64_ARRAY(env.msr_hv_synic_sint, X86CPU, 761866eea9aSAndrey Smetanin HV_SYNIC_SINT_COUNT), 762866eea9aSAndrey Smetanin VMSTATE_END_OF_LIST() 763866eea9aSAndrey Smetanin } 764866eea9aSAndrey Smetanin }; 765866eea9aSAndrey Smetanin 766ff99aa64SAndrey Smetanin static bool hyperv_stimer_enable_needed(void *opaque) 767ff99aa64SAndrey Smetanin { 768ff99aa64SAndrey Smetanin X86CPU *cpu = opaque; 769ff99aa64SAndrey Smetanin CPUX86State *env = &cpu->env; 770ff99aa64SAndrey Smetanin int i; 771ff99aa64SAndrey Smetanin 772ff99aa64SAndrey Smetanin for (i = 0; i < ARRAY_SIZE(env->msr_hv_stimer_config); i++) { 773ff99aa64SAndrey Smetanin if (env->msr_hv_stimer_config[i] || env->msr_hv_stimer_count[i]) { 774ff99aa64SAndrey Smetanin return true; 775ff99aa64SAndrey Smetanin } 776ff99aa64SAndrey Smetanin } 777ff99aa64SAndrey Smetanin return false; 778ff99aa64SAndrey Smetanin } 779ff99aa64SAndrey Smetanin 780ff99aa64SAndrey Smetanin static const VMStateDescription vmstate_msr_hyperv_stimer = { 781ff99aa64SAndrey Smetanin .name = "cpu/msr_hyperv_stimer", 782ff99aa64SAndrey Smetanin .version_id = 1, 783ff99aa64SAndrey Smetanin .minimum_version_id = 1, 784ff99aa64SAndrey Smetanin .needed = hyperv_stimer_enable_needed, 785ff99aa64SAndrey Smetanin .fields = (VMStateField[]) { 786ff99aa64SAndrey Smetanin VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_config, 787ff99aa64SAndrey Smetanin X86CPU, HV_SYNIC_STIMER_COUNT), 788ff99aa64SAndrey Smetanin VMSTATE_UINT64_ARRAY(env.msr_hv_stimer_count, 789ff99aa64SAndrey Smetanin X86CPU, HV_SYNIC_STIMER_COUNT), 790ff99aa64SAndrey Smetanin VMSTATE_END_OF_LIST() 791ff99aa64SAndrey Smetanin } 792ff99aa64SAndrey Smetanin }; 793ff99aa64SAndrey Smetanin 7949aecd6f8SChao Peng static bool avx512_needed(void *opaque) 7959aecd6f8SChao Peng { 7969aecd6f8SChao Peng X86CPU *cpu = opaque; 7979aecd6f8SChao Peng CPUX86State *env = &cpu->env; 7989aecd6f8SChao Peng unsigned int i; 7999aecd6f8SChao Peng 8009aecd6f8SChao Peng for (i = 0; i < NB_OPMASK_REGS; i++) { 8019aecd6f8SChao Peng if (env->opmask_regs[i]) { 8029aecd6f8SChao Peng return true; 8039aecd6f8SChao Peng } 8049aecd6f8SChao Peng } 8059aecd6f8SChao Peng 8069aecd6f8SChao Peng for (i = 0; i < CPU_NB_REGS; i++) { 80719cbd87cSEduardo Habkost #define ENV_XMM(reg, field) (env->xmm_regs[reg].ZMM_Q(field)) 808b7711471SPaolo Bonzini if (ENV_XMM(i, 4) || ENV_XMM(i, 6) || 809b7711471SPaolo Bonzini ENV_XMM(i, 5) || ENV_XMM(i, 7)) { 8109aecd6f8SChao Peng return true; 8119aecd6f8SChao Peng } 8129aecd6f8SChao Peng #ifdef TARGET_X86_64 813b7711471SPaolo Bonzini if (ENV_XMM(i+16, 0) || ENV_XMM(i+16, 1) || 814b7711471SPaolo Bonzini ENV_XMM(i+16, 2) || ENV_XMM(i+16, 3) || 815b7711471SPaolo Bonzini ENV_XMM(i+16, 4) || ENV_XMM(i+16, 5) || 816b7711471SPaolo Bonzini ENV_XMM(i+16, 6) || ENV_XMM(i+16, 7)) { 8179aecd6f8SChao Peng return true; 8189aecd6f8SChao Peng } 8199aecd6f8SChao Peng #endif 8209aecd6f8SChao Peng } 8219aecd6f8SChao Peng 8229aecd6f8SChao Peng return false; 8239aecd6f8SChao Peng } 8249aecd6f8SChao Peng 8259aecd6f8SChao Peng static const VMStateDescription vmstate_avx512 = { 8269aecd6f8SChao Peng .name = "cpu/avx512", 8279aecd6f8SChao Peng .version_id = 1, 8289aecd6f8SChao Peng .minimum_version_id = 1, 8295cd8cadaSJuan Quintela .needed = avx512_needed, 8309aecd6f8SChao Peng .fields = (VMStateField[]) { 8319aecd6f8SChao Peng VMSTATE_UINT64_ARRAY(env.opmask_regs, X86CPU, NB_OPMASK_REGS), 832b7711471SPaolo Bonzini VMSTATE_ZMMH_REGS_VARS(env.xmm_regs, X86CPU, 0), 8339aecd6f8SChao Peng #ifdef TARGET_X86_64 834b7711471SPaolo Bonzini VMSTATE_Hi16_ZMM_REGS_VARS(env.xmm_regs, X86CPU, 16), 8359aecd6f8SChao Peng #endif 8369aecd6f8SChao Peng VMSTATE_END_OF_LIST() 8379aecd6f8SChao Peng } 8389aecd6f8SChao Peng }; 8399aecd6f8SChao Peng 84018cd2c17SWanpeng Li static bool xss_needed(void *opaque) 84118cd2c17SWanpeng Li { 84218cd2c17SWanpeng Li X86CPU *cpu = opaque; 84318cd2c17SWanpeng Li CPUX86State *env = &cpu->env; 84418cd2c17SWanpeng Li 84518cd2c17SWanpeng Li return env->xss != 0; 84618cd2c17SWanpeng Li } 84718cd2c17SWanpeng Li 84818cd2c17SWanpeng Li static const VMStateDescription vmstate_xss = { 84918cd2c17SWanpeng Li .name = "cpu/xss", 85018cd2c17SWanpeng Li .version_id = 1, 85118cd2c17SWanpeng Li .minimum_version_id = 1, 8525cd8cadaSJuan Quintela .needed = xss_needed, 85318cd2c17SWanpeng Li .fields = (VMStateField[]) { 85418cd2c17SWanpeng Li VMSTATE_UINT64(env.xss, X86CPU), 85518cd2c17SWanpeng Li VMSTATE_END_OF_LIST() 85618cd2c17SWanpeng Li } 85718cd2c17SWanpeng Li }; 85818cd2c17SWanpeng Li 859f74eefe0SHuaitong Han #ifdef TARGET_X86_64 860f74eefe0SHuaitong Han static bool pkru_needed(void *opaque) 861f74eefe0SHuaitong Han { 862f74eefe0SHuaitong Han X86CPU *cpu = opaque; 863f74eefe0SHuaitong Han CPUX86State *env = &cpu->env; 864f74eefe0SHuaitong Han 865f74eefe0SHuaitong Han return env->pkru != 0; 866f74eefe0SHuaitong Han } 867f74eefe0SHuaitong Han 868f74eefe0SHuaitong Han static const VMStateDescription vmstate_pkru = { 869f74eefe0SHuaitong Han .name = "cpu/pkru", 870f74eefe0SHuaitong Han .version_id = 1, 871f74eefe0SHuaitong Han .minimum_version_id = 1, 872f74eefe0SHuaitong Han .needed = pkru_needed, 873f74eefe0SHuaitong Han .fields = (VMStateField[]){ 874f74eefe0SHuaitong Han VMSTATE_UINT32(env.pkru, X86CPU), 875f74eefe0SHuaitong Han VMSTATE_END_OF_LIST() 876f74eefe0SHuaitong Han } 877f74eefe0SHuaitong Han }; 878f74eefe0SHuaitong Han #endif 879f74eefe0SHuaitong Han 88036f96c4bSHaozhong Zhang static bool tsc_khz_needed(void *opaque) 88136f96c4bSHaozhong Zhang { 88236f96c4bSHaozhong Zhang X86CPU *cpu = opaque; 88336f96c4bSHaozhong Zhang CPUX86State *env = &cpu->env; 88436f96c4bSHaozhong Zhang MachineClass *mc = MACHINE_GET_CLASS(qdev_get_machine()); 88536f96c4bSHaozhong Zhang PCMachineClass *pcmc = PC_MACHINE_CLASS(mc); 88636f96c4bSHaozhong Zhang return env->tsc_khz && pcmc->save_tsc_khz; 88736f96c4bSHaozhong Zhang } 88836f96c4bSHaozhong Zhang 88936f96c4bSHaozhong Zhang static const VMStateDescription vmstate_tsc_khz = { 89036f96c4bSHaozhong Zhang .name = "cpu/tsc_khz", 89136f96c4bSHaozhong Zhang .version_id = 1, 89236f96c4bSHaozhong Zhang .minimum_version_id = 1, 89336f96c4bSHaozhong Zhang .needed = tsc_khz_needed, 89436f96c4bSHaozhong Zhang .fields = (VMStateField[]) { 89536f96c4bSHaozhong Zhang VMSTATE_INT64(env.tsc_khz, X86CPU), 89636f96c4bSHaozhong Zhang VMSTATE_END_OF_LIST() 89736f96c4bSHaozhong Zhang } 89836f96c4bSHaozhong Zhang }; 89936f96c4bSHaozhong Zhang 90087f8b626SAshok Raj static bool mcg_ext_ctl_needed(void *opaque) 90187f8b626SAshok Raj { 90287f8b626SAshok Raj X86CPU *cpu = opaque; 90387f8b626SAshok Raj CPUX86State *env = &cpu->env; 90487f8b626SAshok Raj return cpu->enable_lmce && env->mcg_ext_ctl; 90587f8b626SAshok Raj } 90687f8b626SAshok Raj 90787f8b626SAshok Raj static const VMStateDescription vmstate_mcg_ext_ctl = { 90887f8b626SAshok Raj .name = "cpu/mcg_ext_ctl", 90987f8b626SAshok Raj .version_id = 1, 91087f8b626SAshok Raj .minimum_version_id = 1, 91187f8b626SAshok Raj .needed = mcg_ext_ctl_needed, 91287f8b626SAshok Raj .fields = (VMStateField[]) { 91387f8b626SAshok Raj VMSTATE_UINT64(env.mcg_ext_ctl, X86CPU), 91487f8b626SAshok Raj VMSTATE_END_OF_LIST() 91587f8b626SAshok Raj } 91687f8b626SAshok Raj }; 91787f8b626SAshok Raj 91868bfd0adSMarcelo Tosatti VMStateDescription vmstate_x86_cpu = { 9190cb892aaSJuan Quintela .name = "cpu", 920f56e3a14SAndreas Färber .version_id = 12, 9210cb892aaSJuan Quintela .minimum_version_id = 3, 9220cb892aaSJuan Quintela .pre_save = cpu_pre_save, 9230cb892aaSJuan Quintela .post_load = cpu_post_load, 9240cb892aaSJuan Quintela .fields = (VMStateField[]) { 925f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.regs, X86CPU, CPU_NB_REGS), 926f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eip, X86CPU), 927f56e3a14SAndreas Färber VMSTATE_UINTTL(env.eflags, X86CPU), 928f56e3a14SAndreas Färber VMSTATE_UINT32(env.hflags, X86CPU), 9290cb892aaSJuan Quintela /* FPU */ 930f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpuc, X86CPU), 931f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpus_vmstate, X86CPU), 932f56e3a14SAndreas Färber VMSTATE_UINT16(env.fptag_vmstate, X86CPU), 933f56e3a14SAndreas Färber VMSTATE_UINT16(env.fpregs_format_vmstate, X86CPU), 934f56e3a14SAndreas Färber VMSTATE_FP_REGS(env.fpregs, X86CPU, 8), 9358dd3dca3Saurel32 936f56e3a14SAndreas Färber VMSTATE_SEGMENT_ARRAY(env.segs, X86CPU, 6), 937f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.ldt, X86CPU), 938f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.tr, X86CPU), 939f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.gdt, X86CPU), 940f56e3a14SAndreas Färber VMSTATE_SEGMENT(env.idt, X86CPU), 941468f6581SJuan Quintela 942f56e3a14SAndreas Färber VMSTATE_UINT32(env.sysenter_cs, X86CPU), 9430cb892aaSJuan Quintela #ifdef TARGET_X86_64 9440cb892aaSJuan Quintela /* Hack: In v7 size changed from 32 to 64 bits on x86_64 */ 945f56e3a14SAndreas Färber VMSTATE_HACK_UINT32(env.sysenter_esp, X86CPU, less_than_7), 946f56e3a14SAndreas Färber VMSTATE_HACK_UINT32(env.sysenter_eip, X86CPU, less_than_7), 947f56e3a14SAndreas Färber VMSTATE_UINTTL_V(env.sysenter_esp, X86CPU, 7), 948f56e3a14SAndreas Färber VMSTATE_UINTTL_V(env.sysenter_eip, X86CPU, 7), 9493c8ce630SJuan Quintela #else 950f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_esp, X86CPU), 951f56e3a14SAndreas Färber VMSTATE_UINTTL(env.sysenter_eip, X86CPU), 9523c8ce630SJuan Quintela #endif 9538dd3dca3Saurel32 954f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[0], X86CPU), 955f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[2], X86CPU), 956f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[3], X86CPU), 957f56e3a14SAndreas Färber VMSTATE_UINTTL(env.cr[4], X86CPU), 958f56e3a14SAndreas Färber VMSTATE_UINTTL_ARRAY(env.dr, X86CPU, 8), 9590cb892aaSJuan Quintela /* MMU */ 960f56e3a14SAndreas Färber VMSTATE_INT32(env.a20_mask, X86CPU), 9610cb892aaSJuan Quintela /* XMM */ 962f56e3a14SAndreas Färber VMSTATE_UINT32(env.mxcsr, X86CPU), 963a03c3e90SPaolo Bonzini VMSTATE_XMM_REGS(env.xmm_regs, X86CPU, 0), 9648dd3dca3Saurel32 9658dd3dca3Saurel32 #ifdef TARGET_X86_64 966f56e3a14SAndreas Färber VMSTATE_UINT64(env.efer, X86CPU), 967f56e3a14SAndreas Färber VMSTATE_UINT64(env.star, X86CPU), 968f56e3a14SAndreas Färber VMSTATE_UINT64(env.lstar, X86CPU), 969f56e3a14SAndreas Färber VMSTATE_UINT64(env.cstar, X86CPU), 970f56e3a14SAndreas Färber VMSTATE_UINT64(env.fmask, X86CPU), 971f56e3a14SAndreas Färber VMSTATE_UINT64(env.kernelgsbase, X86CPU), 9728dd3dca3Saurel32 #endif 973f56e3a14SAndreas Färber VMSTATE_UINT32_V(env.smbase, X86CPU, 4), 9748dd3dca3Saurel32 975f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.pat, X86CPU, 5), 976f56e3a14SAndreas Färber VMSTATE_UINT32_V(env.hflags2, X86CPU, 5), 977dd5e3b17Saliguori 978259186a7SAndreas Färber VMSTATE_UINT32_TEST(parent_obj.halted, X86CPU, version_is_5), 979f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.vm_hsave, X86CPU, 5), 980f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.vm_vmcb, X86CPU, 5), 981f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.tsc_offset, X86CPU, 5), 982f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.intercept, X86CPU, 5), 983f56e3a14SAndreas Färber VMSTATE_UINT16_V(env.intercept_cr_read, X86CPU, 5), 984f56e3a14SAndreas Färber VMSTATE_UINT16_V(env.intercept_cr_write, X86CPU, 5), 985f56e3a14SAndreas Färber VMSTATE_UINT16_V(env.intercept_dr_read, X86CPU, 5), 986f56e3a14SAndreas Färber VMSTATE_UINT16_V(env.intercept_dr_write, X86CPU, 5), 987f56e3a14SAndreas Färber VMSTATE_UINT32_V(env.intercept_exceptions, X86CPU, 5), 988f56e3a14SAndreas Färber VMSTATE_UINT8_V(env.v_tpr, X86CPU, 5), 989dd5e3b17Saliguori /* MTRRs */ 990f56e3a14SAndreas Färber VMSTATE_UINT64_ARRAY_V(env.mtrr_fixed, X86CPU, 11, 8), 991f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.mtrr_deftype, X86CPU, 8), 992d8b5c67bSAlex Williamson VMSTATE_MTRR_VARS(env.mtrr_var, X86CPU, MSR_MTRRcap_VCNT, 8), 9930cb892aaSJuan Quintela /* KVM-related states */ 994f56e3a14SAndreas Färber VMSTATE_INT32_V(env.interrupt_injected, X86CPU, 9), 995f56e3a14SAndreas Färber VMSTATE_UINT32_V(env.mp_state, X86CPU, 9), 996f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.tsc, X86CPU, 9), 997f56e3a14SAndreas Färber VMSTATE_INT32_V(env.exception_injected, X86CPU, 11), 998f56e3a14SAndreas Färber VMSTATE_UINT8_V(env.soft_interrupt, X86CPU, 11), 999f56e3a14SAndreas Färber VMSTATE_UINT8_V(env.nmi_injected, X86CPU, 11), 1000f56e3a14SAndreas Färber VMSTATE_UINT8_V(env.nmi_pending, X86CPU, 11), 1001f56e3a14SAndreas Färber VMSTATE_UINT8_V(env.has_error_code, X86CPU, 11), 1002f56e3a14SAndreas Färber VMSTATE_UINT32_V(env.sipi_vector, X86CPU, 11), 10030cb892aaSJuan Quintela /* MCE */ 1004f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.mcg_cap, X86CPU, 10), 1005f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.mcg_status, X86CPU, 10), 1006f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.mcg_ctl, X86CPU, 10), 1007f56e3a14SAndreas Färber VMSTATE_UINT64_ARRAY_V(env.mce_banks, X86CPU, MCE_BANKS_DEF * 4, 10), 10080cb892aaSJuan Quintela /* rdtscp */ 1009f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.tsc_aux, X86CPU, 11), 10101a03675dSGlauber Costa /* KVM pvclock msr */ 1011f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.system_time_msr, X86CPU, 11), 1012f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.wall_clock_msr, X86CPU, 11), 1013f1665b21SSheng Yang /* XSAVE related fields */ 1014f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xcr0, X86CPU, 12), 1015f56e3a14SAndreas Färber VMSTATE_UINT64_V(env.xstate_bv, X86CPU, 12), 1016b7711471SPaolo Bonzini VMSTATE_YMMH_REGS_VARS(env.xmm_regs, X86CPU, 0, 12), 10170cb892aaSJuan Quintela VMSTATE_END_OF_LIST() 1018a0fb002cSJan Kiszka /* The above list is not sorted /wrt version numbers, watch out! */ 1019f6584ee2SGleb Natapov }, 10205cd8cadaSJuan Quintela .subsections = (const VMStateDescription*[]) { 10215cd8cadaSJuan Quintela &vmstate_async_pf_msr, 10225cd8cadaSJuan Quintela &vmstate_pv_eoi_msr, 10235cd8cadaSJuan Quintela &vmstate_steal_time_msr, 10245cd8cadaSJuan Quintela &vmstate_fpop_ip_dp, 10255cd8cadaSJuan Quintela &vmstate_msr_tsc_adjust, 10265cd8cadaSJuan Quintela &vmstate_msr_tscdeadline, 10275cd8cadaSJuan Quintela &vmstate_msr_ia32_misc_enable, 10285cd8cadaSJuan Quintela &vmstate_msr_ia32_feature_control, 10295cd8cadaSJuan Quintela &vmstate_msr_architectural_pmu, 10305cd8cadaSJuan Quintela &vmstate_mpx, 10315cd8cadaSJuan Quintela &vmstate_msr_hypercall_hypercall, 10325cd8cadaSJuan Quintela &vmstate_msr_hyperv_vapic, 10335cd8cadaSJuan Quintela &vmstate_msr_hyperv_time, 1034f2a53c9eSAndrey Smetanin &vmstate_msr_hyperv_crash, 103546eb8f98SAndrey Smetanin &vmstate_msr_hyperv_runtime, 1036866eea9aSAndrey Smetanin &vmstate_msr_hyperv_synic, 1037ff99aa64SAndrey Smetanin &vmstate_msr_hyperv_stimer, 10385cd8cadaSJuan Quintela &vmstate_avx512, 10395cd8cadaSJuan Quintela &vmstate_xss, 104036f96c4bSHaozhong Zhang &vmstate_tsc_khz, 1041f74eefe0SHuaitong Han #ifdef TARGET_X86_64 1042f74eefe0SHuaitong Han &vmstate_pkru, 1043f74eefe0SHuaitong Han #endif 104487f8b626SAshok Raj &vmstate_mcg_ext_ctl, 10455cd8cadaSJuan Quintela NULL 1046dd5e3b17Saliguori } 10470cb892aaSJuan Quintela }; 1048