2009-08-12 12:03:49 +04:00
/* For general debugging purposes */
# include "../perf.h"
2009-08-17 00:05:48 +04:00
2009-08-12 12:03:49 +04:00
# include <string.h>
# include <stdarg.h>
# include <stdio.h>
2010-03-12 02:12:44 +03:00
# include "cache.h"
2009-08-17 00:05:48 +04:00
# include "color.h"
# include "event.h"
# include "debug.h"
2009-12-28 02:37:00 +03:00
# include "util.h"
2012-05-07 09:09:02 +04:00
# include "target.h"
2009-08-17 00:05:48 +04:00
2014-07-11 16:49:54 +04:00
# define NSECS_PER_SEC 1000000000ULL
# define NSECS_PER_USEC 1000ULL
2010-10-26 21:20:09 +04:00
int verbose ;
bool dump_trace = false , quiet = false ;
2014-07-11 16:49:54 +04:00
int debug_ordered_events ;
2009-08-12 12:03:49 +04:00
2014-07-15 01:46:49 +04:00
static int _eprintf ( int level , int var , const char * fmt , va_list args )
2009-08-12 12:03:49 +04:00
{
int ret = 0 ;
2014-07-15 01:46:49 +04:00
if ( var > = level ) {
2012-11-29 23:51:01 +04:00
if ( use_browser > = 1 )
2012-11-14 20:47:41 +04:00
ui_helpline__vshow ( fmt , args ) ;
2010-03-12 02:12:44 +03:00
else
ret = vfprintf ( stderr , fmt , args ) ;
2009-08-12 12:03:49 +04:00
}
return ret ;
}
2009-08-16 21:24:21 +04:00
2014-07-15 01:46:49 +04:00
int eprintf ( int level , int var , const char * fmt , . . . )
2013-12-03 17:09:25 +04:00
{
va_list args ;
int ret ;
va_start ( args , fmt ) ;
2014-07-15 01:46:49 +04:00
ret = _eprintf ( level , var , fmt , args ) ;
2013-12-03 17:09:25 +04:00
va_end ( args ) ;
return ret ;
}
2014-07-11 16:49:54 +04:00
static int __eprintf_time ( u64 t , const char * fmt , va_list args )
{
int ret = 0 ;
u64 secs , usecs , nsecs = t ;
secs = nsecs / NSECS_PER_SEC ;
nsecs - = secs * NSECS_PER_SEC ;
usecs = nsecs / NSECS_PER_USEC ;
ret = fprintf ( stderr , " [%13 " PRIu64 " .%06 " PRIu64 " ] " ,
secs , usecs ) ;
ret + = vfprintf ( stderr , fmt , args ) ;
return ret ;
}
int eprintf_time ( int level , int var , u64 t , const char * fmt , . . . )
{
int ret = 0 ;
va_list args ;
if ( var > = level ) {
va_start ( args , fmt ) ;
ret = __eprintf_time ( t , fmt , args ) ;
va_end ( args ) ;
}
return ret ;
}
2013-12-03 17:09:25 +04:00
/*
* Overloading libtraceevent standard info print
* function , display with - v in perf .
*/
void pr_stat ( const char * fmt , . . . )
{
va_list args ;
va_start ( args , fmt ) ;
2014-07-15 01:46:49 +04:00
_eprintf ( 1 , verbose , fmt , args ) ;
2013-12-03 17:09:25 +04:00
va_end ( args ) ;
2014-07-15 01:46:49 +04:00
eprintf ( 1 , verbose , " \n " ) ;
2013-12-03 17:09:25 +04:00
}
2009-08-16 21:24:21 +04:00
int dump_printf ( const char * fmt , . . . )
{
va_list args ;
int ret = 0 ;
if ( dump_trace ) {
va_start ( args , fmt ) ;
ret = vprintf ( fmt , args ) ;
va_end ( args ) ;
}
return ret ;
}
2009-08-17 00:05:48 +04:00
2011-01-29 19:01:45 +03:00
void trace_event ( union perf_event * event )
2009-08-17 00:05:48 +04:00
{
unsigned char * raw_event = ( void * ) event ;
const char * color = PERF_COLOR_BLUE ;
int i , j ;
if ( ! dump_trace )
return ;
2010-11-30 22:48:53 +03:00
printf ( " . " ) ;
color_fprintf ( stdout , color , " \n . ... raw event: size %d bytes \n " ,
event - > header . size ) ;
2009-08-17 00:05:48 +04:00
for ( i = 0 ; i < event - > header . size ; i + + ) {
if ( ( i & 15 ) = = 0 ) {
2010-11-30 22:48:53 +03:00
printf ( " . " ) ;
color_fprintf ( stdout , color , " %04x: " , i ) ;
2009-08-17 00:05:48 +04:00
}
2010-11-30 22:48:53 +03:00
color_fprintf ( stdout , color , " %02x " , raw_event [ i ] ) ;
2009-08-17 00:05:48 +04:00
if ( ( ( i & 15 ) = = 15 ) | | i = = event - > header . size - 1 ) {
2010-11-30 22:48:53 +03:00
color_fprintf ( stdout , color , " " ) ;
2009-08-17 00:05:48 +04:00
for ( j = 0 ; j < 15 - ( i & 15 ) ; j + + )
2010-11-30 22:48:53 +03:00
color_fprintf ( stdout , color , " " ) ;
2010-06-12 06:44:04 +04:00
for ( j = i & ~ 15 ; j < = i ; j + + ) {
2010-11-30 22:48:53 +03:00
color_fprintf ( stdout , color , " %c " ,
isprint ( raw_event [ j ] ) ?
raw_event [ j ] : ' . ' ) ;
2009-08-17 00:05:48 +04:00
}
2010-11-30 22:48:53 +03:00
color_fprintf ( stdout , color , " \n " ) ;
2009-08-17 00:05:48 +04:00
}
}
2010-11-30 22:48:53 +03:00
printf ( " . \n " ) ;
2009-08-17 00:05:48 +04:00
}
2014-07-17 14:55:00 +04:00
static struct debug_variable {
const char * name ;
int * ptr ;
} debug_variables [ ] = {
2014-07-11 16:49:54 +04:00
{ . name = " verbose " , . ptr = & verbose } ,
{ . name = " ordered-events " , . ptr = & debug_ordered_events } ,
2014-07-17 14:55:00 +04:00
{ . name = NULL , }
} ;
int perf_debug_option ( const char * str )
{
struct debug_variable * var = & debug_variables [ 0 ] ;
char * vstr , * s = strdup ( str ) ;
int v = 1 ;
vstr = strchr ( s , ' = ' ) ;
if ( vstr )
* vstr + + = 0 ;
while ( var - > name ) {
if ( ! strcmp ( s , var - > name ) )
break ;
var + + ;
}
if ( ! var - > name ) {
pr_err ( " Unknown debug variable name '%s' \n " , s ) ;
free ( s ) ;
return - 1 ;
}
if ( vstr ) {
v = atoi ( vstr ) ;
/*
* Allow only values in range ( 0 , 10 ) ,
* otherwise set 0.
*/
v = ( v < 0 ) | | ( v > 10 ) ? 0 : v ;
}
* var - > ptr = v ;
free ( s ) ;
return 0 ;
}