10d75590dSPeter 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" 79c17d615SPaolo Bonzini #include "sysemu/kvm.h" 8a90db158SAlexey Kardashevskiy #include "helper_regs.h" 9cd6a9bb6SDavid Gibson #include "mmu-hash64.h" 101e00b8d5SPaolo Bonzini #include "migration/cpu.h" 11*d5fc133eSDavid Gibson #include "qapi/error.h" 128dd3dca3Saurel32 13a90db158SAlexey Kardashevskiy static int cpu_load_old(QEMUFile *f, void *opaque, int version_id) 148dd3dca3Saurel32 { 15a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 16a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 17a456d59cSblueswir1 unsigned int i, j; 18bb593904SDavid Gibson target_ulong sdr1; 1930304420SDavid Gibson uint32_t fpscr; 20da91a00fSRichard Henderson target_ulong xer; 21a456d59cSblueswir1 22a456d59cSblueswir1 for (i = 0; i < 32; i++) 23a456d59cSblueswir1 qemu_get_betls(f, &env->gpr[i]); 24a456d59cSblueswir1 #if !defined(TARGET_PPC64) 25a456d59cSblueswir1 for (i = 0; i < 32; i++) 26a456d59cSblueswir1 qemu_get_betls(f, &env->gprh[i]); 27a456d59cSblueswir1 #endif 28a456d59cSblueswir1 qemu_get_betls(f, &env->lr); 29a456d59cSblueswir1 qemu_get_betls(f, &env->ctr); 30a456d59cSblueswir1 for (i = 0; i < 8; i++) 31a456d59cSblueswir1 qemu_get_be32s(f, &env->crf[i]); 32da91a00fSRichard Henderson qemu_get_betls(f, &xer); 33da91a00fSRichard Henderson cpu_write_xer(env, xer); 3418b21a2fSNathan Froyd qemu_get_betls(f, &env->reserve_addr); 35a456d59cSblueswir1 qemu_get_betls(f, &env->msr); 36a456d59cSblueswir1 for (i = 0; i < 4; i++) 37a456d59cSblueswir1 qemu_get_betls(f, &env->tgpr[i]); 38a456d59cSblueswir1 for (i = 0; i < 32; i++) { 39a456d59cSblueswir1 union { 40a456d59cSblueswir1 float64 d; 41a456d59cSblueswir1 uint64_t l; 42a456d59cSblueswir1 } u; 43a456d59cSblueswir1 u.l = qemu_get_be64(f); 44a456d59cSblueswir1 env->fpr[i] = u.d; 45a456d59cSblueswir1 } 4630304420SDavid Gibson qemu_get_be32s(f, &fpscr); 4730304420SDavid Gibson env->fpscr = fpscr; 48a456d59cSblueswir1 qemu_get_sbe32s(f, &env->access_type); 49a456d59cSblueswir1 #if defined(TARGET_PPC64) 509baea4a3SDavid Gibson qemu_get_betls(f, &env->spr[SPR_ASR]); 51a456d59cSblueswir1 qemu_get_sbe32s(f, &env->slb_nr); 52a456d59cSblueswir1 #endif 53bb593904SDavid Gibson qemu_get_betls(f, &sdr1); 54a456d59cSblueswir1 for (i = 0; i < 32; i++) 55a456d59cSblueswir1 qemu_get_betls(f, &env->sr[i]); 56a456d59cSblueswir1 for (i = 0; i < 2; i++) 57a456d59cSblueswir1 for (j = 0; j < 8; j++) 58a456d59cSblueswir1 qemu_get_betls(f, &env->DBAT[i][j]); 59a456d59cSblueswir1 for (i = 0; i < 2; i++) 60a456d59cSblueswir1 for (j = 0; j < 8; j++) 61a456d59cSblueswir1 qemu_get_betls(f, &env->IBAT[i][j]); 62a456d59cSblueswir1 qemu_get_sbe32s(f, &env->nb_tlb); 63a456d59cSblueswir1 qemu_get_sbe32s(f, &env->tlb_per_way); 64a456d59cSblueswir1 qemu_get_sbe32s(f, &env->nb_ways); 65a456d59cSblueswir1 qemu_get_sbe32s(f, &env->last_way); 66a456d59cSblueswir1 qemu_get_sbe32s(f, &env->id_tlbs); 67a456d59cSblueswir1 qemu_get_sbe32s(f, &env->nb_pids); 681c53acccSAlexander Graf if (env->tlb.tlb6) { 69a456d59cSblueswir1 // XXX assumes 6xx 70a456d59cSblueswir1 for (i = 0; i < env->nb_tlb; i++) { 711c53acccSAlexander Graf qemu_get_betls(f, &env->tlb.tlb6[i].pte0); 721c53acccSAlexander Graf qemu_get_betls(f, &env->tlb.tlb6[i].pte1); 731c53acccSAlexander Graf qemu_get_betls(f, &env->tlb.tlb6[i].EPN); 74a456d59cSblueswir1 } 75a456d59cSblueswir1 } 76a456d59cSblueswir1 for (i = 0; i < 4; i++) 77a456d59cSblueswir1 qemu_get_betls(f, &env->pb[i]); 78a456d59cSblueswir1 for (i = 0; i < 1024; i++) 79a456d59cSblueswir1 qemu_get_betls(f, &env->spr[i]); 80e57ca75cSDavid Gibson if (!cpu->vhyp) { 81bb593904SDavid Gibson ppc_store_sdr1(env, sdr1); 82f3c75d42SAneesh Kumar K.V } 83a456d59cSblueswir1 qemu_get_be32s(f, &env->vscr); 84a456d59cSblueswir1 qemu_get_be64s(f, &env->spe_acc); 85a456d59cSblueswir1 qemu_get_be32s(f, &env->spe_fscr); 86a456d59cSblueswir1 qemu_get_betls(f, &env->msr_mask); 87a456d59cSblueswir1 qemu_get_be32s(f, &env->flags); 88a456d59cSblueswir1 qemu_get_sbe32s(f, &env->error_code); 89a456d59cSblueswir1 qemu_get_be32s(f, &env->pending_interrupts); 90a456d59cSblueswir1 qemu_get_be32s(f, &env->irq_input_state); 91a456d59cSblueswir1 for (i = 0; i < POWERPC_EXCP_NB; i++) 92a456d59cSblueswir1 qemu_get_betls(f, &env->excp_vectors[i]); 93a456d59cSblueswir1 qemu_get_betls(f, &env->excp_prefix); 94a456d59cSblueswir1 qemu_get_betls(f, &env->ivor_mask); 95a456d59cSblueswir1 qemu_get_betls(f, &env->ivpr_mask); 96a456d59cSblueswir1 qemu_get_betls(f, &env->hreset_vector); 97a456d59cSblueswir1 qemu_get_betls(f, &env->nip); 98a456d59cSblueswir1 qemu_get_betls(f, &env->hflags); 99a456d59cSblueswir1 qemu_get_betls(f, &env->hflags_nmsr); 1009fb04491SBenjamin Herrenschmidt qemu_get_sbe32(f); /* Discard unused mmu_idx */ 101011aba24SDavid Gibson qemu_get_sbe32(f); /* Discard unused power_mode */ 102a456d59cSblueswir1 1039fb04491SBenjamin Herrenschmidt /* Recompute mmu indices */ 1049fb04491SBenjamin Herrenschmidt hreg_compute_mem_idx(env); 1059fb04491SBenjamin Herrenschmidt 1068dd3dca3Saurel32 return 0; 1078dd3dca3Saurel32 } 108a90db158SAlexey Kardashevskiy 1092c21ee76SJianjun Duan static int get_avr(QEMUFile *f, void *pv, size_t size, VMStateField *field) 110a90db158SAlexey Kardashevskiy { 111a90db158SAlexey Kardashevskiy ppc_avr_t *v = pv; 112a90db158SAlexey Kardashevskiy 113a90db158SAlexey Kardashevskiy v->u64[0] = qemu_get_be64(f); 114a90db158SAlexey Kardashevskiy v->u64[1] = qemu_get_be64(f); 115a90db158SAlexey Kardashevskiy 116a90db158SAlexey Kardashevskiy return 0; 117a90db158SAlexey Kardashevskiy } 118a90db158SAlexey Kardashevskiy 1192c21ee76SJianjun Duan static int put_avr(QEMUFile *f, void *pv, size_t size, VMStateField *field, 1202c21ee76SJianjun Duan QJSON *vmdesc) 121a90db158SAlexey Kardashevskiy { 122a90db158SAlexey Kardashevskiy ppc_avr_t *v = pv; 123a90db158SAlexey Kardashevskiy 124a90db158SAlexey Kardashevskiy qemu_put_be64(f, v->u64[0]); 125a90db158SAlexey Kardashevskiy qemu_put_be64(f, v->u64[1]); 1262c21ee76SJianjun Duan return 0; 127a90db158SAlexey Kardashevskiy } 128a90db158SAlexey Kardashevskiy 129cfd54a04SStefan Weil static const VMStateInfo vmstate_info_avr = { 130a90db158SAlexey Kardashevskiy .name = "avr", 131a90db158SAlexey Kardashevskiy .get = get_avr, 132a90db158SAlexey Kardashevskiy .put = put_avr, 133a90db158SAlexey Kardashevskiy }; 134a90db158SAlexey Kardashevskiy 135a90db158SAlexey Kardashevskiy #define VMSTATE_AVR_ARRAY_V(_f, _s, _n, _v) \ 136a90db158SAlexey Kardashevskiy VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_avr, ppc_avr_t) 137a90db158SAlexey Kardashevskiy 138a90db158SAlexey Kardashevskiy #define VMSTATE_AVR_ARRAY(_f, _s, _n) \ 139a90db158SAlexey Kardashevskiy VMSTATE_AVR_ARRAY_V(_f, _s, _n, 0) 140a90db158SAlexey Kardashevskiy 141146c11f1SDavid Gibson static bool cpu_pre_2_8_migration(void *opaque, int version_id) 142146c11f1SDavid Gibson { 143146c11f1SDavid Gibson PowerPCCPU *cpu = opaque; 144146c11f1SDavid Gibson 145146c11f1SDavid Gibson return cpu->pre_2_8_migration; 146146c11f1SDavid Gibson } 147146c11f1SDavid Gibson 148a90db158SAlexey Kardashevskiy static void cpu_pre_save(void *opaque) 149a90db158SAlexey Kardashevskiy { 150a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 151a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 152a90db158SAlexey Kardashevskiy int i; 15316a2497bSDavid Gibson uint64_t insns_compat_mask = 15416a2497bSDavid Gibson PPC_INSNS_BASE | PPC_ISEL | PPC_STRING | PPC_MFTB 15516a2497bSDavid Gibson | PPC_FLOAT | PPC_FLOAT_FSEL | PPC_FLOAT_FRES 15616a2497bSDavid Gibson | PPC_FLOAT_FSQRT | PPC_FLOAT_FRSQRTE | PPC_FLOAT_FRSQRTES 15716a2497bSDavid Gibson | PPC_FLOAT_STFIWX | PPC_FLOAT_EXT 15816a2497bSDavid Gibson | PPC_CACHE | PPC_CACHE_ICBI | PPC_CACHE_DCBZ 15916a2497bSDavid Gibson | PPC_MEM_SYNC | PPC_MEM_EIEIO | PPC_MEM_TLBIE | PPC_MEM_TLBSYNC 16016a2497bSDavid Gibson | PPC_64B | PPC_64BX | PPC_ALTIVEC 16116a2497bSDavid Gibson | PPC_SEGMENT_64B | PPC_SLBI | PPC_POPCNTB | PPC_POPCNTWD; 16216a2497bSDavid Gibson uint64_t insns_compat_mask2 = PPC2_VSX | PPC2_VSX207 | PPC2_DFP | PPC2_DBRX 16316a2497bSDavid Gibson | PPC2_PERM_ISA206 | PPC2_DIVE_ISA206 16416a2497bSDavid Gibson | PPC2_ATOMIC_ISA206 | PPC2_FP_CVT_ISA206 16516a2497bSDavid Gibson | PPC2_FP_TST_ISA206 | PPC2_BCTAR_ISA207 16616a2497bSDavid Gibson | PPC2_LSQ_ISA207 | PPC2_ALTIVEC_207 16716a2497bSDavid Gibson | PPC2_ISA205 | PPC2_ISA207S | PPC2_FP_CVT_S64 | PPC2_TM; 168a90db158SAlexey Kardashevskiy 169a90db158SAlexey Kardashevskiy env->spr[SPR_LR] = env->lr; 170a90db158SAlexey Kardashevskiy env->spr[SPR_CTR] = env->ctr; 171aa378598SThomas Huth env->spr[SPR_XER] = cpu_read_xer(env); 172a90db158SAlexey Kardashevskiy #if defined(TARGET_PPC64) 173a90db158SAlexey Kardashevskiy env->spr[SPR_CFAR] = env->cfar; 174a90db158SAlexey Kardashevskiy #endif 175a90db158SAlexey Kardashevskiy env->spr[SPR_BOOKE_SPEFSCR] = env->spe_fscr; 176a90db158SAlexey Kardashevskiy 177a90db158SAlexey Kardashevskiy for (i = 0; (i < 4) && (i < env->nb_BATs); i++) { 178a90db158SAlexey Kardashevskiy env->spr[SPR_DBAT0U + 2*i] = env->DBAT[0][i]; 179a90db158SAlexey Kardashevskiy env->spr[SPR_DBAT0U + 2*i + 1] = env->DBAT[1][i]; 180a90db158SAlexey Kardashevskiy env->spr[SPR_IBAT0U + 2*i] = env->IBAT[0][i]; 181a90db158SAlexey Kardashevskiy env->spr[SPR_IBAT0U + 2*i + 1] = env->IBAT[1][i]; 182a90db158SAlexey Kardashevskiy } 183a90db158SAlexey Kardashevskiy for (i = 0; (i < 4) && ((i+4) < env->nb_BATs); i++) { 184a90db158SAlexey Kardashevskiy env->spr[SPR_DBAT4U + 2*i] = env->DBAT[0][i+4]; 185a90db158SAlexey Kardashevskiy env->spr[SPR_DBAT4U + 2*i + 1] = env->DBAT[1][i+4]; 186a90db158SAlexey Kardashevskiy env->spr[SPR_IBAT4U + 2*i] = env->IBAT[0][i+4]; 187a90db158SAlexey Kardashevskiy env->spr[SPR_IBAT4U + 2*i + 1] = env->IBAT[1][i+4]; 188a90db158SAlexey Kardashevskiy } 18916a2497bSDavid Gibson 19016a2497bSDavid Gibson /* Hacks for migration compatibility between 2.6, 2.7 & 2.8 */ 191146c11f1SDavid Gibson if (cpu->pre_2_8_migration) { 19216a2497bSDavid Gibson cpu->mig_msr_mask = env->msr_mask; 19316a2497bSDavid Gibson cpu->mig_insns_flags = env->insns_flags & insns_compat_mask; 19416a2497bSDavid Gibson cpu->mig_insns_flags2 = env->insns_flags2 & insns_compat_mask2; 19516a2497bSDavid Gibson cpu->mig_nb_BATs = env->nb_BATs; 196a90db158SAlexey Kardashevskiy } 197146c11f1SDavid Gibson } 198a90db158SAlexey Kardashevskiy 199*d5fc133eSDavid Gibson /* 200*d5fc133eSDavid Gibson * Determine if a given PVR is a "close enough" match to the CPU 201*d5fc133eSDavid Gibson * object. For TCG and KVM PR it would probably be sufficient to 202*d5fc133eSDavid Gibson * require an exact PVR match. However for KVM HV the user is 203*d5fc133eSDavid Gibson * restricted to a PVR exactly matching the host CPU. The correct way 204*d5fc133eSDavid Gibson * to handle this is to put the guest into an architected 205*d5fc133eSDavid Gibson * compatibility mode. However, to allow a more forgiving transition 206*d5fc133eSDavid Gibson * and migration from before this was widely done, we allow migration 207*d5fc133eSDavid Gibson * between sufficiently similar PVRs, as determined by the CPU class's 208*d5fc133eSDavid Gibson * pvr_match() hook. 209*d5fc133eSDavid Gibson */ 210*d5fc133eSDavid Gibson static bool pvr_match(PowerPCCPU *cpu, uint32_t pvr) 211*d5fc133eSDavid Gibson { 212*d5fc133eSDavid Gibson PowerPCCPUClass *pcc = POWERPC_CPU_GET_CLASS(cpu); 213*d5fc133eSDavid Gibson 214*d5fc133eSDavid Gibson if (pvr == pcc->pvr) { 215*d5fc133eSDavid Gibson return true; 216*d5fc133eSDavid Gibson } 217*d5fc133eSDavid Gibson return pcc->pvr_match(pcc, pvr); 218*d5fc133eSDavid Gibson } 219*d5fc133eSDavid Gibson 220a90db158SAlexey Kardashevskiy static int cpu_post_load(void *opaque, int version_id) 221a90db158SAlexey Kardashevskiy { 222a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 223a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 224a90db158SAlexey Kardashevskiy int i; 2252360b6e8SMark Cave-Ayland target_ulong msr; 226a90db158SAlexey Kardashevskiy 227569be9f0SAlexey Kardashevskiy /* 228*d5fc133eSDavid Gibson * If we're operating in compat mode, we should be ok as long as 229*d5fc133eSDavid Gibson * the destination supports the same compatiblity mode. 230*d5fc133eSDavid Gibson * 231*d5fc133eSDavid Gibson * Otherwise, however, we require that the destination has exactly 232*d5fc133eSDavid Gibson * the same CPU model as the source. 233569be9f0SAlexey Kardashevskiy */ 234*d5fc133eSDavid Gibson 235*d5fc133eSDavid Gibson #if defined(TARGET_PPC64) 236*d5fc133eSDavid Gibson if (cpu->compat_pvr) { 237*d5fc133eSDavid Gibson Error *local_err = NULL; 238*d5fc133eSDavid Gibson 239*d5fc133eSDavid Gibson ppc_set_compat(cpu, cpu->compat_pvr, &local_err); 240*d5fc133eSDavid Gibson if (local_err) { 241*d5fc133eSDavid Gibson error_report_err(local_err); 242*d5fc133eSDavid Gibson error_free(local_err); 243*d5fc133eSDavid Gibson return -1; 244*d5fc133eSDavid Gibson } 245*d5fc133eSDavid Gibson } else 246*d5fc133eSDavid Gibson #endif 247*d5fc133eSDavid Gibson { 248*d5fc133eSDavid Gibson if (!pvr_match(cpu, env->spr[SPR_PVR])) { 249*d5fc133eSDavid Gibson return -1; 250*d5fc133eSDavid Gibson } 251*d5fc133eSDavid Gibson } 252*d5fc133eSDavid Gibson 253a90db158SAlexey Kardashevskiy env->lr = env->spr[SPR_LR]; 254a90db158SAlexey Kardashevskiy env->ctr = env->spr[SPR_CTR]; 2556a9620e6SMark Cave-Ayland cpu_write_xer(env, env->spr[SPR_XER]); 256a90db158SAlexey Kardashevskiy #if defined(TARGET_PPC64) 257a90db158SAlexey Kardashevskiy env->cfar = env->spr[SPR_CFAR]; 258a90db158SAlexey Kardashevskiy #endif 259a90db158SAlexey Kardashevskiy env->spe_fscr = env->spr[SPR_BOOKE_SPEFSCR]; 260a90db158SAlexey Kardashevskiy 261a90db158SAlexey Kardashevskiy for (i = 0; (i < 4) && (i < env->nb_BATs); i++) { 262a90db158SAlexey Kardashevskiy env->DBAT[0][i] = env->spr[SPR_DBAT0U + 2*i]; 263a90db158SAlexey Kardashevskiy env->DBAT[1][i] = env->spr[SPR_DBAT0U + 2*i + 1]; 264a90db158SAlexey Kardashevskiy env->IBAT[0][i] = env->spr[SPR_IBAT0U + 2*i]; 265a90db158SAlexey Kardashevskiy env->IBAT[1][i] = env->spr[SPR_IBAT0U + 2*i + 1]; 266a90db158SAlexey Kardashevskiy } 267a90db158SAlexey Kardashevskiy for (i = 0; (i < 4) && ((i+4) < env->nb_BATs); i++) { 268a90db158SAlexey Kardashevskiy env->DBAT[0][i+4] = env->spr[SPR_DBAT4U + 2*i]; 269a90db158SAlexey Kardashevskiy env->DBAT[1][i+4] = env->spr[SPR_DBAT4U + 2*i + 1]; 270a90db158SAlexey Kardashevskiy env->IBAT[0][i+4] = env->spr[SPR_IBAT4U + 2*i]; 271a90db158SAlexey Kardashevskiy env->IBAT[1][i+4] = env->spr[SPR_IBAT4U + 2*i + 1]; 272a90db158SAlexey Kardashevskiy } 273a90db158SAlexey Kardashevskiy 274e57ca75cSDavid Gibson if (!cpu->vhyp) { 275a90db158SAlexey Kardashevskiy ppc_store_sdr1(env, env->spr[SPR_SDR1]); 276f3c75d42SAneesh Kumar K.V } 2772360b6e8SMark Cave-Ayland 278993ebe4aSMark Cave-Ayland /* Invalidate all msr bits except MSR_TGPR/MSR_HVB before restoring */ 2792360b6e8SMark Cave-Ayland msr = env->msr; 280993ebe4aSMark Cave-Ayland env->msr ^= ~((1ULL << MSR_TGPR) | MSR_HVB); 2812360b6e8SMark Cave-Ayland ppc_store_msr(env, msr); 2822360b6e8SMark Cave-Ayland 283a90db158SAlexey Kardashevskiy hreg_compute_mem_idx(env); 284a90db158SAlexey Kardashevskiy 285a90db158SAlexey Kardashevskiy return 0; 286a90db158SAlexey Kardashevskiy } 287a90db158SAlexey Kardashevskiy 288a90db158SAlexey Kardashevskiy static bool fpu_needed(void *opaque) 289a90db158SAlexey Kardashevskiy { 290a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 291a90db158SAlexey Kardashevskiy 292a90db158SAlexey Kardashevskiy return (cpu->env.insns_flags & PPC_FLOAT); 293a90db158SAlexey Kardashevskiy } 294a90db158SAlexey Kardashevskiy 295a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_fpu = { 296a90db158SAlexey Kardashevskiy .name = "cpu/fpu", 297a90db158SAlexey Kardashevskiy .version_id = 1, 298a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 2995cd8cadaSJuan Quintela .needed = fpu_needed, 300a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 301a90db158SAlexey Kardashevskiy VMSTATE_FLOAT64_ARRAY(env.fpr, PowerPCCPU, 32), 302a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(env.fpscr, PowerPCCPU), 303a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 304a90db158SAlexey Kardashevskiy }, 305a90db158SAlexey Kardashevskiy }; 306a90db158SAlexey Kardashevskiy 307a90db158SAlexey Kardashevskiy static bool altivec_needed(void *opaque) 308a90db158SAlexey Kardashevskiy { 309a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 310a90db158SAlexey Kardashevskiy 311a90db158SAlexey Kardashevskiy return (cpu->env.insns_flags & PPC_ALTIVEC); 312a90db158SAlexey Kardashevskiy } 313a90db158SAlexey Kardashevskiy 314a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_altivec = { 315a90db158SAlexey Kardashevskiy .name = "cpu/altivec", 316a90db158SAlexey Kardashevskiy .version_id = 1, 317a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 3185cd8cadaSJuan Quintela .needed = altivec_needed, 319a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 320a90db158SAlexey Kardashevskiy VMSTATE_AVR_ARRAY(env.avr, PowerPCCPU, 32), 321a90db158SAlexey Kardashevskiy VMSTATE_UINT32(env.vscr, PowerPCCPU), 322a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 323a90db158SAlexey Kardashevskiy }, 324a90db158SAlexey Kardashevskiy }; 325a90db158SAlexey Kardashevskiy 326a90db158SAlexey Kardashevskiy static bool vsx_needed(void *opaque) 327a90db158SAlexey Kardashevskiy { 328a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 329a90db158SAlexey Kardashevskiy 330a90db158SAlexey Kardashevskiy return (cpu->env.insns_flags2 & PPC2_VSX); 331a90db158SAlexey Kardashevskiy } 332a90db158SAlexey Kardashevskiy 333a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_vsx = { 334a90db158SAlexey Kardashevskiy .name = "cpu/vsx", 335a90db158SAlexey Kardashevskiy .version_id = 1, 336a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 3375cd8cadaSJuan Quintela .needed = vsx_needed, 338a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 339a90db158SAlexey Kardashevskiy VMSTATE_UINT64_ARRAY(env.vsr, PowerPCCPU, 32), 340a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 341a90db158SAlexey Kardashevskiy }, 342a90db158SAlexey Kardashevskiy }; 343a90db158SAlexey Kardashevskiy 34480b3f79bSAlexey Kardashevskiy #ifdef TARGET_PPC64 34580b3f79bSAlexey Kardashevskiy /* Transactional memory state */ 34680b3f79bSAlexey Kardashevskiy static bool tm_needed(void *opaque) 34780b3f79bSAlexey Kardashevskiy { 34880b3f79bSAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 34980b3f79bSAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 35080b3f79bSAlexey Kardashevskiy return msr_ts; 35180b3f79bSAlexey Kardashevskiy } 35280b3f79bSAlexey Kardashevskiy 35380b3f79bSAlexey Kardashevskiy static const VMStateDescription vmstate_tm = { 35480b3f79bSAlexey Kardashevskiy .name = "cpu/tm", 35580b3f79bSAlexey Kardashevskiy .version_id = 1, 35680b3f79bSAlexey Kardashevskiy .minimum_version_id = 1, 35780b3f79bSAlexey Kardashevskiy .minimum_version_id_old = 1, 3585cd8cadaSJuan Quintela .needed = tm_needed, 35980b3f79bSAlexey Kardashevskiy .fields = (VMStateField []) { 36080b3f79bSAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.tm_gpr, PowerPCCPU, 32), 36180b3f79bSAlexey Kardashevskiy VMSTATE_AVR_ARRAY(env.tm_vsr, PowerPCCPU, 64), 36280b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_cr, PowerPCCPU), 36380b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_lr, PowerPCCPU), 36480b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_ctr, PowerPCCPU), 36580b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_fpscr, PowerPCCPU), 36680b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_amr, PowerPCCPU), 36780b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_ppr, PowerPCCPU), 36880b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_vrsave, PowerPCCPU), 36980b3f79bSAlexey Kardashevskiy VMSTATE_UINT32(env.tm_vscr, PowerPCCPU), 37080b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_dscr, PowerPCCPU), 37180b3f79bSAlexey Kardashevskiy VMSTATE_UINT64(env.tm_tar, PowerPCCPU), 37280b3f79bSAlexey Kardashevskiy VMSTATE_END_OF_LIST() 37380b3f79bSAlexey Kardashevskiy }, 37480b3f79bSAlexey Kardashevskiy }; 37580b3f79bSAlexey Kardashevskiy #endif 37680b3f79bSAlexey Kardashevskiy 377a90db158SAlexey Kardashevskiy static bool sr_needed(void *opaque) 378a90db158SAlexey Kardashevskiy { 379a90db158SAlexey Kardashevskiy #ifdef TARGET_PPC64 380a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 381a90db158SAlexey Kardashevskiy 382a90db158SAlexey Kardashevskiy return !(cpu->env.mmu_model & POWERPC_MMU_64); 383a90db158SAlexey Kardashevskiy #else 384a90db158SAlexey Kardashevskiy return true; 385a90db158SAlexey Kardashevskiy #endif 386a90db158SAlexey Kardashevskiy } 387a90db158SAlexey Kardashevskiy 388a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_sr = { 389a90db158SAlexey Kardashevskiy .name = "cpu/sr", 390a90db158SAlexey Kardashevskiy .version_id = 1, 391a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 3925cd8cadaSJuan Quintela .needed = sr_needed, 393a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 394a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.sr, PowerPCCPU, 32), 395a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 396a90db158SAlexey Kardashevskiy }, 397a90db158SAlexey Kardashevskiy }; 398a90db158SAlexey Kardashevskiy 399a90db158SAlexey Kardashevskiy #ifdef TARGET_PPC64 4002c21ee76SJianjun Duan static int get_slbe(QEMUFile *f, void *pv, size_t size, VMStateField *field) 401a90db158SAlexey Kardashevskiy { 402a90db158SAlexey Kardashevskiy ppc_slb_t *v = pv; 403a90db158SAlexey Kardashevskiy 404a90db158SAlexey Kardashevskiy v->esid = qemu_get_be64(f); 405a90db158SAlexey Kardashevskiy v->vsid = qemu_get_be64(f); 406a90db158SAlexey Kardashevskiy 407a90db158SAlexey Kardashevskiy return 0; 408a90db158SAlexey Kardashevskiy } 409a90db158SAlexey Kardashevskiy 4102c21ee76SJianjun Duan static int put_slbe(QEMUFile *f, void *pv, size_t size, VMStateField *field, 4112c21ee76SJianjun Duan QJSON *vmdesc) 412a90db158SAlexey Kardashevskiy { 413a90db158SAlexey Kardashevskiy ppc_slb_t *v = pv; 414a90db158SAlexey Kardashevskiy 415a90db158SAlexey Kardashevskiy qemu_put_be64(f, v->esid); 416a90db158SAlexey Kardashevskiy qemu_put_be64(f, v->vsid); 4172c21ee76SJianjun Duan return 0; 418a90db158SAlexey Kardashevskiy } 419a90db158SAlexey Kardashevskiy 420cfd54a04SStefan Weil static const VMStateInfo vmstate_info_slbe = { 421a90db158SAlexey Kardashevskiy .name = "slbe", 422a90db158SAlexey Kardashevskiy .get = get_slbe, 423a90db158SAlexey Kardashevskiy .put = put_slbe, 424a90db158SAlexey Kardashevskiy }; 425a90db158SAlexey Kardashevskiy 426a90db158SAlexey Kardashevskiy #define VMSTATE_SLB_ARRAY_V(_f, _s, _n, _v) \ 427a90db158SAlexey Kardashevskiy VMSTATE_ARRAY(_f, _s, _n, _v, vmstate_info_slbe, ppc_slb_t) 428a90db158SAlexey Kardashevskiy 429a90db158SAlexey Kardashevskiy #define VMSTATE_SLB_ARRAY(_f, _s, _n) \ 430a90db158SAlexey Kardashevskiy VMSTATE_SLB_ARRAY_V(_f, _s, _n, 0) 431a90db158SAlexey Kardashevskiy 432a90db158SAlexey Kardashevskiy static bool slb_needed(void *opaque) 433a90db158SAlexey Kardashevskiy { 434a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 435a90db158SAlexey Kardashevskiy 436a90db158SAlexey Kardashevskiy /* We don't support any of the old segment table based 64-bit CPUs */ 437a90db158SAlexey Kardashevskiy return (cpu->env.mmu_model & POWERPC_MMU_64); 438a90db158SAlexey Kardashevskiy } 439a90db158SAlexey Kardashevskiy 440cd6a9bb6SDavid Gibson static int slb_post_load(void *opaque, int version_id) 441cd6a9bb6SDavid Gibson { 442cd6a9bb6SDavid Gibson PowerPCCPU *cpu = opaque; 443cd6a9bb6SDavid Gibson CPUPPCState *env = &cpu->env; 444cd6a9bb6SDavid Gibson int i; 445cd6a9bb6SDavid Gibson 446cd6a9bb6SDavid Gibson /* We've pulled in the raw esid and vsid values from the migration 447cd6a9bb6SDavid Gibson * stream, but we need to recompute the page size pointers */ 448cd6a9bb6SDavid Gibson for (i = 0; i < env->slb_nr; i++) { 449cd6a9bb6SDavid Gibson if (ppc_store_slb(cpu, i, env->slb[i].esid, env->slb[i].vsid) < 0) { 450cd6a9bb6SDavid Gibson /* Migration source had bad values in its SLB */ 451cd6a9bb6SDavid Gibson return -1; 452cd6a9bb6SDavid Gibson } 453cd6a9bb6SDavid Gibson } 454cd6a9bb6SDavid Gibson 455cd6a9bb6SDavid Gibson return 0; 456cd6a9bb6SDavid Gibson } 457cd6a9bb6SDavid Gibson 458a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_slb = { 459a90db158SAlexey Kardashevskiy .name = "cpu/slb", 460a90db158SAlexey Kardashevskiy .version_id = 1, 461a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 4625cd8cadaSJuan Quintela .needed = slb_needed, 463cd6a9bb6SDavid Gibson .post_load = slb_post_load, 464a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 465d2164ad3SHalil Pasic VMSTATE_INT32_EQUAL(env.slb_nr, PowerPCCPU, NULL), 466d83af167SAneesh Kumar K.V VMSTATE_SLB_ARRAY(env.slb, PowerPCCPU, MAX_SLB_ENTRIES), 467a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 468a90db158SAlexey Kardashevskiy } 469a90db158SAlexey Kardashevskiy }; 470a90db158SAlexey Kardashevskiy #endif /* TARGET_PPC64 */ 471a90db158SAlexey Kardashevskiy 472a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlb6xx_entry = { 473a90db158SAlexey Kardashevskiy .name = "cpu/tlb6xx_entry", 474a90db158SAlexey Kardashevskiy .version_id = 1, 475a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 476a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 477a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(pte0, ppc6xx_tlb_t), 478a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(pte1, ppc6xx_tlb_t), 479a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(EPN, ppc6xx_tlb_t), 480a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 481a90db158SAlexey Kardashevskiy }, 482a90db158SAlexey Kardashevskiy }; 483a90db158SAlexey Kardashevskiy 484a90db158SAlexey Kardashevskiy static bool tlb6xx_needed(void *opaque) 485a90db158SAlexey Kardashevskiy { 486a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 487a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 488a90db158SAlexey Kardashevskiy 489a90db158SAlexey Kardashevskiy return env->nb_tlb && (env->tlb_type == TLB_6XX); 490a90db158SAlexey Kardashevskiy } 491a90db158SAlexey Kardashevskiy 492a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlb6xx = { 493a90db158SAlexey Kardashevskiy .name = "cpu/tlb6xx", 494a90db158SAlexey Kardashevskiy .version_id = 1, 495a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 4965cd8cadaSJuan Quintela .needed = tlb6xx_needed, 497a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 498d2164ad3SHalil Pasic VMSTATE_INT32_EQUAL(env.nb_tlb, PowerPCCPU, NULL), 499a90db158SAlexey Kardashevskiy VMSTATE_STRUCT_VARRAY_POINTER_INT32(env.tlb.tlb6, PowerPCCPU, 500a90db158SAlexey Kardashevskiy env.nb_tlb, 501a90db158SAlexey Kardashevskiy vmstate_tlb6xx_entry, 502a90db158SAlexey Kardashevskiy ppc6xx_tlb_t), 503a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.tgpr, PowerPCCPU, 4), 504a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 505a90db158SAlexey Kardashevskiy } 506a90db158SAlexey Kardashevskiy }; 507a90db158SAlexey Kardashevskiy 508a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlbemb_entry = { 509a90db158SAlexey Kardashevskiy .name = "cpu/tlbemb_entry", 510a90db158SAlexey Kardashevskiy .version_id = 1, 511a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 512a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 513a90db158SAlexey Kardashevskiy VMSTATE_UINT64(RPN, ppcemb_tlb_t), 514a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(EPN, ppcemb_tlb_t), 515a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(PID, ppcemb_tlb_t), 516a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(size, ppcemb_tlb_t), 517a90db158SAlexey Kardashevskiy VMSTATE_UINT32(prot, ppcemb_tlb_t), 518a90db158SAlexey Kardashevskiy VMSTATE_UINT32(attr, ppcemb_tlb_t), 519a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 520a90db158SAlexey Kardashevskiy }, 521a90db158SAlexey Kardashevskiy }; 522a90db158SAlexey Kardashevskiy 523a90db158SAlexey Kardashevskiy static bool tlbemb_needed(void *opaque) 524a90db158SAlexey Kardashevskiy { 525a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 526a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 527a90db158SAlexey Kardashevskiy 528a90db158SAlexey Kardashevskiy return env->nb_tlb && (env->tlb_type == TLB_EMB); 529a90db158SAlexey Kardashevskiy } 530a90db158SAlexey Kardashevskiy 531a90db158SAlexey Kardashevskiy static bool pbr403_needed(void *opaque) 532a90db158SAlexey Kardashevskiy { 533a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 534a90db158SAlexey Kardashevskiy uint32_t pvr = cpu->env.spr[SPR_PVR]; 535a90db158SAlexey Kardashevskiy 536a90db158SAlexey Kardashevskiy return (pvr & 0xffff0000) == 0x00200000; 537a90db158SAlexey Kardashevskiy } 538a90db158SAlexey Kardashevskiy 539a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_pbr403 = { 540a90db158SAlexey Kardashevskiy .name = "cpu/pbr403", 541a90db158SAlexey Kardashevskiy .version_id = 1, 542a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 5435cd8cadaSJuan Quintela .needed = pbr403_needed, 544a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 545a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.pb, PowerPCCPU, 4), 546a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 547a90db158SAlexey Kardashevskiy }, 548a90db158SAlexey Kardashevskiy }; 549a90db158SAlexey Kardashevskiy 550a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlbemb = { 551a90db158SAlexey Kardashevskiy .name = "cpu/tlb6xx", 552a90db158SAlexey Kardashevskiy .version_id = 1, 553a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 5545cd8cadaSJuan Quintela .needed = tlbemb_needed, 555a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 556d2164ad3SHalil Pasic VMSTATE_INT32_EQUAL(env.nb_tlb, PowerPCCPU, NULL), 557a90db158SAlexey Kardashevskiy VMSTATE_STRUCT_VARRAY_POINTER_INT32(env.tlb.tlbe, PowerPCCPU, 558a90db158SAlexey Kardashevskiy env.nb_tlb, 559a90db158SAlexey Kardashevskiy vmstate_tlbemb_entry, 560a90db158SAlexey Kardashevskiy ppcemb_tlb_t), 561a90db158SAlexey Kardashevskiy /* 403 protection registers */ 562a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 563a90db158SAlexey Kardashevskiy }, 5645cd8cadaSJuan Quintela .subsections = (const VMStateDescription*[]) { 5655cd8cadaSJuan Quintela &vmstate_pbr403, 5665cd8cadaSJuan Quintela NULL 567a90db158SAlexey Kardashevskiy } 568a90db158SAlexey Kardashevskiy }; 569a90db158SAlexey Kardashevskiy 570a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlbmas_entry = { 571a90db158SAlexey Kardashevskiy .name = "cpu/tlbmas_entry", 572a90db158SAlexey Kardashevskiy .version_id = 1, 573a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 574a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 575a90db158SAlexey Kardashevskiy VMSTATE_UINT32(mas8, ppcmas_tlb_t), 576a90db158SAlexey Kardashevskiy VMSTATE_UINT32(mas1, ppcmas_tlb_t), 577a90db158SAlexey Kardashevskiy VMSTATE_UINT64(mas2, ppcmas_tlb_t), 578a90db158SAlexey Kardashevskiy VMSTATE_UINT64(mas7_3, ppcmas_tlb_t), 579a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 580a90db158SAlexey Kardashevskiy }, 581a90db158SAlexey Kardashevskiy }; 582a90db158SAlexey Kardashevskiy 583a90db158SAlexey Kardashevskiy static bool tlbmas_needed(void *opaque) 584a90db158SAlexey Kardashevskiy { 585a90db158SAlexey Kardashevskiy PowerPCCPU *cpu = opaque; 586a90db158SAlexey Kardashevskiy CPUPPCState *env = &cpu->env; 587a90db158SAlexey Kardashevskiy 588a90db158SAlexey Kardashevskiy return env->nb_tlb && (env->tlb_type == TLB_MAS); 589a90db158SAlexey Kardashevskiy } 590a90db158SAlexey Kardashevskiy 591a90db158SAlexey Kardashevskiy static const VMStateDescription vmstate_tlbmas = { 592a90db158SAlexey Kardashevskiy .name = "cpu/tlbmas", 593a90db158SAlexey Kardashevskiy .version_id = 1, 594a90db158SAlexey Kardashevskiy .minimum_version_id = 1, 5955cd8cadaSJuan Quintela .needed = tlbmas_needed, 596a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 597d2164ad3SHalil Pasic VMSTATE_INT32_EQUAL(env.nb_tlb, PowerPCCPU, NULL), 598a90db158SAlexey Kardashevskiy VMSTATE_STRUCT_VARRAY_POINTER_INT32(env.tlb.tlbm, PowerPCCPU, 599a90db158SAlexey Kardashevskiy env.nb_tlb, 600a90db158SAlexey Kardashevskiy vmstate_tlbmas_entry, 601a90db158SAlexey Kardashevskiy ppcmas_tlb_t), 602a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 603a90db158SAlexey Kardashevskiy } 604a90db158SAlexey Kardashevskiy }; 605a90db158SAlexey Kardashevskiy 606*d5fc133eSDavid Gibson static bool compat_needed(void *opaque) 607*d5fc133eSDavid Gibson { 608*d5fc133eSDavid Gibson PowerPCCPU *cpu = opaque; 609*d5fc133eSDavid Gibson 610*d5fc133eSDavid Gibson assert(!(cpu->compat_pvr && !cpu->vhyp)); 611*d5fc133eSDavid Gibson return !cpu->pre_2_10_migration && cpu->compat_pvr != 0; 612*d5fc133eSDavid Gibson } 613*d5fc133eSDavid Gibson 614*d5fc133eSDavid Gibson static const VMStateDescription vmstate_compat = { 615*d5fc133eSDavid Gibson .name = "cpu/compat", 616*d5fc133eSDavid Gibson .version_id = 1, 617*d5fc133eSDavid Gibson .minimum_version_id = 1, 618*d5fc133eSDavid Gibson .needed = compat_needed, 619*d5fc133eSDavid Gibson .fields = (VMStateField[]) { 620*d5fc133eSDavid Gibson VMSTATE_UINT32(compat_pvr, PowerPCCPU), 621*d5fc133eSDavid Gibson VMSTATE_END_OF_LIST() 622*d5fc133eSDavid Gibson } 623*d5fc133eSDavid Gibson }; 624*d5fc133eSDavid Gibson 625a90db158SAlexey Kardashevskiy const VMStateDescription vmstate_ppc_cpu = { 626a90db158SAlexey Kardashevskiy .name = "cpu", 627a90db158SAlexey Kardashevskiy .version_id = 5, 628a90db158SAlexey Kardashevskiy .minimum_version_id = 5, 629a90db158SAlexey Kardashevskiy .minimum_version_id_old = 4, 630a90db158SAlexey Kardashevskiy .load_state_old = cpu_load_old, 631a90db158SAlexey Kardashevskiy .pre_save = cpu_pre_save, 632a90db158SAlexey Kardashevskiy .post_load = cpu_post_load, 633a90db158SAlexey Kardashevskiy .fields = (VMStateField[]) { 634569be9f0SAlexey Kardashevskiy VMSTATE_UNUSED(sizeof(target_ulong)), /* was _EQUAL(env.spr[SPR_PVR]) */ 635a90db158SAlexey Kardashevskiy 636a90db158SAlexey Kardashevskiy /* User mode architected state */ 637a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.gpr, PowerPCCPU, 32), 638a90db158SAlexey Kardashevskiy #if !defined(TARGET_PPC64) 639a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.gprh, PowerPCCPU, 32), 640a90db158SAlexey Kardashevskiy #endif 641a90db158SAlexey Kardashevskiy VMSTATE_UINT32_ARRAY(env.crf, PowerPCCPU, 8), 642a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(env.nip, PowerPCCPU), 643a90db158SAlexey Kardashevskiy 644a90db158SAlexey Kardashevskiy /* SPRs */ 645a90db158SAlexey Kardashevskiy VMSTATE_UINTTL_ARRAY(env.spr, PowerPCCPU, 1024), 646a90db158SAlexey Kardashevskiy VMSTATE_UINT64(env.spe_acc, PowerPCCPU), 647a90db158SAlexey Kardashevskiy 648a90db158SAlexey Kardashevskiy /* Reservation */ 649a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(env.reserve_addr, PowerPCCPU), 650a90db158SAlexey Kardashevskiy 651a90db158SAlexey Kardashevskiy /* Supervisor mode architected state */ 652a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(env.msr, PowerPCCPU), 653a90db158SAlexey Kardashevskiy 654a90db158SAlexey Kardashevskiy /* Internal state */ 655a90db158SAlexey Kardashevskiy VMSTATE_UINTTL(env.hflags_nmsr, PowerPCCPU), 656a90db158SAlexey Kardashevskiy /* FIXME: access_type? */ 657a90db158SAlexey Kardashevskiy 658a90db158SAlexey Kardashevskiy /* Sanity checking */ 659146c11f1SDavid Gibson VMSTATE_UINTTL_TEST(mig_msr_mask, PowerPCCPU, cpu_pre_2_8_migration), 660146c11f1SDavid Gibson VMSTATE_UINT64_TEST(mig_insns_flags, PowerPCCPU, cpu_pre_2_8_migration), 661146c11f1SDavid Gibson VMSTATE_UINT64_TEST(mig_insns_flags2, PowerPCCPU, 662146c11f1SDavid Gibson cpu_pre_2_8_migration), 663146c11f1SDavid Gibson VMSTATE_UINT32_TEST(mig_nb_BATs, PowerPCCPU, cpu_pre_2_8_migration), 664a90db158SAlexey Kardashevskiy VMSTATE_END_OF_LIST() 665a90db158SAlexey Kardashevskiy }, 6665cd8cadaSJuan Quintela .subsections = (const VMStateDescription*[]) { 6675cd8cadaSJuan Quintela &vmstate_fpu, 6685cd8cadaSJuan Quintela &vmstate_altivec, 6695cd8cadaSJuan Quintela &vmstate_vsx, 6705cd8cadaSJuan Quintela &vmstate_sr, 671a90db158SAlexey Kardashevskiy #ifdef TARGET_PPC64 6725cd8cadaSJuan Quintela &vmstate_tm, 6735cd8cadaSJuan Quintela &vmstate_slb, 674a90db158SAlexey Kardashevskiy #endif /* TARGET_PPC64 */ 6755cd8cadaSJuan Quintela &vmstate_tlb6xx, 6765cd8cadaSJuan Quintela &vmstate_tlbemb, 6775cd8cadaSJuan Quintela &vmstate_tlbmas, 678*d5fc133eSDavid Gibson &vmstate_compat, 6795cd8cadaSJuan Quintela NULL 680a90db158SAlexey Kardashevskiy } 681a90db158SAlexey Kardashevskiy }; 682