@samitouri / QOSamiQemu / commits / 5dd83f42eb

target/arm: Add FGWTE3_EL3

Reviewed-by: Peter Maydell <peter.maydell@linaro.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Message-id: 20260806172709.333300-2-richard.henderson@linaro.org Signed-off-by: Peter Maydell <peter.maydell@linaro.org>

Richard Henderson committed Aug 6, 2026 at 10:27 UTC 5dd83f42eb6f05f8986cd4fc0d69b3732d3fa47f
4 files changed +27 -1
target/arm/cpregs.h
+1
@@ -385,6 +385,7 @@ typedef enum CPAccessResult {
385 /* Indexes into fgt_write[] */
386 #define FGTREG_HFGWTR 0
387 #define FGTREG_HDFGWTR 1
388 +#define FGTREG_FGWTE3 2
389 /* Indexes into fgt_exec[] */
390 #define FGTREG_HFGITR 0
391
target/arm/cpu-features.h
+5
@@ -1467,6 +1467,11 @@ static inline bool isar_feature_aa64_asid2(const ARMISARegisters *id)
1467 return FIELD_EX64_IDREG(id, ID_AA64MMFR4, ASID2) != 0;
1468 }
1469
1470 +static inline bool isar_feature_aa64_fgwte3(const ARMISARegisters *id)
1471 +{
1472 + return FIELD_EX64_IDREG(id, ID_AA64MMFR4, FGWTE3) != 0;
1473 +}
1474 +
1475 /*
1476 * Note the E2H0 ID fields is signed, increasingly negative as more
1477 * isn't implemented.
target/arm/cpu.h
+1 -1
@@ -553,7 +553,7 @@ typedef struct CPUArchState {
553 * FEAT_FGT2 will add more elements to these arrays.
554 */
555 uint64_t fgt_read[2]; /* HFGRTR, HDFGRTR */
556 - uint64_t fgt_write[2]; /* HFGWTR, HDFGWTR */
556 + uint64_t fgt_write[3]; /* HFGWTR, HDFGWTR, FGWTE3 */
557 uint64_t fgt_exec[1]; /* HFGITR */
558
559 /* RME registers */
target/arm/helper.c
+20
@@ -6394,6 +6394,22 @@ static const ARMCPRegInfo fpmr_reginfo[] = {
6394 }
6395 };
6396
6397 +static void fgwte3_write(CPUARMState *env, const ARMCPRegInfo *ri,
6398 + uint64_t value)
6399 +{
6400 + /* All bits are W1S and can only be cleared by cpu reset. */
6401 + env->cp15.fgt_write[FGTREG_FGWTE3] |= value;
6402 +}
6403 +
6404 +static const ARMCPRegInfo fgwte3_reginfo[] = {
6405 + { .name = "FGWTE3_EL3", .state = ARM_CP_STATE_AA64,
6406 + .opc0 = 3, .opc1 = 6, .crn = 1, .crm = 1, .opc2 = 5,
6407 + .access = PL3_RW, .resetvalue = 0,
6408 + .writefn = fgwte3_write, .raw_writefn = raw_write,
6409 + .fieldoffset = offsetof(CPUARMState, cp15.fgt_write[FGTREG_FGWTE3])
6410 + },
6411 +};
6412 +
6413 void register_cp_regs_for_features(ARMCPU *cpu)
6414 {
6415 /* Register all the coprocessor registers based on feature bits */
@@ -7705,6 +7721,10 @@ void register_cp_regs_for_features(ARMCPU *cpu)
7721 define_arm_cp_regs(cpu, ccsidr2_reginfo);
7722 }
7723
7724 + if (cpu_isar_feature(aa64_fgwte3, cpu)) {
7725 + define_arm_cp_regs(cpu, fgwte3_reginfo);
7726 + }
7727 +
7728 define_pm_cpregs(cpu);
7729 define_gcs_cpregs(cpu);
7730 }