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