| #!/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)) |