1409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "hw/hw.h" 2409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "hw/boards.h" 3409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 4409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli#include "exec-all.h" 5409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 6409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void save_tc(QEMUFile *f, TCState *tc) 7409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 8409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 9409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 10409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save active TC */ 11409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 32; i++) 12409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->gpr[i]); 13409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->PC); 14409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 15409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->HI[i]); 16409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 17409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->LO[i]); 18409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 19409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->ACX[i]); 20409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->DSPControl); 21409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &tc->CP0_TCStatus); 22409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &tc->CP0_TCBind); 23409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->CP0_TCHalt); 24409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->CP0_TCContext); 25409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->CP0_TCSchedule); 26409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &tc->CP0_TCScheFBack); 27409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &tc->CP0_Debug_tcstatus); 28409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 29409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 30409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void save_fpu(QEMUFile *f, CPUMIPSFPUContext *fpu) 31409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 32409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 33409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 34409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 32; i++) 35409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be64s(f, &fpu->fpr[i].d); 36409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_s8s(f, &fpu->fp_status.float_detect_tininess); 37409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_s8s(f, &fpu->fp_status.float_rounding_mode); 38409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_s8s(f, &fpu->fp_status.float_exception_flags); 39409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &fpu->fcr0); 40409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &fpu->fcr31); 41409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 42409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 43409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallivoid cpu_save(QEMUFile *f, void *opaque) 44409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 45409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CPUState *env = opaque; 46409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 47409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 48409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save active TC */ 49409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli save_tc(f, &env->active_tc); 50409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 51409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save active FPU */ 52409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli save_fpu(f, &env->active_fpu); 53409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 54409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save MVP */ 55409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->mvp->CP0_MVPControl); 56409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->mvp->CP0_MVPConf0); 57409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->mvp->CP0_MVPConf1); 58409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 59409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save TLB */ 60409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &env->tlb->nb_tlb); 61409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_TLB_MAX; i++) { 62409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint16_t flags = ((env->tlb->mmu.r4k.tlb[i].G << 10) | 63409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].C0 << 7) | 64409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].C1 << 4) | 65409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].V0 << 3) | 66409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].V1 << 2) | 67409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].D0 << 1) | 68409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli (env->tlb->mmu.r4k.tlb[i].D1 << 0)); 69409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint8_t asid; 70409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 71409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].VPN); 72409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &env->tlb->mmu.r4k.tlb[i].PageMask); 73409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli asid = env->tlb->mmu.r4k.tlb[i].ASID; 74409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_8s(f, &asid); 75409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be16s(f, &flags); 76409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[0]); 77409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[1]); 78409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 79409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 80409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save CPU metastate */ 81409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &env->current_tc); 82409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &env->current_fpu); 83409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->error_code); 84409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_be32s(f, &env->hflags); 85409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->btarget); 86409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli i = env->bcond; 87409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &i); 88409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 89409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save remaining CP1 registers */ 90409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Index); 91409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Random); 92409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_VPEControl); 93409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_VPEConf0); 94409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_VPEConf1); 95409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_YQMask); 96409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_VPESchedule); 97409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_VPEScheFBack); 98409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_VPEOpt); 99409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_EntryLo0); 100409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_EntryLo1); 101409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_Context); 102409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_PageMask); 103409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_PageGrain); 104409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Wired); 105409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSConf0); 106409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSConf1); 107409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSConf2); 108409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSConf3); 109409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSConf4); 110409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_HWREna); 111409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_BadVAddr); 112409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Count); 113409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_EntryHi); 114409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Compare); 115409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Status); 116409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_IntCtl); 117409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSCtl); 118409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_SRSMap); 119409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Cause); 120409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_EPC); 121409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_PRid); 122409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_EBase); 123409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config0); 124409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config1); 125409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config2); 126409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config3); 127409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config6); 128409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Config7); 129409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->lladdr); 130409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 8; i++) 131409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_WatchLo[i]); 132409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 8; i++) 133409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_WatchHi[i]); 134409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_XContext); 135409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Framemask); 136409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Debug); 137409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_DEPC); 138409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_Performance0); 139409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_TagLo); 140409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_DataLo); 141409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_TagHi); 142409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_DataHi); 143409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_betls(f, &env->CP0_ErrorEPC); 144409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_put_sbe32s(f, &env->CP0_DESAVE); 145409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 146409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save inactive TC state */ 147409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for (i = 0; i < MIPS_SHADOW_SET_MAX; i++) 148409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli save_tc(f, &env->tcs[i]); 149409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for (i = 0; i < MIPS_FPU_MAX; i++) 150409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli save_fpu(f, &env->fpus[i]); 151409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 152409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 153409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void load_tc(QEMUFile *f, TCState *tc) 154409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 155409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 156409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 157409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Save active TC */ 158409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 32; i++) 159409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->gpr[i]); 160409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->PC); 161409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 162409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->HI[i]); 163409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 164409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->LO[i]); 165409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_DSP_ACC; i++) 166409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->ACX[i]); 167409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->DSPControl); 168409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &tc->CP0_TCStatus); 169409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &tc->CP0_TCBind); 170409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->CP0_TCHalt); 171409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->CP0_TCContext); 172409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->CP0_TCSchedule); 173409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &tc->CP0_TCScheFBack); 174409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &tc->CP0_Debug_tcstatus); 175409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 176409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 177409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapallistatic void load_fpu(QEMUFile *f, CPUMIPSFPUContext *fpu) 178409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 179409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 180409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 181409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 32; i++) 182409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be64s(f, &fpu->fpr[i].d); 183409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_s8s(f, &fpu->fp_status.float_detect_tininess); 184409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_s8s(f, &fpu->fp_status.float_rounding_mode); 185409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_s8s(f, &fpu->fp_status.float_exception_flags); 186409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &fpu->fcr0); 187409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &fpu->fcr31); 188409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 189409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 190409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalliint cpu_load(QEMUFile *f, void *opaque, int version_id) 191409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli{ 192409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli CPUState *env = opaque; 193409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli int i; 194409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 195409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli if (version_id != 3) 196409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return -EINVAL; 197409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 198409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load active TC */ 199409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli load_tc(f, &env->active_tc); 200409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 201409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load active FPU */ 202409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli load_fpu(f, &env->active_fpu); 203409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 204409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load MVP */ 205409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->mvp->CP0_MVPControl); 206409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->mvp->CP0_MVPConf0); 207409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->mvp->CP0_MVPConf1); 208409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 209409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load TLB */ 210409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &env->tlb->nb_tlb); 211409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < MIPS_TLB_MAX; i++) { 212409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint16_t flags; 213409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli uint8_t asid; 214409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 215409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].VPN); 216409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &env->tlb->mmu.r4k.tlb[i].PageMask); 217409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_8s(f, &asid); 218409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].ASID = asid; 219409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be16s(f, &flags); 220409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].G = (flags >> 10) & 1; 221409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].C0 = (flags >> 7) & 3; 222409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].C1 = (flags >> 4) & 3; 223409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].V0 = (flags >> 3) & 1; 224409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].V1 = (flags >> 2) & 1; 225409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].D0 = (flags >> 1) & 1; 226409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->tlb->mmu.r4k.tlb[i].D1 = (flags >> 0) & 1; 227409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[0]); 228409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->tlb->mmu.r4k.tlb[i].PFN[1]); 229409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli } 230409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 231409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load CPU metastate */ 232409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &env->current_tc); 233409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &env->current_fpu); 234409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->error_code); 235409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_be32s(f, &env->hflags); 236409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->btarget); 237409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &i); 238409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli env->bcond = i; 239409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 240409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load remaining CP1 registers */ 241409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Index); 242409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Random); 243409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_VPEControl); 244409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_VPEConf0); 245409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_VPEConf1); 246409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_YQMask); 247409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_VPESchedule); 248409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_VPEScheFBack); 249409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_VPEOpt); 250409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_EntryLo0); 251409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_EntryLo1); 252409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_Context); 253409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_PageMask); 254409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_PageGrain); 255409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Wired); 256409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSConf0); 257409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSConf1); 258409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSConf2); 259409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSConf3); 260409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSConf4); 261409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_HWREna); 262409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_BadVAddr); 263409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Count); 264409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_EntryHi); 265409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Compare); 266409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Status); 267409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_IntCtl); 268409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSCtl); 269409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_SRSMap); 270409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Cause); 271409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_EPC); 272409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_PRid); 273409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_EBase); 274409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config0); 275409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config1); 276409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config2); 277409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config3); 278409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config6); 279409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Config7); 280409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->lladdr); 281409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 8; i++) 282409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_WatchLo[i]); 283409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for(i = 0; i < 8; i++) 284409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_WatchHi[i]); 285409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_XContext); 286409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Framemask); 287409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Debug); 288409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_DEPC); 289409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_Performance0); 290409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_TagLo); 291409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_DataLo); 292409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_TagHi); 293409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_DataHi); 294409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_betls(f, &env->CP0_ErrorEPC); 295409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli qemu_get_sbe32s(f, &env->CP0_DESAVE); 296409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 297409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* Load inactive TC state */ 298409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for (i = 0; i < MIPS_SHADOW_SET_MAX; i++) 299409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli load_tc(f, &env->tcs[i]); 300409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli for (i = 0; i < MIPS_FPU_MAX; i++) 301409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli load_fpu(f, &env->fpus[i]); 302409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli 303409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli /* XXX: ensure compatiblity for halted bit ? */ 304409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli tlb_flush(env, 1); 305409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli return 0; 306409c7b66435cf5947cab6bf0710f92507317f22eBhanu Chetlapalli} 307