summaryrefslogtreecommitdiff
path: root/tools/perf/pmu-events/make_legacy_cache.py
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/pmu-events/make_legacy_cache.py')
-rwxr-xr-xtools/perf/pmu-events/make_legacy_cache.py129
1 files changed, 129 insertions, 0 deletions
diff --git a/tools/perf/pmu-events/make_legacy_cache.py b/tools/perf/pmu-events/make_legacy_cache.py
new file mode 100755
index 000000000000..28a1ff804f86
--- /dev/null
+++ b/tools/perf/pmu-events/make_legacy_cache.py
@@ -0,0 +1,129 @@
+#!/usr/bin/env python3
+# SPDX-License-Identifier: (LGPL-2.1 OR BSD-2-Clause)
+import json
+
+hw_cache_id = [
+ (0, # PERF_COUNT_HW_CACHE_L1D
+ ["L1-dcache", "l1-d", "l1d", "L1-data",],
+ [0, 1, 2,], # read, write, prefetch
+ "Level 1 data cache",
+ ),
+ (1, # PERF_COUNT_HW_CACHE_L1I
+ ["L1-icache", "l1-i", "l1i", "L1-instruction",],
+ [0, 2,], # read, prefetch
+ "Level 1 instruction cache",
+ ),
+ (2, # PERF_COUNT_HW_CACHE_LL
+ ["LLC", "L2"],
+ [0, 1, 2,], # read, write, prefetch
+ "Last level cache",
+ ),
+ (3, # PERF_COUNT_HW_CACHE_DTLB
+ ["dTLB", "d-tlb", "Data-TLB",],
+ [0, 1, 2,], # read, write, prefetch
+ "Data TLB",
+ ),
+ (4, # PERF_COUNT_HW_CACHE_ITLB
+ ["iTLB", "i-tlb", "Instruction-TLB",],
+ [0,], # read
+ "Instruction TLB",
+ ),
+ (5, # PERF_COUNT_HW_CACHE_BPU
+ ["branch", "branches", "bpu", "btb", "bpc",],
+ [0,], # read
+ "Branch prediction unit",
+ ),
+ (6, # PERF_COUNT_HW_CACHE_NODE
+ ["node",],
+ [0, 1, 2,], # read, write, prefetch
+ "Local memory",
+ ),
+]
+
+hw_cache_op = [
+ (0, # PERF_COUNT_HW_CACHE_OP_READ
+ ["load", "loads", "read",],
+ "read"),
+ (1, # PERF_COUNT_HW_CACHE_OP_WRITE
+ ["store", "stores", "write",],
+ "write"),
+ (2, # PERF_COUNT_HW_CACHE_OP_PREFETCH
+ ["prefetch", "prefetches", "speculative-read", "speculative-load",],
+ "prefetch"),
+]
+
+hw_cache_result = [
+ (0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
+ ["refs", "Reference", "ops", "access",],
+ "accesses"),
+ (1, # PERF_COUNT_HW_CACHE_RESULT_MISS
+ ["misses", "miss",],
+ "misses"),
+]
+
+events = []
+def add_event(name: str,
+ cache_id: int, cache_op: int, cache_result: int,
+ desc: str,
+ deprecated: bool) -> None:
+ # Avoid conflicts with PERF_TYPE_HARDWARE events which are higher priority.
+ if name in ["branch-misses", "branches"]:
+ return
+
+ # Tweak and deprecate L2 named events.
+ if name.startswith("L2"):
+ desc = desc.replace("Last level cache", "Level 2 (or higher) last level cache")
+ deprecated = True
+
+ event = {
+ "EventName": name,
+ "BriefDescription": desc,
+ "LegacyCacheCode": f"0x{cache_id | (cache_op << 8) | (cache_result << 16):06x}",
+ }
+
+ # Deprecate events with the name starting L2 as it is actively
+ # confusing as on many machines it actually means the L3 cache.
+ if deprecated:
+ event["Deprecated"] = "1"
+ events.append(event)
+
+for (cache_id, names, ops, cache_desc) in hw_cache_id:
+ for name in names:
+ add_event(name,
+ cache_id,
+ 0, # PERF_COUNT_HW_CACHE_OP_READ
+ 0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
+ f"{cache_desc} read accesses.",
+ deprecated=True)
+
+ for (op, op_names, op_desc) in hw_cache_op:
+ if op not in ops:
+ continue
+ for op_name in op_names:
+ deprecated = (names[0] != name or op_names[1] != op_name)
+ add_event(f"{name}-{op_name}",
+ cache_id,
+ op,
+ 0, # PERF_COUNT_HW_CACHE_RESULT_ACCESS
+ f"{cache_desc} {op_desc} accesses.",
+ deprecated)
+
+ for (result, result_names, result_desc) in hw_cache_result:
+ for result_name in result_names:
+ deprecated = ((names[0] != name or op_names[0] != op_name) or
+ (result == 0) or (result_names[0] != result_name))
+ add_event(f"{name}-{op_name}-{result_name}",
+ cache_id, op, result,
+ f"{cache_desc} {op_desc} {result_desc}.",
+ deprecated)
+
+ for (result, result_names, result_desc) in hw_cache_result:
+ for result_name in result_names:
+ add_event(f"{name}-{result_name}",
+ cache_id,
+ 0, # PERF_COUNT_HW_CACHE_OP_READ
+ result,
+ f"{cache_desc} read {result_desc}.",
+ deprecated=True)
+
+print(json.dumps(events, indent=2))