raw_write(env, ri, old | value);
}
+static void gic_ppi_cpend_write(CPUARMState *env, const ARMCPRegInfo *ri,
+ uint64_t value)
+{
+ uint64_t old = raw_read(env, ri);
+ /* If ICC_PPI_HMR_EL1[n].HM is 1, PEND bits are RO */
+ uint64_t hm = env->gicv5_cpuif.ppi_hm[ri->opc2 & 1];
+ value &= ~hm;
+ raw_write(env, ri, old & ~value);
+}
+
+static void gic_ppi_spend_write(CPUARMState *env, const ARMCPRegInfo *ri,
+ uint64_t value)
+{
+ uint64_t old = raw_read(env, ri);
+ /* If ICC_PPI_HMR_EL1[n].HM is 1, PEND bits are RO */
+ uint64_t hm = env->gicv5_cpuif.ppi_hm[ri->opc2 & 1];
+ value &= ~hm;
+ raw_write(env, ri, old | value);
+}
+
static const ARMCPRegInfo gicv5_cpuif_reginfo[] = {
/*
* Barrier: wait until the effects of a cpuif system register
.fieldoffset = offsetof(CPUARMState, gicv5_cpuif.ppi_hm[1]),
.resetvalue = PPI_HMR1_RESET,
},
+ { .name = "ICC_PPI_CPENDR0_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 13, .opc2 = 4,
+ .access = PL1_RW, .type = ARM_CP_ALIAS | ARM_CP_IO | ARM_CP_NO_RAW,
+ .fieldoffset = offsetof(CPUARMState, gicv5_cpuif.ppi_pend[0]),
+ .writefn = gic_ppi_cpend_write,
+ },
+ { .name = "ICC_PPI_CPENDR1_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 13, .opc2 = 5,
+ .access = PL1_RW, .type = ARM_CP_ALIAS | ARM_CP_IO | ARM_CP_NO_RAW,
+ .fieldoffset = offsetof(CPUARMState, gicv5_cpuif.ppi_pend[1]),
+ .writefn = gic_ppi_cpend_write,
+ },
+ { .name = "ICC_PPI_SPENDR0_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 13, .opc2 = 6,
+ .access = PL1_RW, .type = ARM_CP_IO | ARM_CP_NO_RAW,
+ .fieldoffset = offsetof(CPUARMState, gicv5_cpuif.ppi_pend[0]),
+ .writefn = gic_ppi_spend_write,
+ },
+ { .name = "ICC_PPI_SPENDR0_EL1", .state = ARM_CP_STATE_AA64,
+ .opc0 = 3, .opc1 = 0, .crn = 12, .crm = 13, .opc2 = 7,
+ .access = PL1_RW, .type = ARM_CP_IO | ARM_CP_NO_RAW,
+ .fieldoffset = offsetof(CPUARMState, gicv5_cpuif.ppi_pend[1]),
+ .writefn = gic_ppi_spend_write,
+ },
};
void define_gicv5_cpuif_regs(ARMCPU *cpu)