qemu: introduce qemu_init_vcpu (Marcelo Tosatti)
[qemu] / target-sparc / machine.c
1 #include "hw/hw.h"
2 #include "hw/boards.h"
3 #include "qemu-timer.h"
4
5 #include "exec-all.h"
6
7 void register_machines(void)
8 {
9 #ifdef TARGET_SPARC64
10     qemu_register_machine(&sun4u_machine);
11     qemu_register_machine(&sun4v_machine);
12     qemu_register_machine(&niagara_machine);
13 #else
14     qemu_register_machine(&ss5_machine);
15     qemu_register_machine(&ss10_machine);
16     qemu_register_machine(&ss600mp_machine);
17     qemu_register_machine(&ss20_machine);
18     qemu_register_machine(&ss2_machine);
19     qemu_register_machine(&voyager_machine);
20     qemu_register_machine(&ss_lx_machine);
21     qemu_register_machine(&ss4_machine);
22     qemu_register_machine(&scls_machine);
23     qemu_register_machine(&sbook_machine);
24     qemu_register_machine(&ss1000_machine);
25     qemu_register_machine(&ss2000_machine);
26 #endif
27 }
28
29 void cpu_save(QEMUFile *f, void *opaque)
30 {
31     CPUState *env = opaque;
32     int i;
33     uint32_t tmp;
34
35     // if env->cwp == env->nwindows - 1, this will set the ins of the last
36     // window as the outs of the first window
37     cpu_set_cwp(env, env->cwp);
38
39     for(i = 0; i < 8; i++)
40         qemu_put_betls(f, &env->gregs[i]);
41     qemu_put_be32s(f, &env->nwindows);
42     for(i = 0; i < env->nwindows * 16; i++)
43         qemu_put_betls(f, &env->regbase[i]);
44
45     /* FPU */
46     for(i = 0; i < TARGET_FPREGS; i++) {
47         union {
48             float32 f;
49             uint32_t i;
50         } u;
51         u.f = env->fpr[i];
52         qemu_put_be32(f, u.i);
53     }
54
55     qemu_put_betls(f, &env->pc);
56     qemu_put_betls(f, &env->npc);
57     qemu_put_betls(f, &env->y);
58     tmp = GET_PSR(env);
59     qemu_put_be32(f, tmp);
60     qemu_put_betls(f, &env->fsr);
61     qemu_put_betls(f, &env->tbr);
62     tmp = env->interrupt_index;
63     qemu_put_be32(f, tmp);
64     qemu_put_be32s(f, &env->pil_in);
65 #ifndef TARGET_SPARC64
66     qemu_put_be32s(f, &env->wim);
67     /* MMU */
68     for (i = 0; i < 32; i++)
69         qemu_put_be32s(f, &env->mmuregs[i]);
70 #else
71     qemu_put_be64s(f, &env->lsu);
72     for (i = 0; i < 16; i++) {
73         qemu_put_be64s(f, &env->immuregs[i]);
74         qemu_put_be64s(f, &env->dmmuregs[i]);
75     }
76     for (i = 0; i < 64; i++) {
77         qemu_put_be64s(f, &env->itlb_tag[i]);
78         qemu_put_be64s(f, &env->itlb_tte[i]);
79         qemu_put_be64s(f, &env->dtlb_tag[i]);
80         qemu_put_be64s(f, &env->dtlb_tte[i]);
81     }
82     qemu_put_be32s(f, &env->mmu_version);
83     for (i = 0; i < MAXTL_MAX; i++) {
84         qemu_put_be64s(f, &env->ts[i].tpc);
85         qemu_put_be64s(f, &env->ts[i].tnpc);
86         qemu_put_be64s(f, &env->ts[i].tstate);
87         qemu_put_be32s(f, &env->ts[i].tt);
88     }
89     qemu_put_be32s(f, &env->xcc);
90     qemu_put_be32s(f, &env->asi);
91     qemu_put_be32s(f, &env->pstate);
92     qemu_put_be32s(f, &env->tl);
93     qemu_put_be32s(f, &env->cansave);
94     qemu_put_be32s(f, &env->canrestore);
95     qemu_put_be32s(f, &env->otherwin);
96     qemu_put_be32s(f, &env->wstate);
97     qemu_put_be32s(f, &env->cleanwin);
98     for (i = 0; i < 8; i++)
99         qemu_put_be64s(f, &env->agregs[i]);
100     for (i = 0; i < 8; i++)
101         qemu_put_be64s(f, &env->bgregs[i]);
102     for (i = 0; i < 8; i++)
103         qemu_put_be64s(f, &env->igregs[i]);
104     for (i = 0; i < 8; i++)
105         qemu_put_be64s(f, &env->mgregs[i]);
106     qemu_put_be64s(f, &env->fprs);
107     qemu_put_be64s(f, &env->tick_cmpr);
108     qemu_put_be64s(f, &env->stick_cmpr);
109     qemu_put_ptimer(f, env->tick);
110     qemu_put_ptimer(f, env->stick);
111     qemu_put_be64s(f, &env->gsr);
112     qemu_put_be32s(f, &env->gl);
113     qemu_put_be64s(f, &env->hpstate);
114     for (i = 0; i < MAXTL_MAX; i++)
115         qemu_put_be64s(f, &env->htstate[i]);
116     qemu_put_be64s(f, &env->hintp);
117     qemu_put_be64s(f, &env->htba);
118     qemu_put_be64s(f, &env->hver);
119     qemu_put_be64s(f, &env->hstick_cmpr);
120     qemu_put_be64s(f, &env->ssr);
121     qemu_put_ptimer(f, env->hstick);
122 #endif
123 }
124
125 int cpu_load(QEMUFile *f, void *opaque, int version_id)
126 {
127     CPUState *env = opaque;
128     int i;
129     uint32_t tmp;
130
131     if (version_id != 5)
132         return -EINVAL;
133     for(i = 0; i < 8; i++)
134         qemu_get_betls(f, &env->gregs[i]);
135     qemu_get_be32s(f, &env->nwindows);
136     for(i = 0; i < env->nwindows * 16; i++)
137         qemu_get_betls(f, &env->regbase[i]);
138
139     /* FPU */
140     for(i = 0; i < TARGET_FPREGS; i++) {
141         union {
142             float32 f;
143             uint32_t i;
144         } u;
145         u.i = qemu_get_be32(f);
146         env->fpr[i] = u.f;
147     }
148
149     qemu_get_betls(f, &env->pc);
150     qemu_get_betls(f, &env->npc);
151     qemu_get_betls(f, &env->y);
152     tmp = qemu_get_be32(f);
153     env->cwp = 0; /* needed to ensure that the wrapping registers are
154                      correctly updated */
155     PUT_PSR(env, tmp);
156     qemu_get_betls(f, &env->fsr);
157     qemu_get_betls(f, &env->tbr);
158     tmp = qemu_get_be32(f);
159     env->interrupt_index = tmp;
160     qemu_get_be32s(f, &env->pil_in);
161 #ifndef TARGET_SPARC64
162     qemu_get_be32s(f, &env->wim);
163     /* MMU */
164     for (i = 0; i < 32; i++)
165         qemu_get_be32s(f, &env->mmuregs[i]);
166 #else
167     qemu_get_be64s(f, &env->lsu);
168     for (i = 0; i < 16; i++) {
169         qemu_get_be64s(f, &env->immuregs[i]);
170         qemu_get_be64s(f, &env->dmmuregs[i]);
171     }
172     for (i = 0; i < 64; i++) {
173         qemu_get_be64s(f, &env->itlb_tag[i]);
174         qemu_get_be64s(f, &env->itlb_tte[i]);
175         qemu_get_be64s(f, &env->dtlb_tag[i]);
176         qemu_get_be64s(f, &env->dtlb_tte[i]);
177     }
178     qemu_get_be32s(f, &env->mmu_version);
179     for (i = 0; i < MAXTL_MAX; i++) {
180         qemu_get_be64s(f, &env->ts[i].tpc);
181         qemu_get_be64s(f, &env->ts[i].tnpc);
182         qemu_get_be64s(f, &env->ts[i].tstate);
183         qemu_get_be32s(f, &env->ts[i].tt);
184     }
185     qemu_get_be32s(f, &env->xcc);
186     qemu_get_be32s(f, &env->asi);
187     qemu_get_be32s(f, &env->pstate);
188     qemu_get_be32s(f, &env->tl);
189     env->tsptr = &env->ts[env->tl & MAXTL_MASK];
190     qemu_get_be32s(f, &env->cansave);
191     qemu_get_be32s(f, &env->canrestore);
192     qemu_get_be32s(f, &env->otherwin);
193     qemu_get_be32s(f, &env->wstate);
194     qemu_get_be32s(f, &env->cleanwin);
195     for (i = 0; i < 8; i++)
196         qemu_get_be64s(f, &env->agregs[i]);
197     for (i = 0; i < 8; i++)
198         qemu_get_be64s(f, &env->bgregs[i]);
199     for (i = 0; i < 8; i++)
200         qemu_get_be64s(f, &env->igregs[i]);
201     for (i = 0; i < 8; i++)
202         qemu_get_be64s(f, &env->mgregs[i]);
203     qemu_get_be64s(f, &env->fprs);
204     qemu_get_be64s(f, &env->tick_cmpr);
205     qemu_get_be64s(f, &env->stick_cmpr);
206     qemu_get_ptimer(f, env->tick);
207     qemu_get_ptimer(f, env->stick);
208     qemu_get_be64s(f, &env->gsr);
209     qemu_get_be32s(f, &env->gl);
210     qemu_get_be64s(f, &env->hpstate);
211     for (i = 0; i < MAXTL_MAX; i++)
212         qemu_get_be64s(f, &env->htstate[i]);
213     qemu_get_be64s(f, &env->hintp);
214     qemu_get_be64s(f, &env->htba);
215     qemu_get_be64s(f, &env->hver);
216     qemu_get_be64s(f, &env->hstick_cmpr);
217     qemu_get_be64s(f, &env->ssr);
218     qemu_get_ptimer(f, env->hstick);
219 #endif
220     tlb_flush(env, 1);
221     return 0;
222 }