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,9 +13,174 @@ void register_machines(void) | ||
13 | 13 | ||
14 | void cpu_save(QEMUFile *f, void *opaque) | 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 | int cpu_load(QEMUFile *f, void *opaque, int version_id) | 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 | return 0; | 185 | return 0; |
21 | } | 186 | } |