arch-arm: Add support to exit the simloop on PMU interrupt
Add an option `exitOnPMUInterrupt` to ArmPMU. The PMU is often used to identify and demark regions of interest in a workload intended for sampled simulation (e.g. fast-forward, warm-up, detailed simulation). Often the PMU is enabled and disabled to demark these regions, but for some workloads PMU interrupts are used to count committed instructions directly. This patch adds the option to exit the simulation loop when a PMU interrupt is triggered so additional simulation control can be effected (e.g. stats dump/reset, CPU switch, etc). Change-Id: Ife02fe8e467dec91a2d4fda3f7dc9540a092f1ec Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/69958 Maintainer: Jason Lowe-Power <power.jg@gmail.com> Tested-by: kokoro <noreply+kokoro@google.com> Reviewed-by: Jason Lowe-Power <power.jg@gmail.com>
This commit is contained in:
@@ -218,6 +218,7 @@ class ArmPMU(SimObject):
|
||||
exitOnPMUControl = Param.Bool(
|
||||
False, "Exit on PMU enable, disable, or reset"
|
||||
)
|
||||
exitOnPMUInterrupt = Param.Bool(False, "Exit on PMU interrupt")
|
||||
|
||||
# 64-bit PMU event counters are officially supported when
|
||||
# Armv8.5-A FEAT_PMUv3p5 is implemented. This parameter is not a
|
||||
|
||||
@@ -68,7 +68,8 @@ PMU::PMU(const ArmPMUParams &p)
|
||||
swIncrementEvent(nullptr),
|
||||
reg_pmcr_conf(0),
|
||||
interrupt(nullptr),
|
||||
exitOnPMUControl(p.exitOnPMUControl)
|
||||
exitOnPMUControl(p.exitOnPMUControl),
|
||||
exitOnPMUInterrupt(p.exitOnPMUInterrupt)
|
||||
{
|
||||
DPRINTF(PMUVerbose, "Initializing the PMU.\n");
|
||||
|
||||
@@ -677,6 +678,10 @@ PMU::setOverflowStatus(RegVal new_val)
|
||||
void
|
||||
PMU::raiseInterrupt()
|
||||
{
|
||||
if (exitOnPMUInterrupt) {
|
||||
inform("Exiting simulation: PMU interrupt detected");
|
||||
exitSimLoop("performance counter interrupt", 0);
|
||||
}
|
||||
if (interrupt) {
|
||||
DPRINTF(PMUVerbose, "Delivering PMU interrupt.\n");
|
||||
interrupt->raise();
|
||||
|
||||
@@ -638,6 +638,10 @@ class PMU : public SimObject, public ArmISA::BaseISADevice
|
||||
*/
|
||||
const bool exitOnPMUControl;
|
||||
|
||||
/**
|
||||
* Exit simloop on PMU interrupt
|
||||
*/
|
||||
bool exitOnPMUInterrupt;
|
||||
};
|
||||
|
||||
} // namespace ArmISA
|
||||
|
||||
@@ -52,6 +52,7 @@ class ExitEvent(Enum):
|
||||
PERF_COUNTER_ENABLE = "performance counter enabled"
|
||||
PERF_COUNTER_DISABLE = "performance counter disabled"
|
||||
PERF_COUNTER_RESET = "performance counter reset"
|
||||
PERF_COUNTER_INTERRUPT = "performance counter interrupt"
|
||||
|
||||
@classmethod
|
||||
def translate_exit_status(cls, exit_string: str) -> "ExitEvent":
|
||||
@@ -99,6 +100,8 @@ class ExitEvent(Enum):
|
||||
return ExitEvent.PERF_COUNTER_DISABLE
|
||||
elif exit_string == "performance counter reset":
|
||||
return ExitEvent.PERF_COUNTER_RESET
|
||||
elif exit_string == "performance counter interrupt":
|
||||
return ExitEvent.PERF_COUNTER_INTERRUPT
|
||||
elif exit_string.endswith("will terminate the simulation.\n"):
|
||||
# This is for the traffic generator exit event
|
||||
return ExitEvent.EXIT
|
||||
|
||||
Reference in New Issue
Block a user