Skip to content

Commit 80d2b43

Browse files
committed
target/arm: Make writes to MDCR_EL3 use PMU start/finish calls
In commit 0176538 we fixed a bug where we weren't correctly bracketing changes to some registers with pmu_op_start() and pmu_op_finish() calls for changes which affect whether the PMU counters might be enabled. However, we missed the case of writes to the AArch64 MDCR_EL3 register, because (unlike its AArch32 counterpart) they are currently done directly to the CPU state struct without going through the sdcr_write() function. Give MDCR_EL3 a writefn which handles the PMU start/finish calls. The SDCR writefn then simplfies to "call the MDCR_EL3 writefn after masking off the bits which don't exist in the AArch32 register". Signed-off-by: Peter Maydell <[email protected]> Reviewed-by: Richard Henderson <[email protected]> Message-id: [email protected]
1 parent 7f4fbfb commit 80d2b43

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

target/arm/helper.c

+14-4
Original file line numberDiff line numberDiff line change
@@ -4756,8 +4756,8 @@ static void sctlr_write(CPUARMState *env, const ARMCPRegInfo *ri,
47564756
}
47574757
}
47584758

4759-
static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
4760-
uint64_t value)
4759+
static void mdcr_el3_write(CPUARMState *env, const ARMCPRegInfo *ri,
4760+
uint64_t value)
47614761
{
47624762
/*
47634763
* Some MDCR_EL3 bits affect whether PMU counters are running:
@@ -4769,12 +4769,19 @@ static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
47694769
if (pmu_op) {
47704770
pmu_op_start(env);
47714771
}
4772-
env->cp15.mdcr_el3 = value & SDCR_VALID_MASK;
4772+
env->cp15.mdcr_el3 = value;
47734773
if (pmu_op) {
47744774
pmu_op_finish(env);
47754775
}
47764776
}
47774777

4778+
static void sdcr_write(CPUARMState *env, const ARMCPRegInfo *ri,
4779+
uint64_t value)
4780+
{
4781+
/* Not all bits defined for MDCR_EL3 exist in the AArch32 SDCR */
4782+
mdcr_el3_write(env, ri, value & SDCR_VALID_MASK);
4783+
}
4784+
47784785
static void mdcr_el2_write(CPUARMState *env, const ARMCPRegInfo *ri,
47794786
uint64_t value)
47804787
{
@@ -5122,9 +5129,12 @@ static const ARMCPRegInfo v8_cp_reginfo[] = {
51225129
.access = PL2_RW,
51235130
.fieldoffset = offsetof(CPUARMState, banked_spsr[BANK_FIQ]) },
51245131
{ .name = "MDCR_EL3", .state = ARM_CP_STATE_AA64,
5132+
.type = ARM_CP_IO,
51255133
.opc0 = 3, .opc1 = 6, .crn = 1, .crm = 3, .opc2 = 1,
51265134
.resetvalue = 0,
5127-
.access = PL3_RW, .fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
5135+
.access = PL3_RW,
5136+
.writefn = mdcr_el3_write,
5137+
.fieldoffset = offsetof(CPUARMState, cp15.mdcr_el3) },
51285138
{ .name = "SDCR", .type = ARM_CP_ALIAS | ARM_CP_IO,
51295139
.cp = 15, .opc1 = 0, .crn = 1, .crm = 3, .opc2 = 1,
51305140
.access = PL1_RW, .accessfn = access_trap_aa32s_el1,

0 commit comments

Comments
 (0)