]> git.proxmox.com Git - qemu.git/blame - target-arm/cpu.c
target-arm: Move OMAP cp15_i_{max,min} reset to cpu_state_reset
[qemu.git] / target-arm / cpu.c
CommitLineData
dec9c2d4
AF
1/*
2 * QEMU ARM CPU
3 *
4 * Copyright (c) 2012 SUSE LINUX Products GmbH
5 *
6 * This program is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU General Public License
8 * as published by the Free Software Foundation; either version 2
9 * of the License, or (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program; if not, see
18 * <http://www.gnu.org/licenses/gpl-2.0.html>
19 */
20
21#include "cpu-qom.h"
22#include "qemu-common.h"
23
24/* CPUClass::reset() */
25static void arm_cpu_reset(CPUState *s)
26{
27 ARMCPU *cpu = ARM_CPU(s);
28 ARMCPUClass *acc = ARM_CPU_GET_CLASS(cpu);
29
30 acc->parent_reset(s);
31
32 /* TODO Inline the current contents of cpu_state_reset(),
33 once cpu_reset_model_id() is eliminated. */
34 cpu_state_reset(&cpu->env);
35}
36
581be094
PM
37static inline void set_feature(CPUARMState *env, int feature)
38{
39 env->features |= 1u << feature;
40}
41
777dc784
PM
42static void arm_cpu_initfn(Object *obj)
43{
44 ARMCPU *cpu = ARM_CPU(obj);
45
46 cpu_exec_init(&cpu->env);
47}
48
581be094
PM
49void arm_cpu_realize(ARMCPU *cpu)
50{
51 /* This function is called by cpu_arm_init() because it
52 * needs to do common actions based on feature bits, etc
53 * that have been set by the subclass init functions.
54 * When we have QOM realize support it should become
55 * a true realize function instead.
56 */
57 CPUARMState *env = &cpu->env;
58 /* Some features automatically imply others: */
59 if (arm_feature(env, ARM_FEATURE_V7)) {
60 set_feature(env, ARM_FEATURE_VAPA);
61 set_feature(env, ARM_FEATURE_THUMB2);
62 if (!arm_feature(env, ARM_FEATURE_M)) {
63 set_feature(env, ARM_FEATURE_V6K);
64 } else {
65 set_feature(env, ARM_FEATURE_V6);
66 }
67 }
68 if (arm_feature(env, ARM_FEATURE_V6K)) {
69 set_feature(env, ARM_FEATURE_V6);
70 set_feature(env, ARM_FEATURE_MVFR);
71 }
72 if (arm_feature(env, ARM_FEATURE_V6)) {
73 set_feature(env, ARM_FEATURE_V5);
74 if (!arm_feature(env, ARM_FEATURE_M)) {
75 set_feature(env, ARM_FEATURE_AUXCR);
76 }
77 }
78 if (arm_feature(env, ARM_FEATURE_V5)) {
79 set_feature(env, ARM_FEATURE_V4T);
80 }
81 if (arm_feature(env, ARM_FEATURE_M)) {
82 set_feature(env, ARM_FEATURE_THUMB_DIV);
83 }
84 if (arm_feature(env, ARM_FEATURE_ARM_DIV)) {
85 set_feature(env, ARM_FEATURE_THUMB_DIV);
86 }
87 if (arm_feature(env, ARM_FEATURE_VFP4)) {
88 set_feature(env, ARM_FEATURE_VFP3);
89 }
90 if (arm_feature(env, ARM_FEATURE_VFP3)) {
91 set_feature(env, ARM_FEATURE_VFP);
92 }
93}
94
777dc784
PM
95/* CPU models */
96
97static void arm926_initfn(Object *obj)
98{
99 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
100 set_feature(&cpu->env, ARM_FEATURE_V5);
101 set_feature(&cpu->env, ARM_FEATURE_VFP);
777dc784 102 cpu->midr = ARM_CPUID_ARM926;
325b3cef 103 cpu->reset_fpsid = 0x41011090;
64e1671f 104 cpu->ctr = 0x1dd20d2;
0ca7e01c 105 cpu->reset_sctlr = 0x00090078;
777dc784
PM
106}
107
108static void arm946_initfn(Object *obj)
109{
110 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
111 set_feature(&cpu->env, ARM_FEATURE_V5);
112 set_feature(&cpu->env, ARM_FEATURE_MPU);
777dc784 113 cpu->midr = ARM_CPUID_ARM946;
64e1671f 114 cpu->ctr = 0x0f004006;
0ca7e01c 115 cpu->reset_sctlr = 0x00000078;
777dc784
PM
116}
117
118static void arm1026_initfn(Object *obj)
119{
120 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
121 set_feature(&cpu->env, ARM_FEATURE_V5);
122 set_feature(&cpu->env, ARM_FEATURE_VFP);
123 set_feature(&cpu->env, ARM_FEATURE_AUXCR);
777dc784 124 cpu->midr = ARM_CPUID_ARM1026;
325b3cef 125 cpu->reset_fpsid = 0x410110a0;
64e1671f 126 cpu->ctr = 0x1dd20d2;
0ca7e01c 127 cpu->reset_sctlr = 0x00090078;
777dc784
PM
128}
129
130static void arm1136_r2_initfn(Object *obj)
131{
132 ARMCPU *cpu = ARM_CPU(obj);
2e4d7e3e
PM
133 /* What qemu calls "arm1136_r2" is actually the 1136 r0p2, ie an
134 * older core than plain "arm1136". In particular this does not
135 * have the v6K features.
136 * These ID register values are correct for 1136 but may be wrong
137 * for 1136_r2 (in particular r0p2 does not actually implement most
138 * of the ID registers).
139 */
581be094
PM
140 set_feature(&cpu->env, ARM_FEATURE_V6);
141 set_feature(&cpu->env, ARM_FEATURE_VFP);
777dc784 142 cpu->midr = ARM_CPUID_ARM1136_R2;
325b3cef 143 cpu->reset_fpsid = 0x410120b4;
bd35c355
PM
144 cpu->mvfr0 = 0x11111111;
145 cpu->mvfr1 = 0x00000000;
64e1671f 146 cpu->ctr = 0x1dd20d2;
0ca7e01c 147 cpu->reset_sctlr = 0x00050078;
2e4d7e3e
PM
148 cpu->id_pfr0 = 0x111;
149 cpu->id_pfr1 = 0x1;
150 cpu->id_dfr0 = 0x2;
151 cpu->id_afr0 = 0x3;
152 cpu->id_mmfr0 = 0x01130003;
153 cpu->id_mmfr1 = 0x10030302;
154 cpu->id_mmfr2 = 0x01222110;
155 cpu->id_isar0 = 0x00140011;
156 cpu->id_isar1 = 0x12002111;
157 cpu->id_isar2 = 0x11231111;
158 cpu->id_isar3 = 0x01102131;
159 cpu->id_isar4 = 0x141;
777dc784
PM
160}
161
162static void arm1136_initfn(Object *obj)
163{
164 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
165 set_feature(&cpu->env, ARM_FEATURE_V6K);
166 set_feature(&cpu->env, ARM_FEATURE_V6);
167 set_feature(&cpu->env, ARM_FEATURE_VFP);
777dc784 168 cpu->midr = ARM_CPUID_ARM1136;
325b3cef 169 cpu->reset_fpsid = 0x410120b4;
bd35c355
PM
170 cpu->mvfr0 = 0x11111111;
171 cpu->mvfr1 = 0x00000000;
64e1671f 172 cpu->ctr = 0x1dd20d2;
0ca7e01c 173 cpu->reset_sctlr = 0x00050078;
2e4d7e3e
PM
174 cpu->id_pfr0 = 0x111;
175 cpu->id_pfr1 = 0x1;
176 cpu->id_dfr0 = 0x2;
177 cpu->id_afr0 = 0x3;
178 cpu->id_mmfr0 = 0x01130003;
179 cpu->id_mmfr1 = 0x10030302;
180 cpu->id_mmfr2 = 0x01222110;
181 cpu->id_isar0 = 0x00140011;
182 cpu->id_isar1 = 0x12002111;
183 cpu->id_isar2 = 0x11231111;
184 cpu->id_isar3 = 0x01102131;
185 cpu->id_isar4 = 0x141;
777dc784
PM
186}
187
188static void arm1176_initfn(Object *obj)
189{
190 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
191 set_feature(&cpu->env, ARM_FEATURE_V6K);
192 set_feature(&cpu->env, ARM_FEATURE_VFP);
193 set_feature(&cpu->env, ARM_FEATURE_VAPA);
777dc784 194 cpu->midr = ARM_CPUID_ARM1176;
325b3cef 195 cpu->reset_fpsid = 0x410120b5;
bd35c355
PM
196 cpu->mvfr0 = 0x11111111;
197 cpu->mvfr1 = 0x00000000;
64e1671f 198 cpu->ctr = 0x1dd20d2;
0ca7e01c 199 cpu->reset_sctlr = 0x00050078;
2e4d7e3e
PM
200 cpu->id_pfr0 = 0x111;
201 cpu->id_pfr1 = 0x11;
202 cpu->id_dfr0 = 0x33;
203 cpu->id_afr0 = 0;
204 cpu->id_mmfr0 = 0x01130003;
205 cpu->id_mmfr1 = 0x10030302;
206 cpu->id_mmfr2 = 0x01222100;
207 cpu->id_isar0 = 0x0140011;
208 cpu->id_isar1 = 0x12002111;
209 cpu->id_isar2 = 0x11231121;
210 cpu->id_isar3 = 0x01102131;
211 cpu->id_isar4 = 0x01141;
777dc784
PM
212}
213
214static void arm11mpcore_initfn(Object *obj)
215{
216 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
217 set_feature(&cpu->env, ARM_FEATURE_V6K);
218 set_feature(&cpu->env, ARM_FEATURE_VFP);
219 set_feature(&cpu->env, ARM_FEATURE_VAPA);
777dc784 220 cpu->midr = ARM_CPUID_ARM11MPCORE;
325b3cef 221 cpu->reset_fpsid = 0x410120b4;
bd35c355
PM
222 cpu->mvfr0 = 0x11111111;
223 cpu->mvfr1 = 0x00000000;
64e1671f 224 cpu->ctr = 0x1dd20d2;
2e4d7e3e
PM
225 cpu->id_pfr0 = 0x111;
226 cpu->id_pfr1 = 0x1;
227 cpu->id_dfr0 = 0;
228 cpu->id_afr0 = 0x2;
229 cpu->id_mmfr0 = 0x01100103;
230 cpu->id_mmfr1 = 0x10020302;
231 cpu->id_mmfr2 = 0x01222000;
232 cpu->id_isar0 = 0x00100011;
233 cpu->id_isar1 = 0x12002111;
234 cpu->id_isar2 = 0x11221011;
235 cpu->id_isar3 = 0x01102131;
236 cpu->id_isar4 = 0x141;
777dc784
PM
237}
238
239static void cortex_m3_initfn(Object *obj)
240{
241 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
242 set_feature(&cpu->env, ARM_FEATURE_V7);
243 set_feature(&cpu->env, ARM_FEATURE_M);
777dc784
PM
244 cpu->midr = ARM_CPUID_CORTEXM3;
245}
246
247static void cortex_a8_initfn(Object *obj)
248{
249 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
250 set_feature(&cpu->env, ARM_FEATURE_V7);
251 set_feature(&cpu->env, ARM_FEATURE_VFP3);
252 set_feature(&cpu->env, ARM_FEATURE_NEON);
253 set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
777dc784 254 cpu->midr = ARM_CPUID_CORTEXA8;
325b3cef 255 cpu->reset_fpsid = 0x410330c0;
bd35c355
PM
256 cpu->mvfr0 = 0x11110222;
257 cpu->mvfr1 = 0x00011100;
64e1671f 258 cpu->ctr = 0x82048004;
0ca7e01c 259 cpu->reset_sctlr = 0x00c50078;
2e4d7e3e
PM
260 cpu->id_pfr0 = 0x1031;
261 cpu->id_pfr1 = 0x11;
262 cpu->id_dfr0 = 0x400;
263 cpu->id_afr0 = 0;
264 cpu->id_mmfr0 = 0x31100003;
265 cpu->id_mmfr1 = 0x20000000;
266 cpu->id_mmfr2 = 0x01202000;
267 cpu->id_mmfr3 = 0x11;
268 cpu->id_isar0 = 0x00101111;
269 cpu->id_isar1 = 0x12112111;
270 cpu->id_isar2 = 0x21232031;
271 cpu->id_isar3 = 0x11112131;
272 cpu->id_isar4 = 0x00111142;
777dc784
PM
273}
274
275static void cortex_a9_initfn(Object *obj)
276{
277 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
278 set_feature(&cpu->env, ARM_FEATURE_V7);
279 set_feature(&cpu->env, ARM_FEATURE_VFP3);
280 set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
281 set_feature(&cpu->env, ARM_FEATURE_NEON);
282 set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
283 /* Note that A9 supports the MP extensions even for
284 * A9UP and single-core A9MP (which are both different
285 * and valid configurations; we don't model A9UP).
286 */
287 set_feature(&cpu->env, ARM_FEATURE_V7MP);
777dc784 288 cpu->midr = ARM_CPUID_CORTEXA9;
325b3cef 289 cpu->reset_fpsid = 0x41033090;
bd35c355
PM
290 cpu->mvfr0 = 0x11110222;
291 cpu->mvfr1 = 0x01111111;
64e1671f 292 cpu->ctr = 0x80038003;
0ca7e01c 293 cpu->reset_sctlr = 0x00c50078;
2e4d7e3e
PM
294 cpu->id_pfr0 = 0x1031;
295 cpu->id_pfr1 = 0x11;
296 cpu->id_dfr0 = 0x000;
297 cpu->id_afr0 = 0;
298 cpu->id_mmfr0 = 0x00100103;
299 cpu->id_mmfr1 = 0x20000000;
300 cpu->id_mmfr2 = 0x01230000;
301 cpu->id_mmfr3 = 0x00002111;
302 cpu->id_isar0 = 0x00101111;
303 cpu->id_isar1 = 0x13112111;
304 cpu->id_isar2 = 0x21232041;
305 cpu->id_isar3 = 0x11112131;
306 cpu->id_isar4 = 0x00111142;
777dc784
PM
307}
308
309static void cortex_a15_initfn(Object *obj)
310{
311 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
312 set_feature(&cpu->env, ARM_FEATURE_V7);
313 set_feature(&cpu->env, ARM_FEATURE_VFP4);
314 set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
315 set_feature(&cpu->env, ARM_FEATURE_NEON);
316 set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
317 set_feature(&cpu->env, ARM_FEATURE_ARM_DIV);
318 set_feature(&cpu->env, ARM_FEATURE_V7MP);
319 set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
777dc784 320 cpu->midr = ARM_CPUID_CORTEXA15;
325b3cef 321 cpu->reset_fpsid = 0x410430f0;
bd35c355
PM
322 cpu->mvfr0 = 0x10110222;
323 cpu->mvfr1 = 0x11111111;
64e1671f 324 cpu->ctr = 0x8444c004;
0ca7e01c 325 cpu->reset_sctlr = 0x00c50078;
2e4d7e3e
PM
326 cpu->id_pfr0 = 0x00001131;
327 cpu->id_pfr1 = 0x00011011;
328 cpu->id_dfr0 = 0x02010555;
329 cpu->id_afr0 = 0x00000000;
330 cpu->id_mmfr0 = 0x10201105;
331 cpu->id_mmfr1 = 0x20000000;
332 cpu->id_mmfr2 = 0x01240000;
333 cpu->id_mmfr3 = 0x02102211;
334 cpu->id_isar0 = 0x02101110;
335 cpu->id_isar1 = 0x13112111;
336 cpu->id_isar2 = 0x21232041;
337 cpu->id_isar3 = 0x11112131;
338 cpu->id_isar4 = 0x10011142;
777dc784
PM
339}
340
341static void ti925t_initfn(Object *obj)
342{
343 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
344 set_feature(&cpu->env, ARM_FEATURE_V4T);
345 set_feature(&cpu->env, ARM_FEATURE_OMAPCP);
777dc784 346 cpu->midr = ARM_CPUID_TI925T;
64e1671f 347 cpu->ctr = 0x5109149;
0ca7e01c 348 cpu->reset_sctlr = 0x00000070;
777dc784
PM
349}
350
351static void sa1100_initfn(Object *obj)
352{
353 ARMCPU *cpu = ARM_CPU(obj);
581be094 354 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
777dc784 355 cpu->midr = ARM_CPUID_SA1100;
0ca7e01c 356 cpu->reset_sctlr = 0x00000070;
777dc784
PM
357}
358
359static void sa1110_initfn(Object *obj)
360{
361 ARMCPU *cpu = ARM_CPU(obj);
581be094 362 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
777dc784 363 cpu->midr = ARM_CPUID_SA1110;
0ca7e01c 364 cpu->reset_sctlr = 0x00000070;
777dc784
PM
365}
366
367static void pxa250_initfn(Object *obj)
368{
369 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
370 set_feature(&cpu->env, ARM_FEATURE_V5);
371 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
777dc784 372 cpu->midr = ARM_CPUID_PXA250;
64e1671f 373 cpu->ctr = 0xd172172;
0ca7e01c 374 cpu->reset_sctlr = 0x00000078;
777dc784
PM
375}
376
377static void pxa255_initfn(Object *obj)
378{
379 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
380 set_feature(&cpu->env, ARM_FEATURE_V5);
381 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
777dc784 382 cpu->midr = ARM_CPUID_PXA255;
64e1671f 383 cpu->ctr = 0xd172172;
0ca7e01c 384 cpu->reset_sctlr = 0x00000078;
777dc784
PM
385}
386
387static void pxa260_initfn(Object *obj)
388{
389 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
390 set_feature(&cpu->env, ARM_FEATURE_V5);
391 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
777dc784 392 cpu->midr = ARM_CPUID_PXA260;
64e1671f 393 cpu->ctr = 0xd172172;
0ca7e01c 394 cpu->reset_sctlr = 0x00000078;
777dc784
PM
395}
396
397static void pxa261_initfn(Object *obj)
398{
399 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
400 set_feature(&cpu->env, ARM_FEATURE_V5);
401 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
777dc784 402 cpu->midr = ARM_CPUID_PXA261;
64e1671f 403 cpu->ctr = 0xd172172;
0ca7e01c 404 cpu->reset_sctlr = 0x00000078;
777dc784
PM
405}
406
407static void pxa262_initfn(Object *obj)
408{
409 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
410 set_feature(&cpu->env, ARM_FEATURE_V5);
411 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
777dc784 412 cpu->midr = ARM_CPUID_PXA262;
64e1671f 413 cpu->ctr = 0xd172172;
0ca7e01c 414 cpu->reset_sctlr = 0x00000078;
777dc784
PM
415}
416
417static void pxa270a0_initfn(Object *obj)
418{
419 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
420 set_feature(&cpu->env, ARM_FEATURE_V5);
421 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
422 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 423 cpu->midr = ARM_CPUID_PXA270_A0;
64e1671f 424 cpu->ctr = 0xd172172;
0ca7e01c 425 cpu->reset_sctlr = 0x00000078;
777dc784
PM
426}
427
428static void pxa270a1_initfn(Object *obj)
429{
430 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
431 set_feature(&cpu->env, ARM_FEATURE_V5);
432 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
433 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 434 cpu->midr = ARM_CPUID_PXA270_A1;
64e1671f 435 cpu->ctr = 0xd172172;
0ca7e01c 436 cpu->reset_sctlr = 0x00000078;
777dc784
PM
437}
438
439static void pxa270b0_initfn(Object *obj)
440{
441 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
442 set_feature(&cpu->env, ARM_FEATURE_V5);
443 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
444 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 445 cpu->midr = ARM_CPUID_PXA270_B0;
64e1671f 446 cpu->ctr = 0xd172172;
0ca7e01c 447 cpu->reset_sctlr = 0x00000078;
777dc784
PM
448}
449
450static void pxa270b1_initfn(Object *obj)
451{
452 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
453 set_feature(&cpu->env, ARM_FEATURE_V5);
454 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
455 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 456 cpu->midr = ARM_CPUID_PXA270_B1;
64e1671f 457 cpu->ctr = 0xd172172;
0ca7e01c 458 cpu->reset_sctlr = 0x00000078;
777dc784
PM
459}
460
461static void pxa270c0_initfn(Object *obj)
462{
463 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
464 set_feature(&cpu->env, ARM_FEATURE_V5);
465 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
466 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 467 cpu->midr = ARM_CPUID_PXA270_C0;
64e1671f 468 cpu->ctr = 0xd172172;
0ca7e01c 469 cpu->reset_sctlr = 0x00000078;
777dc784
PM
470}
471
472static void pxa270c5_initfn(Object *obj)
473{
474 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
475 set_feature(&cpu->env, ARM_FEATURE_V5);
476 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
477 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
777dc784 478 cpu->midr = ARM_CPUID_PXA270_C5;
64e1671f 479 cpu->ctr = 0xd172172;
0ca7e01c 480 cpu->reset_sctlr = 0x00000078;
777dc784
PM
481}
482
483static void arm_any_initfn(Object *obj)
484{
485 ARMCPU *cpu = ARM_CPU(obj);
581be094
PM
486 set_feature(&cpu->env, ARM_FEATURE_V7);
487 set_feature(&cpu->env, ARM_FEATURE_VFP4);
488 set_feature(&cpu->env, ARM_FEATURE_VFP_FP16);
489 set_feature(&cpu->env, ARM_FEATURE_NEON);
490 set_feature(&cpu->env, ARM_FEATURE_THUMB2EE);
491 set_feature(&cpu->env, ARM_FEATURE_ARM_DIV);
492 set_feature(&cpu->env, ARM_FEATURE_V7MP);
777dc784
PM
493 cpu->midr = ARM_CPUID_ANY;
494}
495
496typedef struct ARMCPUInfo {
497 const char *name;
498 void (*initfn)(Object *obj);
499} ARMCPUInfo;
500
501static const ARMCPUInfo arm_cpus[] = {
502 { .name = "arm926", .initfn = arm926_initfn },
503 { .name = "arm946", .initfn = arm946_initfn },
504 { .name = "arm1026", .initfn = arm1026_initfn },
505 /* What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
506 * older core than plain "arm1136". In particular this does not
507 * have the v6K features.
508 */
509 { .name = "arm1136-r2", .initfn = arm1136_r2_initfn },
510 { .name = "arm1136", .initfn = arm1136_initfn },
511 { .name = "arm1176", .initfn = arm1176_initfn },
512 { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
513 { .name = "cortex-m3", .initfn = cortex_m3_initfn },
514 { .name = "cortex-a8", .initfn = cortex_a8_initfn },
515 { .name = "cortex-a9", .initfn = cortex_a9_initfn },
516 { .name = "cortex-a15", .initfn = cortex_a15_initfn },
517 { .name = "ti925t", .initfn = ti925t_initfn },
518 { .name = "sa1100", .initfn = sa1100_initfn },
519 { .name = "sa1110", .initfn = sa1110_initfn },
520 { .name = "pxa250", .initfn = pxa250_initfn },
521 { .name = "pxa255", .initfn = pxa255_initfn },
522 { .name = "pxa260", .initfn = pxa260_initfn },
523 { .name = "pxa261", .initfn = pxa261_initfn },
524 { .name = "pxa262", .initfn = pxa262_initfn },
525 /* "pxa270" is an alias for "pxa270-a0" */
526 { .name = "pxa270", .initfn = pxa270a0_initfn },
527 { .name = "pxa270-a0", .initfn = pxa270a0_initfn },
528 { .name = "pxa270-a1", .initfn = pxa270a1_initfn },
529 { .name = "pxa270-b0", .initfn = pxa270b0_initfn },
530 { .name = "pxa270-b1", .initfn = pxa270b1_initfn },
531 { .name = "pxa270-c0", .initfn = pxa270c0_initfn },
532 { .name = "pxa270-c5", .initfn = pxa270c5_initfn },
533 { .name = "any", .initfn = arm_any_initfn },
534};
535
dec9c2d4
AF
536static void arm_cpu_class_init(ObjectClass *oc, void *data)
537{
538 ARMCPUClass *acc = ARM_CPU_CLASS(oc);
539 CPUClass *cc = CPU_CLASS(acc);
540
541 acc->parent_reset = cc->reset;
542 cc->reset = arm_cpu_reset;
543}
544
777dc784
PM
545static void cpu_register(const ARMCPUInfo *info)
546{
547 TypeInfo type_info = {
548 .name = info->name,
549 .parent = TYPE_ARM_CPU,
550 .instance_size = sizeof(ARMCPU),
551 .instance_init = info->initfn,
552 .class_size = sizeof(ARMCPUClass),
553 };
554
555 type_register_static(&type_info);
556}
557
dec9c2d4
AF
558static const TypeInfo arm_cpu_type_info = {
559 .name = TYPE_ARM_CPU,
560 .parent = TYPE_CPU,
561 .instance_size = sizeof(ARMCPU),
777dc784
PM
562 .instance_init = arm_cpu_initfn,
563 .abstract = true,
dec9c2d4
AF
564 .class_size = sizeof(ARMCPUClass),
565 .class_init = arm_cpu_class_init,
566};
567
568static void arm_cpu_register_types(void)
569{
777dc784
PM
570 int i;
571
dec9c2d4 572 type_register_static(&arm_cpu_type_info);
777dc784
PM
573 for (i = 0; i < ARRAY_SIZE(arm_cpus); i++) {
574 cpu_register(&arm_cpus[i]);
575 }
dec9c2d4
AF
576}
577
578type_init(arm_cpu_register_types)