diff options
| -rw-r--r-- | include/linux/ftrace_event.h | 3 | ||||
| -rw-r--r-- | include/trace/ftrace.h | 8 | ||||
| -rw-r--r-- | kernel/trace/trace_output.c | 25 | 
3 files changed, 36 insertions, 0 deletions
diff --git a/include/linux/ftrace_event.h b/include/linux/ftrace_event.h index 4b58cf1a11c..bbf40f624fc 100644 --- a/include/linux/ftrace_event.h +++ b/include/linux/ftrace_event.h @@ -20,6 +20,9 @@ const char *ftrace_print_flags_seq(struct trace_seq *p, const char *delim,  				   unsigned long flags,  				   const struct trace_print_flags *flag_array); +const char *ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val, +				     const struct trace_print_flags *symbol_array); +  /*   * The trace entry - the most basic unit of tracing. This is what   * is printed in the end as a single line in the trace output, such as: diff --git a/include/trace/ftrace.h b/include/trace/ftrace.h index 22c94719c56..87fc227c6fb 100644 --- a/include/trace/ftrace.h +++ b/include/trace/ftrace.h @@ -130,6 +130,14 @@  		ftrace_print_flags_seq(p, delim, flag, flags);		\  	}) +#undef __print_symbolic +#define __print_symbolic(value, symbol_array...)			\ +	({								\ +		static const struct trace_print_flags symbols[] =	\ +			{ symbol_array, { -1, NULL }};			\ +		ftrace_print_symbols_seq(p, value, symbols);		\ +	}) +  #undef TRACE_EVENT  #define TRACE_EVENT(call, proto, args, tstruct, assign, print)		\  enum print_line_t							\ diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index a4840c260c8..c12d95db2f5 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -251,6 +251,31 @@ ftrace_print_flags_seq(struct trace_seq *p, const char *delim,  	return p->buffer;  } +const char * +ftrace_print_symbols_seq(struct trace_seq *p, unsigned long val, +			 const struct trace_print_flags *symbol_array) +{ +	int i; + +	trace_seq_init(p); + +	for (i = 0;  symbol_array[i].name; i++) { + +		if (val != symbol_array[i].mask) +			continue; + +		trace_seq_puts(p, symbol_array[i].name); +		break; +	} + +	if (!p->len) +		trace_seq_printf(p, "0x%lx", val); +		 +	trace_seq_putc(p, 0); + +	return p->buffer; +} +  #ifdef CONFIG_KRETPROBES  static inline const char *kretprobed(const char *name)  {  |