[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for-7.0 v7 07/10] target/ppc/power8-pmu.c: handle overflow bits w
From: |
Daniel Henrique Barboza |
Subject: |
[PATCH for-7.0 v7 07/10] target/ppc/power8-pmu.c: handle overflow bits when PMU is running |
Date: |
Fri, 19 Nov 2021 15:22:13 -0300 |
Up until this moment we were assuming that the counter negative
enabled bits, PMC1CE and PMCjCE, would never be changed when the
PMU is already started.
Turns out that there is no such restriction in the PowerISA v3.1,
and software can enable/disable overflow conditions of the counters
at any time.
To support this scenario, track the overflow bits state when a
write in MMCR0 is made in which the run state of the PMU (MMCR0_FC
bit) didn't change and, if some overflow bit were changed in the
middle of a cycle count session, restart it.
Signed-off-by: Daniel Henrique Barboza <danielhb413@gmail.com>
---
target/ppc/power8-pmu.c | 26 +++++++++++++++++++++-----
1 file changed, 21 insertions(+), 5 deletions(-)
diff --git a/target/ppc/power8-pmu.c b/target/ppc/power8-pmu.c
index ed7fd0c898..1dfe4bc930 100644
--- a/target/ppc/power8-pmu.c
+++ b/target/ppc/power8-pmu.c
@@ -285,15 +285,31 @@ void helper_store_mmcr0(CPUPPCState *env, target_ulong
value)
start_cycle_count_session(env);
}
} else {
- /*
- * No change in MMCR0_FC state but, if the PMU is running and
- * a change in one of the frozen counter bits is made, update
- * the PMCs with the cycles counted so far.
- */
if (!curr_FC) {
+ bool cycles_updated = false;
+
+ /*
+ * No change in MMCR0_FC state but, if the PMU is running and
+ * a change in one of the frozen counter bits is made, update
+ * the PMCs with the cycles counted so far.
+ */
if ((curr_value & MMCR0_FC14) != (value & MMCR0_FC14) ||
(curr_value & MMCR0_FC56) != (value & MMCR0_FC56)) {
pmu_update_cycles(env, curr_value);
+ cycles_updated = true;
+ }
+
+ /*
+ * If changes in the overflow bits were made, start a new
+ * cycle count session to restart the appropriate overflow
+ * timers.
+ */
+ if ((curr_value & MMCR0_PMC1CE) != (value & MMCR0_PMC1CE) ||
+ (curr_value & MMCR0_PMCjCE) != (value & MMCR0_PMCjCE)) {
+ if (!cycles_updated) {
+ pmu_update_cycles(env, curr_value);
+ }
+ start_cycle_count_session(env);
}
}
}
--
2.31.1
- [PATCH for-7.0 v7 00/10] PMU-EBB support for PPC64 TCG, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 01/10] target/ppc: introduce PMUEventType and PMU overflow timers, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 02/10] target/ppc: PMU basic cycle count for pseries TCG, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 03/10] target/ppc: enable PMU counter overflow with cycle events, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 04/10] target/ppc: enable PMU instruction count, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 07/10] target/ppc/power8-pmu.c: handle overflow bits when PMU is running,
Daniel Henrique Barboza <=
- [PATCH for-7.0 v7 05/10] target/ppc/power8-pmu.c: add PM_RUN_INST_CMPL (0xFA) event, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 06/10] target/ppc: PMU: handle setting of PMCs while running, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 08/10] PPC64/TCG: Implement 'rfebb' instruction, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 09/10] target/ppc: PMU Event-Based exception support, Daniel Henrique Barboza, 2021/11/19
- [PATCH for-7.0 v7 10/10] target/ppc/excp_helper.c: EBB handling adjustments, Daniel Henrique Barboza, 2021/11/19