diff options
Diffstat (limited to 'tools/perf/scripts')
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/Context.c | 134 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/Context.xs | 41 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL | 11 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/README | 34 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm | 55 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm | 35 | ||||
-rw-r--r-- | tools/perf/scripts/perl/Perf-Trace-Util/typemap | 1 | ||||
-rw-r--r-- | tools/perf/scripts/perl/check-perf-trace.pl | 106 |
8 files changed, 409 insertions, 8 deletions
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/Context.c b/tools/perf/scripts/perl/Perf-Trace-Util/Context.c new file mode 100644 index 000000000000..3ba3ffc54164 --- /dev/null +++ b/tools/perf/scripts/perl/Perf-Trace-Util/Context.c | |||
@@ -0,0 +1,134 @@ | |||
1 | /* | ||
2 | * This file was generated automatically by ExtUtils::ParseXS version 2.18_02 from the | ||
3 | * contents of Context.xs. Do not edit this file, edit Context.xs instead. | ||
4 | * | ||
5 | * ANY CHANGES MADE HERE WILL BE LOST! | ||
6 | * | ||
7 | */ | ||
8 | |||
9 | #line 1 "Context.xs" | ||
10 | /* | ||
11 | * Context.xs. XS interfaces for perf trace. | ||
12 | * | ||
13 | * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com> | ||
14 | * | ||
15 | * This program is free software; you can redistribute it and/or modify | ||
16 | * it under the terms of the GNU General Public License as published by | ||
17 | * the Free Software Foundation; either version 2 of the License, or | ||
18 | * (at your option) any later version. | ||
19 | * | ||
20 | * This program is distributed in the hope that it will be useful, | ||
21 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
22 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
23 | * GNU General Public License for more details. | ||
24 | * | ||
25 | * You should have received a copy of the GNU General Public License | ||
26 | * along with this program; if not, write to the Free Software | ||
27 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
28 | * | ||
29 | */ | ||
30 | |||
31 | #include "EXTERN.h" | ||
32 | #include "perl.h" | ||
33 | #include "XSUB.h" | ||
34 | #include "../../../util/trace-event-perl.h" | ||
35 | |||
36 | #ifndef PERL_UNUSED_VAR | ||
37 | # define PERL_UNUSED_VAR(var) if (0) var = var | ||
38 | #endif | ||
39 | |||
40 | #line 41 "Context.c" | ||
41 | |||
42 | XS(XS_Perf__Trace__Context_get_common_pc); /* prototype to pass -Wmissing-prototypes */ | ||
43 | XS(XS_Perf__Trace__Context_get_common_pc) | ||
44 | { | ||
45 | #ifdef dVAR | ||
46 | dVAR; dXSARGS; | ||
47 | #else | ||
48 | dXSARGS; | ||
49 | #endif | ||
50 | if (items != 1) | ||
51 | Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::get_common_pc", "context"); | ||
52 | PERL_UNUSED_VAR(cv); /* -W */ | ||
53 | { | ||
54 | struct scripting_context * context = INT2PTR(struct scripting_context *,SvIV(ST(0))); | ||
55 | int RETVAL; | ||
56 | dXSTARG; | ||
57 | |||
58 | RETVAL = get_common_pc(context); | ||
59 | XSprePUSH; PUSHi((IV)RETVAL); | ||
60 | } | ||
61 | XSRETURN(1); | ||
62 | } | ||
63 | |||
64 | |||
65 | XS(XS_Perf__Trace__Context_get_common_flags); /* prototype to pass -Wmissing-prototypes */ | ||
66 | XS(XS_Perf__Trace__Context_get_common_flags) | ||
67 | { | ||
68 | #ifdef dVAR | ||
69 | dVAR; dXSARGS; | ||
70 | #else | ||
71 | dXSARGS; | ||
72 | #endif | ||
73 | if (items != 1) | ||
74 | Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::get_common_flags", "context"); | ||
75 | PERL_UNUSED_VAR(cv); /* -W */ | ||
76 | { | ||
77 | struct scripting_context * context = INT2PTR(struct scripting_context *,SvIV(ST(0))); | ||
78 | int RETVAL; | ||
79 | dXSTARG; | ||
80 | |||
81 | RETVAL = get_common_flags(context); | ||
82 | XSprePUSH; PUSHi((IV)RETVAL); | ||
83 | } | ||
84 | XSRETURN(1); | ||
85 | } | ||
86 | |||
87 | |||
88 | XS(XS_Perf__Trace__Context_get_common_lock_depth); /* prototype to pass -Wmissing-prototypes */ | ||
89 | XS(XS_Perf__Trace__Context_get_common_lock_depth) | ||
90 | { | ||
91 | #ifdef dVAR | ||
92 | dVAR; dXSARGS; | ||
93 | #else | ||
94 | dXSARGS; | ||
95 | #endif | ||
96 | if (items != 1) | ||
97 | Perl_croak(aTHX_ "Usage: %s(%s)", "Perf::Trace::Context::get_common_lock_depth", "context"); | ||
98 | PERL_UNUSED_VAR(cv); /* -W */ | ||
99 | { | ||
100 | struct scripting_context * context = INT2PTR(struct scripting_context *,SvIV(ST(0))); | ||
101 | int RETVAL; | ||
102 | dXSTARG; | ||
103 | |||
104 | RETVAL = get_common_lock_depth(context); | ||
105 | XSprePUSH; PUSHi((IV)RETVAL); | ||
106 | } | ||
107 | XSRETURN(1); | ||
108 | } | ||
109 | |||
110 | #ifdef __cplusplus | ||
111 | extern "C" | ||
112 | #endif | ||
113 | XS(boot_Perf__Trace__Context); /* prototype to pass -Wmissing-prototypes */ | ||
114 | XS(boot_Perf__Trace__Context) | ||
115 | { | ||
116 | #ifdef dVAR | ||
117 | dVAR; dXSARGS; | ||
118 | #else | ||
119 | dXSARGS; | ||
120 | #endif | ||
121 | const char* file = __FILE__; | ||
122 | |||
123 | PERL_UNUSED_VAR(cv); /* -W */ | ||
124 | PERL_UNUSED_VAR(items); /* -W */ | ||
125 | XS_VERSION_BOOTCHECK ; | ||
126 | |||
127 | newXSproto("Perf::Trace::Context::get_common_pc", XS_Perf__Trace__Context_get_common_pc, file, "$"); | ||
128 | newXSproto("Perf::Trace::Context::get_common_flags", XS_Perf__Trace__Context_get_common_flags, file, "$"); | ||
129 | newXSproto("Perf::Trace::Context::get_common_lock_depth", XS_Perf__Trace__Context_get_common_lock_depth, file, "$"); | ||
130 | if (PL_unitcheckav) | ||
131 | call_list(PL_scopestack_ix, PL_unitcheckav); | ||
132 | XSRETURN_YES; | ||
133 | } | ||
134 | |||
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs b/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs new file mode 100644 index 000000000000..24facb3696d4 --- /dev/null +++ b/tools/perf/scripts/perl/Perf-Trace-Util/Context.xs | |||
@@ -0,0 +1,41 @@ | |||
1 | /* | ||
2 | * Context.xs. XS interfaces for perf trace. | ||
3 | * | ||
4 | * Copyright (C) 2009 Tom Zanussi <tzanussi@gmail.com> | ||
5 | * | ||
6 | * This program is free software; you can redistribute it and/or modify | ||
7 | * it under the terms of the GNU General Public License as published by | ||
8 | * the Free Software Foundation; either version 2 of the License, or | ||
9 | * (at your option) any later version. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, | ||
12 | * but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | ||
14 | * GNU General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA | ||
19 | * | ||
20 | */ | ||
21 | |||
22 | #include "EXTERN.h" | ||
23 | #include "perl.h" | ||
24 | #include "XSUB.h" | ||
25 | #include "../../../util/trace-event-perl.h" | ||
26 | |||
27 | MODULE = Perf::Trace::Context PACKAGE = Perf::Trace::Context | ||
28 | PROTOTYPES: ENABLE | ||
29 | |||
30 | int | ||
31 | get_common_pc(context) | ||
32 | struct scripting_context * context | ||
33 | |||
34 | int | ||
35 | get_common_flags(context) | ||
36 | struct scripting_context * context | ||
37 | |||
38 | int | ||
39 | get_common_lock_depth(context) | ||
40 | struct scripting_context * context | ||
41 | |||
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL b/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL index b0de02e6950d..decdeb0f6789 100644 --- a/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL +++ b/tools/perf/scripts/perl/Perf-Trace-Util/Makefile.PL | |||
@@ -3,10 +3,15 @@ use ExtUtils::MakeMaker; | |||
3 | # See lib/ExtUtils/MakeMaker.pm for details of how to influence | 3 | # See lib/ExtUtils/MakeMaker.pm for details of how to influence |
4 | # the contents of the Makefile that is written. | 4 | # the contents of the Makefile that is written. |
5 | WriteMakefile( | 5 | WriteMakefile( |
6 | NAME => 'Perf::Trace::Util', | 6 | NAME => 'Perf::Trace::Context', |
7 | VERSION_FROM => 'lib/Perf/Trace/Util.pm', # finds $VERSION | 7 | VERSION_FROM => 'lib/Perf/Trace/Context.pm', # finds $VERSION |
8 | PREREQ_PM => {}, # e.g., Module::Name => 1.1 | 8 | PREREQ_PM => {}, # e.g., Module::Name => 1.1 |
9 | ($] >= 5.005 ? ## Add these new keywords supported since 5.005 | 9 | ($] >= 5.005 ? ## Add these new keywords supported since 5.005 |
10 | (ABSTRACT_FROM => 'lib/Perf/Trace/Util.pm', # retrieve abstract from module | 10 | (ABSTRACT_FROM => 'lib/Perf/Trace/Context.pm', # retrieve abstract from module |
11 | AUTHOR => 'Tom Zanussi <tzanussi@gmail.com>') : ()), | 11 | AUTHOR => 'Tom Zanussi <tzanussi@gmail.com>') : ()), |
12 | LIBS => [''], # e.g., '-lm' | ||
13 | DEFINE => '-I ../..', # e.g., '-DHAVE_SOMETHING' | ||
14 | INC => '-I.', # e.g., '-I. -I/usr/include/other' | ||
15 | # Un-comment this if you add C files to link with later: | ||
16 | OBJECT => 'Context.o', # link all the C files too | ||
12 | ); | 17 | ); |
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/README b/tools/perf/scripts/perl/Perf-Trace-Util/README index 0a58378f0836..adb99aa3a7b8 100644 --- a/tools/perf/scripts/perl/Perf-Trace-Util/README +++ b/tools/perf/scripts/perl/Perf-Trace-Util/README | |||
@@ -3,6 +3,34 @@ Perf-Trace-Util version 0.01 | |||
3 | 3 | ||
4 | This module contains utility functions for use with perf trace. | 4 | This module contains utility functions for use with perf trace. |
5 | 5 | ||
6 | Core.pm and Util.pm are pure Perl modules; Core.pm contains routines | ||
7 | that the core perf support for Perl calls on and should always be | ||
8 | 'used', while Util.pm contains useful but optional utility functions | ||
9 | that scripts may want to use. Context.pm contains the Perl->C | ||
10 | interface that allows scripts to access data in the embedding perf | ||
11 | executable; scripts wishing to do that should 'use Context.pm'. | ||
12 | |||
13 | The Perl->C perf interface is completely driven by Context.xs. If you | ||
14 | want to add new Perl functions that end up accessing C data in the | ||
15 | perf executable, you add desciptions of the new functions here. | ||
16 | scripting_context is a pointer to the perf data in the perf executable | ||
17 | that you want to access - it's passed as the second parameter, | ||
18 | $context, to all handler functions. | ||
19 | |||
20 | After you do that: | ||
21 | |||
22 | perl Makefile.PL # to create a Makefile for the next step | ||
23 | make # to create Context.c | ||
24 | |||
25 | edit Context.c to add const to the char* file = __FILE__ line in | ||
26 | XS(boot_Perf__Trace__Context) to silence a warning/error. | ||
27 | |||
28 | You can delete the Makefile, object files and anything else that was | ||
29 | generated e.g. blib and shared library, etc, except for of course | ||
30 | Context.c | ||
31 | |||
32 | You should then be able to run the normal perf make as usual. | ||
33 | |||
6 | INSTALLATION | 34 | INSTALLATION |
7 | 35 | ||
8 | Building perf with perf trace Perl scripting should install this | 36 | Building perf with perf trace Perl scripting should install this |
@@ -15,12 +43,10 @@ DEPENDENCIES | |||
15 | 43 | ||
16 | This module requires these other modules and libraries: | 44 | This module requires these other modules and libraries: |
17 | 45 | ||
18 | blah blah blah | 46 | None |
19 | 47 | ||
20 | COPYRIGHT AND LICENCE | 48 | COPYRIGHT AND LICENCE |
21 | 49 | ||
22 | Put the correct copyright and licence information here. | ||
23 | |||
24 | Copyright (C) 2009 by Tom Zanussi <tzanussi@gmail.com> | 50 | Copyright (C) 2009 by Tom Zanussi <tzanussi@gmail.com> |
25 | 51 | ||
26 | This library is free software; you can redistribute it and/or modify | 52 | This library is free software; you can redistribute it and/or modify |
@@ -31,5 +57,3 @@ Alternatively, this software may be distributed under the terms of the | |||
31 | GNU General Public License ("GPL") version 2 as published by the Free | 57 | GNU General Public License ("GPL") version 2 as published by the Free |
32 | Software Foundation. | 58 | Software Foundation. |
33 | 59 | ||
34 | |||
35 | |||
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm b/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm new file mode 100644 index 000000000000..6c7f3659cb17 --- /dev/null +++ b/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Context.pm | |||
@@ -0,0 +1,55 @@ | |||
1 | package Perf::Trace::Context; | ||
2 | |||
3 | use 5.010000; | ||
4 | use strict; | ||
5 | use warnings; | ||
6 | |||
7 | require Exporter; | ||
8 | |||
9 | our @ISA = qw(Exporter); | ||
10 | |||
11 | our %EXPORT_TAGS = ( 'all' => [ qw( | ||
12 | ) ] ); | ||
13 | |||
14 | our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); | ||
15 | |||
16 | our @EXPORT = qw( | ||
17 | common_pc common_flags common_lock_depth | ||
18 | ); | ||
19 | |||
20 | our $VERSION = '0.01'; | ||
21 | |||
22 | require XSLoader; | ||
23 | XSLoader::load('Perf::Trace::Context', $VERSION); | ||
24 | |||
25 | 1; | ||
26 | __END__ | ||
27 | =head1 NAME | ||
28 | |||
29 | Perf::Trace::Context - Perl extension for accessing functions in perf. | ||
30 | |||
31 | =head1 SYNOPSIS | ||
32 | |||
33 | use Perf::Trace::Context; | ||
34 | |||
35 | =head1 SEE ALSO | ||
36 | |||
37 | Perf (trace) documentation | ||
38 | |||
39 | =head1 AUTHOR | ||
40 | |||
41 | Tom Zanussi, E<lt>tzanussi@gmail.com<gt> | ||
42 | |||
43 | =head1 COPYRIGHT AND LICENSE | ||
44 | |||
45 | Copyright (C) 2009 by Tom Zanussi | ||
46 | |||
47 | This library is free software; you can redistribute it and/or modify | ||
48 | it under the same terms as Perl itself, either Perl version 5.10.0 or, | ||
49 | at your option, any later version of Perl 5 you may have available. | ||
50 | |||
51 | Alternatively, this software may be distributed under the terms of the | ||
52 | GNU General Public License ("GPL") version 2 as published by the Free | ||
53 | Software Foundation. | ||
54 | |||
55 | =cut | ||
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm b/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm index fd250fb7be16..9df376a9f629 100644 --- a/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm +++ b/tools/perf/scripts/perl/Perf-Trace-Util/lib/Perf/Trace/Core.pm | |||
@@ -16,10 +16,45 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'} } ); | |||
16 | our @EXPORT = qw( | 16 | our @EXPORT = qw( |
17 | define_flag_field define_flag_value flag_str dump_flag_fields | 17 | define_flag_field define_flag_value flag_str dump_flag_fields |
18 | define_symbolic_field define_symbolic_value symbol_str dump_symbolic_fields | 18 | define_symbolic_field define_symbolic_value symbol_str dump_symbolic_fields |
19 | trace_flag_str | ||
19 | ); | 20 | ); |
20 | 21 | ||
21 | our $VERSION = '0.01'; | 22 | our $VERSION = '0.01'; |
22 | 23 | ||
24 | my %trace_flags = (0x00 => "NONE", | ||
25 | 0x01 => "IRQS_OFF", | ||
26 | 0x02 => "IRQS_NOSUPPORT", | ||
27 | 0x04 => "NEED_RESCHED", | ||
28 | 0x08 => "HARDIRQ", | ||
29 | 0x10 => "SOFTIRQ"); | ||
30 | |||
31 | sub trace_flag_str | ||
32 | { | ||
33 | my ($value) = @_; | ||
34 | |||
35 | my $string; | ||
36 | |||
37 | my $print_delim = 0; | ||
38 | |||
39 | foreach my $idx (sort {$a <=> $b} keys %trace_flags) { | ||
40 | if (!$value && !$idx) { | ||
41 | $string .= "NONE"; | ||
42 | last; | ||
43 | } | ||
44 | |||
45 | if ($idx && ($value & $idx) == $idx) { | ||
46 | if ($print_delim) { | ||
47 | $string .= " | "; | ||
48 | } | ||
49 | $string .= "$trace_flags{$idx}"; | ||
50 | $print_delim = 1; | ||
51 | $value &= ~$idx; | ||
52 | } | ||
53 | } | ||
54 | |||
55 | return $string; | ||
56 | } | ||
57 | |||
23 | my %flag_fields; | 58 | my %flag_fields; |
24 | my %symbolic_fields; | 59 | my %symbolic_fields; |
25 | 60 | ||
diff --git a/tools/perf/scripts/perl/Perf-Trace-Util/typemap b/tools/perf/scripts/perl/Perf-Trace-Util/typemap new file mode 100644 index 000000000000..840836804aa7 --- /dev/null +++ b/tools/perf/scripts/perl/Perf-Trace-Util/typemap | |||
@@ -0,0 +1 @@ | |||
struct scripting_context * T_PTR | |||
diff --git a/tools/perf/scripts/perl/check-perf-trace.pl b/tools/perf/scripts/perl/check-perf-trace.pl new file mode 100644 index 000000000000..4e7dc0a407a5 --- /dev/null +++ b/tools/perf/scripts/perl/check-perf-trace.pl | |||
@@ -0,0 +1,106 @@ | |||
1 | # perf trace event handlers, generated by perf trace -g perl | ||
2 | # (c) 2009, Tom Zanussi <tzanussi@gmail.com> | ||
3 | # Licensed under the terms of the GNU GPL License version 2 | ||
4 | |||
5 | # This script tests basic functionality such as flag and symbol | ||
6 | # strings, common_xxx() calls back into perf, begin, end, unhandled | ||
7 | # events, etc. Basically, if this script runs successfully and | ||
8 | # displays expected results, perl scripting support should be ok. | ||
9 | |||
10 | use lib "$ENV{'PERF_EXEC_PATH'}/scripts/perl/Perf-Trace-Util/lib"; | ||
11 | use lib "./Perf-Trace-Util/lib"; | ||
12 | use Perf::Trace::Core; | ||
13 | use Perf::Trace::Context; | ||
14 | use Perf::Trace::Util; | ||
15 | |||
16 | sub trace_begin | ||
17 | { | ||
18 | print "trace_begin\n"; | ||
19 | } | ||
20 | |||
21 | sub trace_end | ||
22 | { | ||
23 | print "trace_end\n"; | ||
24 | |||
25 | print_unhandled(); | ||
26 | } | ||
27 | |||
28 | sub irq::softirq_entry | ||
29 | { | ||
30 | my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, | ||
31 | $common_pid, $common_comm, | ||
32 | $vec) = @_; | ||
33 | |||
34 | print_header($event_name, $common_cpu, $common_secs, $common_nsecs, | ||
35 | $common_pid, $common_comm); | ||
36 | |||
37 | print_uncommon($context); | ||
38 | |||
39 | printf("vec=%s\n", | ||
40 | symbol_str("irq::softirq_entry", "vec", $vec)); | ||
41 | } | ||
42 | |||
43 | sub kmem::kmalloc | ||
44 | { | ||
45 | my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, | ||
46 | $common_pid, $common_comm, | ||
47 | $call_site, $ptr, $bytes_req, $bytes_alloc, | ||
48 | $gfp_flags) = @_; | ||
49 | |||
50 | print_header($event_name, $common_cpu, $common_secs, $common_nsecs, | ||
51 | $common_pid, $common_comm); | ||
52 | |||
53 | print_uncommon($context); | ||
54 | |||
55 | printf("call_site=%p, ptr=%p, bytes_req=%u, bytes_alloc=%u, ". | ||
56 | "gfp_flags=%s\n", | ||
57 | $call_site, $ptr, $bytes_req, $bytes_alloc, | ||
58 | |||
59 | flag_str("kmem::kmalloc", "gfp_flags", $gfp_flags)); | ||
60 | } | ||
61 | |||
62 | # print trace fields not included in handler args | ||
63 | sub print_uncommon | ||
64 | { | ||
65 | my ($context) = @_; | ||
66 | |||
67 | printf("common_preempt_count=%d, common_flags=%s, common_lock_depth=%d, ", | ||
68 | common_pc($context), trace_flag_str(common_flags($context)), | ||
69 | common_lock_depth($context)); | ||
70 | |||
71 | } | ||
72 | |||
73 | my %unhandled; | ||
74 | |||
75 | sub print_unhandled | ||
76 | { | ||
77 | if ((scalar keys %unhandled) == 0) { | ||
78 | return; | ||
79 | } | ||
80 | |||
81 | print "\nunhandled events:\n\n"; | ||
82 | |||
83 | printf("%-40s %10s\n", "event", "count"); | ||
84 | printf("%-40s %10s\n", "----------------------------------------", | ||
85 | "-----------"); | ||
86 | |||
87 | foreach my $event_name (keys %unhandled) { | ||
88 | printf("%-40s %10d\n", $event_name, $unhandled{$event_name}); | ||
89 | } | ||
90 | } | ||
91 | |||
92 | sub trace_unhandled | ||
93 | { | ||
94 | my ($event_name, $context, $common_cpu, $common_secs, $common_nsecs, | ||
95 | $common_pid, $common_comm) = @_; | ||
96 | |||
97 | $unhandled{$event_name}++; | ||
98 | } | ||
99 | |||
100 | sub print_header | ||
101 | { | ||
102 | my ($event_name, $cpu, $secs, $nsecs, $pid, $comm) = @_; | ||
103 | |||
104 | printf("%-20s %5u %05u.%09u %8u %-20s ", | ||
105 | $event_name, $cpu, $secs, $nsecs, $pid, $comm); | ||
106 | } | ||