From nobody Mon Dec 1 21:31:21 2025 Received: from mail-wm1-f52.google.com (mail-wm1-f52.google.com [209.85.128.52]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id AAF7C3358C0 for ; Mon, 1 Dec 2025 16:41:49 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=209.85.128.52 ARC-Seal: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764607311; cv=none; b=usDVx6zKt6j8obLffKQo1JwOfEsUfpJHzMmZb1XDkKTuUjxICUh5eHpz+DjDhvLyGP4xbnwbW39d2rM6p+ncmHbZCKVJNnziYScJKiTqZIMiRpgCBCSvTVgH8hPNMcHcEuk0iboIySdCa/A16Ph64mq+Fw+sh2lJpQqdbchlhoI= ARC-Message-Signature: i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1764607311; c=relaxed/simple; bh=SLaYdEHzakF3Enk+K7jxOiLbeMI4gzx9C/7lLRmhoNw=; h=From:Date:Subject:MIME-Version:Content-Type:Message-Id:References: In-Reply-To:To:Cc; b=nvYdG/lqOtJ9MxOCgiIf1zkEu22uu6B23hC6fMlqJ8h7D9LzotrEfC192mKw06O/qbH9fCh1NGPOl1G6K1fUPNGMmWn5w8zYPASpOmx918PjCKb1TDhSttVGPyjuGrNqqpZz1ordImjlWwtFLRtkh4C4w3z6QM3UuHlQK4YWinM= ARC-Authentication-Results: i=1; smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org; spf=pass smtp.mailfrom=linaro.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b=oHx9GypC; arc=none smtp.client-ip=209.85.128.52 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=none dis=none) header.from=linaro.org Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=linaro.org Authentication-Results: smtp.subspace.kernel.org; dkim=pass (2048-bit key) header.d=linaro.org header.i=@linaro.org header.b="oHx9GypC" Received: by mail-wm1-f52.google.com with SMTP id 5b1f17b1804b1-477bf34f5f5so28748465e9.0 for ; Mon, 01 Dec 2025 08:41:49 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linaro.org; s=google; t=1764607308; x=1765212108; darn=vger.kernel.org; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:from:to:cc:subject:date:message-id :reply-to; bh=zABew4dqD3IbbU1tyEn5D3f43+dljvZpz0Ak8Px/2GQ=; b=oHx9GypCoLmeOj6LIKUPjtJWrIB/4TU0QXWpk3PAhBo1RyX2VnxABhTekpiOKYVDQz UR+U3vnRuXBU2fBpges4cva9KFWnJD6++L3eHBfp4KtvElIvPPr0YfxXn03fWfMsfNnU ++TA8qiAa4hNV/J/58ftq8SLu201wYikiwXCSM97RRnjl8HewpA4PS583HdP1QiSrYsP hLZDzF9x9V8x993nDNcvyxkmUFZxyHdMI1hHW0aZDQPCud5RmgvXzBVwvLGqBXHV99dX 3Ve5xeCyu/ARWWNCHpxQY0Jrq8b0hmecTQsvmubO4NgUCsdjf7tOsW2PtHw6ItVhQ38A qbeg== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1764607308; x=1765212108; h=cc:to:in-reply-to:references:message-id:content-transfer-encoding :mime-version:subject:date:from:x-gm-gg:x-gm-message-state:from:to :cc:subject:date:message-id:reply-to; bh=zABew4dqD3IbbU1tyEn5D3f43+dljvZpz0Ak8Px/2GQ=; b=fySkI2oHqrUrpwzdoMGr+5Fj1cYrce8rK2SdfhU6xsHiIvgLJHmhzR5ezsEO3gFG1L oAvSJvT7LE3Ltriw5e7RN4C+WiZQrKlQFs3MU5X7PTeKjuT80Y6nDAAS/yQ3d8fe0hel vfJrGbanVHGOdvetlYR9OvZL1LZife+NSG4Osj2OTlq2JD1bIp1Ui+eHj8L4GQ3nDSZs tyjn8NOmaS219kMwXtbW6KvtqtrjGOkWHHp2K3dhg0yiGoVDMNRX6jE3tXkdhhqKn3ma o8ePulfB8gWgP02PU5CcdHB/mzEcC0X6/P+NrIluWDRS8a5OAeg2VKmLpq3X3UvBpcD2 Qk1Q== X-Forwarded-Encrypted: i=1; AJvYcCUPkcvowyHP46cWZSgIwwQh6gpZlGCzftYA2RvvT+JWvAV5d2EaUZfeMy1Zs3eXJ34EqAxHECLIEL7i5sw=@vger.kernel.org X-Gm-Message-State: AOJu0Yw0dvt0ZvbqKSWEywklYeYS5TWcFTuiNkDNKPue0sLhgUx9OZZ2 /s+ukH+ZgIfLCMUIkdjfuVDQIqlChJBfevKMQAdh366IewxYMexful09NaujCgfMMY4= X-Gm-Gg: ASbGncuH9E42qT5/FsgUS+d1iWx7fD363zfTxNF67Xkp3gGN46qpi4TiySZ/uIkq7v/ Jt62osC7EyBLya0/lyaVwGMnTvjlPEJ7rSun+smbDcGbeuK1RVG/yMr1VVXwVt5CnYwPq+6HlN1 7vS2ZYPg+SZI5e6gLDSFeVoZkRa653jC3wj5G6oNw9WtIJwDlaugTHIgdZ5ryXlISAWBT0Dh9VU wYacNWvbmpVZl6XvJii/tuKHgNP4cgLtSROGbIuEOlmT4TbSOIkTeQKa6hnqYmXLgmIZ4nmZ2Ny aagdLcW9X9h31wq1eziFS7NsRCK1CPelUB7wHPErSHSF58Z/H1BjW0O64/PRNhQeM/N2faMHJZG 6RdAbN4Fpdd7tXLl/XsiirFN5mmnn2hpt0FqnFq3fuHpkM/GSoEk99hPH2FBSWpPEa9f0j+m55o b030zzgfO0uLbID9jlGrbsi7Lpu/N45gw= X-Google-Smtp-Source: AGHT+IH4qlSHOHlP9FoC3pEYptApY3iIhEO5qtBZvowYnB5XerIVCpLZUtOXG+kLqnlpOo12ry8aAw== X-Received: by 2002:a05:600c:4685:b0:477:5b0a:e616 with SMTP id 5b1f17b1804b1-47904acaf28mr248918075e9.5.1764607307979; Mon, 01 Dec 2025 08:41:47 -0800 (PST) Received: from ho-tower-lan.lan ([185.48.77.170]) by smtp.gmail.com with ESMTPSA id 5b1f17b1804b1-4791164d4f3sm255901275e9.13.2025.12.01.08.41.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 01 Dec 2025 08:41:47 -0800 (PST) From: James Clark Date: Mon, 01 Dec 2025 16:41:07 +0000 Subject: [PATCH 4/7] perf cs-etm: Don't use hard coded config bits when setting up ETMCR Precedence: bulk X-Mailing-List: linux-kernel@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: quoted-printable Message-Id: <20251201-james-perf-config-bits-v1-4-22ecbbf8007c@linaro.org> References: <20251201-james-perf-config-bits-v1-0-22ecbbf8007c@linaro.org> In-Reply-To: <20251201-james-perf-config-bits-v1-0-22ecbbf8007c@linaro.org> To: Peter Zijlstra , Ingo Molnar , Arnaldo Carvalho de Melo , Namhyung Kim , Mark Rutland , Alexander Shishkin , Jiri Olsa , Ian Rogers , Adrian Hunter , Suzuki K Poulose , Mike Leach , John Garry , Will Deacon , Leo Yan Cc: linux-perf-users@vger.kernel.org, linux-kernel@vger.kernel.org, coresight@lists.linaro.org, linux-arm-kernel@lists.infradead.org, James Clark X-Mailer: b4 0.14.0 Perf only looks at attr.config when determining what was programmed into ETMCR. These bits could theoretically be in any of the config fields. Add a generic helper to find the value of any named format field in any config field and then use it to get the attributes relevant to ETMCR. The kernel will also stop publishing the ETMCR register bits in a header [1] so preempt that by defining them here. [1]: https://lore.kernel.org/linux-arm-kernel/20251128-james-cs-syncfreq-v8= -10-4d319764cc58@linaro.org/ Signed-off-by: James Clark --- tools/perf/arch/arm/util/cs-etm.c | 35 ++++++++++++++++++++++++++++++++++- tools/perf/util/evsel.h | 2 ++ tools/perf/util/pmu.c | 33 +++++++++++++++++++++++++++++++++ 3 files changed, 69 insertions(+), 1 deletion(-) diff --git a/tools/perf/arch/arm/util/cs-etm.c b/tools/perf/arch/arm/util/c= s-etm.c index 22c6272e8c36..414cafb21c98 100644 --- a/tools/perf/arch/arm/util/cs-etm.c +++ b/tools/perf/arch/arm/util/cs-etm.c @@ -68,6 +68,12 @@ static const char * const metadata_ete_ro[] =3D { =20 enum cs_etm_version { CS_NOT_PRESENT, CS_ETMV3, CS_ETMV4, CS_ETE }; =20 + +/* ETMv3 ETMCR register bits */ +#define ETMCR_CYC_ACC BIT(12) +#define ETMCR_TIMESTAMP_EN BIT(28) +#define ETMCR_RETURN_STACK BIT(29) + static bool cs_etm_is_ete(struct perf_pmu *cs_etm_pmu, struct perf_cpu cpu= ); static int cs_etm_get_ro(struct perf_pmu *pmu, struct perf_cpu cpu, const = char *path, __u64 *val); static bool cs_etm_pmu_path_exists(struct perf_pmu *pmu, struct perf_cpu c= pu, const char *path); @@ -487,6 +493,33 @@ static int cs_etm_recording_options(struct auxtrace_re= cord *itr, return err; } =20 +static u64 cs_etm_guess_etmcr(struct auxtrace_record *itr) +{ + struct cs_etm_recording *ptr =3D + container_of(itr, struct cs_etm_recording, itr); + struct perf_pmu *cs_etm_pmu =3D ptr->cs_etm_pmu; + struct evsel *evsel =3D cs_etm_get_evsel(ptr->evlist, cs_etm_pmu); + u64 etmcr =3D 0; + u64 val; + + if (!evsel) + return 0; + + /* + * Roughly guess what the kernel programmed into ETMCR based on + * what options the event was opened with. This doesn't have to be + * complete or 100% accurate, not all bits used by OpenCSD anyway. + */ + if (!evsel__get_config_val(cs_etm_pmu, evsel, "cycacc", &val) && val) + etmcr |=3D ETMCR_CYC_ACC; + if (!evsel__get_config_val(cs_etm_pmu, evsel, "timestamp", &val) && val) + etmcr |=3D ETMCR_TIMESTAMP_EN; + if (!evsel__get_config_val(cs_etm_pmu, evsel, "retstack", &val) && val) + etmcr |=3D ETMCR_RETURN_STACK; + + return etmcr; +} + static u64 cs_etm_get_config(struct auxtrace_record *itr) { struct cs_etm_recording *ptr =3D @@ -746,7 +779,7 @@ static void cs_etm_get_metadata(struct perf_cpu cpu, u3= 2 *offset, case CS_ETMV3: magic =3D __perf_cs_etmv3_magic; /* Get configuration register */ - info->priv[*offset + CS_ETM_ETMCR] =3D cs_etm_get_config(itr); + info->priv[*offset + CS_ETM_ETMCR] =3D cs_etm_guess_etmcr(itr); /* traceID set to legacy value in case new perf running on old system */ info->priv[*offset + CS_ETM_ETMTRACEIDR] =3D cs_etm_get_legacy_trace_id(= cpu); /* Get read-only information from sysFS */ diff --git a/tools/perf/util/evsel.h b/tools/perf/util/evsel.h index 3ae4ac8f9a37..1c567cc70a82 100644 --- a/tools/perf/util/evsel.h +++ b/tools/perf/util/evsel.h @@ -574,6 +574,8 @@ void evsel__uniquify_counter(struct evsel *counter); ((((src) >> (pos)) & ((1ull << (size)) - 1)) << (63 - ((pos) + (size) - 1= ))) =20 u64 evsel__bitfield_swap_branch_flags(u64 value); +int evsel__get_config_val(struct perf_pmu *pmu, struct evsel *evsel, + const char *config_name, u64 *val); void evsel__set_config_if_unset(struct perf_pmu *pmu, struct evsel *evsel, const char *config_name, u64 val); =20 diff --git a/tools/perf/util/pmu.c b/tools/perf/util/pmu.c index c8968cddc0a9..5501b0230097 100644 --- a/tools/perf/util/pmu.c +++ b/tools/perf/util/pmu.c @@ -1384,6 +1384,39 @@ pmu_find_format(const struct list_head *formats, con= st char *name) return NULL; } =20 +int evsel__get_config_val(struct perf_pmu *pmu, struct evsel *evsel, + const char *config_name, u64 *val) +{ + struct perf_pmu_format *format =3D pmu_find_format(&pmu->format, config_n= ame); + u64 bits =3D perf_pmu__format_bits(pmu, config_name); + + if (!format || !bits) { + pr_err("Unknown/empty format name: %s\n", config_name); + return -EINVAL; + } + + switch (format->value) { + case PERF_PMU_FORMAT_VALUE_CONFIG: + *val =3D FIELD_GET(bits, evsel->core.attr.config); + return 0; + case PERF_PMU_FORMAT_VALUE_CONFIG1: + *val =3D FIELD_GET(bits, evsel->core.attr.config1); + return 0; + case PERF_PMU_FORMAT_VALUE_CONFIG2: + *val =3D FIELD_GET(bits, evsel->core.attr.config2); + return 0; + case PERF_PMU_FORMAT_VALUE_CONFIG3: + *val =3D FIELD_GET(bits, evsel->core.attr.config3); + return 0; + case PERF_PMU_FORMAT_VALUE_CONFIG4: + *val =3D FIELD_GET(bits, evsel->core.attr.config4); + return 0; + default: + pr_err("Unknown format value: %d\n", format->value); + return -EINVAL; + } +} + /* * Set @config_name to @val as long as the user hasn't already set or clea= red it * by passing a config term on the command line. --=20 2.34.1