]> Git Repo - qemu.git/blame - target-arm/cpu.c
target-arm: Add QOM subclasses for each ARM cpu implementation
[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
777dc784
PM
37static void arm_cpu_initfn(Object *obj)
38{
39 ARMCPU *cpu = ARM_CPU(obj);
40
41 cpu_exec_init(&cpu->env);
42}
43
44/* CPU models */
45
46static void arm926_initfn(Object *obj)
47{
48 ARMCPU *cpu = ARM_CPU(obj);
49 cpu->midr = ARM_CPUID_ARM926;
50}
51
52static void arm946_initfn(Object *obj)
53{
54 ARMCPU *cpu = ARM_CPU(obj);
55 cpu->midr = ARM_CPUID_ARM946;
56}
57
58static void arm1026_initfn(Object *obj)
59{
60 ARMCPU *cpu = ARM_CPU(obj);
61 cpu->midr = ARM_CPUID_ARM1026;
62}
63
64static void arm1136_r2_initfn(Object *obj)
65{
66 ARMCPU *cpu = ARM_CPU(obj);
67 cpu->midr = ARM_CPUID_ARM1136_R2;
68}
69
70static void arm1136_initfn(Object *obj)
71{
72 ARMCPU *cpu = ARM_CPU(obj);
73 cpu->midr = ARM_CPUID_ARM1136;
74}
75
76static void arm1176_initfn(Object *obj)
77{
78 ARMCPU *cpu = ARM_CPU(obj);
79 cpu->midr = ARM_CPUID_ARM1176;
80}
81
82static void arm11mpcore_initfn(Object *obj)
83{
84 ARMCPU *cpu = ARM_CPU(obj);
85 cpu->midr = ARM_CPUID_ARM11MPCORE;
86}
87
88static void cortex_m3_initfn(Object *obj)
89{
90 ARMCPU *cpu = ARM_CPU(obj);
91 cpu->midr = ARM_CPUID_CORTEXM3;
92}
93
94static void cortex_a8_initfn(Object *obj)
95{
96 ARMCPU *cpu = ARM_CPU(obj);
97 cpu->midr = ARM_CPUID_CORTEXA8;
98}
99
100static void cortex_a9_initfn(Object *obj)
101{
102 ARMCPU *cpu = ARM_CPU(obj);
103 cpu->midr = ARM_CPUID_CORTEXA9;
104}
105
106static void cortex_a15_initfn(Object *obj)
107{
108 ARMCPU *cpu = ARM_CPU(obj);
109 cpu->midr = ARM_CPUID_CORTEXA15;
110}
111
112static void ti925t_initfn(Object *obj)
113{
114 ARMCPU *cpu = ARM_CPU(obj);
115 cpu->midr = ARM_CPUID_TI925T;
116}
117
118static void sa1100_initfn(Object *obj)
119{
120 ARMCPU *cpu = ARM_CPU(obj);
121 cpu->midr = ARM_CPUID_SA1100;
122}
123
124static void sa1110_initfn(Object *obj)
125{
126 ARMCPU *cpu = ARM_CPU(obj);
127 cpu->midr = ARM_CPUID_SA1110;
128}
129
130static void pxa250_initfn(Object *obj)
131{
132 ARMCPU *cpu = ARM_CPU(obj);
133 cpu->midr = ARM_CPUID_PXA250;
134}
135
136static void pxa255_initfn(Object *obj)
137{
138 ARMCPU *cpu = ARM_CPU(obj);
139 cpu->midr = ARM_CPUID_PXA255;
140}
141
142static void pxa260_initfn(Object *obj)
143{
144 ARMCPU *cpu = ARM_CPU(obj);
145 cpu->midr = ARM_CPUID_PXA260;
146}
147
148static void pxa261_initfn(Object *obj)
149{
150 ARMCPU *cpu = ARM_CPU(obj);
151 cpu->midr = ARM_CPUID_PXA261;
152}
153
154static void pxa262_initfn(Object *obj)
155{
156 ARMCPU *cpu = ARM_CPU(obj);
157 cpu->midr = ARM_CPUID_PXA262;
158}
159
160static void pxa270a0_initfn(Object *obj)
161{
162 ARMCPU *cpu = ARM_CPU(obj);
163 cpu->midr = ARM_CPUID_PXA270_A0;
164}
165
166static void pxa270a1_initfn(Object *obj)
167{
168 ARMCPU *cpu = ARM_CPU(obj);
169 cpu->midr = ARM_CPUID_PXA270_A1;
170}
171
172static void pxa270b0_initfn(Object *obj)
173{
174 ARMCPU *cpu = ARM_CPU(obj);
175 cpu->midr = ARM_CPUID_PXA270_B0;
176}
177
178static void pxa270b1_initfn(Object *obj)
179{
180 ARMCPU *cpu = ARM_CPU(obj);
181 cpu->midr = ARM_CPUID_PXA270_B1;
182}
183
184static void pxa270c0_initfn(Object *obj)
185{
186 ARMCPU *cpu = ARM_CPU(obj);
187 cpu->midr = ARM_CPUID_PXA270_C0;
188}
189
190static void pxa270c5_initfn(Object *obj)
191{
192 ARMCPU *cpu = ARM_CPU(obj);
193 cpu->midr = ARM_CPUID_PXA270_C5;
194}
195
196static void arm_any_initfn(Object *obj)
197{
198 ARMCPU *cpu = ARM_CPU(obj);
199 cpu->midr = ARM_CPUID_ANY;
200}
201
202typedef struct ARMCPUInfo {
203 const char *name;
204 void (*initfn)(Object *obj);
205} ARMCPUInfo;
206
207static const ARMCPUInfo arm_cpus[] = {
208 { .name = "arm926", .initfn = arm926_initfn },
209 { .name = "arm946", .initfn = arm946_initfn },
210 { .name = "arm1026", .initfn = arm1026_initfn },
211 /* What QEMU calls "arm1136-r2" is actually the 1136 r0p2, i.e. an
212 * older core than plain "arm1136". In particular this does not
213 * have the v6K features.
214 */
215 { .name = "arm1136-r2", .initfn = arm1136_r2_initfn },
216 { .name = "arm1136", .initfn = arm1136_initfn },
217 { .name = "arm1176", .initfn = arm1176_initfn },
218 { .name = "arm11mpcore", .initfn = arm11mpcore_initfn },
219 { .name = "cortex-m3", .initfn = cortex_m3_initfn },
220 { .name = "cortex-a8", .initfn = cortex_a8_initfn },
221 { .name = "cortex-a9", .initfn = cortex_a9_initfn },
222 { .name = "cortex-a15", .initfn = cortex_a15_initfn },
223 { .name = "ti925t", .initfn = ti925t_initfn },
224 { .name = "sa1100", .initfn = sa1100_initfn },
225 { .name = "sa1110", .initfn = sa1110_initfn },
226 { .name = "pxa250", .initfn = pxa250_initfn },
227 { .name = "pxa255", .initfn = pxa255_initfn },
228 { .name = "pxa260", .initfn = pxa260_initfn },
229 { .name = "pxa261", .initfn = pxa261_initfn },
230 { .name = "pxa262", .initfn = pxa262_initfn },
231 /* "pxa270" is an alias for "pxa270-a0" */
232 { .name = "pxa270", .initfn = pxa270a0_initfn },
233 { .name = "pxa270-a0", .initfn = pxa270a0_initfn },
234 { .name = "pxa270-a1", .initfn = pxa270a1_initfn },
235 { .name = "pxa270-b0", .initfn = pxa270b0_initfn },
236 { .name = "pxa270-b1", .initfn = pxa270b1_initfn },
237 { .name = "pxa270-c0", .initfn = pxa270c0_initfn },
238 { .name = "pxa270-c5", .initfn = pxa270c5_initfn },
239 { .name = "any", .initfn = arm_any_initfn },
240};
241
dec9c2d4
AF
242static void arm_cpu_class_init(ObjectClass *oc, void *data)
243{
244 ARMCPUClass *acc = ARM_CPU_CLASS(oc);
245 CPUClass *cc = CPU_CLASS(acc);
246
247 acc->parent_reset = cc->reset;
248 cc->reset = arm_cpu_reset;
249}
250
777dc784
PM
251static void cpu_register(const ARMCPUInfo *info)
252{
253 TypeInfo type_info = {
254 .name = info->name,
255 .parent = TYPE_ARM_CPU,
256 .instance_size = sizeof(ARMCPU),
257 .instance_init = info->initfn,
258 .class_size = sizeof(ARMCPUClass),
259 };
260
261 type_register_static(&type_info);
262}
263
dec9c2d4
AF
264static const TypeInfo arm_cpu_type_info = {
265 .name = TYPE_ARM_CPU,
266 .parent = TYPE_CPU,
267 .instance_size = sizeof(ARMCPU),
777dc784
PM
268 .instance_init = arm_cpu_initfn,
269 .abstract = true,
dec9c2d4
AF
270 .class_size = sizeof(ARMCPUClass),
271 .class_init = arm_cpu_class_init,
272};
273
274static void arm_cpu_register_types(void)
275{
777dc784
PM
276 int i;
277
dec9c2d4 278 type_register_static(&arm_cpu_type_info);
777dc784
PM
279 for (i = 0; i < ARRAY_SIZE(arm_cpus); i++) {
280 cpu_register(&arm_cpus[i]);
281 }
dec9c2d4
AF
282}
283
284type_init(arm_cpu_register_types)
This page took 0.062156 seconds and 4 git commands to generate.