@ -291,7 +291,8 @@ static void print_events_table_prefix(FILE *fp, const char *tblname)
static int print_events_table_entry ( void * data , char * name , char * event ,
char * desc , char * long_desc ,
char * pmu , char * unit , char * perpkg )
char * pmu , char * unit , char * perpkg ,
char * metric_expr )
{
struct perf_entry_data * pd = data ;
FILE * outfp = pd - > outfp ;
@ -315,6 +316,8 @@ static int print_events_table_entry(void *data, char *name, char *event,
fprintf ( outfp , " \t .unit = \" %s \" , \n " , unit ) ;
if ( perpkg )
fprintf ( outfp , " \t .perpkg = \" %s \" , \n " , perpkg ) ;
if ( metric_expr )
fprintf ( outfp , " \t .metric_expr = \" %s \" , \n " , metric_expr ) ;
fprintf ( outfp , " }, \n " ) ;
return 0 ;
@ -362,7 +365,8 @@ static char *real_event(const char *name, char *event)
int json_events ( const char * fn ,
int ( * func ) ( void * data , char * name , char * event , char * desc ,
char * long_desc ,
char * pmu , char * unit , char * perpkg ) ,
char * pmu , char * unit , char * perpkg ,
char * metric_expr ) ,
void * data )
{
int err = - EIO ;
@ -388,6 +392,7 @@ int json_events(const char *fn,
char * filter = NULL ;
char * perpkg = NULL ;
char * unit = NULL ;
char * metric_expr = NULL ;
unsigned long long eventcode = 0 ;
struct msrmap * msr = NULL ;
jsmntok_t * msrval = NULL ;
@ -398,6 +403,7 @@ int json_events(const char *fn,
for ( j = 0 ; j < obj - > size ; j + = 2 ) {
jsmntok_t * field , * val ;
int nz ;
char * s ;
field = tok + j ;
EXPECT ( field - > type = = JSMN_STRING , tok + j ,
@ -444,7 +450,6 @@ int json_events(const char *fn,
NULL ) ;
} else if ( json_streq ( map , field , " Unit " ) ) {
const char * ppmu ;
char * s ;
ppmu = field_to_perf ( unit_to_pmu , map , val ) ;
if ( ppmu ) {
@ -464,6 +469,10 @@ int json_events(const char *fn,
addfield ( map , & unit , " " , " " , val ) ;
} else if ( json_streq ( map , field , " PerPkg " ) ) {
addfield ( map , & perpkg , " " , " " , val ) ;
} else if ( json_streq ( map , field , " MetricExpr " ) ) {
addfield ( map , & metric_expr , " " , " " , val ) ;
for ( s = metric_expr ; * s ; s + + )
* s = tolower ( * s ) ;
}
/* ignore unknown fields */
}
@ -488,7 +497,7 @@ int json_events(const char *fn,
fixname ( name ) ;
err = func ( data , name , real_event ( name , event ) , desc , long_desc ,
pmu , unit , perpkg ) ;
pmu , unit , perpkg , metric_expr ) ;
free ( event ) ;
free ( desc ) ;
free ( name ) ;
@ -498,6 +507,7 @@ int json_events(const char *fn,
free ( filter ) ;
free ( perpkg ) ;
free ( unit ) ;
free ( metric_expr ) ;
if ( err )
break ;
tok + = j ;