arm/cpu: store clidr into the idregs array

Signed-off-by: Cornelia Huck <cohuck@redhat.com>
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Reviewed-by: Eric Auger <eric.auger@redhat.com>
Message-id: 20250704141927.38963-5-cohuck@redhat.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Cornelia Huck 2025-07-04 16:19:26 +02:00 committed by Peter Maydell
parent e61aa4a5ff
commit f73632932b
8 changed files with 25 additions and 25 deletions

View File

@ -1331,7 +1331,7 @@ static uint32_t nvic_readl(NVICState *s, uint32_t offset, MemTxAttrs attrs)
} }
return GET_IDREG(&cpu->isar, ID_ISAR5); return GET_IDREG(&cpu->isar, ID_ISAR5);
case 0xd78: /* CLIDR */ case 0xd78: /* CLIDR */
return cpu->clidr; return GET_IDREG(&cpu->isar, CLIDR);
case 0xd7c: /* CTR */ case 0xd7c: /* CTR */
return cpu->ctr; return cpu->ctr;
case 0xd80: /* CSSIDR */ case 0xd80: /* CSSIDR */

View File

@ -35,5 +35,6 @@ DEF(MVFR2_EL1, 3, 0, 0, 3, 2)
DEF(ID_PFR2_EL1, 3, 0, 0, 3, 4) DEF(ID_PFR2_EL1, 3, 0, 0, 3, 4)
DEF(ID_DFR1_EL1, 3, 0, 0, 3, 5) DEF(ID_DFR1_EL1, 3, 0, 0, 3, 5)
DEF(ID_MMFR5_EL1, 3, 0, 0, 3, 6) DEF(ID_MMFR5_EL1, 3, 0, 0, 3, 6)
DEF(CLIDR_EL1, 3, 1, 0, 0, 1)
DEF(ID_AA64ZFR0_EL1, 3, 0, 0, 4, 4) DEF(ID_AA64ZFR0_EL1, 3, 0, 0, 4, 4)
DEF(CTR_EL0, 3, 3, 0, 0, 1) DEF(CTR_EL0, 3, 3, 0, 0, 1)

View File

@ -1082,7 +1082,6 @@ struct ArchCPU {
uint32_t reset_sctlr; uint32_t reset_sctlr;
uint64_t pmceid0; uint64_t pmceid0;
uint64_t pmceid1; uint64_t pmceid1;
uint64_t clidr;
uint64_t mp_affinity; /* MP ID without feature bits */ uint64_t mp_affinity; /* MP ID without feature bits */
/* The elements of this array are the CCSIDR values for each cache, /* The elements of this array are the CCSIDR values for each cache,
* in the order L1DCache, L1ICache, L2DCache, L2ICache, etc. * in the order L1DCache, L1ICache, L2DCache, L2ICache, etc.
@ -2945,7 +2944,7 @@ static inline bool arm_v7m_csselr_razwi(ARMCPU *cpu)
/* If all the CLIDR.Ctypem bits are 0 there are no caches, and /* If all the CLIDR.Ctypem bits are 0 there are no caches, and
* CSSELR is RAZ/WI. * CSSELR is RAZ/WI.
*/ */
return (cpu->clidr & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0; return (GET_IDREG(&cpu->isar, CLIDR) & R_V7M_CLIDR_CTYPE_ALL_MASK) != 0;
} }
static inline bool arm_sctlr_b(CPUARMState *env) static inline bool arm_sctlr_b(CPUARMState *env)

View File

@ -683,7 +683,7 @@ static void aarch64_a57_initfn(Object *obj)
cpu->isar.dbgdevid = 0x01110f13; cpu->isar.dbgdevid = 0x01110f13;
cpu->isar.dbgdevid1 = 0x2; cpu->isar.dbgdevid1 = 0x2;
cpu->isar.reset_pmcr_el0 = 0x41013000; cpu->isar.reset_pmcr_el0 = 0x41013000;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
/* 32KB L1 dcache */ /* 32KB L1 dcache */
cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
/* 48KB L1 icache */ /* 48KB L1 icache */
@ -745,7 +745,7 @@ static void aarch64_a53_initfn(Object *obj)
cpu->isar.dbgdevid = 0x00110f13; cpu->isar.dbgdevid = 0x00110f13;
cpu->isar.dbgdevid1 = 0x1; cpu->isar.dbgdevid1 = 0x1;
cpu->isar.reset_pmcr_el0 = 0x41033000; cpu->isar.reset_pmcr_el0 = 0x41033000;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
/* 32KB L1 dcache */ /* 32KB L1 dcache */
cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
/* 32KB L1 icache */ /* 32KB L1 icache */

View File

@ -7889,7 +7889,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
.access = PL1_R, .type = ARM_CP_CONST, .access = PL1_R, .type = ARM_CP_CONST,
.accessfn = access_tid4, .accessfn = access_tid4,
.fgt = FGT_CLIDR_EL1, .fgt = FGT_CLIDR_EL1,
.resetvalue = cpu->clidr .resetvalue = GET_IDREG(isar, CLIDR)
}; };
define_one_arm_cp_reg(cpu, &clidr); define_one_arm_cp_reg(cpu, &clidr);
define_arm_cp_regs(cpu, v7_cp_reginfo); define_arm_cp_regs(cpu, v7_cp_reginfo);

View File

@ -195,7 +195,7 @@ static void cortex_m33_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR4, 0x01310132); SET_IDREG(isar, ID_ISAR4, 0x01310132);
SET_IDREG(isar, ID_ISAR5, 0x00000000); SET_IDREG(isar, ID_ISAR5, 0x00000000);
SET_IDREG(isar, ID_ISAR6, 0x00000000); SET_IDREG(isar, ID_ISAR6, 0x00000000);
cpu->clidr = 0x00000000; SET_IDREG(isar, CLIDR, 0x00000000);
cpu->ctr = 0x8000c000; cpu->ctr = 0x8000c000;
} }
@ -233,7 +233,7 @@ static void cortex_m55_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR4, 0x01310132); SET_IDREG(isar, ID_ISAR4, 0x01310132);
SET_IDREG(isar, ID_ISAR5, 0x00000000); SET_IDREG(isar, ID_ISAR5, 0x00000000);
SET_IDREG(isar, ID_ISAR6, 0x00000000); SET_IDREG(isar, ID_ISAR6, 0x00000000);
cpu->clidr = 0x00000000; /* caches not implemented */ SET_IDREG(isar, CLIDR, 0x00000000); /* caches not implemented */
cpu->ctr = 0x8303c003; cpu->ctr = 0x8303c003;
} }

View File

@ -371,7 +371,7 @@ static void cortex_a8_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR3, 0x11112131); SET_IDREG(isar, ID_ISAR3, 0x11112131);
SET_IDREG(isar, ID_ISAR4, 0x00111142); SET_IDREG(isar, ID_ISAR4, 0x00111142);
cpu->isar.dbgdidr = 0x15141000; cpu->isar.dbgdidr = 0x15141000;
cpu->clidr = (1 << 27) | (2 << 24) | 3; SET_IDREG(isar, CLIDR, (1 << 27) | (2 << 24) | 3);
cpu->ccsidr[0] = 0xe007e01a; /* 16k L1 dcache. */ cpu->ccsidr[0] = 0xe007e01a; /* 16k L1 dcache. */
cpu->ccsidr[1] = 0x2007e01a; /* 16k L1 icache. */ cpu->ccsidr[1] = 0x2007e01a; /* 16k L1 icache. */
cpu->ccsidr[2] = 0xf0000000; /* No L2 icache. */ cpu->ccsidr[2] = 0xf0000000; /* No L2 icache. */
@ -447,7 +447,7 @@ static void cortex_a9_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR3, 0x11112131); SET_IDREG(isar, ID_ISAR3, 0x11112131);
SET_IDREG(isar, ID_ISAR4, 0x00111142); SET_IDREG(isar, ID_ISAR4, 0x00111142);
cpu->isar.dbgdidr = 0x35141000; cpu->isar.dbgdidr = 0x35141000;
cpu->clidr = (1 << 27) | (1 << 24) | 3; SET_IDREG(isar, CLIDR, (1 << 27) | (1 << 24) | 3);
cpu->ccsidr[0] = 0xe00fe019; /* 16k L1 dcache. */ cpu->ccsidr[0] = 0xe00fe019; /* 16k L1 dcache. */
cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */ cpu->ccsidr[1] = 0x200fe019; /* 16k L1 icache. */
cpu->isar.reset_pmcr_el0 = 0x41093000; cpu->isar.reset_pmcr_el0 = 0x41093000;
@ -519,7 +519,7 @@ static void cortex_a7_initfn(Object *obj)
cpu->isar.dbgdidr = 0x3515f005; cpu->isar.dbgdidr = 0x3515f005;
cpu->isar.dbgdevid = 0x01110f13; cpu->isar.dbgdevid = 0x01110f13;
cpu->isar.dbgdevid1 = 0x1; cpu->isar.dbgdevid1 = 0x1;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */ cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */
cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */ cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */
cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */ cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */
@ -567,7 +567,7 @@ static void cortex_a15_initfn(Object *obj)
cpu->isar.dbgdidr = 0x3515f021; cpu->isar.dbgdidr = 0x3515f021;
cpu->isar.dbgdevid = 0x01110f13; cpu->isar.dbgdevid = 0x01110f13;
cpu->isar.dbgdevid1 = 0x0; cpu->isar.dbgdevid1 = 0x0;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */ cpu->ccsidr[0] = 0x701fe00a; /* 32K L1 dcache */
cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */ cpu->ccsidr[1] = 0x201fe00a; /* 32K L1 icache */
cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */ cpu->ccsidr[2] = 0x711fe07a; /* 4096K L2 unified cache */
@ -758,7 +758,7 @@ static void cortex_r52_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR4, 0x00010142); SET_IDREG(isar, ID_ISAR4, 0x00010142);
SET_IDREG(isar, ID_ISAR5, 0x00010001); SET_IDREG(isar, ID_ISAR5, 0x00010001);
cpu->isar.dbgdidr = 0x77168000; cpu->isar.dbgdidr = 0x77168000;
cpu->clidr = (1 << 27) | (1 << 24) | 0x3; SET_IDREG(isar, CLIDR, (1 << 27) | (1 << 24) | 0x3);
cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */ cpu->ccsidr[0] = 0x700fe01a; /* 32KB L1 dcache */
cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */ cpu->ccsidr[1] = 0x201fe00a; /* 32KB L1 icache */
@ -990,7 +990,7 @@ static void arm_max_initfn(Object *obj)
SET_IDREG(isar, ID_ISAR5, 0x00011121); SET_IDREG(isar, ID_ISAR5, 0x00011121);
SET_IDREG(isar, ID_ISAR6, 0); SET_IDREG(isar, ID_ISAR6, 0);
cpu->isar.reset_pmcr_el0 = 0x41013000; cpu->isar.reset_pmcr_el0 = 0x41013000;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */ cpu->ccsidr[0] = 0x701fe00a; /* 32KB L1 dcache */
cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */ cpu->ccsidr[1] = 0x201fe012; /* 48KB L1 icache */
cpu->ccsidr[2] = 0x70ffe07a; /* 2048KB L2 cache */ cpu->ccsidr[2] = 0x70ffe07a; /* 2048KB L2 cache */

View File

@ -71,7 +71,7 @@ static void aarch64_a35_initfn(Object *obj)
SET_IDREG(isar, ID_AA64ISAR1, 0); SET_IDREG(isar, ID_AA64ISAR1, 0);
SET_IDREG(isar, ID_AA64MMFR0, 0x00101122); SET_IDREG(isar, ID_AA64MMFR0, 0x00101122);
SET_IDREG(isar, ID_AA64MMFR1, 0); SET_IDREG(isar, ID_AA64MMFR1, 0);
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
/* From B2.4 AArch64 Virtual Memory control registers */ /* From B2.4 AArch64 Virtual Memory control registers */
@ -216,7 +216,7 @@ static void aarch64_a55_initfn(Object *obj)
set_feature(&cpu->env, ARM_FEATURE_PMU); set_feature(&cpu->env, ARM_FEATURE_PMU);
/* Ordered by B2.4 AArch64 registers by functional group */ /* Ordered by B2.4 AArch64 registers by functional group */
cpu->clidr = 0x82000023; SET_IDREG(isar, CLIDR, 0x82000023);
cpu->ctr = 0x84448004; /* L1Ip = VIPT */ cpu->ctr = 0x84448004; /* L1Ip = VIPT */
cpu->dcz_blocksize = 4; /* 64 bytes */ cpu->dcz_blocksize = 4; /* 64 bytes */
SET_IDREG(isar, ID_AA64DFR0, 0x0000000010305408ull); SET_IDREG(isar, ID_AA64DFR0, 0x0000000010305408ull);
@ -317,7 +317,7 @@ static void aarch64_a72_initfn(Object *obj)
cpu->isar.dbgdevid = 0x01110f13; cpu->isar.dbgdevid = 0x01110f13;
cpu->isar.dbgdevid1 = 0x2; cpu->isar.dbgdevid1 = 0x2;
cpu->isar.reset_pmcr_el0 = 0x41023000; cpu->isar.reset_pmcr_el0 = 0x41023000;
cpu->clidr = 0x0a200023; SET_IDREG(isar, CLIDR, 0x0a200023);
/* 32KB L1 dcache */ /* 32KB L1 dcache */
cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7); cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 64, 32 * KiB, 7);
/* 48KB L1 dcache */ /* 48KB L1 dcache */
@ -349,7 +349,7 @@ static void aarch64_a76_initfn(Object *obj)
set_feature(&cpu->env, ARM_FEATURE_PMU); set_feature(&cpu->env, ARM_FEATURE_PMU);
/* Ordered by B2.4 AArch64 registers by functional group */ /* Ordered by B2.4 AArch64 registers by functional group */
cpu->clidr = 0x82000023; SET_IDREG(isar, CLIDR, 0x82000023);
cpu->ctr = 0x8444C004; cpu->ctr = 0x8444C004;
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
SET_IDREG(isar, ID_AA64DFR0, 0x0000000010305408ull); SET_IDREG(isar, ID_AA64DFR0, 0x0000000010305408ull);
@ -436,7 +436,7 @@ static void aarch64_a64fx_initfn(Object *obj)
SET_IDREG(isar, ID_AA64ISAR0, 0x0000000010211120); SET_IDREG(isar, ID_AA64ISAR0, 0x0000000010211120);
SET_IDREG(isar, ID_AA64ISAR1, 0x0000000000010001); SET_IDREG(isar, ID_AA64ISAR1, 0x0000000000010001);
SET_IDREG(isar, ID_AA64ZFR0, 0x0000000000000000); SET_IDREG(isar, ID_AA64ZFR0, 0x0000000000000000);
cpu->clidr = 0x0000000080000023; SET_IDREG(isar, CLIDR, 0x0000000080000023);
/* 64KB L1 dcache */ /* 64KB L1 dcache */
cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 7); cpu->ccsidr[0] = make_ccsidr(CCSIDR_FORMAT_LEGACY, 4, 256, 64 * KiB, 7);
/* 64KB L1 icache */ /* 64KB L1 icache */
@ -597,7 +597,7 @@ static void aarch64_neoverse_n1_initfn(Object *obj)
set_feature(&cpu->env, ARM_FEATURE_PMU); set_feature(&cpu->env, ARM_FEATURE_PMU);
/* Ordered by B2.4 AArch64 registers by functional group */ /* Ordered by B2.4 AArch64 registers by functional group */
cpu->clidr = 0x82000023; SET_IDREG(isar, CLIDR, 0x82000023);
cpu->ctr = 0x8444c004; cpu->ctr = 0x8444c004;
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
SET_IDREG(isar, ID_AA64DFR0, 0x0000000110305408ull); SET_IDREG(isar, ID_AA64DFR0, 0x0000000110305408ull);
@ -673,7 +673,7 @@ static void aarch64_neoverse_v1_initfn(Object *obj)
set_feature(&cpu->env, ARM_FEATURE_PMU); set_feature(&cpu->env, ARM_FEATURE_PMU);
/* Ordered by 3.2.4 AArch64 registers by functional group */ /* Ordered by 3.2.4 AArch64 registers by functional group */
cpu->clidr = 0x82000023; SET_IDREG(isar, CLIDR, 0x82000023);
cpu->ctr = 0xb444c004; /* With DIC and IDC set */ cpu->ctr = 0xb444c004; /* With DIC and IDC set */
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
SET_IDREG(isar, ID_AA64AFR0, 0x00000000); SET_IDREG(isar, ID_AA64AFR0, 0x00000000);
@ -934,7 +934,7 @@ static void aarch64_a710_initfn(Object *obj)
SET_IDREG(isar, ID_AA64MMFR0, 0x0000022200101122ull); SET_IDREG(isar, ID_AA64MMFR0, 0x0000022200101122ull);
SET_IDREG(isar, ID_AA64MMFR1, 0x0000000010212122ull); SET_IDREG(isar, ID_AA64MMFR1, 0x0000000010212122ull);
SET_IDREG(isar, ID_AA64MMFR2, 0x1221011110101011ull); SET_IDREG(isar, ID_AA64MMFR2, 0x1221011110101011ull);
cpu->clidr = 0x0000001482000023ull; SET_IDREG(isar, CLIDR, 0x0000001482000023ull);
cpu->gm_blocksize = 4; cpu->gm_blocksize = 4;
cpu->ctr = 0x000000049444c004ull; cpu->ctr = 0x000000049444c004ull;
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
@ -1036,7 +1036,7 @@ static void aarch64_neoverse_n2_initfn(Object *obj)
SET_IDREG(isar, ID_AA64MMFR0, 0x0000022200101125ull); SET_IDREG(isar, ID_AA64MMFR0, 0x0000022200101125ull);
SET_IDREG(isar, ID_AA64MMFR1, 0x0000000010212122ull); SET_IDREG(isar, ID_AA64MMFR1, 0x0000000010212122ull);
SET_IDREG(isar, ID_AA64MMFR2, 0x1221011112101011ull); SET_IDREG(isar, ID_AA64MMFR2, 0x1221011112101011ull);
cpu->clidr = 0x0000001482000023ull; SET_IDREG(isar, CLIDR, 0x0000001482000023ull);
cpu->gm_blocksize = 4; cpu->gm_blocksize = 4;
cpu->ctr = 0x00000004b444c004ull; cpu->ctr = 0x00000004b444c004ull;
cpu->dcz_blocksize = 4; cpu->dcz_blocksize = 4;
@ -1125,10 +1125,10 @@ void aarch64_max_tcg_initfn(Object *obj)
* We're going to set FEAT_S2FWB, which mandates that CLIDR_EL1.{LoUU,LoUIS} * We're going to set FEAT_S2FWB, which mandates that CLIDR_EL1.{LoUU,LoUIS}
* are zero. * are zero.
*/ */
u = cpu->clidr; u = GET_IDREG(isar, CLIDR);
u = FIELD_DP32(u, CLIDR_EL1, LOUIS, 0); u = FIELD_DP32(u, CLIDR_EL1, LOUIS, 0);
u = FIELD_DP32(u, CLIDR_EL1, LOUU, 0); u = FIELD_DP32(u, CLIDR_EL1, LOUU, 0);
cpu->clidr = u; SET_IDREG(isar, CLIDR, u);
/* /*
* Set CTR_EL0.DIC and IDC to tell the guest it doesnt' need to * Set CTR_EL0.DIC and IDC to tell the guest it doesnt' need to