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