xref: /qemu/target/arm/tcg/cpu-v7m.c (revision 3072961b6edc99abfbd87caac3de29bb58a52ccf)
1bbf6c6dbSThomas Huth /*
2bbf6c6dbSThomas Huth  * QEMU ARMv7-M TCG-only CPUs.
3bbf6c6dbSThomas Huth  *
4bbf6c6dbSThomas Huth  * Copyright (c) 2012 SUSE LINUX Products GmbH
5bbf6c6dbSThomas Huth  *
6bbf6c6dbSThomas Huth  * This code is licensed under the GNU GPL v2 or later.
7bbf6c6dbSThomas Huth  *
8bbf6c6dbSThomas Huth  * SPDX-License-Identifier: GPL-2.0-or-later
9bbf6c6dbSThomas Huth  */
10bbf6c6dbSThomas Huth 
11bbf6c6dbSThomas Huth #include "qemu/osdep.h"
12bbf6c6dbSThomas Huth #include "cpu.h"
1315017436SPhilippe Mathieu-Daudé #include "accel/tcg/cpu-ops.h"
14bbf6c6dbSThomas Huth #include "internals.h"
15bbf6c6dbSThomas Huth 
16bbf6c6dbSThomas Huth #if !defined(CONFIG_USER_ONLY)
17bbf6c6dbSThomas Huth 
18bbf6c6dbSThomas Huth #include "hw/intc/armv7m_nvic.h"
19bbf6c6dbSThomas Huth 
arm_v7m_cpu_exec_interrupt(CPUState * cs,int interrupt_request)20bbf6c6dbSThomas Huth static bool arm_v7m_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
21bbf6c6dbSThomas Huth {
22bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(cs);
23bbf6c6dbSThomas Huth     CPUARMState *env = &cpu->env;
24bbf6c6dbSThomas Huth     bool ret = false;
25bbf6c6dbSThomas Huth 
26bbf6c6dbSThomas Huth     /*
27bbf6c6dbSThomas Huth      * ARMv7-M interrupt masking works differently than -A or -R.
28bbf6c6dbSThomas Huth      * There is no FIQ/IRQ distinction. Instead of I and F bits
29bbf6c6dbSThomas Huth      * masking FIQ and IRQ interrupts, an exception is taken only
30bbf6c6dbSThomas Huth      * if it is higher priority than the current execution priority
31bbf6c6dbSThomas Huth      * (which depends on state like BASEPRI, FAULTMASK and the
32bbf6c6dbSThomas Huth      * currently active exception).
33bbf6c6dbSThomas Huth      */
34bbf6c6dbSThomas Huth     if (interrupt_request & CPU_INTERRUPT_HARD
35bbf6c6dbSThomas Huth         && (armv7m_nvic_can_take_pending_exception(env->nvic))) {
36bbf6c6dbSThomas Huth         cs->exception_index = EXCP_IRQ;
370ebdf989SPhilippe Mathieu-Daudé         cs->cc->tcg_ops->do_interrupt(cs);
38bbf6c6dbSThomas Huth         ret = true;
39bbf6c6dbSThomas Huth     }
40bbf6c6dbSThomas Huth     return ret;
41bbf6c6dbSThomas Huth }
42bbf6c6dbSThomas Huth 
43bbf6c6dbSThomas Huth #endif /* !CONFIG_USER_ONLY */
44bbf6c6dbSThomas Huth 
cortex_m0_initfn(Object * obj)45bbf6c6dbSThomas Huth static void cortex_m0_initfn(Object *obj)
46bbf6c6dbSThomas Huth {
47bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
48bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V6);
49bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
50bbf6c6dbSThomas Huth 
51bbf6c6dbSThomas Huth     cpu->midr = 0x410cc200;
52bbf6c6dbSThomas Huth 
53bbf6c6dbSThomas Huth     /*
54bbf6c6dbSThomas Huth      * These ID register values are not guest visible, because
55bbf6c6dbSThomas Huth      * we do not implement the Main Extension. They must be set
56bbf6c6dbSThomas Huth      * to values corresponding to the Cortex-M0's implemented
57bbf6c6dbSThomas Huth      * features, because QEMU generally controls its emulation
58bbf6c6dbSThomas Huth      * by looking at ID register fields. We use the same values as
59bbf6c6dbSThomas Huth      * for the M3.
60bbf6c6dbSThomas Huth      */
61bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x00000030;
62bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000200;
63bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x00100000;
64bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
65bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00000030;
66bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
67bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x00000000;
68bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000000;
69bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01141110;
70bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02111000;
71bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x21112231;
72bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111110;
73bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310102;
74bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
75bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
76bbf6c6dbSThomas Huth }
77bbf6c6dbSThomas Huth 
cortex_m3_initfn(Object * obj)78bbf6c6dbSThomas Huth static void cortex_m3_initfn(Object *obj)
79bbf6c6dbSThomas Huth {
80bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
81bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V7);
82bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
83bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
84bbf6c6dbSThomas Huth     cpu->midr = 0x410fc231;
85bbf6c6dbSThomas Huth     cpu->pmsav7_dregion = 8;
86bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x00000030;
87bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000200;
88bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x00100000;
89bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
90bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00000030;
91bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
92bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x00000000;
93bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000000;
94bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01141110;
95bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02111000;
96bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x21112231;
97bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111110;
98bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310102;
99bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
100bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
101bbf6c6dbSThomas Huth }
102bbf6c6dbSThomas Huth 
cortex_m4_initfn(Object * obj)103bbf6c6dbSThomas Huth static void cortex_m4_initfn(Object *obj)
104bbf6c6dbSThomas Huth {
105bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
106bbf6c6dbSThomas Huth 
107bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V7);
108bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
109bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
110bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
111bbf6c6dbSThomas Huth     cpu->midr = 0x410fc240; /* r0p0 */
112bbf6c6dbSThomas Huth     cpu->pmsav7_dregion = 8;
113bbf6c6dbSThomas Huth     cpu->isar.mvfr0 = 0x10110021;
114bbf6c6dbSThomas Huth     cpu->isar.mvfr1 = 0x11000011;
115bbf6c6dbSThomas Huth     cpu->isar.mvfr2 = 0x00000000;
116bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x00000030;
117bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000200;
118bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x00100000;
119bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
120bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00000030;
121bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
122bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x00000000;
123bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000000;
124bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01141110;
125bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02111000;
126bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x21112231;
127bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111110;
128bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310102;
129bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
130bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
131bbf6c6dbSThomas Huth }
132bbf6c6dbSThomas Huth 
cortex_m7_initfn(Object * obj)133bbf6c6dbSThomas Huth static void cortex_m7_initfn(Object *obj)
134bbf6c6dbSThomas Huth {
135bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
136bbf6c6dbSThomas Huth 
137bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V7);
138bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
139bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
140bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
141bbf6c6dbSThomas Huth     cpu->midr = 0x411fc272; /* r1p2 */
142bbf6c6dbSThomas Huth     cpu->pmsav7_dregion = 8;
143bbf6c6dbSThomas Huth     cpu->isar.mvfr0 = 0x10110221;
144bbf6c6dbSThomas Huth     cpu->isar.mvfr1 = 0x12000011;
145bbf6c6dbSThomas Huth     cpu->isar.mvfr2 = 0x00000040;
146bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x00000030;
147bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000200;
148bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x00100000;
149bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
150bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00100030;
151bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
152bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x01000000;
153bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000000;
154bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01101110;
155bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02112000;
156bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x20232231;
157bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111131;
158bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310132;
159bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
160bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
161bbf6c6dbSThomas Huth }
162bbf6c6dbSThomas Huth 
cortex_m33_initfn(Object * obj)163bbf6c6dbSThomas Huth static void cortex_m33_initfn(Object *obj)
164bbf6c6dbSThomas Huth {
165bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
166bbf6c6dbSThomas Huth 
167bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V8);
168bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
169bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
170bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
171bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
172bbf6c6dbSThomas Huth     cpu->midr = 0x410fd213; /* r0p3 */
173bbf6c6dbSThomas Huth     cpu->pmsav7_dregion = 16;
174bbf6c6dbSThomas Huth     cpu->sau_sregion = 8;
175bbf6c6dbSThomas Huth     cpu->isar.mvfr0 = 0x10110021;
176bbf6c6dbSThomas Huth     cpu->isar.mvfr1 = 0x11000011;
177bbf6c6dbSThomas Huth     cpu->isar.mvfr2 = 0x00000040;
178bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x00000030;
179bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000210;
180bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x00200000;
181bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
182bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00101F40;
183bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
184bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x01000000;
185bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000000;
186bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01101110;
187bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02212000;
188bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x20232232;
189bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111131;
190bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310132;
191bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
192bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
193bbf6c6dbSThomas Huth     cpu->clidr = 0x00000000;
194bbf6c6dbSThomas Huth     cpu->ctr = 0x8000c000;
195bbf6c6dbSThomas Huth }
196bbf6c6dbSThomas Huth 
cortex_m55_initfn(Object * obj)197bbf6c6dbSThomas Huth static void cortex_m55_initfn(Object *obj)
198bbf6c6dbSThomas Huth {
199bbf6c6dbSThomas Huth     ARMCPU *cpu = ARM_CPU(obj);
200bbf6c6dbSThomas Huth 
201bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V8);
202bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_V8_1M);
203bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M);
204bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_MAIN);
205bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_M_SECURITY);
206bbf6c6dbSThomas Huth     set_feature(&cpu->env, ARM_FEATURE_THUMB_DSP);
207bbf6c6dbSThomas Huth     cpu->midr = 0x410fd221; /* r0p1 */
208bbf6c6dbSThomas Huth     cpu->revidr = 0;
209bbf6c6dbSThomas Huth     cpu->pmsav7_dregion = 16;
210bbf6c6dbSThomas Huth     cpu->sau_sregion = 8;
211bbf6c6dbSThomas Huth     /* These are the MVFR* values for the FPU + full MVE configuration */
212bbf6c6dbSThomas Huth     cpu->isar.mvfr0 = 0x10110221;
213bbf6c6dbSThomas Huth     cpu->isar.mvfr1 = 0x12100211;
214bbf6c6dbSThomas Huth     cpu->isar.mvfr2 = 0x00000040;
215bbf6c6dbSThomas Huth     cpu->isar.id_pfr0 = 0x20000030;
216bbf6c6dbSThomas Huth     cpu->isar.id_pfr1 = 0x00000230;
217bbf6c6dbSThomas Huth     cpu->isar.id_dfr0 = 0x10200000;
218bbf6c6dbSThomas Huth     cpu->id_afr0 = 0x00000000;
219bbf6c6dbSThomas Huth     cpu->isar.id_mmfr0 = 0x00111040;
220bbf6c6dbSThomas Huth     cpu->isar.id_mmfr1 = 0x00000000;
221bbf6c6dbSThomas Huth     cpu->isar.id_mmfr2 = 0x01000000;
222bbf6c6dbSThomas Huth     cpu->isar.id_mmfr3 = 0x00000011;
223bbf6c6dbSThomas Huth     cpu->isar.id_isar0 = 0x01103110;
224bbf6c6dbSThomas Huth     cpu->isar.id_isar1 = 0x02212000;
225bbf6c6dbSThomas Huth     cpu->isar.id_isar2 = 0x20232232;
226bbf6c6dbSThomas Huth     cpu->isar.id_isar3 = 0x01111131;
227bbf6c6dbSThomas Huth     cpu->isar.id_isar4 = 0x01310132;
228bbf6c6dbSThomas Huth     cpu->isar.id_isar5 = 0x00000000;
229bbf6c6dbSThomas Huth     cpu->isar.id_isar6 = 0x00000000;
230bbf6c6dbSThomas Huth     cpu->clidr = 0x00000000; /* caches not implemented */
231bbf6c6dbSThomas Huth     cpu->ctr = 0x8303c003;
232bbf6c6dbSThomas Huth }
233bbf6c6dbSThomas Huth 
234bbf6c6dbSThomas Huth static const TCGCPUOps arm_v7m_tcg_ops = {
2358201f1a2SPhilippe Mathieu-Daudé     /* ARM processors have a weak memory model */
2368201f1a2SPhilippe Mathieu-Daudé     .guest_default_memory_order = 0,
237a3d40b5eSPhilippe Mathieu-Daudé     .mttcg_supported = true,
23804583ce7SPhilippe Mathieu-Daudé 
239bbf6c6dbSThomas Huth     .initialize = arm_translate_init,
240e4a8e093SRichard Henderson     .translate_code = arm_translate_code,
241c37f8978SRichard Henderson     .get_tb_cpu_state = arm_get_tb_cpu_state,
242bbf6c6dbSThomas Huth     .synchronize_from_tb = arm_cpu_synchronize_from_tb,
243bbf6c6dbSThomas Huth     .debug_excp_handler = arm_debug_excp_handler,
244bbf6c6dbSThomas Huth     .restore_state_to_opc = arm_restore_state_to_opc,
24561dc4d0dSPhilippe Mathieu-Daudé     .mmu_index = arm_cpu_mmu_index,
246bbf6c6dbSThomas Huth 
247bbf6c6dbSThomas Huth #ifdef CONFIG_USER_ONLY
248bbf6c6dbSThomas Huth     .record_sigsegv = arm_cpu_record_sigsegv,
249bbf6c6dbSThomas Huth     .record_sigbus = arm_cpu_record_sigbus,
250bbf6c6dbSThomas Huth #else
2511ba3cb88SRichard Henderson     .tlb_fill_align = arm_cpu_tlb_fill_align,
252*d21144a4SRichard Henderson     .pointer_wrap = cpu_pointer_wrap_uint32,
253bbf6c6dbSThomas Huth     .cpu_exec_interrupt = arm_v7m_cpu_exec_interrupt,
254fcee3707SPeter Maydell     .cpu_exec_halt = arm_cpu_exec_halt,
2559181ab45SRichard Henderson     .cpu_exec_reset = cpu_reset,
256bbf6c6dbSThomas Huth     .do_interrupt = arm_v7m_cpu_do_interrupt,
257bbf6c6dbSThomas Huth     .do_transaction_failed = arm_cpu_do_transaction_failed,
258bbf6c6dbSThomas Huth     .do_unaligned_access = arm_cpu_do_unaligned_access,
259bbf6c6dbSThomas Huth     .adjust_watchpoint_address = arm_adjust_watchpoint_address,
260bbf6c6dbSThomas Huth     .debug_check_watchpoint = arm_debug_check_watchpoint,
261bbf6c6dbSThomas Huth     .debug_check_breakpoint = arm_debug_check_breakpoint,
262bbf6c6dbSThomas Huth #endif /* !CONFIG_USER_ONLY */
263bbf6c6dbSThomas Huth };
264bbf6c6dbSThomas Huth 
arm_v7m_class_init(ObjectClass * oc,const void * data)26512d1a768SPhilippe Mathieu-Daudé static void arm_v7m_class_init(ObjectClass *oc, const void *data)
266bbf6c6dbSThomas Huth {
267bbf6c6dbSThomas Huth     ARMCPUClass *acc = ARM_CPU_CLASS(oc);
268bbf6c6dbSThomas Huth     CPUClass *cc = CPU_CLASS(oc);
269bbf6c6dbSThomas Huth 
270bbf6c6dbSThomas Huth     acc->info = data;
271bbf6c6dbSThomas Huth     cc->tcg_ops = &arm_v7m_tcg_ops;
272bbf6c6dbSThomas Huth }
273bbf6c6dbSThomas Huth 
274bbf6c6dbSThomas Huth static const ARMCPUInfo arm_v7m_cpus[] = {
275bbf6c6dbSThomas Huth     { .name = "cortex-m0",   .initfn = cortex_m0_initfn,
276bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
277bbf6c6dbSThomas Huth     { .name = "cortex-m3",   .initfn = cortex_m3_initfn,
278bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
279bbf6c6dbSThomas Huth     { .name = "cortex-m4",   .initfn = cortex_m4_initfn,
280bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
281bbf6c6dbSThomas Huth     { .name = "cortex-m7",   .initfn = cortex_m7_initfn,
282bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
283bbf6c6dbSThomas Huth     { .name = "cortex-m33",  .initfn = cortex_m33_initfn,
284bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
285bbf6c6dbSThomas Huth     { .name = "cortex-m55",  .initfn = cortex_m55_initfn,
286bbf6c6dbSThomas Huth                              .class_init = arm_v7m_class_init },
287bbf6c6dbSThomas Huth };
288bbf6c6dbSThomas Huth 
arm_v7m_cpu_register_types(void)289bbf6c6dbSThomas Huth static void arm_v7m_cpu_register_types(void)
290bbf6c6dbSThomas Huth {
291bbf6c6dbSThomas Huth     size_t i;
292bbf6c6dbSThomas Huth 
293bbf6c6dbSThomas Huth     for (i = 0; i < ARRAY_SIZE(arm_v7m_cpus); ++i) {
294bbf6c6dbSThomas Huth         arm_cpu_register(&arm_v7m_cpus[i]);
295bbf6c6dbSThomas Huth     }
296bbf6c6dbSThomas Huth }
297bbf6c6dbSThomas Huth 
298bbf6c6dbSThomas Huth type_init(arm_v7m_cpu_register_types)
299