2009-06-06 14:24:17 +04:00
/*
* builtin - list . c
*
* Builtin list command : list all event types
*
* Copyright ( C ) 2009 , Thomas Gleixner < tglx @ linutronix . de >
* Copyright ( C ) 2008 - 2009 , Red Hat Inc , Ingo Molnar < mingo @ redhat . com >
2011-02-17 20:38:58 +03:00
* Copyright ( C ) 2011 , Red Hat Inc , Arnaldo Carvalho de Melo < acme @ redhat . com >
2009-06-06 14:24:17 +04:00
*/
# include "builtin.h"
# include "perf.h"
# include "util/parse-events.h"
2009-08-12 21:44:59 +04:00
# include "util/cache.h"
2013-04-20 22:02:29 +04:00
# include "util/pmu.h"
2015-12-15 18:39:39 +03:00
# include <subcmd/parse-options.h>
2009-06-06 14:24:17 +04:00
2016-09-16 01:24:45 +03:00
static bool desc_flag = true ;
2012-09-11 02:15:03 +04:00
int cmd_list ( int argc , const char * * argv , const char * prefix __maybe_unused )
2009-06-06 14:24:17 +04:00
{
2013-10-30 20:15:06 +04:00
int i ;
2014-12-31 06:36:55 +03:00
bool raw_dump = false ;
2016-09-16 01:24:48 +03:00
bool long_desc_flag = false ;
2014-12-31 06:36:55 +03:00
struct option list_options [ ] = {
OPT_BOOLEAN ( 0 , " raw-dump " , & raw_dump , " Dump raw events " ) ,
2016-09-16 01:24:45 +03:00
OPT_BOOLEAN ( ' d ' , " desc " , & desc_flag ,
" Print extra event descriptions. --no-desc to not print. " ) ,
2016-09-16 01:24:48 +03:00
OPT_BOOLEAN ( ' v ' , " long-desc " , & long_desc_flag ,
" Print longer event descriptions. " ) ,
2013-10-30 20:28:29 +04:00
OPT_END ( )
} ;
const char * const list_usage [ ] = {
2016-09-16 01:24:48 +03:00
" perf list [<options>] [hw|sw|cache|tracepoint|pmu|sdt|event_glob] " ,
2013-10-30 20:28:29 +04:00
NULL
} ;
2014-12-31 06:36:55 +03:00
set_option_flag ( list_options , 0 , " raw-dump " , PARSE_OPT_HIDDEN ) ;
2013-10-30 20:28:29 +04:00
argc = parse_options ( argc , argv , list_options , list_usage ,
PARSE_OPT_STOP_AT_NON_OPTION ) ;
2013-10-30 20:15:06 +04:00
2009-08-12 21:44:59 +04:00
setup_pager ( ) ;
2011-02-17 20:38:58 +03:00
2015-09-30 23:13:26 +03:00
if ( ! raw_dump & & pager_in_use ( ) )
2015-02-13 16:11:55 +03:00
printf ( " \n List of pre-defined events (to be used in -e): \n \n " ) ;
2013-10-30 20:28:29 +04:00
if ( argc = = 0 ) {
2016-09-16 01:24:48 +03:00
print_events ( NULL , raw_dump , ! desc_flag , long_desc_flag ) ;
2013-10-30 20:15:06 +04:00
return 0 ;
}
2011-02-17 20:38:58 +03:00
2013-10-30 20:28:29 +04:00
for ( i = 0 ; i < argc ; + + i ) {
2015-10-01 18:12:22 +03:00
char * sep , * s ;
2015-02-27 13:21:26 +03:00
if ( strcmp ( argv [ i ] , " tracepoint " ) = = 0 )
2015-02-27 13:21:28 +03:00
print_tracepoint_events ( NULL , NULL , raw_dump ) ;
2013-10-30 20:15:06 +04:00
else if ( strcmp ( argv [ i ] , " hw " ) = = 0 | |
strcmp ( argv [ i ] , " hardware " ) = = 0 )
2015-02-27 13:21:27 +03:00
print_symbol_events ( NULL , PERF_TYPE_HARDWARE ,
2015-02-27 13:21:28 +03:00
event_symbols_hw , PERF_COUNT_HW_MAX , raw_dump ) ;
2013-10-30 20:15:06 +04:00
else if ( strcmp ( argv [ i ] , " sw " ) = = 0 | |
strcmp ( argv [ i ] , " software " ) = = 0 )
2015-02-27 13:21:27 +03:00
print_symbol_events ( NULL , PERF_TYPE_SOFTWARE ,
2015-02-27 13:21:28 +03:00
event_symbols_sw , PERF_COUNT_SW_MAX , raw_dump ) ;
2013-10-30 20:15:06 +04:00
else if ( strcmp ( argv [ i ] , " cache " ) = = 0 | |
strcmp ( argv [ i ] , " hwcache " ) = = 0 )
2015-02-27 13:21:28 +03:00
print_hwcache_events ( NULL , raw_dump ) ;
2013-10-30 20:15:06 +04:00
else if ( strcmp ( argv [ i ] , " pmu " ) = = 0 )
2016-09-16 01:24:48 +03:00
print_pmu_events ( NULL , raw_dump , ! desc_flag ,
long_desc_flag ) ;
2016-06-24 12:06:46 +03:00
else if ( strcmp ( argv [ i ] , " sdt " ) = = 0 )
print_sdt_events ( NULL , NULL , raw_dump ) ;
2015-10-01 18:12:22 +03:00
else if ( ( sep = strchr ( argv [ i ] , ' : ' ) ) ! = NULL ) {
2013-10-30 20:15:06 +04:00
int sep_idx ;
2011-02-17 20:38:58 +03:00
2013-10-30 20:15:06 +04:00
if ( sep = = NULL ) {
2016-09-16 01:24:48 +03:00
print_events ( argv [ i ] , raw_dump , ! desc_flag ,
long_desc_flag ) ;
2013-10-30 20:15:06 +04:00
continue ;
2011-02-17 20:38:58 +03:00
}
2013-10-30 20:15:06 +04:00
sep_idx = sep - argv [ i ] ;
s = strdup ( argv [ i ] ) ;
if ( s = = NULL )
return - 1 ;
s [ sep_idx ] = ' \0 ' ;
2015-02-27 13:21:28 +03:00
print_tracepoint_events ( s , s + sep_idx + 1 , raw_dump ) ;
2016-06-24 12:06:46 +03:00
print_sdt_events ( s , s + sep_idx + 1 , raw_dump ) ;
2013-10-30 20:15:06 +04:00
free ( s ) ;
2015-10-01 18:12:22 +03:00
} else {
if ( asprintf ( & s , " *%s* " , argv [ i ] ) < 0 ) {
printf ( " Critical: Not enough memory! Trying to continue... \n " ) ;
continue ;
}
print_symbol_events ( s , PERF_TYPE_HARDWARE ,
event_symbols_hw , PERF_COUNT_HW_MAX , raw_dump ) ;
print_symbol_events ( s , PERF_TYPE_SOFTWARE ,
event_symbols_sw , PERF_COUNT_SW_MAX , raw_dump ) ;
print_hwcache_events ( s , raw_dump ) ;
2016-09-16 01:24:48 +03:00
print_pmu_events ( s , raw_dump , ! desc_flag ,
long_desc_flag ) ;
2015-10-01 18:12:22 +03:00
print_tracepoint_events ( NULL , s , raw_dump ) ;
2016-06-24 12:06:46 +03:00
print_sdt_events ( NULL , s , raw_dump ) ;
2015-10-01 18:12:22 +03:00
free ( s ) ;
2011-02-17 20:38:58 +03:00
}
}
2009-06-06 14:24:17 +04:00
return 0 ;
}