139920a04SFabiano Rosas /*
239920a04SFabiano Rosas * QEMU AArch64 TCG CPUs
339920a04SFabiano Rosas *
439920a04SFabiano Rosas * Copyright (c) 2013 Linaro Ltd
539920a04SFabiano Rosas *
639920a04SFabiano Rosas * This program is free software; you can redistribute it and/or
739920a04SFabiano Rosas * modify it under the terms of the GNU General Public License
839920a04SFabiano Rosas * as published by the Free Software Foundation; either version 2
939920a04SFabiano Rosas * of the License, or (at your option) any later version.
1039920a04SFabiano Rosas *
1139920a04SFabiano Rosas * This program is distributed in the hope that it will be useful,
1239920a04SFabiano Rosas * but WITHOUT ANY WARRANTY; without even the implied warranty of
1339920a04SFabiano Rosas * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
1439920a04SFabiano Rosas * GNU General Public License for more details.
1539920a04SFabiano Rosas *
1639920a04SFabiano Rosas * You should have received a copy of the GNU General Public License
1739920a04SFabiano Rosas * along with this program; if not, see
1839920a04SFabiano Rosas * <http://www.gnu.org/licenses/gpl-2.0.html>
1939920a04SFabiano Rosas */
2039920a04SFabiano Rosas
2139920a04SFabiano Rosas #include "qemu/osdep.h"
2239920a04SFabiano Rosas #include "qapi/error.h"
2339920a04SFabiano Rosas #include "cpu.h"
2439920a04SFabiano Rosas #include "qemu/module.h"
2539920a04SFabiano Rosas #include "qapi/visitor.h"
2639920a04SFabiano Rosas #include "hw/qdev-properties.h"
27d8100822SRichard Henderson #include "qemu/units.h"
2839920a04SFabiano Rosas #include "internals.h"
295a534314SPeter Maydell #include "cpu-features.h"
3039920a04SFabiano Rosas #include "cpregs.h"
3139920a04SFabiano Rosas
aarch64_a35_initfn(Object * obj)3239920a04SFabiano Rosas static void aarch64_a35_initfn(Object *obj)
3339920a04SFabiano Rosas {
3439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
3539920a04SFabiano Rosas
3639920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a35";
3739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
3839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
3939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
40f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
4139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
4239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
4339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
4439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
4539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
4639920a04SFabiano Rosas
4739920a04SFabiano Rosas /* From B2.2 AArch64 identification registers. */
4839920a04SFabiano Rosas cpu->midr = 0x411fd040;
4939920a04SFabiano Rosas cpu->revidr = 0;
5039920a04SFabiano Rosas cpu->ctr = 0x84448004;
5139920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131;
5239920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011;
5339920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066;
5439920a04SFabiano Rosas cpu->id_afr0 = 0;
5539920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105;
5639920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000;
5739920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000;
5839920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211;
5939920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110;
6039920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111;
6139920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042;
6239920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131;
6339920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142;
6439920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121;
6539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222;
6639920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0;
6739920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106;
6839920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0;
6939920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120;
7039920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0;
7139920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00101122;
7239920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0;
7339920a04SFabiano Rosas cpu->clidr = 0x0a200023;
7439920a04SFabiano Rosas cpu->dcz_blocksize = 4;
7539920a04SFabiano Rosas
7639920a04SFabiano Rosas /* From B2.4 AArch64 Virtual Memory control registers */
7739920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838;
7839920a04SFabiano Rosas
7939920a04SFabiano Rosas /* From B2.10 AArch64 performance monitor registers */
8039920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410a3000;
8139920a04SFabiano Rosas
8239920a04SFabiano Rosas /* From B2.29 Cache ID registers */
83676624d7SAlireza Sanaee /* 32KB L1 dcache */
84676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
85676624d7SAlireza Sanaee /* 32KB L1 icache */
86676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 2);
87676624d7SAlireza Sanaee /* 512KB L2 cache */
88676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 512 * KiB, 7);
8939920a04SFabiano Rosas
9039920a04SFabiano Rosas /* From B3.5 VGIC Type register */
9139920a04SFabiano Rosas cpu->gic_num_lrs = 4;
9239920a04SFabiano Rosas cpu->gic_vpribits = 5;
9339920a04SFabiano Rosas cpu->gic_vprebits = 5;
9439920a04SFabiano Rosas cpu->gic_pribits = 5;
9539920a04SFabiano Rosas
9639920a04SFabiano Rosas /* From C6.4 Debug ID Register */
9739920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000;
9839920a04SFabiano Rosas /* From C6.5 Debug Device ID Register */
9939920a04SFabiano Rosas cpu->isar.dbgdevid = 0x00110f13;
10039920a04SFabiano Rosas /* From C6.6 Debug Device ID Register 1 */
10139920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2;
10239920a04SFabiano Rosas
10339920a04SFabiano Rosas /* From Cortex-A35 SIMD and Floating-point Support r1p0 */
10439920a04SFabiano Rosas /* From 3.2 AArch32 register summary */
10539920a04SFabiano Rosas cpu->reset_fpsid = 0x41034043;
10639920a04SFabiano Rosas
10739920a04SFabiano Rosas /* From 2.2 AArch64 register summary */
10839920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222;
10939920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111;
11039920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043;
11139920a04SFabiano Rosas
11239920a04SFabiano Rosas /* These values are the same with A53/A57/A72. */
11339920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu);
11439920a04SFabiano Rosas }
11539920a04SFabiano Rosas
cpu_max_get_sve_max_vq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)11639920a04SFabiano Rosas static void cpu_max_get_sve_max_vq(Object *obj, Visitor *v, const char *name,
11739920a04SFabiano Rosas void *opaque, Error **errp)
11839920a04SFabiano Rosas {
11939920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
12039920a04SFabiano Rosas uint32_t value;
12139920a04SFabiano Rosas
12239920a04SFabiano Rosas /* All vector lengths are disabled when SVE is off. */
12339920a04SFabiano Rosas if (!cpu_isar_feature(aa64_sve, cpu)) {
12439920a04SFabiano Rosas value = 0;
12539920a04SFabiano Rosas } else {
12639920a04SFabiano Rosas value = cpu->sve_max_vq;
12739920a04SFabiano Rosas }
12839920a04SFabiano Rosas visit_type_uint32(v, name, &value, errp);
12939920a04SFabiano Rosas }
13039920a04SFabiano Rosas
cpu_max_set_sve_max_vq(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)13139920a04SFabiano Rosas static void cpu_max_set_sve_max_vq(Object *obj, Visitor *v, const char *name,
13239920a04SFabiano Rosas void *opaque, Error **errp)
13339920a04SFabiano Rosas {
13439920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
13539920a04SFabiano Rosas uint32_t max_vq;
13639920a04SFabiano Rosas
13739920a04SFabiano Rosas if (!visit_type_uint32(v, name, &max_vq, errp)) {
13839920a04SFabiano Rosas return;
13939920a04SFabiano Rosas }
14039920a04SFabiano Rosas
14139920a04SFabiano Rosas if (max_vq == 0 || max_vq > ARM_MAX_VQ) {
14239920a04SFabiano Rosas error_setg(errp, "unsupported SVE vector length");
14339920a04SFabiano Rosas error_append_hint(errp, "Valid sve-max-vq in range [1-%d]\n",
14439920a04SFabiano Rosas ARM_MAX_VQ);
14539920a04SFabiano Rosas return;
14639920a04SFabiano Rosas }
14739920a04SFabiano Rosas
14839920a04SFabiano Rosas cpu->sve_max_vq = max_vq;
14939920a04SFabiano Rosas }
15039920a04SFabiano Rosas
cpu_arm_get_rme(Object * obj,Error ** errp)151a834d547SRichard Henderson static bool cpu_arm_get_rme(Object *obj, Error **errp)
152a834d547SRichard Henderson {
153a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj);
154a834d547SRichard Henderson return cpu_isar_feature(aa64_rme, cpu);
155a834d547SRichard Henderson }
156a834d547SRichard Henderson
cpu_arm_set_rme(Object * obj,bool value,Error ** errp)157a834d547SRichard Henderson static void cpu_arm_set_rme(Object *obj, bool value, Error **errp)
158a834d547SRichard Henderson {
159a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj);
160a834d547SRichard Henderson uint64_t t;
161a834d547SRichard Henderson
162a834d547SRichard Henderson t = cpu->isar.id_aa64pfr0;
163a834d547SRichard Henderson t = FIELD_DP64(t, ID_AA64PFR0, RME, value);
164a834d547SRichard Henderson cpu->isar.id_aa64pfr0 = t;
165a834d547SRichard Henderson }
166a834d547SRichard Henderson
cpu_max_set_l0gptsz(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)167a834d547SRichard Henderson static void cpu_max_set_l0gptsz(Object *obj, Visitor *v, const char *name,
168a834d547SRichard Henderson void *opaque, Error **errp)
169a834d547SRichard Henderson {
170a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj);
171a834d547SRichard Henderson uint32_t value;
172a834d547SRichard Henderson
173a834d547SRichard Henderson if (!visit_type_uint32(v, name, &value, errp)) {
174a834d547SRichard Henderson return;
175a834d547SRichard Henderson }
176a834d547SRichard Henderson
177a834d547SRichard Henderson /* Encode the value for the GPCCR_EL3 field. */
178a834d547SRichard Henderson switch (value) {
179a834d547SRichard Henderson case 30:
180a834d547SRichard Henderson case 34:
181a834d547SRichard Henderson case 36:
182a834d547SRichard Henderson case 39:
183a834d547SRichard Henderson cpu->reset_l0gptsz = value - 30;
184a834d547SRichard Henderson break;
185a834d547SRichard Henderson default:
186a834d547SRichard Henderson error_setg(errp, "invalid value for l0gptsz");
187a834d547SRichard Henderson error_append_hint(errp, "valid values are 30, 34, 36, 39\n");
188a834d547SRichard Henderson break;
189a834d547SRichard Henderson }
190a834d547SRichard Henderson }
191a834d547SRichard Henderson
cpu_max_get_l0gptsz(Object * obj,Visitor * v,const char * name,void * opaque,Error ** errp)192a834d547SRichard Henderson static void cpu_max_get_l0gptsz(Object *obj, Visitor *v, const char *name,
193a834d547SRichard Henderson void *opaque, Error **errp)
194a834d547SRichard Henderson {
195a834d547SRichard Henderson ARMCPU *cpu = ARM_CPU(obj);
196a834d547SRichard Henderson uint32_t value = cpu->reset_l0gptsz + 30;
197a834d547SRichard Henderson
198a834d547SRichard Henderson visit_type_uint32(v, name, &value, errp);
199a834d547SRichard Henderson }
200a834d547SRichard Henderson
201eeed7aedSRichard Henderson static const Property arm_cpu_lpa2_property =
20239920a04SFabiano Rosas DEFINE_PROP_BOOL("lpa2", ARMCPU, prop_lpa2, true);
20339920a04SFabiano Rosas
aarch64_a55_initfn(Object * obj)20439920a04SFabiano Rosas static void aarch64_a55_initfn(Object *obj)
20539920a04SFabiano Rosas {
20639920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
20739920a04SFabiano Rosas
20839920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a55";
20939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
21039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
21139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
212f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
21339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
21439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
21539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
21639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
21739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
21839920a04SFabiano Rosas
21939920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */
22039920a04SFabiano Rosas cpu->clidr = 0x82000023;
22139920a04SFabiano Rosas cpu->ctr = 0x84448004; /* L1Ip = VIPT */
22239920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */
22339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull;
22439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
22539920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
22639920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
22739920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
22839920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
22939920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000010112222ull;
23039920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull;
23139920a04SFabiano Rosas cpu->id_afr0 = 0x00000000;
23239920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088;
23339920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110;
23439920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111;
23539920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042;
23639920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131;
23739920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142;
23839920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121;
23939920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010;
24039920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105;
24139920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000;
24239920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000;
24339920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211;
24439920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110;
24539920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131;
24639920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011;
24739920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011;
24839920a04SFabiano Rosas cpu->midr = 0x412FD050; /* r2p0 */
24939920a04SFabiano Rosas cpu->revidr = 0;
25039920a04SFabiano Rosas
25139920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */
252676624d7SAlireza Sanaee /* 32KB L1 dcache */
253676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
254676624d7SAlireza Sanaee /* 32KB L1 icache */
255676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 2);
256676624d7SAlireza Sanaee /* 512KB L2 cache */
257676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 512 * KiB, 7);
25839920a04SFabiano Rosas
25939920a04SFabiano Rosas /* From B2.96 SCTLR_EL3 */
26039920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838;
26139920a04SFabiano Rosas
26239920a04SFabiano Rosas /* From B4.45 ICH_VTR_EL2 */
26339920a04SFabiano Rosas cpu->gic_num_lrs = 4;
26439920a04SFabiano Rosas cpu->gic_vpribits = 5;
26539920a04SFabiano Rosas cpu->gic_vprebits = 5;
26639920a04SFabiano Rosas cpu->gic_pribits = 5;
26739920a04SFabiano Rosas
26839920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222;
26939920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111;
27039920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043;
27139920a04SFabiano Rosas
27239920a04SFabiano Rosas /* From D5.4 AArch64 PMU register summary */
27339920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000;
27439920a04SFabiano Rosas }
27539920a04SFabiano Rosas
aarch64_a72_initfn(Object * obj)27639920a04SFabiano Rosas static void aarch64_a72_initfn(Object *obj)
27739920a04SFabiano Rosas {
27839920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
27939920a04SFabiano Rosas
28039920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a72";
28139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
28239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
28339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
284f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
28539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
28639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
28739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
28839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
28939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
29039920a04SFabiano Rosas cpu->midr = 0x410fd083;
29139920a04SFabiano Rosas cpu->revidr = 0x00000000;
29239920a04SFabiano Rosas cpu->reset_fpsid = 0x41034080;
29339920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222;
29439920a04SFabiano Rosas cpu->isar.mvfr1 = 0x12111111;
29539920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043;
29639920a04SFabiano Rosas cpu->ctr = 0x8444c004;
29739920a04SFabiano Rosas cpu->reset_sctlr = 0x00c50838;
29839920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x00000131;
29939920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00011011;
30039920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x03010066;
30139920a04SFabiano Rosas cpu->id_afr0 = 0x00000000;
30239920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105;
30339920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000;
30439920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000;
30539920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02102211;
30639920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110;
30739920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111;
30839920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042;
30939920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131;
31039920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00011142;
31139920a04SFabiano Rosas cpu->isar.id_isar5 = 0x00011121;
31239920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x00002222;
31339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x10305106;
31439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x00011120;
31539920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x00001124;
31639920a04SFabiano Rosas cpu->isar.dbgdidr = 0x3516d000;
31739920a04SFabiano Rosas cpu->isar.dbgdevid = 0x01110f13;
31839920a04SFabiano Rosas cpu->isar.dbgdevid1 = 0x2;
31939920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x41023000;
32039920a04SFabiano Rosas cpu->clidr = 0x0a200023;
321676624d7SAlireza Sanaee /* 32KB L1 dcache */
322676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
323676624d7SAlireza Sanaee /* 48KB L1 dcache */
324676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 3, 64, 48 * KiB, 2);
325676624d7SAlireza Sanaee /* 1MB L2 cache */
326676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 64, 1 * MiB, 7);
32739920a04SFabiano Rosas cpu->dcz_blocksize = 4; /* 64 bytes */
32839920a04SFabiano Rosas cpu->gic_num_lrs = 4;
32939920a04SFabiano Rosas cpu->gic_vpribits = 5;
33039920a04SFabiano Rosas cpu->gic_vprebits = 5;
33139920a04SFabiano Rosas cpu->gic_pribits = 5;
33239920a04SFabiano Rosas define_cortex_a72_a57_a53_cp_reginfo(cpu);
33339920a04SFabiano Rosas }
33439920a04SFabiano Rosas
aarch64_a76_initfn(Object * obj)33539920a04SFabiano Rosas static void aarch64_a76_initfn(Object *obj)
33639920a04SFabiano Rosas {
33739920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
33839920a04SFabiano Rosas
33939920a04SFabiano Rosas cpu->dtb_compatible = "arm,cortex-a76";
34039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
34139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
34239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
343f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
34439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
34539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
34639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
34739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
34839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
34939920a04SFabiano Rosas
35039920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */
35139920a04SFabiano Rosas cpu->clidr = 0x82000023;
35239920a04SFabiano Rosas cpu->ctr = 0x8444C004;
35339920a04SFabiano Rosas cpu->dcz_blocksize = 4;
35439920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408ull;
35539920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
35639920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
35739920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101122ull;
35839920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
35939920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
36039920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */
36139920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000010ull;
36239920a04SFabiano Rosas cpu->id_afr0 = 0x00000000;
36339920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088;
36439920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110;
36539920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111;
36639920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042;
36739920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131;
36839920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142;
36939920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121;
37039920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010;
37139920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105;
37239920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000;
37339920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000;
37439920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211;
37539920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110;
37639920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131;
37739920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */
37839920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011;
37939920a04SFabiano Rosas cpu->midr = 0x414fd0b1; /* r4p1 */
38039920a04SFabiano Rosas cpu->revidr = 0;
38139920a04SFabiano Rosas
38239920a04SFabiano Rosas /* From B2.18 CCSIDR_EL1 */
383676624d7SAlireza Sanaee /* 64KB L1 dcache */
384676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 7);
385676624d7SAlireza Sanaee /* 64KB L1 icache */
386676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 2);
387676624d7SAlireza Sanaee /* 512KB L2 cache */
388676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 512 * KiB, 7);
38939920a04SFabiano Rosas
39039920a04SFabiano Rosas /* From B2.93 SCTLR_EL3 */
39139920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838;
39239920a04SFabiano Rosas
39339920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */
39439920a04SFabiano Rosas cpu->gic_num_lrs = 4;
39539920a04SFabiano Rosas cpu->gic_vpribits = 5;
39639920a04SFabiano Rosas cpu->gic_vprebits = 5;
39739920a04SFabiano Rosas cpu->gic_pribits = 5;
39839920a04SFabiano Rosas
39939920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */
40039920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222;
40139920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111;
40239920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043;
40339920a04SFabiano Rosas
40439920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */
40539920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410b3000;
40639920a04SFabiano Rosas }
40739920a04SFabiano Rosas
aarch64_a64fx_initfn(Object * obj)40839920a04SFabiano Rosas static void aarch64_a64fx_initfn(Object *obj)
40939920a04SFabiano Rosas {
41039920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
41139920a04SFabiano Rosas
41239920a04SFabiano Rosas cpu->dtb_compatible = "arm,a64fx";
41339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
41439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
41539920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
416f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
41739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
41839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
41939920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
42039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
42139920a04SFabiano Rosas cpu->midr = 0x461f0010;
42239920a04SFabiano Rosas cpu->revidr = 0x00000000;
42339920a04SFabiano Rosas cpu->ctr = 0x86668006;
42439920a04SFabiano Rosas cpu->reset_sctlr = 0x30000180;
42539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x0000000101111111; /* No RAS Extensions */
42639920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000000;
42739920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000010305408;
42839920a04SFabiano Rosas cpu->isar.id_aa64dfr1 = 0x0000000000000000;
42939920a04SFabiano Rosas cpu->id_aa64afr0 = 0x0000000000000000;
43039920a04SFabiano Rosas cpu->id_aa64afr1 = 0x0000000000000000;
43139920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000001122;
43239920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000011212100;
43339920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011;
43439920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000000010211120;
43539920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000010001;
43639920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = 0x0000000000000000;
43739920a04SFabiano Rosas cpu->clidr = 0x0000000080000023;
438676624d7SAlireza Sanaee /* 64KB L1 dcache */
439676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 7);
440676624d7SAlireza Sanaee /* 64KB L1 icache */
441676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 2);
442676624d7SAlireza Sanaee /* 8MB L2 cache */
443676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 16, 256, 8 * MiB, 7);
44439920a04SFabiano Rosas cpu->dcz_blocksize = 6; /* 256 bytes */
44539920a04SFabiano Rosas cpu->gic_num_lrs = 4;
44639920a04SFabiano Rosas cpu->gic_vpribits = 5;
44739920a04SFabiano Rosas cpu->gic_vprebits = 5;
44839920a04SFabiano Rosas cpu->gic_pribits = 5;
44939920a04SFabiano Rosas
45039920a04SFabiano Rosas /* The A64FX supports only 128, 256 and 512 bit vector lengths */
45139920a04SFabiano Rosas aarch64_add_sve_properties(obj);
45239920a04SFabiano Rosas cpu->sve_vq.supported = (1 << 0) /* 128bit */
45339920a04SFabiano Rosas | (1 << 1) /* 256bit */
45439920a04SFabiano Rosas | (1 << 3); /* 512bit */
45539920a04SFabiano Rosas
45639920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x46014040;
45739920a04SFabiano Rosas
45839920a04SFabiano Rosas /* TODO: Add A64FX specific HPC extension registers */
45939920a04SFabiano Rosas }
46039920a04SFabiano Rosas
access_actlr_w(CPUARMState * env,const ARMCPRegInfo * r,bool read)4616d482423SRichard Henderson static CPAccessResult access_actlr_w(CPUARMState *env, const ARMCPRegInfo *r,
4626d482423SRichard Henderson bool read)
4636d482423SRichard Henderson {
4646d482423SRichard Henderson if (!read) {
4656d482423SRichard Henderson int el = arm_current_el(env);
4666d482423SRichard Henderson
4676d482423SRichard Henderson /* Because ACTLR_EL2 is constant 0, writes below EL2 trap to EL2. */
4686d482423SRichard Henderson if (el < 2 && arm_is_el2_enabled(env)) {
4696d482423SRichard Henderson return CP_ACCESS_TRAP_EL2;
4706d482423SRichard Henderson }
4716d482423SRichard Henderson /* Because ACTLR_EL3 is constant 0, writes below EL3 trap to EL3. */
4726d482423SRichard Henderson if (el < 3 && arm_feature(env, ARM_FEATURE_EL3)) {
4736d482423SRichard Henderson return CP_ACCESS_TRAP_EL3;
4746d482423SRichard Henderson }
4756d482423SRichard Henderson }
4766d482423SRichard Henderson return CP_ACCESS_OK;
4776d482423SRichard Henderson }
4786d482423SRichard Henderson
47939920a04SFabiano Rosas static const ARMCPRegInfo neoverse_n1_cp_reginfo[] = {
48039920a04SFabiano Rosas { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64,
48139920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0,
4826d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
4836d482423SRichard Henderson /* Traps and enables are the same as for TCR_EL1. */
4846d482423SRichard Henderson .accessfn = access_tvm_trvm, .fgt = FGT_TCR_EL1, },
48539920a04SFabiano Rosas { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64,
48639920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0,
48739920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
48839920a04SFabiano Rosas { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64,
48939920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0,
49039920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
49139920a04SFabiano Rosas { .name = "ATCR_EL12", .state = ARM_CP_STATE_AA64,
49239920a04SFabiano Rosas .opc0 = 3, .opc1 = 5, .crn = 15, .crm = 7, .opc2 = 0,
49339920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
49439920a04SFabiano Rosas { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64,
49539920a04SFabiano Rosas .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1,
49639920a04SFabiano Rosas .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
49739920a04SFabiano Rosas { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
49839920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0,
4996d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5006d482423SRichard Henderson .accessfn = access_actlr_w },
50139920a04SFabiano Rosas { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64,
50239920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1,
5036d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5046d482423SRichard Henderson .accessfn = access_actlr_w },
50539920a04SFabiano Rosas { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64,
50639920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2,
5076d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5086d482423SRichard Henderson .accessfn = access_actlr_w },
50939920a04SFabiano Rosas /*
51039920a04SFabiano Rosas * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU
51139920a04SFabiano Rosas * (and in particular its system registers).
51239920a04SFabiano Rosas */
51339920a04SFabiano Rosas { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64,
51439920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0,
51539920a04SFabiano Rosas .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 },
51639920a04SFabiano Rosas { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
51739920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4,
5186d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0x961563010,
5196d482423SRichard Henderson .accessfn = access_actlr_w },
52039920a04SFabiano Rosas { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64,
52139920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1,
52239920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
52339920a04SFabiano Rosas { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64,
52439920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3,
52539920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
52639920a04SFabiano Rosas { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64,
52739920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2,
52839920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
52939920a04SFabiano Rosas { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64,
53039920a04SFabiano Rosas .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0,
53139920a04SFabiano Rosas .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
53239920a04SFabiano Rosas { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64,
53339920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7,
5346d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5356d482423SRichard Henderson .accessfn = access_actlr_w },
53639920a04SFabiano Rosas { .name = "ERXPFGCDN_EL1", .state = ARM_CP_STATE_AA64,
53739920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 2,
5386d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5396d482423SRichard Henderson .accessfn = access_actlr_w },
54039920a04SFabiano Rosas { .name = "ERXPFGCTL_EL1", .state = ARM_CP_STATE_AA64,
54139920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 1,
5426d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5436d482423SRichard Henderson .accessfn = access_actlr_w },
54439920a04SFabiano Rosas { .name = "ERXPFGF_EL1", .state = ARM_CP_STATE_AA64,
54539920a04SFabiano Rosas .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 0,
5466d482423SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
5476d482423SRichard Henderson .accessfn = access_actlr_w },
54839920a04SFabiano Rosas };
54939920a04SFabiano Rosas
define_neoverse_n1_cp_reginfo(ARMCPU * cpu)55039920a04SFabiano Rosas static void define_neoverse_n1_cp_reginfo(ARMCPU *cpu)
55139920a04SFabiano Rosas {
55239920a04SFabiano Rosas define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo);
55339920a04SFabiano Rosas }
55439920a04SFabiano Rosas
555c74138c6SPeter Maydell static const ARMCPRegInfo neoverse_v1_cp_reginfo[] = {
556c74138c6SPeter Maydell { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64,
557c74138c6SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5,
55887da10b4SRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
55987da10b4SRichard Henderson .accessfn = access_actlr_w },
560c74138c6SPeter Maydell { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64,
561c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0,
562c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
563c74138c6SPeter Maydell { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64,
564c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1,
565c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
566c74138c6SPeter Maydell { .name = "CPUPPMCR3_EL3", .state = ARM_CP_STATE_AA64,
567c74138c6SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6,
568c74138c6SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
569c74138c6SPeter Maydell };
570c74138c6SPeter Maydell
define_neoverse_v1_cp_reginfo(ARMCPU * cpu)571c74138c6SPeter Maydell static void define_neoverse_v1_cp_reginfo(ARMCPU *cpu)
572c74138c6SPeter Maydell {
573c74138c6SPeter Maydell /*
574c74138c6SPeter Maydell * The Neoverse V1 has all of the Neoverse N1's IMPDEF
575c74138c6SPeter Maydell * registers and a few more of its own.
576c74138c6SPeter Maydell */
577c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_n1_cp_reginfo);
578c74138c6SPeter Maydell define_arm_cp_regs(cpu, neoverse_v1_cp_reginfo);
579c74138c6SPeter Maydell }
580c74138c6SPeter Maydell
aarch64_neoverse_n1_initfn(Object * obj)58139920a04SFabiano Rosas static void aarch64_neoverse_n1_initfn(Object *obj)
58239920a04SFabiano Rosas {
58339920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
58439920a04SFabiano Rosas
58539920a04SFabiano Rosas cpu->dtb_compatible = "arm,neoverse-n1";
58639920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_V8);
58739920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_NEON);
58839920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
589f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
59039920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_AARCH64);
59139920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
59239920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL2);
59339920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_EL3);
59439920a04SFabiano Rosas set_feature(&cpu->env, ARM_FEATURE_PMU);
59539920a04SFabiano Rosas
59639920a04SFabiano Rosas /* Ordered by B2.4 AArch64 registers by functional group */
59739920a04SFabiano Rosas cpu->clidr = 0x82000023;
59839920a04SFabiano Rosas cpu->ctr = 0x8444c004;
59939920a04SFabiano Rosas cpu->dcz_blocksize = 4;
60039920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = 0x0000000110305408ull;
60139920a04SFabiano Rosas cpu->isar.id_aa64isar0 = 0x0000100010211120ull;
60239920a04SFabiano Rosas cpu->isar.id_aa64isar1 = 0x0000000000100001ull;
60339920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
60439920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
60539920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = 0x0000000000001011ull;
60639920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = 0x1100000010111112ull; /* GIC filled in later */
60739920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = 0x0000000000000020ull;
60839920a04SFabiano Rosas cpu->id_afr0 = 0x00000000;
60939920a04SFabiano Rosas cpu->isar.id_dfr0 = 0x04010088;
61039920a04SFabiano Rosas cpu->isar.id_isar0 = 0x02101110;
61139920a04SFabiano Rosas cpu->isar.id_isar1 = 0x13112111;
61239920a04SFabiano Rosas cpu->isar.id_isar2 = 0x21232042;
61339920a04SFabiano Rosas cpu->isar.id_isar3 = 0x01112131;
61439920a04SFabiano Rosas cpu->isar.id_isar4 = 0x00010142;
61539920a04SFabiano Rosas cpu->isar.id_isar5 = 0x01011121;
61639920a04SFabiano Rosas cpu->isar.id_isar6 = 0x00000010;
61739920a04SFabiano Rosas cpu->isar.id_mmfr0 = 0x10201105;
61839920a04SFabiano Rosas cpu->isar.id_mmfr1 = 0x40000000;
61939920a04SFabiano Rosas cpu->isar.id_mmfr2 = 0x01260000;
62039920a04SFabiano Rosas cpu->isar.id_mmfr3 = 0x02122211;
62139920a04SFabiano Rosas cpu->isar.id_mmfr4 = 0x00021110;
62239920a04SFabiano Rosas cpu->isar.id_pfr0 = 0x10010131;
62339920a04SFabiano Rosas cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */
62439920a04SFabiano Rosas cpu->isar.id_pfr2 = 0x00000011;
62539920a04SFabiano Rosas cpu->midr = 0x414fd0c1; /* r4p1 */
62639920a04SFabiano Rosas cpu->revidr = 0;
62739920a04SFabiano Rosas
62839920a04SFabiano Rosas /* From B2.23 CCSIDR_EL1 */
629676624d7SAlireza Sanaee /* 64KB L1 dcache */
630676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 7);
631676624d7SAlireza Sanaee /* 64KB L1 icache */
632676624d7SAlireza Sanaee cpu->ccsidr[1] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 64 * KiB, 2);
633676624d7SAlireza Sanaee /* 1MB L2 dcache */
634676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 8, 64, 1 * MiB, 7);
63539920a04SFabiano Rosas
63639920a04SFabiano Rosas /* From B2.98 SCTLR_EL3 */
63739920a04SFabiano Rosas cpu->reset_sctlr = 0x30c50838;
63839920a04SFabiano Rosas
63939920a04SFabiano Rosas /* From B4.23 ICH_VTR_EL2 */
64039920a04SFabiano Rosas cpu->gic_num_lrs = 4;
64139920a04SFabiano Rosas cpu->gic_vpribits = 5;
64239920a04SFabiano Rosas cpu->gic_vprebits = 5;
64339920a04SFabiano Rosas cpu->gic_pribits = 5;
64439920a04SFabiano Rosas
64539920a04SFabiano Rosas /* From B5.1 AdvSIMD AArch64 register summary */
64639920a04SFabiano Rosas cpu->isar.mvfr0 = 0x10110222;
64739920a04SFabiano Rosas cpu->isar.mvfr1 = 0x13211111;
64839920a04SFabiano Rosas cpu->isar.mvfr2 = 0x00000043;
64939920a04SFabiano Rosas
65039920a04SFabiano Rosas /* From D5.1 AArch64 PMU register summary */
65139920a04SFabiano Rosas cpu->isar.reset_pmcr_el0 = 0x410c3000;
65239920a04SFabiano Rosas
65339920a04SFabiano Rosas define_neoverse_n1_cp_reginfo(cpu);
65439920a04SFabiano Rosas }
65539920a04SFabiano Rosas
aarch64_neoverse_v1_initfn(Object * obj)656c74138c6SPeter Maydell static void aarch64_neoverse_v1_initfn(Object *obj)
657c74138c6SPeter Maydell {
658c74138c6SPeter Maydell ARMCPU *cpu = ARM_CPU(obj);
659c74138c6SPeter Maydell
660c74138c6SPeter Maydell cpu->dtb_compatible = "arm,neoverse-v1";
661c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8);
662c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON);
663c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
664f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
665c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64);
666c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
667c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2);
668c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3);
669c74138c6SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU);
670c74138c6SPeter Maydell
671c74138c6SPeter Maydell /* Ordered by 3.2.4 AArch64 registers by functional group */
672c74138c6SPeter Maydell cpu->clidr = 0x82000023;
673c74138c6SPeter Maydell cpu->ctr = 0xb444c004; /* With DIC and IDC set */
674c74138c6SPeter Maydell cpu->dcz_blocksize = 4;
675c74138c6SPeter Maydell cpu->id_aa64afr0 = 0x00000000;
676c74138c6SPeter Maydell cpu->id_aa64afr1 = 0x00000000;
677c74138c6SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000001f210305519ull;
678c74138c6SPeter Maydell cpu->isar.id_aa64dfr1 = 0x00000000;
679c74138c6SPeter Maydell cpu->isar.id_aa64isar0 = 0x1011111110212120ull; /* with FEAT_RNG */
6808676007eSPeter Maydell cpu->isar.id_aa64isar1 = 0x0011100001211032ull;
681c74138c6SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000000000101125ull;
682c74138c6SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
683c74138c6SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x0220011102101011ull;
684c74138c6SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1101110120111112ull; /* GIC filled in later */
685c74138c6SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000020ull;
686c74138c6SPeter Maydell cpu->id_afr0 = 0x00000000;
687c74138c6SPeter Maydell cpu->isar.id_dfr0 = 0x15011099;
688c74138c6SPeter Maydell cpu->isar.id_isar0 = 0x02101110;
689c74138c6SPeter Maydell cpu->isar.id_isar1 = 0x13112111;
690c74138c6SPeter Maydell cpu->isar.id_isar2 = 0x21232042;
691c74138c6SPeter Maydell cpu->isar.id_isar3 = 0x01112131;
692c74138c6SPeter Maydell cpu->isar.id_isar4 = 0x00010142;
693c74138c6SPeter Maydell cpu->isar.id_isar5 = 0x11011121;
694c74138c6SPeter Maydell cpu->isar.id_isar6 = 0x01100111;
695c74138c6SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105;
696c74138c6SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000;
697c74138c6SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000;
698c74138c6SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211;
699c74138c6SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110;
700c74138c6SPeter Maydell cpu->isar.id_pfr0 = 0x21110131;
701c74138c6SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */
702c74138c6SPeter Maydell cpu->isar.id_pfr2 = 0x00000011;
703c74138c6SPeter Maydell cpu->midr = 0x411FD402; /* r1p2 */
704c74138c6SPeter Maydell cpu->revidr = 0;
705c74138c6SPeter Maydell
706c74138c6SPeter Maydell /*
707c74138c6SPeter Maydell * The Neoverse-V1 r1p2 TRM lists 32-bit format CCSIDR_EL1 values,
708c74138c6SPeter Maydell * but also says it implements CCIDX, which means they should be
709c74138c6SPeter Maydell * 64-bit format. So we here use values which are based on the textual
710d8100822SRichard Henderson * information in chapter 2 of the TRM:
711c74138c6SPeter Maydell *
712d8100822SRichard Henderson * L1: 4-way set associative 64-byte line size, total size 64K.
713c74138c6SPeter Maydell * L2: 8-way set associative, 64 byte line size, either 512K or 1MB.
714c74138c6SPeter Maydell * L3: No L3 (this matches the CLIDR_EL1 value).
715c74138c6SPeter Maydell */
716676624d7SAlireza Sanaee /* 64KB L1 dcache */
717676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0);
718676624d7SAlireza Sanaee /* 64KB L1 icache */
719676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0];
720676624d7SAlireza Sanaee /* 1MB L2 cache */
721676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 1 * MiB, 0);
722c74138c6SPeter Maydell
723c74138c6SPeter Maydell /* From 3.2.115 SCTLR_EL3 */
724c74138c6SPeter Maydell cpu->reset_sctlr = 0x30c50838;
725c74138c6SPeter Maydell
726c74138c6SPeter Maydell /* From 3.4.8 ICC_CTLR_EL3 and 3.4.23 ICH_VTR_EL2 */
727c74138c6SPeter Maydell cpu->gic_num_lrs = 4;
728c74138c6SPeter Maydell cpu->gic_vpribits = 5;
729c74138c6SPeter Maydell cpu->gic_vprebits = 5;
730c74138c6SPeter Maydell cpu->gic_pribits = 5;
731c74138c6SPeter Maydell
732c74138c6SPeter Maydell /* From 3.5.1 AdvSIMD AArch64 register summary */
733c74138c6SPeter Maydell cpu->isar.mvfr0 = 0x10110222;
734c74138c6SPeter Maydell cpu->isar.mvfr1 = 0x13211111;
735c74138c6SPeter Maydell cpu->isar.mvfr2 = 0x00000043;
736c74138c6SPeter Maydell
737c74138c6SPeter Maydell /* From 3.7.5 ID_AA64ZFR0_EL1 */
738c74138c6SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000100000100000;
739c74138c6SPeter Maydell cpu->sve_vq.supported = (1 << 0) /* 128bit */
740c74138c6SPeter Maydell | (1 << 1); /* 256bit */
741c74138c6SPeter Maydell
742c74138c6SPeter Maydell /* From 5.5.1 AArch64 PMU register summary */
743c74138c6SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x41213000;
744c74138c6SPeter Maydell
745c74138c6SPeter Maydell define_neoverse_v1_cp_reginfo(cpu);
746c74138c6SPeter Maydell
747c74138c6SPeter Maydell aarch64_add_pauth_properties(obj);
748c74138c6SPeter Maydell aarch64_add_sve_properties(obj);
749c74138c6SPeter Maydell }
750c74138c6SPeter Maydell
751e3d45c0aSRichard Henderson static const ARMCPRegInfo cortex_a710_cp_reginfo[] = {
752e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL1", .state = ARM_CP_STATE_AA64,
753e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 0,
754e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
755e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
756e3d45c0aSRichard Henderson { .name = "CPUACTLR2_EL1", .state = ARM_CP_STATE_AA64,
757e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 1,
758e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
759e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
760e3d45c0aSRichard Henderson { .name = "CPUACTLR3_EL1", .state = ARM_CP_STATE_AA64,
761e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 2,
762e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
763e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
764e3d45c0aSRichard Henderson { .name = "CPUACTLR4_EL1", .state = ARM_CP_STATE_AA64,
765e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 3,
766e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
767e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
768e3d45c0aSRichard Henderson { .name = "CPUECTLR_EL1", .state = ARM_CP_STATE_AA64,
769e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 4,
770e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
771e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
772e3d45c0aSRichard Henderson { .name = "CPUECTLR2_EL1", .state = ARM_CP_STATE_AA64,
773e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 1, .opc2 = 5,
774e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
775e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
776e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64,
777e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 4,
778e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
779e3d45c0aSRichard Henderson { .name = "CPUPWRCTLR_EL1", .state = ARM_CP_STATE_AA64,
780e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 2, .opc2 = 7,
781e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
782e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
783e3d45c0aSRichard Henderson { .name = "ATCR_EL1", .state = ARM_CP_STATE_AA64,
784e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 7, .opc2 = 0,
785e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
786e3d45c0aSRichard Henderson { .name = "CPUACTLR5_EL1", .state = ARM_CP_STATE_AA64,
787e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 0,
788e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
789e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
790e3d45c0aSRichard Henderson { .name = "CPUACTLR6_EL1", .state = ARM_CP_STATE_AA64,
791e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 1,
792e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
793e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
794e3d45c0aSRichard Henderson { .name = "CPUACTLR7_EL1", .state = ARM_CP_STATE_AA64,
795e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 8, .opc2 = 2,
796e3d45c0aSRichard Henderson .access = PL1_RW, .type = ARM_CP_CONST, .resetvalue = 0,
797e3d45c0aSRichard Henderson .accessfn = access_actlr_w },
798e3d45c0aSRichard Henderson { .name = "ATCR_EL2", .state = ARM_CP_STATE_AA64,
799e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 0,
800e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
801e3d45c0aSRichard Henderson { .name = "AVTCR_EL2", .state = ARM_CP_STATE_AA64,
802e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 4, .crn = 15, .crm = 7, .opc2 = 1,
803e3d45c0aSRichard Henderson .access = PL2_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
804e3d45c0aSRichard Henderson { .name = "CPUPPMCR_EL3", .state = ARM_CP_STATE_AA64,
805e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 0,
806e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
807e3d45c0aSRichard Henderson { .name = "CPUPPMCR2_EL3", .state = ARM_CP_STATE_AA64,
808e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 1,
809e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
810e3d45c0aSRichard Henderson { .name = "CPUPPMCR4_EL3", .state = ARM_CP_STATE_AA64,
811e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 4,
812e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
813e3d45c0aSRichard Henderson { .name = "CPUPPMCR5_EL3", .state = ARM_CP_STATE_AA64,
814e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 5,
815e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
816e3d45c0aSRichard Henderson { .name = "CPUPPMCR6_EL3", .state = ARM_CP_STATE_AA64,
817e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 2, .opc2 = 6,
818e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
819e3d45c0aSRichard Henderson { .name = "CPUACTLR_EL3", .state = ARM_CP_STATE_AA64,
820e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 4, .opc2 = 0,
821e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
822e3d45c0aSRichard Henderson { .name = "ATCR_EL3", .state = ARM_CP_STATE_AA64,
823e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 7, .opc2 = 0,
824e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
825e3d45c0aSRichard Henderson { .name = "CPUPSELR_EL3", .state = ARM_CP_STATE_AA64,
826e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 0,
827e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
828e3d45c0aSRichard Henderson { .name = "CPUPCR_EL3", .state = ARM_CP_STATE_AA64,
829e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 1,
830e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
831e3d45c0aSRichard Henderson { .name = "CPUPOR_EL3", .state = ARM_CP_STATE_AA64,
832e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 2,
833e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
834e3d45c0aSRichard Henderson { .name = "CPUPMR_EL3", .state = ARM_CP_STATE_AA64,
835e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 3,
836e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
837e3d45c0aSRichard Henderson { .name = "CPUPOR2_EL3", .state = ARM_CP_STATE_AA64,
838e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 4,
839e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
840e3d45c0aSRichard Henderson { .name = "CPUPMR2_EL3", .state = ARM_CP_STATE_AA64,
841e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 5,
842e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
843e3d45c0aSRichard Henderson { .name = "CPUPFR_EL3", .state = ARM_CP_STATE_AA64,
844e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 8, .opc2 = 6,
845e3d45c0aSRichard Henderson .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
8463bcc5398SPeter Maydell /*
8473bcc5398SPeter Maydell * Report CPUCFR_EL1.SCU as 1, as we do not implement the DSU
8483bcc5398SPeter Maydell * (and in particular its system registers).
8493bcc5398SPeter Maydell */
8503bcc5398SPeter Maydell { .name = "CPUCFR_EL1", .state = ARM_CP_STATE_AA64,
8513bcc5398SPeter Maydell .opc0 = 3, .opc1 = 0, .crn = 15, .crm = 0, .opc2 = 0,
8523bcc5398SPeter Maydell .access = PL1_R, .type = ARM_CP_CONST, .resetvalue = 4 },
853e3d45c0aSRichard Henderson
854e3d45c0aSRichard Henderson /*
855e3d45c0aSRichard Henderson * Stub RAMINDEX, as we don't actually implement caches, BTB,
856e3d45c0aSRichard Henderson * or anything else with cpu internal memory.
857e3d45c0aSRichard Henderson * "Read" zeros into the IDATA* and DDATA* output registers.
858e3d45c0aSRichard Henderson */
859e3d45c0aSRichard Henderson { .name = "RAMINDEX_EL3", .state = ARM_CP_STATE_AA64,
860e3d45c0aSRichard Henderson .opc0 = 1, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0,
861e3d45c0aSRichard Henderson .access = PL3_W, .type = ARM_CP_CONST, .resetvalue = 0 },
862e3d45c0aSRichard Henderson { .name = "IDATA0_EL3", .state = ARM_CP_STATE_AA64,
863e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 0,
864e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
865e3d45c0aSRichard Henderson { .name = "IDATA1_EL3", .state = ARM_CP_STATE_AA64,
866e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 1,
867e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
868e3d45c0aSRichard Henderson { .name = "IDATA2_EL3", .state = ARM_CP_STATE_AA64,
869e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 0, .opc2 = 2,
870e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
871e3d45c0aSRichard Henderson { .name = "DDATA0_EL3", .state = ARM_CP_STATE_AA64,
872e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 0,
873e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
874e3d45c0aSRichard Henderson { .name = "DDATA1_EL3", .state = ARM_CP_STATE_AA64,
875e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 1,
876e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
877e3d45c0aSRichard Henderson { .name = "DDATA2_EL3", .state = ARM_CP_STATE_AA64,
878e3d45c0aSRichard Henderson .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 1, .opc2 = 2,
879e3d45c0aSRichard Henderson .access = PL3_R, .type = ARM_CP_CONST, .resetvalue = 0 },
880e3d45c0aSRichard Henderson };
881e3d45c0aSRichard Henderson
aarch64_a710_initfn(Object * obj)882e3d45c0aSRichard Henderson static void aarch64_a710_initfn(Object *obj)
883e3d45c0aSRichard Henderson {
884e3d45c0aSRichard Henderson ARMCPU *cpu = ARM_CPU(obj);
885e3d45c0aSRichard Henderson
886e3d45c0aSRichard Henderson cpu->dtb_compatible = "arm,cortex-a710";
887e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_V8);
888e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_NEON);
889e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
890f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
891e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_AARCH64);
892e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
893e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL2);
894e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_EL3);
895e3d45c0aSRichard Henderson set_feature(&cpu->env, ARM_FEATURE_PMU);
896e3d45c0aSRichard Henderson
897e3d45c0aSRichard Henderson /* Ordered by Section B.4: AArch64 registers */
898e3d45c0aSRichard Henderson cpu->midr = 0x412FD471; /* r2p1 */
899e3d45c0aSRichard Henderson cpu->revidr = 0;
900e3d45c0aSRichard Henderson cpu->isar.id_pfr0 = 0x21110131;
901e3d45c0aSRichard Henderson cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */
902e3d45c0aSRichard Henderson cpu->isar.id_dfr0 = 0x16011099;
903e3d45c0aSRichard Henderson cpu->id_afr0 = 0;
904e3d45c0aSRichard Henderson cpu->isar.id_mmfr0 = 0x10201105;
905e3d45c0aSRichard Henderson cpu->isar.id_mmfr1 = 0x40000000;
906e3d45c0aSRichard Henderson cpu->isar.id_mmfr2 = 0x01260000;
907e3d45c0aSRichard Henderson cpu->isar.id_mmfr3 = 0x02122211;
908e3d45c0aSRichard Henderson cpu->isar.id_isar0 = 0x02101110;
909e3d45c0aSRichard Henderson cpu->isar.id_isar1 = 0x13112111;
910e3d45c0aSRichard Henderson cpu->isar.id_isar2 = 0x21232042;
911e3d45c0aSRichard Henderson cpu->isar.id_isar3 = 0x01112131;
912e3d45c0aSRichard Henderson cpu->isar.id_isar4 = 0x00010142;
913e3d45c0aSRichard Henderson cpu->isar.id_isar5 = 0x11011121; /* with Crypto */
914e3d45c0aSRichard Henderson cpu->isar.id_mmfr4 = 0x21021110;
915e3d45c0aSRichard Henderson cpu->isar.id_isar6 = 0x01111111;
916e3d45c0aSRichard Henderson cpu->isar.mvfr0 = 0x10110222;
917e3d45c0aSRichard Henderson cpu->isar.mvfr1 = 0x13211111;
918e3d45c0aSRichard Henderson cpu->isar.mvfr2 = 0x00000043;
919e3d45c0aSRichard Henderson cpu->isar.id_pfr2 = 0x00000011;
920e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */
921e3d45c0aSRichard Henderson cpu->isar.id_aa64pfr1 = 0x0000000000000221ull;
922e3d45c0aSRichard Henderson cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */
9233bcc5398SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f010305619ull;
924e3d45c0aSRichard Henderson cpu->isar.id_aa64dfr1 = 0;
925e3d45c0aSRichard Henderson cpu->id_aa64afr0 = 0;
926e3d45c0aSRichard Henderson cpu->id_aa64afr1 = 0;
927e3d45c0aSRichard Henderson cpu->isar.id_aa64isar0 = 0x0221111110212120ull; /* with Crypto */
9283bcc5398SPeter Maydell cpu->isar.id_aa64isar1 = 0x0010111101211052ull;
929e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr0 = 0x0000022200101122ull;
930e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
931e3d45c0aSRichard Henderson cpu->isar.id_aa64mmfr2 = 0x1221011110101011ull;
932e3d45c0aSRichard Henderson cpu->clidr = 0x0000001482000023ull;
933e3d45c0aSRichard Henderson cpu->gm_blocksize = 4;
934e3d45c0aSRichard Henderson cpu->ctr = 0x000000049444c004ull;
935e3d45c0aSRichard Henderson cpu->dcz_blocksize = 4;
936e3d45c0aSRichard Henderson /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_0006_003f */
937e3d45c0aSRichard Henderson
938e3d45c0aSRichard Henderson /* Section B.5.2: PMCR_EL0 */
939e3d45c0aSRichard Henderson cpu->isar.reset_pmcr_el0 = 0xa000; /* with 20 counters */
940e3d45c0aSRichard Henderson
941e3d45c0aSRichard Henderson /* Section B.6.7: ICH_VTR_EL2 */
942e3d45c0aSRichard Henderson cpu->gic_num_lrs = 4;
943e3d45c0aSRichard Henderson cpu->gic_vpribits = 5;
944e3d45c0aSRichard Henderson cpu->gic_vprebits = 5;
945e3d45c0aSRichard Henderson cpu->gic_pribits = 5;
946e3d45c0aSRichard Henderson
947e3d45c0aSRichard Henderson /* Section 14: Scalable Vector Extensions support */
948e3d45c0aSRichard Henderson cpu->sve_vq.supported = 1 << 0; /* 128bit */
949e3d45c0aSRichard Henderson
950e3d45c0aSRichard Henderson /*
951e3d45c0aSRichard Henderson * The cortex-a710 TRM does not list CCSIDR values. The layout of
952e3d45c0aSRichard Henderson * the caches are in text in Table 7-1, Table 8-1, and Table 9-1.
953e3d45c0aSRichard Henderson *
954e3d45c0aSRichard Henderson * L1: 4-way set associative 64-byte line size, total either 32K or 64K.
955e3d45c0aSRichard Henderson * L2: 8-way set associative 64 byte line size, total either 256K or 512K.
956e3d45c0aSRichard Henderson */
957676624d7SAlireza Sanaee /* L1 dcache */
958676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0);
959676624d7SAlireza Sanaee /* L1 icache */
960676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0];
961676624d7SAlireza Sanaee /* L2 cache */
962676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 512 * KiB, 0);
963e3d45c0aSRichard Henderson
964e3d45c0aSRichard Henderson /* FIXME: Not documented -- copied from neoverse-v1 */
965e3d45c0aSRichard Henderson cpu->reset_sctlr = 0x30c50838;
966e3d45c0aSRichard Henderson
967e3d45c0aSRichard Henderson define_arm_cp_regs(cpu, cortex_a710_cp_reginfo);
968e3d45c0aSRichard Henderson
969e3d45c0aSRichard Henderson aarch64_add_pauth_properties(obj);
970e3d45c0aSRichard Henderson aarch64_add_sve_properties(obj);
971e3d45c0aSRichard Henderson }
972e3d45c0aSRichard Henderson
973dfff1000SPeter Maydell /* Extra IMPDEF regs in the N2 beyond those in the A710 */
974dfff1000SPeter Maydell static const ARMCPRegInfo neoverse_n2_cp_reginfo[] = {
975dfff1000SPeter Maydell { .name = "CPURNDBR_EL3", .state = ARM_CP_STATE_AA64,
976dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 0,
977dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
978dfff1000SPeter Maydell { .name = "CPURNDPEID_EL3", .state = ARM_CP_STATE_AA64,
979dfff1000SPeter Maydell .opc0 = 3, .opc1 = 6, .crn = 15, .crm = 3, .opc2 = 1,
980dfff1000SPeter Maydell .access = PL3_RW, .type = ARM_CP_CONST, .resetvalue = 0 },
981dfff1000SPeter Maydell };
982dfff1000SPeter Maydell
aarch64_neoverse_n2_initfn(Object * obj)983dfff1000SPeter Maydell static void aarch64_neoverse_n2_initfn(Object *obj)
984dfff1000SPeter Maydell {
985dfff1000SPeter Maydell ARMCPU *cpu = ARM_CPU(obj);
986dfff1000SPeter Maydell
987dfff1000SPeter Maydell cpu->dtb_compatible = "arm,neoverse-n2";
988dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_V8);
989dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_NEON);
990dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_GENERIC_TIMER);
991f037f5b4SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
992dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_AARCH64);
993dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_CBAR_RO);
994dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL2);
995dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_EL3);
996dfff1000SPeter Maydell set_feature(&cpu->env, ARM_FEATURE_PMU);
997dfff1000SPeter Maydell
998dfff1000SPeter Maydell /* Ordered by Section B.5: AArch64 ID registers */
999dfff1000SPeter Maydell cpu->midr = 0x410FD493; /* r0p3 */
1000dfff1000SPeter Maydell cpu->revidr = 0;
1001dfff1000SPeter Maydell cpu->isar.id_pfr0 = 0x21110131;
1002dfff1000SPeter Maydell cpu->isar.id_pfr1 = 0x00010000; /* GIC filled in later */
1003dfff1000SPeter Maydell cpu->isar.id_dfr0 = 0x16011099;
1004dfff1000SPeter Maydell cpu->id_afr0 = 0;
1005dfff1000SPeter Maydell cpu->isar.id_mmfr0 = 0x10201105;
1006dfff1000SPeter Maydell cpu->isar.id_mmfr1 = 0x40000000;
1007dfff1000SPeter Maydell cpu->isar.id_mmfr2 = 0x01260000;
1008dfff1000SPeter Maydell cpu->isar.id_mmfr3 = 0x02122211;
1009dfff1000SPeter Maydell cpu->isar.id_isar0 = 0x02101110;
1010dfff1000SPeter Maydell cpu->isar.id_isar1 = 0x13112111;
1011dfff1000SPeter Maydell cpu->isar.id_isar2 = 0x21232042;
1012dfff1000SPeter Maydell cpu->isar.id_isar3 = 0x01112131;
1013dfff1000SPeter Maydell cpu->isar.id_isar4 = 0x00010142;
1014dfff1000SPeter Maydell cpu->isar.id_isar5 = 0x11011121; /* with Crypto */
1015dfff1000SPeter Maydell cpu->isar.id_mmfr4 = 0x01021110;
1016dfff1000SPeter Maydell cpu->isar.id_isar6 = 0x01111111;
1017dfff1000SPeter Maydell cpu->isar.mvfr0 = 0x10110222;
1018dfff1000SPeter Maydell cpu->isar.mvfr1 = 0x13211111;
1019dfff1000SPeter Maydell cpu->isar.mvfr2 = 0x00000043;
1020dfff1000SPeter Maydell cpu->isar.id_pfr2 = 0x00000011;
1021dfff1000SPeter Maydell cpu->isar.id_aa64pfr0 = 0x1201111120111112ull; /* GIC filled in later */
1022dfff1000SPeter Maydell cpu->isar.id_aa64pfr1 = 0x0000000000000221ull;
1023dfff1000SPeter Maydell cpu->isar.id_aa64zfr0 = 0x0000110100110021ull; /* with Crypto */
1024dfff1000SPeter Maydell cpu->isar.id_aa64dfr0 = 0x000011f210305619ull;
1025dfff1000SPeter Maydell cpu->isar.id_aa64dfr1 = 0;
1026dfff1000SPeter Maydell cpu->id_aa64afr0 = 0;
1027dfff1000SPeter Maydell cpu->id_aa64afr1 = 0;
1028e867a124SMarcin Juszkiewicz cpu->isar.id_aa64isar0 = 0x1221111110212120ull; /* with Crypto and FEAT_RNG */
1029dfff1000SPeter Maydell cpu->isar.id_aa64isar1 = 0x0011111101211052ull;
1030dfff1000SPeter Maydell cpu->isar.id_aa64mmfr0 = 0x0000022200101125ull;
1031dfff1000SPeter Maydell cpu->isar.id_aa64mmfr1 = 0x0000000010212122ull;
1032dfff1000SPeter Maydell cpu->isar.id_aa64mmfr2 = 0x1221011112101011ull;
1033dfff1000SPeter Maydell cpu->clidr = 0x0000001482000023ull;
1034dfff1000SPeter Maydell cpu->gm_blocksize = 4;
1035dfff1000SPeter Maydell cpu->ctr = 0x00000004b444c004ull;
1036dfff1000SPeter Maydell cpu->dcz_blocksize = 4;
1037dfff1000SPeter Maydell /* TODO FEAT_MPAM: mpamidr_el1 = 0x0000_0001_001e_01ff */
1038dfff1000SPeter Maydell
1039dfff1000SPeter Maydell /* Section B.7.2: PMCR_EL0 */
1040dfff1000SPeter Maydell cpu->isar.reset_pmcr_el0 = 0x3000; /* with 6 counters */
1041dfff1000SPeter Maydell
1042dfff1000SPeter Maydell /* Section B.8.9: ICH_VTR_EL2 */
1043dfff1000SPeter Maydell cpu->gic_num_lrs = 4;
1044dfff1000SPeter Maydell cpu->gic_vpribits = 5;
1045dfff1000SPeter Maydell cpu->gic_vprebits = 5;
1046dfff1000SPeter Maydell cpu->gic_pribits = 5;
1047dfff1000SPeter Maydell
1048dfff1000SPeter Maydell /* Section 14: Scalable Vector Extensions support */
1049dfff1000SPeter Maydell cpu->sve_vq.supported = 1 << 0; /* 128bit */
1050dfff1000SPeter Maydell
1051dfff1000SPeter Maydell /*
1052dfff1000SPeter Maydell * The Neoverse N2 TRM does not list CCSIDR values. The layout of
1053dfff1000SPeter Maydell * the caches are in text in Table 7-1, Table 8-1, and Table 9-1.
1054dfff1000SPeter Maydell *
1055dfff1000SPeter Maydell * L1: 4-way set associative 64-byte line size, total 64K.
1056dfff1000SPeter Maydell * L2: 8-way set associative 64 byte line size, total either 512K or 1024K.
1057dfff1000SPeter Maydell */
1058676624d7SAlireza Sanaee /* L1 dcache */
1059676624d7SAlireza Sanaee cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 4, 64, 64 * KiB, 0);
1060676624d7SAlireza Sanaee /* L1 icache */
1061676624d7SAlireza Sanaee cpu->ccsidr[1] = cpu->ccsidr[0];
1062676624d7SAlireza Sanaee /* L2 cache */
1063676624d7SAlireza Sanaee cpu->ccsidr[2] = make_ccsidr(CCSIDR_FORMAT_CCIDX, 8, 64, 512 * KiB, 0);
1064dfff1000SPeter Maydell /* FIXME: Not documented -- copied from neoverse-v1 */
1065dfff1000SPeter Maydell cpu->reset_sctlr = 0x30c50838;
1066dfff1000SPeter Maydell
1067dfff1000SPeter Maydell /*
1068dfff1000SPeter Maydell * The Neoverse N2 has all of the Cortex-A710 IMPDEF registers,
1069dfff1000SPeter Maydell * and a few more RNG related ones.
1070dfff1000SPeter Maydell */
1071dfff1000SPeter Maydell define_arm_cp_regs(cpu, cortex_a710_cp_reginfo);
1072dfff1000SPeter Maydell define_arm_cp_regs(cpu, neoverse_n2_cp_reginfo);
1073dfff1000SPeter Maydell
1074dfff1000SPeter Maydell aarch64_add_pauth_properties(obj);
1075dfff1000SPeter Maydell aarch64_add_sve_properties(obj);
1076dfff1000SPeter Maydell }
1077dfff1000SPeter Maydell
107839920a04SFabiano Rosas /*
107939920a04SFabiano Rosas * -cpu max: a CPU with as many features enabled as our emulation supports.
108020cf68efSClaudio Fontana * The version of '-cpu max' for qemu-system-arm is defined in cpu32.c;
108139920a04SFabiano Rosas * this only needs to handle 64 bits.
108239920a04SFabiano Rosas */
aarch64_max_tcg_initfn(Object * obj)108339920a04SFabiano Rosas void aarch64_max_tcg_initfn(Object *obj)
108439920a04SFabiano Rosas {
108539920a04SFabiano Rosas ARMCPU *cpu = ARM_CPU(obj);
108639920a04SFabiano Rosas uint64_t t;
108739920a04SFabiano Rosas uint32_t u;
108839920a04SFabiano Rosas
108939920a04SFabiano Rosas /*
1090f037f5b4SPeter Maydell * Unset ARM_FEATURE_BACKCOMPAT_CNTFRQ, which we would otherwise default
1091f037f5b4SPeter Maydell * to because we started with aarch64_a57_initfn(). A 'max' CPU might
1092f037f5b4SPeter Maydell * be a v8.6-or-later one, in which case the cntfrq must be 1GHz; and
1093f037f5b4SPeter Maydell * because it is our "may change" CPU type we are OK with it not being
1094f037f5b4SPeter Maydell * backwards-compatible with how it worked in old QEMU.
1095f037f5b4SPeter Maydell */
1096f037f5b4SPeter Maydell unset_feature(&cpu->env, ARM_FEATURE_BACKCOMPAT_CNTFRQ);
1097f037f5b4SPeter Maydell
1098f037f5b4SPeter Maydell /*
109939920a04SFabiano Rosas * Reset MIDR so the guest doesn't mistake our 'max' CPU type for a real
110039920a04SFabiano Rosas * one and try to apply errata workarounds or use impdef features we
110139920a04SFabiano Rosas * don't provide.
110239920a04SFabiano Rosas * An IMPLEMENTER field of 0 means "reserved for software use";
110339920a04SFabiano Rosas * ARCHITECTURE must be 0xf indicating "v7 or later, check ID registers
110439920a04SFabiano Rosas * to see which features are present";
110539920a04SFabiano Rosas * the VARIANT, PARTNUM and REVISION fields are all implementation
110639920a04SFabiano Rosas * defined and we choose to define PARTNUM just in case guest
110739920a04SFabiano Rosas * code needs to distinguish this QEMU CPU from other software
110839920a04SFabiano Rosas * implementations, though this shouldn't be needed.
110939920a04SFabiano Rosas */
111039920a04SFabiano Rosas t = FIELD_DP64(0, MIDR_EL1, IMPLEMENTER, 0);
111139920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, ARCHITECTURE, 0xf);
111239920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, PARTNUM, 'Q');
111339920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, VARIANT, 0);
111439920a04SFabiano Rosas t = FIELD_DP64(t, MIDR_EL1, REVISION, 0);
111539920a04SFabiano Rosas cpu->midr = t;
111639920a04SFabiano Rosas
111739920a04SFabiano Rosas /*
111839920a04SFabiano Rosas * We're going to set FEAT_S2FWB, which mandates that CLIDR_EL1.{LoUU,LoUIS}
111939920a04SFabiano Rosas * are zero.
112039920a04SFabiano Rosas */
112139920a04SFabiano Rosas u = cpu->clidr;
112239920a04SFabiano Rosas u = FIELD_DP32(u, CLIDR_EL1, LOUIS, 0);
112339920a04SFabiano Rosas u = FIELD_DP32(u, CLIDR_EL1, LOUU, 0);
112439920a04SFabiano Rosas cpu->clidr = u;
112539920a04SFabiano Rosas
11263d65b958SPeter Maydell /*
11273d65b958SPeter Maydell * Set CTR_EL0.DIC and IDC to tell the guest it doesnt' need to
11283d65b958SPeter Maydell * do any cache maintenance for data-to-instruction or
11293d65b958SPeter Maydell * instruction-to-guest coherence. (Our cache ops are nops.)
11303d65b958SPeter Maydell */
11313d65b958SPeter Maydell t = cpu->ctr;
11323d65b958SPeter Maydell t = FIELD_DP64(t, CTR_EL0, IDC, 1);
11333d65b958SPeter Maydell t = FIELD_DP64(t, CTR_EL0, DIC, 1);
11343d65b958SPeter Maydell cpu->ctr = t;
11353d65b958SPeter Maydell
113639920a04SFabiano Rosas t = cpu->isar.id_aa64isar0;
113739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, AES, 2); /* FEAT_PMULL */
113839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA1, 1); /* FEAT_SHA1 */
113939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA2, 2); /* FEAT_SHA512 */
11409e771a2fSAlex Bennée t = FIELD_DP64(t, ID_AA64ISAR0, CRC32, 1); /* FEAT_CRC32 */
114139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, ATOMIC, 2); /* FEAT_LSE */
114239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, RDM, 1); /* FEAT_RDM */
114339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SHA3, 1); /* FEAT_SHA3 */
114439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SM3, 1); /* FEAT_SM3 */
114539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, SM4, 1); /* FEAT_SM4 */
114639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, DP, 1); /* FEAT_DotProd */
114739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, FHM, 1); /* FEAT_FHM */
114839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, TS, 2); /* FEAT_FlagM2 */
114939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, TLB, 2); /* FEAT_TLBIRANGE */
115039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR0, RNDR, 1); /* FEAT_RNG */
115139920a04SFabiano Rosas cpu->isar.id_aa64isar0 = t;
115239920a04SFabiano Rosas
115339920a04SFabiano Rosas t = cpu->isar.id_aa64isar1;
115439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, DPB, 2); /* FEAT_DPB2 */
11558a69a423SAaron Lindsay t = FIELD_DP64(t, ID_AA64ISAR1, APA, PauthFeat_FPACCOMBINED);
11566c3427eeSRichard Henderson t = FIELD_DP64(t, ID_AA64ISAR1, API, 1);
115739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, JSCVT, 1); /* FEAT_JSCVT */
115839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, FCMA, 1); /* FEAT_FCMA */
115939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, LRCPC, 2); /* FEAT_LRCPC2 */
116039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, FRINTTS, 1); /* FEAT_FRINTTS */
116139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, SB, 1); /* FEAT_SB */
116239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, SPECRES, 1); /* FEAT_SPECRES */
11635d1187b3SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR1, BF16, 2); /* FEAT_BF16, FEAT_EBF16 */
116439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, DGH, 1); /* FEAT_DGH */
116539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ISAR1, I8MM, 1); /* FEAT_I8MM */
116619db1d4dSManos Pitsidianakis t = FIELD_DP64(t, ID_AA64ISAR1, XS, 1); /* FEAT_XS */
116739920a04SFabiano Rosas cpu->isar.id_aa64isar1 = t;
116839920a04SFabiano Rosas
11693039b090SPeter Maydell t = cpu->isar.id_aa64isar2;
1170b0bf3774SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, RPRES, 1); /* FEAT_RPRES */
1171706a92fbSPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, MOPS, 1); /* FEAT_MOPS */
11723039b090SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, BC, 1); /* FEAT_HBC */
1173a96edb68SPeter Maydell t = FIELD_DP64(t, ID_AA64ISAR2, WFXT, 2); /* FEAT_WFxT */
11743039b090SPeter Maydell cpu->isar.id_aa64isar2 = t;
11753039b090SPeter Maydell
117639920a04SFabiano Rosas t = cpu->isar.id_aa64pfr0;
117739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, FP, 1); /* FEAT_FP16 */
117839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, ADVSIMD, 1); /* FEAT_FP16 */
117939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, RAS, 2); /* FEAT_RASv1p1 + FEAT_DoubleFault */
118039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SVE, 1);
118139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, SEL2, 1); /* FEAT_SEL2 */
118239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, DIT, 1); /* FEAT_DIT */
1183e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR0, CSV2, 3); /* FEAT_CSV2_3 */
118439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR0, CSV3, 1); /* FEAT_CSV3 */
118539920a04SFabiano Rosas cpu->isar.id_aa64pfr0 = t;
118639920a04SFabiano Rosas
118739920a04SFabiano Rosas t = cpu->isar.id_aa64pfr1;
118839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, BT, 1); /* FEAT_BTI */
118939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SSBS, 2); /* FEAT_SSBS2 */
119039920a04SFabiano Rosas /*
119139920a04SFabiano Rosas * Begin with full support for MTE. This will be downgraded to MTE=0
119239920a04SFabiano Rosas * during realize if the board provides no tag memory, much like
119339920a04SFabiano Rosas * we do for EL2 with the virtualization=on property.
119439920a04SFabiano Rosas */
119539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, MTE, 3); /* FEAT_MTE3 */
119639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, RAS_FRAC, 0); /* FEAT_RASv1p1 + FEAT_DoubleFault */
119739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64PFR1, SME, 1); /* FEAT_SME */
1198e1973951SPeter Maydell t = FIELD_DP64(t, ID_AA64PFR1, CSV2_FRAC, 0); /* FEAT_CSV2_3 */
119914a16403SJinjie Ruan t = FIELD_DP64(t, ID_AA64PFR1, NMI, 1); /* FEAT_NMI */
120039920a04SFabiano Rosas cpu->isar.id_aa64pfr1 = t;
120139920a04SFabiano Rosas
120239920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr0;
120339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, PARANGE, 6); /* FEAT_LPA: 52 bits */
120439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16, 1); /* 16k pages supported */
120539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN16_2, 2); /* 16k stage2 supported */
120639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN64_2, 2); /* 64k stage2 supported */
120739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, TGRAN4_2, 2); /* 4k stage2 supported */
120839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR0, FGT, 1); /* FEAT_FGT */
1209c10a9a51SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR0, ECV, 2); /* FEAT_ECV */
121039920a04SFabiano Rosas cpu->isar.id_aa64mmfr0 = t;
121139920a04SFabiano Rosas
121239920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr1;
121339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HAFDBS, 2); /* FEAT_HAFDBS */
121439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VMIDBITS, 2); /* FEAT_VMID16 */
121539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, VH, 1); /* FEAT_VHE */
1216df9a3917SRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, HPDS, 2); /* FEAT_HPDS2 */
121739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, LO, 1); /* FEAT_LOR */
121839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, PAN, 3); /* FEAT_PAN3 */
121939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, XNX, 1); /* FEAT_XNX */
122074360f35SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR1, ETS, 2); /* FEAT_ETS2 */
122139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR1, HCX, 1); /* FEAT_HCX */
1222d38a57a3SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR1, AFP, 1); /* FEAT_AFP */
12239cd0c0deSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR1, TIDCP1, 1); /* FEAT_TIDCP1 */
1224374cdc8eSGustavo Romero t = FIELD_DP64(t, ID_AA64MMFR1, CMOW, 1); /* FEAT_CMOW */
122539920a04SFabiano Rosas cpu->isar.id_aa64mmfr1 = t;
122639920a04SFabiano Rosas
122739920a04SFabiano Rosas t = cpu->isar.id_aa64mmfr2;
122839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, CNP, 1); /* FEAT_TTCNP */
122939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, UAO, 1); /* FEAT_UAO */
123039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IESB, 1); /* FEAT_IESB */
123139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, VARANGE, 1); /* FEAT_LVA */
1232e2862554SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR2, NV, 2); /* FEAT_NV2 */
123339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, ST, 1); /* FEAT_TTST */
123459b6b42cSRichard Henderson t = FIELD_DP64(t, ID_AA64MMFR2, AT, 1); /* FEAT_LSE2 */
123539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, IDS, 1); /* FEAT_IDST */
123639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, FWB, 1); /* FEAT_S2FWB */
123739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, TTL, 1); /* FEAT_TTL */
123839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, BBM, 2); /* FEAT_BBM at level 2 */
123939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, EVT, 2); /* FEAT_EVT */
124039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64MMFR2, E0PD, 1); /* FEAT_E0PD */
124139920a04SFabiano Rosas cpu->isar.id_aa64mmfr2 = t;
124239920a04SFabiano Rosas
1243663163f0SPeter Maydell t = cpu->isar.id_aa64mmfr3;
1244663163f0SPeter Maydell t = FIELD_DP64(t, ID_AA64MMFR3, SPEC_FPACC, 1); /* FEAT_FPACC_SPEC */
1245663163f0SPeter Maydell cpu->isar.id_aa64mmfr3 = t;
1246663163f0SPeter Maydell
124739920a04SFabiano Rosas t = cpu->isar.id_aa64zfr0;
124839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SVEVER, 1);
124939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, AES, 2); /* FEAT_SVE_PMULL128 */
125039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, BITPERM, 1); /* FEAT_SVE_BitPerm */
12515d1187b3SPeter Maydell t = FIELD_DP64(t, ID_AA64ZFR0, BFLOAT16, 2); /* FEAT_BF16, FEAT_EBF16 */
125239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SHA3, 1); /* FEAT_SVE_SHA3 */
125339920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, SM4, 1); /* FEAT_SVE_SM4 */
125439920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, I8MM, 1); /* FEAT_I8MM */
125539920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F32MM, 1); /* FEAT_F32MM */
125639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64ZFR0, F64MM, 1); /* FEAT_F64MM */
125739920a04SFabiano Rosas cpu->isar.id_aa64zfr0 = t;
125839920a04SFabiano Rosas
125939920a04SFabiano Rosas t = cpu->isar.id_aa64dfr0;
126002ff2addSGustavo Romero t = FIELD_DP64(t, ID_AA64DFR0, DEBUGVER, 10); /* FEAT_Debugv8p8 */
126139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64DFR0, PMUVER, 6); /* FEAT_PMUv3p5 */
12623d80bbf1SPeter Maydell t = FIELD_DP64(t, ID_AA64DFR0, HPMN0, 1); /* FEAT_HPMN0 */
126339920a04SFabiano Rosas cpu->isar.id_aa64dfr0 = t;
126439920a04SFabiano Rosas
126539920a04SFabiano Rosas t = cpu->isar.id_aa64smfr0;
126639920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F32F32, 1); /* FEAT_SME */
126739920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, B16F32, 1); /* FEAT_SME */
126839920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F16F32, 1); /* FEAT_SME */
126939920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I8I32, 0xf); /* FEAT_SME */
127039920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, F64F64, 1); /* FEAT_SME_F64F64 */
127139920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, I16I64, 0xf); /* FEAT_SME_I16I64 */
127239920a04SFabiano Rosas t = FIELD_DP64(t, ID_AA64SMFR0, FA64, 1); /* FEAT_SME_FA64 */
127339920a04SFabiano Rosas cpu->isar.id_aa64smfr0 = t;
127439920a04SFabiano Rosas
127539920a04SFabiano Rosas /* Replicate the same data to the 32-bit id registers. */
127639920a04SFabiano Rosas aa32_max_features(cpu);
127739920a04SFabiano Rosas
127839920a04SFabiano Rosas #ifdef CONFIG_USER_ONLY
127939920a04SFabiano Rosas /*
128039920a04SFabiano Rosas * For usermode -cpu max we can use a larger and more efficient DCZ
128139920a04SFabiano Rosas * blocksize since we don't have to follow what the hardware does.
128239920a04SFabiano Rosas */
128339920a04SFabiano Rosas cpu->ctr = 0x80038003; /* 32 byte I and D cacheline size, VIPT icache */
128439920a04SFabiano Rosas cpu->dcz_blocksize = 7; /* 512 bytes */
128539920a04SFabiano Rosas #endif
1286851ec6ebSRichard Henderson cpu->gm_blocksize = 6; /* 256 bytes */
128739920a04SFabiano Rosas
128839920a04SFabiano Rosas cpu->sve_vq.supported = MAKE_64BIT_MASK(0, ARM_MAX_VQ);
128939920a04SFabiano Rosas cpu->sme_vq.supported = SVE_VQ_POW2_MAP;
129039920a04SFabiano Rosas
129139920a04SFabiano Rosas aarch64_add_pauth_properties(obj);
129239920a04SFabiano Rosas aarch64_add_sve_properties(obj);
129339920a04SFabiano Rosas aarch64_add_sme_properties(obj);
129439920a04SFabiano Rosas object_property_add(obj, "sve-max-vq", "uint32", cpu_max_get_sve_max_vq,
129539920a04SFabiano Rosas cpu_max_set_sve_max_vq, NULL, NULL);
1296a834d547SRichard Henderson object_property_add_bool(obj, "x-rme", cpu_arm_get_rme, cpu_arm_set_rme);
1297a834d547SRichard Henderson object_property_add(obj, "x-l0gptsz", "uint32", cpu_max_get_l0gptsz,
1298a834d547SRichard Henderson cpu_max_set_l0gptsz, NULL, NULL);
129939920a04SFabiano Rosas qdev_property_add_static(DEVICE(obj), &arm_cpu_lpa2_property);
130039920a04SFabiano Rosas }
130139920a04SFabiano Rosas
130239920a04SFabiano Rosas static const ARMCPUInfo aarch64_cpus[] = {
130339920a04SFabiano Rosas { .name = "cortex-a35", .initfn = aarch64_a35_initfn },
130439920a04SFabiano Rosas { .name = "cortex-a55", .initfn = aarch64_a55_initfn },
130539920a04SFabiano Rosas { .name = "cortex-a72", .initfn = aarch64_a72_initfn },
130639920a04SFabiano Rosas { .name = "cortex-a76", .initfn = aarch64_a76_initfn },
1307e3d45c0aSRichard Henderson { .name = "cortex-a710", .initfn = aarch64_a710_initfn },
130839920a04SFabiano Rosas { .name = "a64fx", .initfn = aarch64_a64fx_initfn },
130939920a04SFabiano Rosas { .name = "neoverse-n1", .initfn = aarch64_neoverse_n1_initfn },
1310c74138c6SPeter Maydell { .name = "neoverse-v1", .initfn = aarch64_neoverse_v1_initfn },
1311dfff1000SPeter Maydell { .name = "neoverse-n2", .initfn = aarch64_neoverse_n2_initfn },
131239920a04SFabiano Rosas };
131339920a04SFabiano Rosas
aarch64_cpu_register_types(void)131439920a04SFabiano Rosas static void aarch64_cpu_register_types(void)
131539920a04SFabiano Rosas {
131639920a04SFabiano Rosas size_t i;
131739920a04SFabiano Rosas
131839920a04SFabiano Rosas for (i = 0; i < ARRAY_SIZE(aarch64_cpus); ++i) {
1319*ec7e5a90SPeter Maydell arm_cpu_register(&aarch64_cpus[i]);
132039920a04SFabiano Rosas }
132139920a04SFabiano Rosas }
132239920a04SFabiano Rosas
132339920a04SFabiano Rosas type_init(aarch64_cpu_register_types)
1324