util/vfio-helpers: Rework the IOVA allocator to avoid IOVA reserved regions
[qemu/ar7.git] / target / arm / cpu_tcg.c
blob0013e25412f8943c4d9f052dcf1b53cd60297eb6
1 /*
2 * QEMU ARM TCG CPUs.
4 * Copyright (c) 2012 SUSE LINUX Products GmbH
6 * This code is licensed under the GNU GPL v2 or later.
8 * SPDX-License-Identifier: GPL-2.0-or-later
9 */
11 #include "qemu/osdep.h"
12 #include "cpu.h"
13 #include "internals.h"
15 /* CPU models. These are not needed for the AArch64 linux-user build. */
16 #if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
18 static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
20 CPUClass *cc = CPU_GET_CLASS(cs);
21 ARMCPU *cpu = ARM_CPU(cs);
22 CPUARMState *env = &cpu->env;
23 bool ret = false;
26 * ARMv7-M interrupt masking works differently than -A or -R.
27 * There is no FIQ/IRQ distinction. Instead of I and F bits
28 * masking FIQ and IRQ interrupts, an exception is taken only
29 * if it is higher priority than the current execution priority
30 * (which depends on state like BASEPRI, FAULTMASK and the
31 * currently active exception).
33 if (interrupt_request & CPU_INTERRUPT_HARD
34 && (armv7m_nvic_can_take_pending_exception(env->nvic))) {
35 cs->exception_index = EXCP_IRQ;
36 cc->do_interrupt(cs);
37 ret = true;
39 return ret;
42 static void arm926_initfn(Object *obj)
44 ARMCPU *cpu = ARM_CPU(obj);
46 cpu->dtb_compatible = "arm,arm926";
47 set_feature(&cpu->env, ARM_FEATURE_V5);
48 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
49 set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
50 cpu->midr = 0x41069265;
51 cpu->reset_fpsid = 0x41011090;
52 cpu->ctr = 0x1dd20d2;
53 cpu->reset_sctlr = 0x00090078;
56 * ARMv5 does not have the ID_ISAR registers, but we can still
57 * set the field to indicate Jazelle support within QEMU.
59 cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
61 * Similarly, we need to set MVFR0 fields to enable vfp and short vector
62 * support even though ARMv5 doesn't have this register.
64 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
65 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSP, 1);
66 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
69 static void arm946_initfn(Object *obj)
71 ARMCPU *cpu = ARM_CPU(obj);
73 cpu->dtb_compatible = "arm,arm946";
74 set_feature(&cpu->env, ARM_FEATURE_V5);
75 set_feature(&cpu->env, ARM_FEATURE_PMSA);
76 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
77 cpu->midr = 0x41059461;
78 cpu->ctr = 0x0f004006;
79 cpu->reset_sctlr = 0x00000078;
82 static void arm1026_initfn(Object *obj)
84 ARMCPU *cpu = ARM_CPU(obj);
86 cpu->dtb_compatible = "arm,arm1026";
87 set_feature(&cpu->env, ARM_FEATURE_V5);
88 set_feature(&cpu->env, ARM_FEATURE_AUXCR);
89 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
90 set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
91 cpu->midr = 0x4106a262;
92 cpu->reset_fpsid = 0x410110a0;
93 cpu->ctr = 0x1dd20d2;
94 cpu->reset_sctlr = 0x00090078;
95 cpu->reset_auxcr = 1;
98 * ARMv5 does not have the ID_ISAR registers, but we can still
99 * set the field to indicate Jazelle support within QEMU.
101 cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
103 * Similarly, we need to set MVFR0 fields to enable vfp and short vector
104 * support even though ARMv5 doesn't have this register.
106 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
107 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSP, 1);
108 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
111 /* The 1026 had an IFAR at c6,c0,0,1 rather than the ARMv6 c6,c0,0,2 */
112 ARMCPRegInfo ifar = {
113 .name = "IFAR", .cp = 15, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 1,
114 .access = PL1_RW,
115 .fieldoffset = offsetof(CPUARMState, cp15.ifar_ns),
116 .resetvalue = 0
118 define_one_arm_cp_reg(cpu, &ifar);
122 static void arm1136_r2_initfn(Object *obj)
124 ARMCPU *cpu = ARM_CPU(obj);
126 * What qemu calls "arm1136_r2" is actually the 1136 r0p2, ie an
127 * older core than plain "arm1136". In particular this does not
128 * have the v6K features.
129 * These ID register values are correct for 1136 but may be wrong
130 * for 1136_r2 (in particular r0p2 does not actually implement most
131 * of the ID registers).
134 cpu->dtb_compatible = "arm,arm1136";
135 set_feature(&cpu->env, ARM_FEATURE_V6);
136 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
137 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
138 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
139 cpu->midr = 0x4107b362;
140 cpu->reset_fpsid = 0x410120b4;
141 cpu->isar.mvfr0 = 0x11111111;
142 cpu->isar.mvfr1 = 0x00000000;
143 cpu->ctr = 0x1dd20d2;
144 cpu->reset_sctlr = 0x00050078;
145 cpu->isar.id_pfr0 = 0x111;
146 cpu->isar.id_pfr1 = 0x1;
147 cpu->isar.id_dfr0 = 0x2;
148 cpu->id_afr0 = 0x3;
149 cpu->isar.id_mmfr0 = 0x01130003;
150 cpu->isar.id_mmfr1 = 0x10030302;
151 cpu->isar.id_mmfr2 = 0x01222110;
152 cpu->isar.id_isar0 = 0x00140011;
153 cpu->isar.id_isar1 = 0x12002111;
154 cpu->isar.id_isar2 = 0x11231111;
155 cpu->isar.id_isar3 = 0x01102131;
156 cpu->isar.id_isar4 = 0x141;
157 cpu->reset_auxcr = 7;
160 static void arm1136_initfn(Object *obj)
162 ARMCPU *cpu = ARM_CPU(obj);
164 cpu->dtb_compatible = "arm,arm1136";
165 set_feature(&cpu->env, ARM_FEATURE_V6K);
166 set_feature(&cpu->env, ARM_FEATURE_V6);
167 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
168 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
169 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
170 cpu->midr = 0x4117b363;
171 cpu->reset_fpsid = 0x410120b4;
172 cpu->isar.mvfr0 = 0x11111111;
173 cpu->isar.mvfr1 = 0x00000000;
174 cpu->ctr = 0x1dd20d2;
175 cpu->reset_sctlr = 0x00050078;
176 cpu->isar.id_pfr0 = 0x111;
177 cpu->isar.id_pfr1 = 0x1;
178 cpu->isar.id_dfr0 = 0x2;
179 cpu->id_afr0 = 0x3;
180 cpu->isar.id_mmfr0 = 0x01130003;
181 cpu->isar.id_mmfr1 = 0x10030302;
182 cpu->isar.id_mmfr2 = 0x01222110;
183 cpu->isar.id_isar0 = 0x00140011;
184 cpu->isar.id_isar1 = 0x12002111;
185 cpu->isar.id_isar2 = 0x11231111;
186 cpu->isar.id_isar3 = 0x01102131;
187 cpu->isar.id_isar4 = 0x141;
188 cpu->reset_auxcr = 7;
191 static void arm1176_initfn(Object *obj)
193 ARMCPU *cpu = ARM_CPU(obj);
195 cpu->dtb_compatible = "arm,arm1176";
196 set_feature(&cpu->env, ARM_FEATURE_V6K);
197 set_feature(&cpu->env, ARM_FEATURE_VAPA);
198 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
199 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
200 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
201 set_feature(&cpu->env, ARM_FEATURE_EL3);
202 cpu->midr = 0x410fb767;
203 cpu->reset_fpsid = 0x410120b5;
204 cpu->isar.mvfr0 = 0x11111111;
205 cpu->isar.mvfr1 = 0x00000000;
206 cpu->ctr = 0x1dd20d2;
207 cpu->reset_sctlr = 0x00050078;
208 cpu->isar.id_pfr0 = 0x111;
209 cpu->isar.id_pfr1 = 0x11;
210 cpu->isar.id_dfr0 = 0x33;
211 cpu->id_afr0 = 0;
212 cpu->isar.id_mmfr0 = 0x01130003;
213 cpu->isar.id_mmfr1 = 0x10030302;
214 cpu->isar.id_mmfr2 = 0x01222100;
215 cpu->isar.id_isar0 = 0x0140011;
216 cpu->isar.id_isar1 = 0x12002111;
217 cpu->isar.id_isar2 = 0x11231121;
218 cpu->isar.id_isar3 = 0x01102131;
219 cpu->isar.id_isar4 = 0x01141;
220 cpu->reset_auxcr = 7;
223 static void arm11mpcore_initfn(Object *obj)
225 ARMCPU *cpu = ARM_CPU(obj);
227 cpu->dtb_compatible = "arm,arm11mpcore";
228 set_feature(&cpu->env, ARM_FEATURE_V6K);
229 set_feature(&cpu->env, ARM_FEATURE_VAPA);
230 set_feature(&cpu->env, ARM_FEATURE_MPIDR);
231 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
232 cpu->midr = 0x410fb022;
233 cpu->reset_fpsid = 0x410120b4;
234 cpu->isar.mvfr0 = 0x11111111;
235 cpu->isar.mvfr1 = 0x00000000;
236 cpu->ctr = 0x1d192992; /* 32K icache 32K dcache */
237 cpu->isar.id_pfr0 = 0x111;
238 cpu->isar.id_pfr1 = 0x1;
239 cpu->isar.id_dfr0 = 0;
240 cpu->id_afr0 = 0x2;
241 cpu->isar.id_mmfr0 = 0x01100103;
242 cpu->isar.id_mmfr1 = 0x10020302;
243 cpu->isar.id_mmfr2 = 0x01222000;
244 cpu->isar.id_isar0 = 0x00100011;
245 cpu->isar.id_isar1 = 0x12002111;
246 cpu->isar.id_isar2 = 0x11221011;
247 cpu->isar.id_isar3 = 0x01102131;
248 cpu->isar.id_isar4 = 0x141;
249 cpu->reset_auxcr = 1;
252 static void cortex_m0_initfn(Object *obj)
254 ARMCPU *cpu = ARM_CPU(obj);
255 set_feature(&cpu->env, ARM_FEATURE_V6);
256 set_feature(&cpu->env, ARM_FEATURE_M);
258 cpu->midr = 0x410cc200;
261 * These ID register values are not guest visible, because
262 * we do not implement the Main Extension. They must be set
263 * to values corresponding to the Cortex-M0's implemented
264 * features, because QEMU generally controls its emulation
265 * by looking at ID register fields. We use the same values as
266 * for the M3.
268 cpu->isar.id_pfr0 = 0x00000030;
269 cpu->isar.id_pfr1 = 0x00000200;
270 cpu->isar.id_dfr0 = 0x00100000;
271 cpu->id_afr0 = 0x00000000;
272 cpu->isar.id_mmfr0 = 0x00000030;
273 cpu->isar.id_mmfr1 = 0x00000000;
274 cpu->isar.id_mmfr2 = 0x00000000;
275 cpu->isar.id_mmfr3 = 0x00000000;
276 cpu->isar.id_isar0 = 0x01141110;
277 cpu->isar.id_isar1 = 0x02111000;
278 cpu->isar.id_isar2 = 0x21112231;
279 cpu->isar.id_isar3 = 0x01111110;
280 cpu->isar.id_isar4 = 0x01310102;
281 cpu->isar.id_isar5 = 0x00000000;
282 cpu->isar.id_isar6 = 0x00000000;
285 static void cortex_m3_initfn(Object *obj)
287 ARMCPU *cpu = ARM_CPU(obj);
288 set_feature(&cpu->env, ARM_FEATURE_V7);
289 set_feature(&cpu->env, ARM_FEATURE_M);
290 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
291 cpu->midr = 0x410fc231;
292 cpu->pmsav7_dregion = 8;
293 cpu->isar.id_pfr0 = 0x00000030;
294 cpu->isar.id_pfr1 = 0x00000200;
295 cpu->isar.id_dfr0 = 0x00100000;
296 cpu->id_afr0 = 0x00000000;
297 cpu->isar.id_mmfr0 = 0x00000030;
298 cpu->isar.id_mmfr1 = 0x00000000;
299 cpu->isar.id_mmfr2 = 0x00000000;
300 cpu->isar.id_mmfr3 = 0x00000000;
301 cpu->isar.id_isar0 = 0x01141110;
302 cpu->isar.id_isar1 = 0x02111000;
303 cpu->isar.id_isar2 = 0x21112231;
304 cpu->isar.id_isar3 = 0x01111110;
305 cpu->isar.id_isar4 = 0x01310102;
306 cpu->isar.id_isar5 = 0x00000000;
307 cpu->isar.id_isar6 = 0x00000000;
310 static void cortex_m4_initfn(Object *obj)
312 ARMCPU *cpu = ARM_CPU(obj);
314 set_feature(&cpu->env, ARM_FEATURE_V7);
315 set_feature(&cpu->env, ARM_FEATURE_M);
316 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
317 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
318 cpu->midr = 0x410fc240; /* r0p0 */
319 cpu->pmsav7_dregion = 8;
320 cpu->isar.mvfr0 = 0x10110021;
321 cpu->isar.mvfr1 = 0x11000011;
322 cpu->isar.mvfr2 = 0x00000000;
323 cpu->isar.id_pfr0 = 0x00000030;
324 cpu->isar.id_pfr1 = 0x00000200;
325 cpu->isar.id_dfr0 = 0x00100000;
326 cpu->id_afr0 = 0x00000000;
327 cpu->isar.id_mmfr0 = 0x00000030;
328 cpu->isar.id_mmfr1 = 0x00000000;
329 cpu->isar.id_mmfr2 = 0x00000000;
330 cpu->isar.id_mmfr3 = 0x00000000;
331 cpu->isar.id_isar0 = 0x01141110;
332 cpu->isar.id_isar1 = 0x02111000;
333 cpu->isar.id_isar2 = 0x21112231;
334 cpu->isar.id_isar3 = 0x01111110;
335 cpu->isar.id_isar4 = 0x01310102;
336 cpu->isar.id_isar5 = 0x00000000;
337 cpu->isar.id_isar6 = 0x00000000;
340 static void cortex_m7_initfn(Object *obj)
342 ARMCPU *cpu = ARM_CPU(obj);
344 set_feature(&cpu->env, ARM_FEATURE_V7);
345 set_feature(&cpu->env, ARM_FEATURE_M);
346 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
347 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
348 cpu->midr = 0x411fc272; /* r1p2 */
349 cpu->pmsav7_dregion = 8;
350 cpu->isar.mvfr0 = 0x10110221;
351 cpu->isar.mvfr1 = 0x12000011;
352 cpu->isar.mvfr2 = 0x00000040;
353 cpu->isar.id_pfr0 = 0x00000030;
354 cpu->isar.id_pfr1 = 0x00000200;
355 cpu->isar.id_dfr0 = 0x00100000;
356 cpu->id_afr0 = 0x00000000;
357 cpu->isar.id_mmfr0 = 0x00100030;
358 cpu->isar.id_mmfr1 = 0x00000000;
359 cpu->isar.id_mmfr2 = 0x01000000;
360 cpu->isar.id_mmfr3 = 0x00000000;
361 cpu->isar.id_isar0 = 0x01101110;
362 cpu->isar.id_isar1 = 0x02112000;
363 cpu->isar.id_isar2 = 0x20232231;
364 cpu->isar.id_isar3 = 0x01111131;
365 cpu->isar.id_isar4 = 0x01310132;
366 cpu->isar.id_isar5 = 0x00000000;
367 cpu->isar.id_isar6 = 0x00000000;
370 static void cortex_m33_initfn(Object *obj)
372 ARMCPU *cpu = ARM_CPU(obj);
374 set_feature(&cpu->env, ARM_FEATURE_V8);
375 set_feature(&cpu->env, ARM_FEATURE_M);
376 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
377 set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
378 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
379 cpu->midr = 0x410fd213; /* r0p3 */
380 cpu->pmsav7_dregion = 16;
381 cpu->sau_sregion = 8;
382 cpu->isar.mvfr0 = 0x10110021;
383 cpu->isar.mvfr1 = 0x11000011;
384 cpu->isar.mvfr2 = 0x00000040;
385 cpu->isar.id_pfr0 = 0x00000030;
386 cpu->isar.id_pfr1 = 0x00000210;
387 cpu->isar.id_dfr0 = 0x00200000;
388 cpu->id_afr0 = 0x00000000;
389 cpu->isar.id_mmfr0 = 0x00101F40;
390 cpu->isar.id_mmfr1 = 0x00000000;
391 cpu->isar.id_mmfr2 = 0x01000000;
392 cpu->isar.id_mmfr3 = 0x00000000;
393 cpu->isar.id_isar0 = 0x01101110;
394 cpu->isar.id_isar1 = 0x02212000;
395 cpu->isar.id_isar2 = 0x20232232;
396 cpu->isar.id_isar3 = 0x01111131;
397 cpu->isar.id_isar4 = 0x01310132;
398 cpu->isar.id_isar5 = 0x00000000;
399 cpu->isar.id_isar6 = 0x00000000;
400 cpu->clidr = 0x00000000;
401 cpu->ctr = 0x8000c000;
404 static const ARMCPRegInfo cortexr5_cp_reginfo[] = {
405 /* Dummy the TCM region regs for the moment */
406 { .name = "ATCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 0,
407 .access = PL1_RW, .type = ARM_CP_CONST },
408 { .name = "BTCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 1,
409 .access = PL1_RW, .type = ARM_CP_CONST },
410 { .name = "DCACHE_INVAL", .cp = 15, .opc1 = 0, .crn = 15, .crm = 5,
411 .opc2 = 0, .access = PL1_W, .type = ARM_CP_NOP },
412 REGINFO_SENTINEL
415 static void cortex_r5_initfn(Object *obj)
417 ARMCPU *cpu = ARM_CPU(obj);
419 set_feature(&cpu->env, ARM_FEATURE_V7);
420 set_feature(&cpu->env, ARM_FEATURE_V7MP);
421 set_feature(&cpu->env, ARM_FEATURE_PMSA);
422 set_feature(&cpu->env, ARM_FEATURE_PMU);
423 cpu->midr = 0x411fc153; /* r1p3 */
424 cpu->isar.id_pfr0 = 0x0131;
425 cpu->isar.id_pfr1 = 0x001;
426 cpu->isar.id_dfr0 = 0x010400;
427 cpu->id_afr0 = 0x0;
428 cpu->isar.id_mmfr0 = 0x0210030;
429 cpu->isar.id_mmfr1 = 0x00000000;
430 cpu->isar.id_mmfr2 = 0x01200000;
431 cpu->isar.id_mmfr3 = 0x0211;
432 cpu->isar.id_isar0 = 0x02101111;
433 cpu->isar.id_isar1 = 0x13112111;
434 cpu->isar.id_isar2 = 0x21232141;
435 cpu->isar.id_isar3 = 0x01112131;
436 cpu->isar.id_isar4 = 0x0010142;
437 cpu->isar.id_isar5 = 0x0;
438 cpu->isar.id_isar6 = 0x0;
439 cpu->mp_is_up = true;
440 cpu->pmsav7_dregion = 16;
441 define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
444 static void cortex_r5f_initfn(Object *obj)
446 ARMCPU *cpu = ARM_CPU(obj);
448 cortex_r5_initfn(obj);
449 cpu->isar.mvfr0 = 0x10110221;
450 cpu->isar.mvfr1 = 0x00000011;
453 static void ti925t_initfn(Object *obj)
455 ARMCPU *cpu = ARM_CPU(obj);
456 set_feature(&cpu->env, ARM_FEATURE_V4T);
457 set_feature(&cpu->env, ARM_FEATURE_OMAPCP);
458 cpu->midr = ARM_CPUID_TI925T;
459 cpu->ctr = 0x5109149;
460 cpu->reset_sctlr = 0x00000070;
463 static void sa1100_initfn(Object *obj)
465 ARMCPU *cpu = ARM_CPU(obj);
467 cpu->dtb_compatible = "intel,sa1100";
468 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
469 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
470 cpu->midr = 0x4401A11B;
471 cpu->reset_sctlr = 0x00000070;
474 static void sa1110_initfn(Object *obj)
476 ARMCPU *cpu = ARM_CPU(obj);
477 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
478 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
479 cpu->midr = 0x6901B119;
480 cpu->reset_sctlr = 0x00000070;
483 static void pxa250_initfn(Object *obj)
485 ARMCPU *cpu = ARM_CPU(obj);
487 cpu->dtb_compatible = "marvell,xscale";
488 set_feature(&cpu->env, ARM_FEATURE_V5);
489 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
490 cpu->midr = 0x69052100;
491 cpu->ctr = 0xd172172;
492 cpu->reset_sctlr = 0x00000078;
495 static void pxa255_initfn(Object *obj)
497 ARMCPU *cpu = ARM_CPU(obj);
499 cpu->dtb_compatible = "marvell,xscale";
500 set_feature(&cpu->env, ARM_FEATURE_V5);
501 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
502 cpu->midr = 0x69052d00;
503 cpu->ctr = 0xd172172;
504 cpu->reset_sctlr = 0x00000078;
507 static void pxa260_initfn(Object *obj)
509 ARMCPU *cpu = ARM_CPU(obj);
511 cpu->dtb_compatible = "marvell,xscale";
512 set_feature(&cpu->env, ARM_FEATURE_V5);
513 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
514 cpu->midr = 0x69052903;
515 cpu->ctr = 0xd172172;
516 cpu->reset_sctlr = 0x00000078;
519 static void pxa261_initfn(Object *obj)
521 ARMCPU *cpu = ARM_CPU(obj);
523 cpu->dtb_compatible = "marvell,xscale";
524 set_feature(&cpu->env, ARM_FEATURE_V5);
525 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
526 cpu->midr = 0x69052d05;
527 cpu->ctr = 0xd172172;
528 cpu->reset_sctlr = 0x00000078;
531 static void pxa262_initfn(Object *obj)
533 ARMCPU *cpu = ARM_CPU(obj);
535 cpu->dtb_compatible = "marvell,xscale";
536 set_feature(&cpu->env, ARM_FEATURE_V5);
537 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
538 cpu->midr = 0x69052d06;
539 cpu->ctr = 0xd172172;
540 cpu->reset_sctlr = 0x00000078;
543 static void pxa270a0_initfn(Object *obj)
545 ARMCPU *cpu = ARM_CPU(obj);
547 cpu->dtb_compatible = "marvell,xscale";
548 set_feature(&cpu->env, ARM_FEATURE_V5);
549 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
550 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
551 cpu->midr = 0x69054110;
552 cpu->ctr = 0xd172172;
553 cpu->reset_sctlr = 0x00000078;
556 static void pxa270a1_initfn(Object *obj)
558 ARMCPU *cpu = ARM_CPU(obj);
560 cpu->dtb_compatible = "marvell,xscale";
561 set_feature(&cpu->env, ARM_FEATURE_V5);
562 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
563 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
564 cpu->midr = 0x69054111;
565 cpu->ctr = 0xd172172;
566 cpu->reset_sctlr = 0x00000078;
569 static void pxa270b0_initfn(Object *obj)
571 ARMCPU *cpu = ARM_CPU(obj);
573 cpu->dtb_compatible = "marvell,xscale";
574 set_feature(&cpu->env, ARM_FEATURE_V5);
575 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
576 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
577 cpu->midr = 0x69054112;
578 cpu->ctr = 0xd172172;
579 cpu->reset_sctlr = 0x00000078;
582 static void pxa270b1_initfn(Object *obj)
584 ARMCPU *cpu = ARM_CPU(obj);
586 cpu->dtb_compatible = "marvell,xscale";
587 set_feature(&cpu->env, ARM_FEATURE_V5);
588 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
589 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
590 cpu->midr = 0x69054113;
591 cpu->ctr = 0xd172172;
592 cpu->reset_sctlr = 0x00000078;
595 static void pxa270c0_initfn(Object *obj)
597 ARMCPU *cpu = ARM_CPU(obj);
599 cpu->dtb_compatible = "marvell,xscale";
600 set_feature(&cpu->env, ARM_FEATURE_V5);
601 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
602 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
603 cpu->midr = 0x69054114;
604 cpu->ctr = 0xd172172;
605 cpu->reset_sctlr = 0x00000078;
608 static void pxa270c5_initfn(Object *obj)
610 ARMCPU *cpu = ARM_CPU(obj);
612 cpu->dtb_compatible = "marvell,xscale";
613 set_feature(&cpu->env, ARM_FEATURE_V5);
614 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
615 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
616 cpu->midr = 0x69054117;
617 cpu->ctr = 0xd172172;
618 cpu->reset_sctlr = 0x00000078;
621 static void arm_v7m_class_init(ObjectClass *oc, void *data)
623 ARMCPUClass *acc = ARM_CPU_CLASS(oc);
624 CPUClass *cc = CPU_CLASS(oc);
626 acc->info = data;
627 #ifndef CONFIG_USER_ONLY
628 cc->do_interrupt = arm_v7m_cpu_do_interrupt;
629 #endif
631 cc->cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt;
632 cc->gdb_core_xml_file = "arm-m-profile.xml";
635 static const ARMCPUInfo arm_tcg_cpus[] = {
636 { .name = "arm926", .initfn = arm926_initfn },
637 { .name = "arm946", .initfn = arm946_initfn },
638 { .name = "arm1026", .initfn = arm1026_initfn },
640 * What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
641 * older core than plain "arm1136". In particular this does not
642 * have the v6K features.
644 { .name = "arm1136-r2", .initfn = arm1136_r2_initfn },
645 { .name = "arm1136", .initfn = arm1136_initfn },
646 { .name = "arm1176", .initfn = arm1176_initfn },
647 { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
648 { .name = "cortex-m0", .initfn = cortex_m0_initfn,
649 .class_init = arm_v7m_class_init },
650 { .name = "cortex-m3", .initfn = cortex_m3_initfn,
651 .class_init = arm_v7m_class_init },
652 { .name = "cortex-m4", .initfn = cortex_m4_initfn,
653 .class_init = arm_v7m_class_init },
654 { .name = "cortex-m7", .initfn = cortex_m7_initfn,
655 .class_init = arm_v7m_class_init },
656 { .name = "cortex-m33", .initfn = cortex_m33_initfn,
657 .class_init = arm_v7m_class_init },
658 { .name = "cortex-r5", .initfn = cortex_r5_initfn },
659 { .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
660 { .name = "ti925t", .initfn = ti925t_initfn },
661 { .name = "sa1100", .initfn = sa1100_initfn },
662 { .name = "sa1110", .initfn = sa1110_initfn },
663 { .name = "pxa250", .initfn = pxa250_initfn },
664 { .name = "pxa255", .initfn = pxa255_initfn },
665 { .name = "pxa260", .initfn = pxa260_initfn },
666 { .name = "pxa261", .initfn = pxa261_initfn },
667 { .name = "pxa262", .initfn = pxa262_initfn },
668 /* "pxa270" is an alias for "pxa270-a0" */
669 { .name = "pxa270", .initfn = pxa270a0_initfn },
670 { .name = "pxa270-a0", .initfn = pxa270a0_initfn },
671 { .name = "pxa270-a1", .initfn = pxa270a1_initfn },
672 { .name = "pxa270-b0", .initfn = pxa270b0_initfn },
673 { .name = "pxa270-b1", .initfn = pxa270b1_initfn },
674 { .name = "pxa270-c0", .initfn = pxa270c0_initfn },
675 { .name = "pxa270-c5", .initfn = pxa270c5_initfn },
678 static void arm_tcg_cpu_register_types(void)
680 size_t i;
682 for (i = 0; i < ARRAY_SIZE(arm_tcg_cpus); ++i) {
683 arm_cpu_register(&arm_tcg_cpus[i]);
687 type_init(arm_tcg_cpu_register_types)
689 #endif /* !CONFIG_USER_ONLY || !TARGET_AARCH64 */