diff options
Diffstat (limited to 'kernel/trace/trace_output.c')
| -rw-r--r-- | kernel/trace/trace_output.c | 44 | 
1 files changed, 44 insertions, 0 deletions
diff --git a/kernel/trace/trace_output.c b/kernel/trace/trace_output.c index b77b9a697619..692bf7184c8c 100644 --- a/kernel/trace/trace_output.c +++ b/kernel/trace/trace_output.c @@ -177,6 +177,50 @@ ftrace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len)  }  EXPORT_SYMBOL(ftrace_print_hex_seq); +const char * +ftrace_print_array_seq(struct trace_seq *p, const void *buf, int buf_len, +		       size_t el_size) +{ +	const char *ret = trace_seq_buffer_ptr(p); +	const char *prefix = ""; +	void *ptr = (void *)buf; + +	trace_seq_putc(p, '{'); + +	while (ptr < buf + buf_len) { +		switch (el_size) { +		case 1: +			trace_seq_printf(p, "%s0x%x", prefix, +					 *(u8 *)ptr); +			break; +		case 2: +			trace_seq_printf(p, "%s0x%x", prefix, +					 *(u16 *)ptr); +			break; +		case 4: +			trace_seq_printf(p, "%s0x%x", prefix, +					 *(u32 *)ptr); +			break; +		case 8: +			trace_seq_printf(p, "%s0x%llx", prefix, +					 *(u64 *)ptr); +			break; +		default: +			trace_seq_printf(p, "BAD SIZE:%zu 0x%x", el_size, +					 *(u8 *)ptr); +			el_size = 1; +		} +		prefix = ","; +		ptr += el_size; +	} + +	trace_seq_putc(p, '}'); +	trace_seq_putc(p, 0); + +	return ret; +} +EXPORT_SYMBOL(ftrace_print_array_seq); +  int ftrace_raw_output_prep(struct trace_iterator *iter,  			   struct trace_event *trace_event)  {  |