Commit a456d59c20fb959c431069cee0f94d5b4628a198
1 parent
9b64997f
VM load/save support for PPC CPU
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6143 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
1 changed file
with
165 additions
and
0 deletions
target-ppc/machine.c
... | ... | @@ -13,9 +13,174 @@ void register_machines(void) |
13 | 13 | |
14 | 14 | void cpu_save(QEMUFile *f, void *opaque) |
15 | 15 | { |
16 | + CPUState *env = (CPUState *)opaque; | |
17 | + unsigned int i, j; | |
18 | + | |
19 | + for (i = 0; i < 32; i++) | |
20 | + qemu_put_betls(f, &env->gpr[i]); | |
21 | +#if !defined(TARGET_PPC64) | |
22 | + for (i = 0; i < 32; i++) | |
23 | + qemu_put_betls(f, &env->gprh[i]); | |
24 | +#endif | |
25 | + qemu_put_betls(f, &env->lr); | |
26 | + qemu_put_betls(f, &env->ctr); | |
27 | + for (i = 0; i < 8; i++) | |
28 | + qemu_put_be32s(f, &env->crf[i]); | |
29 | + qemu_put_betls(f, &env->xer); | |
30 | + qemu_put_betls(f, &env->reserve); | |
31 | + qemu_put_betls(f, &env->msr); | |
32 | + for (i = 0; i < 4; i++) | |
33 | + qemu_put_betls(f, &env->tgpr[i]); | |
34 | + for (i = 0; i < 32; i++) { | |
35 | + union { | |
36 | + float64 d; | |
37 | + uint64_t l; | |
38 | + } u; | |
39 | + u.d = env->fpr[i]; | |
40 | + qemu_put_be64(f, u.l); | |
41 | + } | |
42 | + qemu_put_be32s(f, &env->fpscr); | |
43 | + qemu_put_sbe32s(f, &env->access_type); | |
44 | +#if !defined(CONFIG_USER_ONLY) | |
45 | +#if defined(TARGET_PPC64) | |
46 | + qemu_put_betls(f, &env->asr); | |
47 | + qemu_put_sbe32s(f, &env->slb_nr); | |
48 | +#endif | |
49 | + qemu_put_betls(f, &env->sdr1); | |
50 | + for (i = 0; i < 32; i++) | |
51 | + qemu_put_betls(f, &env->sr[i]); | |
52 | + for (i = 0; i < 2; i++) | |
53 | + for (j = 0; j < 8; j++) | |
54 | + qemu_put_betls(f, &env->DBAT[i][j]); | |
55 | + for (i = 0; i < 2; i++) | |
56 | + for (j = 0; j < 8; j++) | |
57 | + qemu_put_betls(f, &env->IBAT[i][j]); | |
58 | + qemu_put_sbe32s(f, &env->nb_tlb); | |
59 | + qemu_put_sbe32s(f, &env->tlb_per_way); | |
60 | + qemu_put_sbe32s(f, &env->nb_ways); | |
61 | + qemu_put_sbe32s(f, &env->last_way); | |
62 | + qemu_put_sbe32s(f, &env->id_tlbs); | |
63 | + qemu_put_sbe32s(f, &env->nb_pids); | |
64 | + if (env->tlb) { | |
65 | + // XXX assumes 6xx | |
66 | + for (i = 0; i < env->nb_tlb; i++) { | |
67 | + qemu_put_betls(f, &env->tlb[i].tlb6.pte0); | |
68 | + qemu_put_betls(f, &env->tlb[i].tlb6.pte1); | |
69 | + qemu_put_betls(f, &env->tlb[i].tlb6.EPN); | |
70 | + } | |
71 | + } | |
72 | + for (i = 0; i < 4; i++) | |
73 | + qemu_put_betls(f, &env->pb[i]); | |
74 | +#endif | |
75 | + for (i = 0; i < 1024; i++) | |
76 | + qemu_put_betls(f, &env->spr[i]); | |
77 | + qemu_put_be32s(f, &env->vscr); | |
78 | + qemu_put_be64s(f, &env->spe_acc); | |
79 | + qemu_put_be32s(f, &env->spe_fscr); | |
80 | + qemu_put_betls(f, &env->msr_mask); | |
81 | + qemu_put_be32s(f, &env->flags); | |
82 | + qemu_put_sbe32s(f, &env->error_code); | |
83 | + qemu_put_be32s(f, &env->pending_interrupts); | |
84 | +#if !defined(CONFIG_USER_ONLY) | |
85 | + qemu_put_be32s(f, &env->irq_input_state); | |
86 | + for (i = 0; i < POWERPC_EXCP_NB; i++) | |
87 | + qemu_put_betls(f, &env->excp_vectors[i]); | |
88 | + qemu_put_betls(f, &env->excp_prefix); | |
89 | + qemu_put_betls(f, &env->ivor_mask); | |
90 | + qemu_put_betls(f, &env->ivpr_mask); | |
91 | + qemu_put_betls(f, &env->hreset_vector); | |
92 | +#endif | |
93 | + qemu_put_betls(f, &env->nip); | |
94 | + qemu_put_betls(f, &env->hflags); | |
95 | + qemu_put_betls(f, &env->hflags_nmsr); | |
96 | + qemu_put_sbe32s(f, &env->mmu_idx); | |
97 | + qemu_put_sbe32s(f, &env->power_mode); | |
16 | 98 | } |
17 | 99 | |
18 | 100 | int cpu_load(QEMUFile *f, void *opaque, int version_id) |
19 | 101 | { |
102 | + CPUState *env = (CPUState *)opaque; | |
103 | + unsigned int i, j; | |
104 | + | |
105 | + for (i = 0; i < 32; i++) | |
106 | + qemu_get_betls(f, &env->gpr[i]); | |
107 | +#if !defined(TARGET_PPC64) | |
108 | + for (i = 0; i < 32; i++) | |
109 | + qemu_get_betls(f, &env->gprh[i]); | |
110 | +#endif | |
111 | + qemu_get_betls(f, &env->lr); | |
112 | + qemu_get_betls(f, &env->ctr); | |
113 | + for (i = 0; i < 8; i++) | |
114 | + qemu_get_be32s(f, &env->crf[i]); | |
115 | + qemu_get_betls(f, &env->xer); | |
116 | + qemu_get_betls(f, &env->reserve); | |
117 | + qemu_get_betls(f, &env->msr); | |
118 | + for (i = 0; i < 4; i++) | |
119 | + qemu_get_betls(f, &env->tgpr[i]); | |
120 | + for (i = 0; i < 32; i++) { | |
121 | + union { | |
122 | + float64 d; | |
123 | + uint64_t l; | |
124 | + } u; | |
125 | + u.l = qemu_get_be64(f); | |
126 | + env->fpr[i] = u.d; | |
127 | + } | |
128 | + qemu_get_be32s(f, &env->fpscr); | |
129 | + qemu_get_sbe32s(f, &env->access_type); | |
130 | +#if !defined(CONFIG_USER_ONLY) | |
131 | +#if defined(TARGET_PPC64) | |
132 | + qemu_get_betls(f, &env->asr); | |
133 | + qemu_get_sbe32s(f, &env->slb_nr); | |
134 | +#endif | |
135 | + qemu_get_betls(f, &env->sdr1); | |
136 | + for (i = 0; i < 32; i++) | |
137 | + qemu_get_betls(f, &env->sr[i]); | |
138 | + for (i = 0; i < 2; i++) | |
139 | + for (j = 0; j < 8; j++) | |
140 | + qemu_get_betls(f, &env->DBAT[i][j]); | |
141 | + for (i = 0; i < 2; i++) | |
142 | + for (j = 0; j < 8; j++) | |
143 | + qemu_get_betls(f, &env->IBAT[i][j]); | |
144 | + qemu_get_sbe32s(f, &env->nb_tlb); | |
145 | + qemu_get_sbe32s(f, &env->tlb_per_way); | |
146 | + qemu_get_sbe32s(f, &env->nb_ways); | |
147 | + qemu_get_sbe32s(f, &env->last_way); | |
148 | + qemu_get_sbe32s(f, &env->id_tlbs); | |
149 | + qemu_get_sbe32s(f, &env->nb_pids); | |
150 | + if (env->tlb) { | |
151 | + // XXX assumes 6xx | |
152 | + for (i = 0; i < env->nb_tlb; i++) { | |
153 | + qemu_get_betls(f, &env->tlb[i].tlb6.pte0); | |
154 | + qemu_get_betls(f, &env->tlb[i].tlb6.pte1); | |
155 | + qemu_get_betls(f, &env->tlb[i].tlb6.EPN); | |
156 | + } | |
157 | + } | |
158 | + for (i = 0; i < 4; i++) | |
159 | + qemu_get_betls(f, &env->pb[i]); | |
160 | +#endif | |
161 | + for (i = 0; i < 1024; i++) | |
162 | + qemu_get_betls(f, &env->spr[i]); | |
163 | + qemu_get_be32s(f, &env->vscr); | |
164 | + qemu_get_be64s(f, &env->spe_acc); | |
165 | + qemu_get_be32s(f, &env->spe_fscr); | |
166 | + qemu_get_betls(f, &env->msr_mask); | |
167 | + qemu_get_be32s(f, &env->flags); | |
168 | + qemu_get_sbe32s(f, &env->error_code); | |
169 | + qemu_get_be32s(f, &env->pending_interrupts); | |
170 | +#if !defined(CONFIG_USER_ONLY) | |
171 | + qemu_get_be32s(f, &env->irq_input_state); | |
172 | + for (i = 0; i < POWERPC_EXCP_NB; i++) | |
173 | + qemu_get_betls(f, &env->excp_vectors[i]); | |
174 | + qemu_get_betls(f, &env->excp_prefix); | |
175 | + qemu_get_betls(f, &env->ivor_mask); | |
176 | + qemu_get_betls(f, &env->ivpr_mask); | |
177 | + qemu_get_betls(f, &env->hreset_vector); | |
178 | +#endif | |
179 | + qemu_get_betls(f, &env->nip); | |
180 | + qemu_get_betls(f, &env->hflags); | |
181 | + qemu_get_betls(f, &env->hflags_nmsr); | |
182 | + qemu_get_sbe32s(f, &env->mmu_idx); | |
183 | + qemu_get_sbe32s(f, &env->power_mode); | |
184 | + | |
20 | 185 | return 0; |
21 | 186 | } | ... | ... |