docs: don't install corresponding man page if guest agent is disabled
[qemu/ar7.git] / target / arm / cpu_tcg.c
blobc29b434c60d658c4e5c00f4fb9ad99d8218c63f1
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 #ifdef CONFIG_TCG
14 #include "hw/core/tcg-cpu-ops.h"
15 #endif /* CONFIG_TCG */
16 #include "internals.h"
18 /* CPU models. These are not needed for the AArch64 linux-user build. */
19 #if !defined(CONFIG_USER_ONLY) || !defined(TARGET_AARCH64)
21 #ifdef CONFIG_TCG
22 static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
24 CPUClass *cc = CPU_GET_CLASS(cs);
25 ARMCPU *cpu = ARM_CPU(cs);
26 CPUARMState *env = &cpu->env;
27 bool ret = false;
30 * ARMv7-M interrupt masking works differently than -A or -R.
31 * There is no FIQ/IRQ distinction. Instead of I and F bits
32 * masking FIQ and IRQ interrupts, an exception is taken only
33 * if it is higher priority than the current execution priority
34 * (which depends on state like BASEPRI, FAULTMASK and the
35 * currently active exception).
37 if (interrupt_request & CPU_INTERRUPT_HARD
38 && (armv7m_nvic_can_take_pending_exception(env->nvic))) {
39 cs->exception_index = EXCP_IRQ;
40 cc->tcg_ops->do_interrupt(cs);
41 ret = true;
43 return ret;
45 #endif /* CONFIG_TCG */
47 static void arm926_initfn(Object *obj)
49 ARMCPU *cpu = ARM_CPU(obj);
51 cpu->dtb_compatible = "arm,arm926";
52 set_feature(&cpu->env, ARM_FEATURE_V5);
53 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
54 set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
55 cpu->midr = 0x41069265;
56 cpu->reset_fpsid = 0x41011090;
57 cpu->ctr = 0x1dd20d2;
58 cpu->reset_sctlr = 0x00090078;
61 * ARMv5 does not have the ID_ISAR registers, but we can still
62 * set the field to indicate Jazelle support within QEMU.
64 cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
66 * Similarly, we need to set MVFR0 fields to enable vfp and short vector
67 * support even though ARMv5 doesn't have this register.
69 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
70 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSP, 1);
71 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
74 static void arm946_initfn(Object *obj)
76 ARMCPU *cpu = ARM_CPU(obj);
78 cpu->dtb_compatible = "arm,arm946";
79 set_feature(&cpu->env, ARM_FEATURE_V5);
80 set_feature(&cpu->env, ARM_FEATURE_PMSA);
81 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
82 cpu->midr = 0x41059461;
83 cpu->ctr = 0x0f004006;
84 cpu->reset_sctlr = 0x00000078;
87 static void arm1026_initfn(Object *obj)
89 ARMCPU *cpu = ARM_CPU(obj);
91 cpu->dtb_compatible = "arm,arm1026";
92 set_feature(&cpu->env, ARM_FEATURE_V5);
93 set_feature(&cpu->env, ARM_FEATURE_AUXCR);
94 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
95 set_feature(&cpu->env, ARM_FEATURE_CACHE_TEST_CLEAN);
96 cpu->midr = 0x4106a262;
97 cpu->reset_fpsid = 0x410110a0;
98 cpu->ctr = 0x1dd20d2;
99 cpu->reset_sctlr = 0x00090078;
100 cpu->reset_auxcr = 1;
103 * ARMv5 does not have the ID_ISAR registers, but we can still
104 * set the field to indicate Jazelle support within QEMU.
106 cpu->isar.id_isar1 = FIELD_DP32(cpu->isar.id_isar1, ID_ISAR1, JAZELLE, 1);
108 * Similarly, we need to set MVFR0 fields to enable vfp and short vector
109 * support even though ARMv5 doesn't have this register.
111 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSHVEC, 1);
112 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPSP, 1);
113 cpu->isar.mvfr0 = FIELD_DP32(cpu->isar.mvfr0, MVFR0, FPDP, 1);
116 /* The 1026 had an IFAR at c6,c0,0,1 rather than the ARMv6 c6,c0,0,2 */
117 ARMCPRegInfo ifar = {
118 .name = "IFAR", .cp = 15, .crn = 6, .crm = 0, .opc1 = 0, .opc2 = 1,
119 .access = PL1_RW,
120 .fieldoffset = offsetof(CPUARMState, cp15.ifar_ns),
121 .resetvalue = 0
123 define_one_arm_cp_reg(cpu, &ifar);
127 static void arm1136_r2_initfn(Object *obj)
129 ARMCPU *cpu = ARM_CPU(obj);
131 * What qemu calls "arm1136_r2" is actually the 1136 r0p2, ie an
132 * older core than plain "arm1136". In particular this does not
133 * have the v6K features.
134 * These ID register values are correct for 1136 but may be wrong
135 * for 1136_r2 (in particular r0p2 does not actually implement most
136 * of the ID registers).
139 cpu->dtb_compatible = "arm,arm1136";
140 set_feature(&cpu->env, ARM_FEATURE_V6);
141 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
142 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
143 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
144 cpu->midr = 0x4107b362;
145 cpu->reset_fpsid = 0x410120b4;
146 cpu->isar.mvfr0 = 0x11111111;
147 cpu->isar.mvfr1 = 0x00000000;
148 cpu->ctr = 0x1dd20d2;
149 cpu->reset_sctlr = 0x00050078;
150 cpu->isar.id_pfr0 = 0x111;
151 cpu->isar.id_pfr1 = 0x1;
152 cpu->isar.id_dfr0 = 0x2;
153 cpu->id_afr0 = 0x3;
154 cpu->isar.id_mmfr0 = 0x01130003;
155 cpu->isar.id_mmfr1 = 0x10030302;
156 cpu->isar.id_mmfr2 = 0x01222110;
157 cpu->isar.id_isar0 = 0x00140011;
158 cpu->isar.id_isar1 = 0x12002111;
159 cpu->isar.id_isar2 = 0x11231111;
160 cpu->isar.id_isar3 = 0x01102131;
161 cpu->isar.id_isar4 = 0x141;
162 cpu->reset_auxcr = 7;
165 static void arm1136_initfn(Object *obj)
167 ARMCPU *cpu = ARM_CPU(obj);
169 cpu->dtb_compatible = "arm,arm1136";
170 set_feature(&cpu->env, ARM_FEATURE_V6K);
171 set_feature(&cpu->env, ARM_FEATURE_V6);
172 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
173 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
174 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
175 cpu->midr = 0x4117b363;
176 cpu->reset_fpsid = 0x410120b4;
177 cpu->isar.mvfr0 = 0x11111111;
178 cpu->isar.mvfr1 = 0x00000000;
179 cpu->ctr = 0x1dd20d2;
180 cpu->reset_sctlr = 0x00050078;
181 cpu->isar.id_pfr0 = 0x111;
182 cpu->isar.id_pfr1 = 0x1;
183 cpu->isar.id_dfr0 = 0x2;
184 cpu->id_afr0 = 0x3;
185 cpu->isar.id_mmfr0 = 0x01130003;
186 cpu->isar.id_mmfr1 = 0x10030302;
187 cpu->isar.id_mmfr2 = 0x01222110;
188 cpu->isar.id_isar0 = 0x00140011;
189 cpu->isar.id_isar1 = 0x12002111;
190 cpu->isar.id_isar2 = 0x11231111;
191 cpu->isar.id_isar3 = 0x01102131;
192 cpu->isar.id_isar4 = 0x141;
193 cpu->reset_auxcr = 7;
196 static void arm1176_initfn(Object *obj)
198 ARMCPU *cpu = ARM_CPU(obj);
200 cpu->dtb_compatible = "arm,arm1176";
201 set_feature(&cpu->env, ARM_FEATURE_V6K);
202 set_feature(&cpu->env, ARM_FEATURE_VAPA);
203 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
204 set_feature(&cpu->env, ARM_FEATURE_CACHE_DIRTY_REG);
205 set_feature(&cpu->env, ARM_FEATURE_CACHE_BLOCK_OPS);
206 set_feature(&cpu->env, ARM_FEATURE_EL3);
207 cpu->midr = 0x410fb767;
208 cpu->reset_fpsid = 0x410120b5;
209 cpu->isar.mvfr0 = 0x11111111;
210 cpu->isar.mvfr1 = 0x00000000;
211 cpu->ctr = 0x1dd20d2;
212 cpu->reset_sctlr = 0x00050078;
213 cpu->isar.id_pfr0 = 0x111;
214 cpu->isar.id_pfr1 = 0x11;
215 cpu->isar.id_dfr0 = 0x33;
216 cpu->id_afr0 = 0;
217 cpu->isar.id_mmfr0 = 0x01130003;
218 cpu->isar.id_mmfr1 = 0x10030302;
219 cpu->isar.id_mmfr2 = 0x01222100;
220 cpu->isar.id_isar0 = 0x0140011;
221 cpu->isar.id_isar1 = 0x12002111;
222 cpu->isar.id_isar2 = 0x11231121;
223 cpu->isar.id_isar3 = 0x01102131;
224 cpu->isar.id_isar4 = 0x01141;
225 cpu->reset_auxcr = 7;
228 static void arm11mpcore_initfn(Object *obj)
230 ARMCPU *cpu = ARM_CPU(obj);
232 cpu->dtb_compatible = "arm,arm11mpcore";
233 set_feature(&cpu->env, ARM_FEATURE_V6K);
234 set_feature(&cpu->env, ARM_FEATURE_VAPA);
235 set_feature(&cpu->env, ARM_FEATURE_MPIDR);
236 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
237 cpu->midr = 0x410fb022;
238 cpu->reset_fpsid = 0x410120b4;
239 cpu->isar.mvfr0 = 0x11111111;
240 cpu->isar.mvfr1 = 0x00000000;
241 cpu->ctr = 0x1d192992; /* 32K icache 32K dcache */
242 cpu->isar.id_pfr0 = 0x111;
243 cpu->isar.id_pfr1 = 0x1;
244 cpu->isar.id_dfr0 = 0;
245 cpu->id_afr0 = 0x2;
246 cpu->isar.id_mmfr0 = 0x01100103;
247 cpu->isar.id_mmfr1 = 0x10020302;
248 cpu->isar.id_mmfr2 = 0x01222000;
249 cpu->isar.id_isar0 = 0x00100011;
250 cpu->isar.id_isar1 = 0x12002111;
251 cpu->isar.id_isar2 = 0x11221011;
252 cpu->isar.id_isar3 = 0x01102131;
253 cpu->isar.id_isar4 = 0x141;
254 cpu->reset_auxcr = 1;
257 static void cortex_m0_initfn(Object *obj)
259 ARMCPU *cpu = ARM_CPU(obj);
260 set_feature(&cpu->env, ARM_FEATURE_V6);
261 set_feature(&cpu->env, ARM_FEATURE_M);
263 cpu->midr = 0x410cc200;
266 * These ID register values are not guest visible, because
267 * we do not implement the Main Extension. They must be set
268 * to values corresponding to the Cortex-M0's implemented
269 * features, because QEMU generally controls its emulation
270 * by looking at ID register fields. We use the same values as
271 * for the M3.
273 cpu->isar.id_pfr0 = 0x00000030;
274 cpu->isar.id_pfr1 = 0x00000200;
275 cpu->isar.id_dfr0 = 0x00100000;
276 cpu->id_afr0 = 0x00000000;
277 cpu->isar.id_mmfr0 = 0x00000030;
278 cpu->isar.id_mmfr1 = 0x00000000;
279 cpu->isar.id_mmfr2 = 0x00000000;
280 cpu->isar.id_mmfr3 = 0x00000000;
281 cpu->isar.id_isar0 = 0x01141110;
282 cpu->isar.id_isar1 = 0x02111000;
283 cpu->isar.id_isar2 = 0x21112231;
284 cpu->isar.id_isar3 = 0x01111110;
285 cpu->isar.id_isar4 = 0x01310102;
286 cpu->isar.id_isar5 = 0x00000000;
287 cpu->isar.id_isar6 = 0x00000000;
290 static void cortex_m3_initfn(Object *obj)
292 ARMCPU *cpu = ARM_CPU(obj);
293 set_feature(&cpu->env, ARM_FEATURE_V7);
294 set_feature(&cpu->env, ARM_FEATURE_M);
295 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
296 cpu->midr = 0x410fc231;
297 cpu->pmsav7_dregion = 8;
298 cpu->isar.id_pfr0 = 0x00000030;
299 cpu->isar.id_pfr1 = 0x00000200;
300 cpu->isar.id_dfr0 = 0x00100000;
301 cpu->id_afr0 = 0x00000000;
302 cpu->isar.id_mmfr0 = 0x00000030;
303 cpu->isar.id_mmfr1 = 0x00000000;
304 cpu->isar.id_mmfr2 = 0x00000000;
305 cpu->isar.id_mmfr3 = 0x00000000;
306 cpu->isar.id_isar0 = 0x01141110;
307 cpu->isar.id_isar1 = 0x02111000;
308 cpu->isar.id_isar2 = 0x21112231;
309 cpu->isar.id_isar3 = 0x01111110;
310 cpu->isar.id_isar4 = 0x01310102;
311 cpu->isar.id_isar5 = 0x00000000;
312 cpu->isar.id_isar6 = 0x00000000;
315 static void cortex_m4_initfn(Object *obj)
317 ARMCPU *cpu = ARM_CPU(obj);
319 set_feature(&cpu->env, ARM_FEATURE_V7);
320 set_feature(&cpu->env, ARM_FEATURE_M);
321 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
322 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
323 cpu->midr = 0x410fc240; /* r0p0 */
324 cpu->pmsav7_dregion = 8;
325 cpu->isar.mvfr0 = 0x10110021;
326 cpu->isar.mvfr1 = 0x11000011;
327 cpu->isar.mvfr2 = 0x00000000;
328 cpu->isar.id_pfr0 = 0x00000030;
329 cpu->isar.id_pfr1 = 0x00000200;
330 cpu->isar.id_dfr0 = 0x00100000;
331 cpu->id_afr0 = 0x00000000;
332 cpu->isar.id_mmfr0 = 0x00000030;
333 cpu->isar.id_mmfr1 = 0x00000000;
334 cpu->isar.id_mmfr2 = 0x00000000;
335 cpu->isar.id_mmfr3 = 0x00000000;
336 cpu->isar.id_isar0 = 0x01141110;
337 cpu->isar.id_isar1 = 0x02111000;
338 cpu->isar.id_isar2 = 0x21112231;
339 cpu->isar.id_isar3 = 0x01111110;
340 cpu->isar.id_isar4 = 0x01310102;
341 cpu->isar.id_isar5 = 0x00000000;
342 cpu->isar.id_isar6 = 0x00000000;
345 static void cortex_m7_initfn(Object *obj)
347 ARMCPU *cpu = ARM_CPU(obj);
349 set_feature(&cpu->env, ARM_FEATURE_V7);
350 set_feature(&cpu->env, ARM_FEATURE_M);
351 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
352 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
353 cpu->midr = 0x411fc272; /* r1p2 */
354 cpu->pmsav7_dregion = 8;
355 cpu->isar.mvfr0 = 0x10110221;
356 cpu->isar.mvfr1 = 0x12000011;
357 cpu->isar.mvfr2 = 0x00000040;
358 cpu->isar.id_pfr0 = 0x00000030;
359 cpu->isar.id_pfr1 = 0x00000200;
360 cpu->isar.id_dfr0 = 0x00100000;
361 cpu->id_afr0 = 0x00000000;
362 cpu->isar.id_mmfr0 = 0x00100030;
363 cpu->isar.id_mmfr1 = 0x00000000;
364 cpu->isar.id_mmfr2 = 0x01000000;
365 cpu->isar.id_mmfr3 = 0x00000000;
366 cpu->isar.id_isar0 = 0x01101110;
367 cpu->isar.id_isar1 = 0x02112000;
368 cpu->isar.id_isar2 = 0x20232231;
369 cpu->isar.id_isar3 = 0x01111131;
370 cpu->isar.id_isar4 = 0x01310132;
371 cpu->isar.id_isar5 = 0x00000000;
372 cpu->isar.id_isar6 = 0x00000000;
375 static void cortex_m33_initfn(Object *obj)
377 ARMCPU *cpu = ARM_CPU(obj);
379 set_feature(&cpu->env, ARM_FEATURE_V8);
380 set_feature(&cpu->env, ARM_FEATURE_M);
381 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
382 set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
383 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
384 cpu->midr = 0x410fd213; /* r0p3 */
385 cpu->pmsav7_dregion = 16;
386 cpu->sau_sregion = 8;
387 cpu->isar.mvfr0 = 0x10110021;
388 cpu->isar.mvfr1 = 0x11000011;
389 cpu->isar.mvfr2 = 0x00000040;
390 cpu->isar.id_pfr0 = 0x00000030;
391 cpu->isar.id_pfr1 = 0x00000210;
392 cpu->isar.id_dfr0 = 0x00200000;
393 cpu->id_afr0 = 0x00000000;
394 cpu->isar.id_mmfr0 = 0x00101F40;
395 cpu->isar.id_mmfr1 = 0x00000000;
396 cpu->isar.id_mmfr2 = 0x01000000;
397 cpu->isar.id_mmfr3 = 0x00000000;
398 cpu->isar.id_isar0 = 0x01101110;
399 cpu->isar.id_isar1 = 0x02212000;
400 cpu->isar.id_isar2 = 0x20232232;
401 cpu->isar.id_isar3 = 0x01111131;
402 cpu->isar.id_isar4 = 0x01310132;
403 cpu->isar.id_isar5 = 0x00000000;
404 cpu->isar.id_isar6 = 0x00000000;
405 cpu->clidr = 0x00000000;
406 cpu->ctr = 0x8000c000;
409 static void cortex_m55_initfn(Object *obj)
411 ARMCPU *cpu = ARM_CPU(obj);
413 set_feature(&cpu->env, ARM_FEATURE_V8);
414 set_feature(&cpu->env, ARM_FEATURE_V8_1M);
415 set_feature(&cpu->env, ARM_FEATURE_M);
416 set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
417 set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
418 set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
419 cpu->midr = 0x410fd221; /* r0p1 */
420 cpu->revidr = 0;
421 cpu->pmsav7_dregion = 16;
422 cpu->sau_sregion = 8;
424 * These are the MVFR* values for the FPU, no MVE configuration;
425 * we will update them later when we implement MVE
427 cpu->isar.mvfr0 = 0x10110221;
428 cpu->isar.mvfr1 = 0x12100011;
429 cpu->isar.mvfr2 = 0x00000040;
430 cpu->isar.id_pfr0 = 0x20000030;
431 cpu->isar.id_pfr1 = 0x00000230;
432 cpu->isar.id_dfr0 = 0x10200000;
433 cpu->id_afr0 = 0x00000000;
434 cpu->isar.id_mmfr0 = 0x00111040;
435 cpu->isar.id_mmfr1 = 0x00000000;
436 cpu->isar.id_mmfr2 = 0x01000000;
437 cpu->isar.id_mmfr3 = 0x00000011;
438 cpu->isar.id_isar0 = 0x01103110;
439 cpu->isar.id_isar1 = 0x02212000;
440 cpu->isar.id_isar2 = 0x20232232;
441 cpu->isar.id_isar3 = 0x01111131;
442 cpu->isar.id_isar4 = 0x01310132;
443 cpu->isar.id_isar5 = 0x00000000;
444 cpu->isar.id_isar6 = 0x00000000;
445 cpu->clidr = 0x00000000; /* caches not implemented */
446 cpu->ctr = 0x8303c003;
449 static const ARMCPRegInfo cortexr5_cp_reginfo[] = {
450 /* Dummy the TCM region regs for the moment */
451 { .name = "ATCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 0,
452 .access = PL1_RW, .type = ARM_CP_CONST },
453 { .name = "BTCM", .cp = 15, .opc1 = 0, .crn = 9, .crm = 1, .opc2 = 1,
454 .access = PL1_RW, .type = ARM_CP_CONST },
455 { .name = "DCACHE_INVAL", .cp = 15, .opc1 = 0, .crn = 15, .crm = 5,
456 .opc2 = 0, .access = PL1_W, .type = ARM_CP_NOP },
457 REGINFO_SENTINEL
460 static void cortex_r5_initfn(Object *obj)
462 ARMCPU *cpu = ARM_CPU(obj);
464 set_feature(&cpu->env, ARM_FEATURE_V7);
465 set_feature(&cpu->env, ARM_FEATURE_V7MP);
466 set_feature(&cpu->env, ARM_FEATURE_PMSA);
467 set_feature(&cpu->env, ARM_FEATURE_PMU);
468 cpu->midr = 0x411fc153; /* r1p3 */
469 cpu->isar.id_pfr0 = 0x0131;
470 cpu->isar.id_pfr1 = 0x001;
471 cpu->isar.id_dfr0 = 0x010400;
472 cpu->id_afr0 = 0x0;
473 cpu->isar.id_mmfr0 = 0x0210030;
474 cpu->isar.id_mmfr1 = 0x00000000;
475 cpu->isar.id_mmfr2 = 0x01200000;
476 cpu->isar.id_mmfr3 = 0x0211;
477 cpu->isar.id_isar0 = 0x02101111;
478 cpu->isar.id_isar1 = 0x13112111;
479 cpu->isar.id_isar2 = 0x21232141;
480 cpu->isar.id_isar3 = 0x01112131;
481 cpu->isar.id_isar4 = 0x0010142;
482 cpu->isar.id_isar5 = 0x0;
483 cpu->isar.id_isar6 = 0x0;
484 cpu->mp_is_up = true;
485 cpu->pmsav7_dregion = 16;
486 define_arm_cp_regs(cpu, cortexr5_cp_reginfo);
489 static void cortex_r5f_initfn(Object *obj)
491 ARMCPU *cpu = ARM_CPU(obj);
493 cortex_r5_initfn(obj);
494 cpu->isar.mvfr0 = 0x10110221;
495 cpu->isar.mvfr1 = 0x00000011;
498 static void ti925t_initfn(Object *obj)
500 ARMCPU *cpu = ARM_CPU(obj);
501 set_feature(&cpu->env, ARM_FEATURE_V4T);
502 set_feature(&cpu->env, ARM_FEATURE_OMAPCP);
503 cpu->midr = ARM_CPUID_TI925T;
504 cpu->ctr = 0x5109149;
505 cpu->reset_sctlr = 0x00000070;
508 static void sa1100_initfn(Object *obj)
510 ARMCPU *cpu = ARM_CPU(obj);
512 cpu->dtb_compatible = "intel,sa1100";
513 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
514 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
515 cpu->midr = 0x4401A11B;
516 cpu->reset_sctlr = 0x00000070;
519 static void sa1110_initfn(Object *obj)
521 ARMCPU *cpu = ARM_CPU(obj);
522 set_feature(&cpu->env, ARM_FEATURE_STRONGARM);
523 set_feature(&cpu->env, ARM_FEATURE_DUMMY_C15_REGS);
524 cpu->midr = 0x6901B119;
525 cpu->reset_sctlr = 0x00000070;
528 static void pxa250_initfn(Object *obj)
530 ARMCPU *cpu = ARM_CPU(obj);
532 cpu->dtb_compatible = "marvell,xscale";
533 set_feature(&cpu->env, ARM_FEATURE_V5);
534 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
535 cpu->midr = 0x69052100;
536 cpu->ctr = 0xd172172;
537 cpu->reset_sctlr = 0x00000078;
540 static void pxa255_initfn(Object *obj)
542 ARMCPU *cpu = ARM_CPU(obj);
544 cpu->dtb_compatible = "marvell,xscale";
545 set_feature(&cpu->env, ARM_FEATURE_V5);
546 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
547 cpu->midr = 0x69052d00;
548 cpu->ctr = 0xd172172;
549 cpu->reset_sctlr = 0x00000078;
552 static void pxa260_initfn(Object *obj)
554 ARMCPU *cpu = ARM_CPU(obj);
556 cpu->dtb_compatible = "marvell,xscale";
557 set_feature(&cpu->env, ARM_FEATURE_V5);
558 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
559 cpu->midr = 0x69052903;
560 cpu->ctr = 0xd172172;
561 cpu->reset_sctlr = 0x00000078;
564 static void pxa261_initfn(Object *obj)
566 ARMCPU *cpu = ARM_CPU(obj);
568 cpu->dtb_compatible = "marvell,xscale";
569 set_feature(&cpu->env, ARM_FEATURE_V5);
570 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
571 cpu->midr = 0x69052d05;
572 cpu->ctr = 0xd172172;
573 cpu->reset_sctlr = 0x00000078;
576 static void pxa262_initfn(Object *obj)
578 ARMCPU *cpu = ARM_CPU(obj);
580 cpu->dtb_compatible = "marvell,xscale";
581 set_feature(&cpu->env, ARM_FEATURE_V5);
582 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
583 cpu->midr = 0x69052d06;
584 cpu->ctr = 0xd172172;
585 cpu->reset_sctlr = 0x00000078;
588 static void pxa270a0_initfn(Object *obj)
590 ARMCPU *cpu = ARM_CPU(obj);
592 cpu->dtb_compatible = "marvell,xscale";
593 set_feature(&cpu->env, ARM_FEATURE_V5);
594 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
595 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
596 cpu->midr = 0x69054110;
597 cpu->ctr = 0xd172172;
598 cpu->reset_sctlr = 0x00000078;
601 static void pxa270a1_initfn(Object *obj)
603 ARMCPU *cpu = ARM_CPU(obj);
605 cpu->dtb_compatible = "marvell,xscale";
606 set_feature(&cpu->env, ARM_FEATURE_V5);
607 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
608 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
609 cpu->midr = 0x69054111;
610 cpu->ctr = 0xd172172;
611 cpu->reset_sctlr = 0x00000078;
614 static void pxa270b0_initfn(Object *obj)
616 ARMCPU *cpu = ARM_CPU(obj);
618 cpu->dtb_compatible = "marvell,xscale";
619 set_feature(&cpu->env, ARM_FEATURE_V5);
620 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
621 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
622 cpu->midr = 0x69054112;
623 cpu->ctr = 0xd172172;
624 cpu->reset_sctlr = 0x00000078;
627 static void pxa270b1_initfn(Object *obj)
629 ARMCPU *cpu = ARM_CPU(obj);
631 cpu->dtb_compatible = "marvell,xscale";
632 set_feature(&cpu->env, ARM_FEATURE_V5);
633 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
634 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
635 cpu->midr = 0x69054113;
636 cpu->ctr = 0xd172172;
637 cpu->reset_sctlr = 0x00000078;
640 static void pxa270c0_initfn(Object *obj)
642 ARMCPU *cpu = ARM_CPU(obj);
644 cpu->dtb_compatible = "marvell,xscale";
645 set_feature(&cpu->env, ARM_FEATURE_V5);
646 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
647 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
648 cpu->midr = 0x69054114;
649 cpu->ctr = 0xd172172;
650 cpu->reset_sctlr = 0x00000078;
653 static void pxa270c5_initfn(Object *obj)
655 ARMCPU *cpu = ARM_CPU(obj);
657 cpu->dtb_compatible = "marvell,xscale";
658 set_feature(&cpu->env, ARM_FEATURE_V5);
659 set_feature(&cpu->env, ARM_FEATURE_XSCALE);
660 set_feature(&cpu->env, ARM_FEATURE_IWMMXT);
661 cpu->midr = 0x69054117;
662 cpu->ctr = 0xd172172;
663 cpu->reset_sctlr = 0x00000078;
666 #ifdef CONFIG_TCG
667 static struct TCGCPUOps arm_v7m_tcg_ops = {
668 .initialize = arm_translate_init,
669 .synchronize_from_tb = arm_cpu_synchronize_from_tb,
670 .cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt,
671 .tlb_fill = arm_cpu_tlb_fill,
672 .debug_excp_handler = arm_debug_excp_handler,
674 #if !defined(CONFIG_USER_ONLY)
675 .do_interrupt = arm_v7m_cpu_do_interrupt,
676 .do_transaction_failed = arm_cpu_do_transaction_failed,
677 .do_unaligned_access = arm_cpu_do_unaligned_access,
678 .adjust_watchpoint_address = arm_adjust_watchpoint_address,
679 .debug_check_watchpoint = arm_debug_check_watchpoint,
680 #endif /* !CONFIG_USER_ONLY */
682 #endif /* CONFIG_TCG */
684 static void arm_v7m_class_init(ObjectClass *oc, void *data)
686 ARMCPUClass *acc = ARM_CPU_CLASS(oc);
687 CPUClass *cc = CPU_CLASS(oc);
689 acc->info = data;
690 #ifdef CONFIG_TCG
691 cc->tcg_ops = &arm_v7m_tcg_ops;
692 #endif /* CONFIG_TCG */
694 cc->gdb_core_xml_file = "arm-m-profile.xml";
697 static const ARMCPUInfo arm_tcg_cpus[] = {
698 { .name = "arm926", .initfn = arm926_initfn },
699 { .name = "arm946", .initfn = arm946_initfn },
700 { .name = "arm1026", .initfn = arm1026_initfn },
702 * What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
703 * older core than plain "arm1136". In particular this does not
704 * have the v6K features.
706 { .name = "arm1136-r2", .initfn = arm1136_r2_initfn },
707 { .name = "arm1136", .initfn = arm1136_initfn },
708 { .name = "arm1176", .initfn = arm1176_initfn },
709 { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
710 { .name = "cortex-m0", .initfn = cortex_m0_initfn,
711 .class_init = arm_v7m_class_init },
712 { .name = "cortex-m3", .initfn = cortex_m3_initfn,
713 .class_init = arm_v7m_class_init },
714 { .name = "cortex-m4", .initfn = cortex_m4_initfn,
715 .class_init = arm_v7m_class_init },
716 { .name = "cortex-m7", .initfn = cortex_m7_initfn,
717 .class_init = arm_v7m_class_init },
718 { .name = "cortex-m33", .initfn = cortex_m33_initfn,
719 .class_init = arm_v7m_class_init },
720 { .name = "cortex-m55", .initfn = cortex_m55_initfn,
721 .class_init = arm_v7m_class_init },
722 { .name = "cortex-r5", .initfn = cortex_r5_initfn },
723 { .name = "cortex-r5f", .initfn = cortex_r5f_initfn },
724 { .name = "ti925t", .initfn = ti925t_initfn },
725 { .name = "sa1100", .initfn = sa1100_initfn },
726 { .name = "sa1110", .initfn = sa1110_initfn },
727 { .name = "pxa250", .initfn = pxa250_initfn },
728 { .name = "pxa255", .initfn = pxa255_initfn },
729 { .name = "pxa260", .initfn = pxa260_initfn },
730 { .name = "pxa261", .initfn = pxa261_initfn },
731 { .name = "pxa262", .initfn = pxa262_initfn },
732 /* "pxa270" is an alias for "pxa270-a0" */
733 { .name = "pxa270", .initfn = pxa270a0_initfn },
734 { .name = "pxa270-a0", .initfn = pxa270a0_initfn },
735 { .name = "pxa270-a1", .initfn = pxa270a1_initfn },
736 { .name = "pxa270-b0", .initfn = pxa270b0_initfn },
737 { .name = "pxa270-b1", .initfn = pxa270b1_initfn },
738 { .name = "pxa270-c0", .initfn = pxa270c0_initfn },
739 { .name = "pxa270-c5", .initfn = pxa270c5_initfn },
742 static void arm_tcg_cpu_register_types(void)
744 size_t i;
746 for (i = 0; i < ARRAY_SIZE(arm_tcg_cpus); ++i) {
747 arm_cpu_register(&arm_tcg_cpus[i]);
751 type_init(arm_tcg_cpu_register_types)
753 #endif /* !CONFIG_USER_ONLY || !TARGET_AARCH64 */