@@ -76,7 +76,7 @@ const EVENT_TYPES =
76
76
(:stalled_cycles_backend , 8 ), # PERF_COUNT_HW_STALLED_CYCLES_BACKEND
77
77
(:scaled_cycles , 9 ) # PERF_COUNT_HW_REF_CPU_CYCLES
78
78
]),
79
- (:sw , 1 , # PERF_TYPE_SOFTWARE
79
+ (:sw , PERF_TYPE_SOFTWARE,
80
80
[(:cpu_clock , 0 ), # PERF_COUNT_SW_CPU_CLOCK
81
81
(:task_clock , 1 ), # PEF_COUNT_SW_TASK_CLOCK
82
82
(:page_faults , 2 ), # PERF_COUNT_SW_PAGE_FAULTS
@@ -414,9 +414,47 @@ const NAME_TO_EVENT = Dict(
414
414
" iTLB-load-misses" => EventType (:cache , :TLB_insn , :read , :miss ),
415
415
" iTLB-loads" => EventType (:cache , :TLB_insn , :read , :access ),
416
416
)
417
-
418
417
const EVENT_TO_NAME = Dict (event => name for (name, event) in NAME_TO_EVENT)
419
418
419
+ function is_supported (event:: EventType )
420
+ attr = perf_event_attr ()
421
+ attr. typ = event. category
422
+ attr. size = sizeof (perf_event_attr)
423
+ attr. config = event. event
424
+ fd = perf_event_open (attr, 0 , - 1 , - 1 , 0 )
425
+ if fd ≥ 0
426
+ ret = ccall (:close , Cint, (Cint,), fd)
427
+ if ret != 0
428
+ @warn " failed to close file descriptor for some reason"
429
+ end
430
+ return true
431
+ end
432
+ return false
433
+ end
434
+
435
+ is_supported (name:: AbstractString ) = haskey (NAME_TO_EVENT, name) && is_supported (NAME_TO_EVENT[name])
436
+
437
+ function list ()
438
+ for t in [PERF_TYPE_HARDWARE, PERF_TYPE_SOFTWARE, PERF_TYPE_HW_CACHE]
439
+ events = collect (filter (x -> x[2 ]. category == t, NAME_TO_EVENT))
440
+ sort! (events, by = x -> x[1 ]) # sort events by name
441
+ if t == PERF_TYPE_HARDWARE
442
+ println (" hardware:" )
443
+ elseif t == PERF_TYPE_SOFTWARE
444
+ println (" software:" )
445
+ elseif t == PERF_TYPE_HW_CACHE
446
+ println (" cache:" )
447
+ else
448
+ @assert false
449
+ end
450
+ for (name, event) in events
451
+ @printf " %-25s%s" name (is_supported (event) ? " supported" : " not supported" )
452
+ println ()
453
+ end
454
+ t != PERF_TYPE_HW_CACHE && println ()
455
+ end
456
+ end
457
+
420
458
function parse_pstats_options (opts)
421
459
# default events
422
460
events = parse_groups ("
0 commit comments