target/arm: PMU: Set PMCR.N to 4

This both advertises that we support four counters and enables them
because the pmu_num_counters() reads this value from PMCR.

Signed-off-by: Aaron Lindsay <alindsay@codeaurora.org>
Signed-off-by: Aaron Lindsay <aaron@os.amperecomputing.com>
Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Message-id: 20181211151945.29137-13-aaron@os.amperecomputing.com
Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Aaron Lindsay 2019-01-21 10:23:14 +00:00 committed by Peter Maydell
parent b2e2372511
commit ac689a2e51

View File

@ -1777,7 +1777,7 @@ static const ARMCPRegInfo v7_cp_reginfo[] = {
.access = PL1_W, .type = ARM_CP_NOP }, .access = PL1_W, .type = ARM_CP_NOP },
/* Performance monitors are implementation defined in v7, /* Performance monitors are implementation defined in v7,
* but with an ARM recommended set of registers, which we * but with an ARM recommended set of registers, which we
* follow (although we don't actually implement any counters) * follow.
* *
* Performance registers fall into three categories: * Performance registers fall into three categories:
* (a) always UNDEF in PL0, RW in PL1 (PMINTENSET, PMINTENCLR) * (a) always UNDEF in PL0, RW in PL1 (PMINTENSET, PMINTENCLR)
@ -5671,10 +5671,10 @@ void register_cp_regs_for_features(ARMCPU *cpu)
} }
if (arm_feature(env, ARM_FEATURE_V7)) { if (arm_feature(env, ARM_FEATURE_V7)) {
/* v7 performance monitor control register: same implementor /* v7 performance monitor control register: same implementor
* field as main ID register, and we implement only the cycle * field as main ID register, and we implement four counters in
* count register. * addition to the cycle count register.
*/ */
unsigned int i, pmcrn = 0; unsigned int i, pmcrn = 4;
ARMCPRegInfo pmcr = { ARMCPRegInfo pmcr = {
.name = "PMCR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 0, .name = "PMCR", .cp = 15, .crn = 9, .crm = 12, .opc1 = 0, .opc2 = 0,
.access = PL0_RW, .access = PL0_RW,
@ -5689,7 +5689,7 @@ void register_cp_regs_for_features(ARMCPU *cpu)
.access = PL0_RW, .accessfn = pmreg_access, .access = PL0_RW, .accessfn = pmreg_access,
.type = ARM_CP_IO, .type = ARM_CP_IO,
.fieldoffset = offsetof(CPUARMState, cp15.c9_pmcr), .fieldoffset = offsetof(CPUARMState, cp15.c9_pmcr),
.resetvalue = cpu->midr & 0xff000000, .resetvalue = (cpu->midr & 0xff000000) | (pmcrn << PMCRN_SHIFT),
.writefn = pmcr_write, .raw_writefn = raw_write, .writefn = pmcr_write, .raw_writefn = raw_write,
}; };
define_one_arm_cp_reg(cpu, &pmcr); define_one_arm_cp_reg(cpu, &pmcr);