162306a36Sopenharmony_ci# perf script event handlers, generated by perf script -g perl
262306a36Sopenharmony_ci# (c) 2009, Tom Zanussi <tzanussi@gmail.com>
362306a36Sopenharmony_ci# Licensed under the terms of the GNU GPL License version 2
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci# This script tests basic functionality such as flag and symbol
662306a36Sopenharmony_ci# strings, common_xxx() calls back into perf, begin, end, unhandled
762306a36Sopenharmony_ci# events, etc.  Basically, if this script runs successfully and
862306a36Sopenharmony_ci# displays expected results, perl scripting support should be ok.
962306a36Sopenharmony_ci
1062306a36Sopenharmony_ciuse lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib";
1162306a36Sopenharmony_ciuse lib "./Perf-Trace-Util/lib";
1262306a36Sopenharmony_ciuse Perf::Trace::Core;
1362306a36Sopenharmony_ciuse Perf::Trace::Context;
1462306a36Sopenharmony_ciuse Perf::Trace::Util;
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cisub trace_begin
1762306a36Sopenharmony_ci{
1862306a36Sopenharmony_ci    print "trace_begin\n";
1962306a36Sopenharmony_ci}
2062306a36Sopenharmony_ci
2162306a36Sopenharmony_cisub trace_end
2262306a36Sopenharmony_ci{
2362306a36Sopenharmony_ci    print "trace_end\n";
2462306a36Sopenharmony_ci
2562306a36Sopenharmony_ci    print_unhandled();
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cisub irq::softirq_entry
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
3162306a36Sopenharmony_ci	    $common_pid, $common_comm, $common_callchain,
3262306a36Sopenharmony_ci	    $vec) = @_;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	print_header($event_name, $common_cpu, $common_secs, $common_nsecs,
3562306a36Sopenharmony_ci		     $common_pid, $common_comm);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_ci	print_uncommon($context);
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci	printf("vec=%s\n",
4062306a36Sopenharmony_ci	       symbol_str("irq::softirq_entry", "vec", $vec));
4162306a36Sopenharmony_ci}
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cisub kmem::kmalloc
4462306a36Sopenharmony_ci{
4562306a36Sopenharmony_ci	my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
4662306a36Sopenharmony_ci	    $common_pid, $common_comm, $common_callchain,
4762306a36Sopenharmony_ci	    $call_site, $ptr, $bytes_req, $bytes_alloc,
4862306a36Sopenharmony_ci	    $gfp_flags) = @_;
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_ci	print_header($event_name, $common_cpu, $common_secs, $common_nsecs,
5162306a36Sopenharmony_ci		     $common_pid, $common_comm);
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_ci	print_uncommon($context);
5462306a36Sopenharmony_ci
5562306a36Sopenharmony_ci	printf("call_site=%p, ptr=%p, bytes_req=%u, bytes_alloc=%u, ".
5662306a36Sopenharmony_ci	       "gfp_flags=%s\n",
5762306a36Sopenharmony_ci	       $call_site, $ptr, $bytes_req, $bytes_alloc,
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_ci	       flag_str("kmem::kmalloc", "gfp_flags", $gfp_flags));
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_ci# print trace fields not included in handler args
6362306a36Sopenharmony_cisub print_uncommon
6462306a36Sopenharmony_ci{
6562306a36Sopenharmony_ci    my ($context) = @_;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci    printf("common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, ",
6862306a36Sopenharmony_ci	   common_pc($context), trace_flag_str(common_flags($context)),
6962306a36Sopenharmony_ci	   common_lock_depth($context));
7062306a36Sopenharmony_ci
7162306a36Sopenharmony_ci}
7262306a36Sopenharmony_ci
7362306a36Sopenharmony_cimy %unhandled;
7462306a36Sopenharmony_ci
7562306a36Sopenharmony_cisub print_unhandled
7662306a36Sopenharmony_ci{
7762306a36Sopenharmony_ci    if ((scalar keys %unhandled) == 0) {
7862306a36Sopenharmony_ci	return;
7962306a36Sopenharmony_ci    }
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci    print "\nunhandled events:\n\n";
8262306a36Sopenharmony_ci
8362306a36Sopenharmony_ci    printf("%-40s  %10s\n", "event", "count");
8462306a36Sopenharmony_ci    printf("%-40s  %10s\n", "----------------------------------------",
8562306a36Sopenharmony_ci	   "-----------");
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci    foreach my $event_name (keys %unhandled) {
8862306a36Sopenharmony_ci	printf("%-40s  %10d\n", $event_name, $unhandled{$event_name});
8962306a36Sopenharmony_ci    }
9062306a36Sopenharmony_ci}
9162306a36Sopenharmony_ci
9262306a36Sopenharmony_cisub trace_unhandled
9362306a36Sopenharmony_ci{
9462306a36Sopenharmony_ci    my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs,
9562306a36Sopenharmony_ci	$common_pid, $common_comm, $common_callchain) = @_;
9662306a36Sopenharmony_ci
9762306a36Sopenharmony_ci    $unhandled{$event_name}++;
9862306a36Sopenharmony_ci}
9962306a36Sopenharmony_ci
10062306a36Sopenharmony_cisub print_header
10162306a36Sopenharmony_ci{
10262306a36Sopenharmony_ci	my ($event_name, $cpu, $secs, $nsecs, $pid, $comm) = @_;
10362306a36Sopenharmony_ci
10462306a36Sopenharmony_ci	printf("%-20s %5u %05u.%09u %8u %-20s ",
10562306a36Sopenharmony_ci	       $event_name, $cpu, $secs, $nsecs, $pid, $comm);
10662306a36Sopenharmony_ci}
107