From fab9ae05cd0670456716a21c5b50f22c095fa2ff Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Mon, 6 Jan 2025 16:34:46 -0800 Subject: [PATCH 1/2] make sure PMUs are not in use when running the metrics command --- cmd/metrics/metrics.go | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/cmd/metrics/metrics.go b/cmd/metrics/metrics.go index b2b01c85..0ddcbefe 100644 --- a/cmd/metrics/metrics.go +++ b/cmd/metrics/metrics.go @@ -806,6 +806,25 @@ func prepareTarget(targetContext *targetContext, targetTempRoot string, localTem channelError <- targetError{target: myTarget, err: err} return } + // make sure PMUs are not in use on target + output, err := script.RunScript(myTarget, script.GetScriptByName(script.PMUBusyScriptName), localTempDir) + if err != nil { + err = fmt.Errorf("failed to check if PMUs are in use: %w", err) + _ = statusUpdate(myTarget.GetName(), fmt.Sprintf("Error: %v", err)) + targetContext.err = err + channelError <- targetError{target: myTarget, err: err} + return + } + for _, line := range strings.Split(output.Stdout, "\n") { + // if one of the MSR registers is active (ignore cpu_cycles), then the PMU is in use + if strings.Contains(line, "Active") && !strings.Contains(line, "0x30a") { + err = fmt.Errorf("PMU in use on target: %s", line) + _ = statusUpdate(myTarget.GetName(), fmt.Sprintf("Error: %v", err)) + targetContext.err = err + channelError <- targetError{target: myTarget, err: err} + return + } + } // check if NMI watchdog is enabled and disable it if necessary if !flagNoRoot { var nmiWatchdogEnabled bool From 0cec79c7d3cdef5c99c7e4b0430ff996b171e28a Mon Sep 17 00:00:00 2001 From: "Harper, Jason M" Date: Tue, 7 Jan 2025 09:59:12 -0800 Subject: [PATCH 2/2] only check for busy PMUs on Intel processors --- cmd/metrics/metrics.go | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) diff --git a/cmd/metrics/metrics.go b/cmd/metrics/metrics.go index 0ddcbefe..e203faff 100644 --- a/cmd/metrics/metrics.go +++ b/cmd/metrics/metrics.go @@ -807,23 +807,25 @@ func prepareTarget(targetContext *targetContext, targetTempRoot string, localTem return } // make sure PMUs are not in use on target - output, err := script.RunScript(myTarget, script.GetScriptByName(script.PMUBusyScriptName), localTempDir) - if err != nil { - err = fmt.Errorf("failed to check if PMUs are in use: %w", err) - _ = statusUpdate(myTarget.GetName(), fmt.Sprintf("Error: %v", err)) - targetContext.err = err - channelError <- targetError{target: myTarget, err: err} - return - } - for _, line := range strings.Split(output.Stdout, "\n") { - // if one of the MSR registers is active (ignore cpu_cycles), then the PMU is in use - if strings.Contains(line, "Active") && !strings.Contains(line, "0x30a") { - err = fmt.Errorf("PMU in use on target: %s", line) + if family, err := myTarget.GetFamily(); err == nil && family == "6" { + output, err := script.RunScript(myTarget, script.GetScriptByName(script.PMUBusyScriptName), localTempDir) + if err != nil { + err = fmt.Errorf("failed to check if PMUs are in use: %w", err) _ = statusUpdate(myTarget.GetName(), fmt.Sprintf("Error: %v", err)) targetContext.err = err channelError <- targetError{target: myTarget, err: err} return } + for _, line := range strings.Split(output.Stdout, "\n") { + // if one of the MSR registers is active (ignore cpu_cycles), then the PMU is in use + if strings.Contains(line, "Active") && !strings.Contains(line, "0x30a") { + err = fmt.Errorf("PMU in use on target: %s", line) + _ = statusUpdate(myTarget.GetName(), fmt.Sprintf("Error: %v", err)) + targetContext.err = err + channelError <- targetError{target: myTarget, err: err} + return + } + } } // check if NMI watchdog is enabled and disable it if necessary if !flagNoRoot {