xref: /linux-6.15/kernel/trace/trace_output.c (revision 4ee51101)
1 // SPDX-License-Identifier: GPL-2.0
2 /*
3  * trace_output.c
4  *
5  * Copyright (C) 2008 Red Hat Inc, Steven Rostedt <[email protected]>
6  *
7  */
8 #include <linux/module.h>
9 #include <linux/mutex.h>
10 #include <linux/ftrace.h>
11 #include <linux/kprobes.h>
12 #include <linux/sched/clock.h>
13 #include <linux/sched/mm.h>
14 
15 #include "trace_output.h"
16 
17 /* must be a power of 2 */
18 #define EVENT_HASHSIZE	128
19 
20 DECLARE_RWSEM(trace_event_sem);
21 
22 static struct hlist_head event_hash[EVENT_HASHSIZE] __read_mostly;
23 
24 static int next_event_type = __TRACE_LAST_TYPE;
25 
26 enum print_line_t trace_print_bputs_msg_only(struct trace_iterator *iter)
27 {
28 	struct trace_seq *s = &iter->seq;
29 	struct trace_entry *entry = iter->ent;
30 	struct bputs_entry *field;
31 
32 	trace_assign_type(field, entry);
33 
34 	trace_seq_puts(s, field->str);
35 
36 	return trace_handle_return(s);
37 }
38 
39 enum print_line_t trace_print_bprintk_msg_only(struct trace_iterator *iter)
40 {
41 	struct trace_seq *s = &iter->seq;
42 	struct trace_entry *entry = iter->ent;
43 	struct bprint_entry *field;
44 
45 	trace_assign_type(field, entry);
46 
47 	trace_seq_bprintf(s, field->fmt, field->buf);
48 
49 	return trace_handle_return(s);
50 }
51 
52 enum print_line_t trace_print_printk_msg_only(struct trace_iterator *iter)
53 {
54 	struct trace_seq *s = &iter->seq;
55 	struct trace_entry *entry = iter->ent;
56 	struct print_entry *field;
57 
58 	trace_assign_type(field, entry);
59 
60 	trace_seq_puts(s, field->buf);
61 
62 	return trace_handle_return(s);
63 }
64 
65 const char *
66 trace_print_flags_seq(struct trace_seq *p, const char *delim,
67 		      unsigned long flags,
68 		      const struct trace_print_flags *flag_array)
69 {
70 	unsigned long mask;
71 	const char *str;
72 	const char *ret = trace_seq_buffer_ptr(p);
73 	int i, first = 1;
74 
75 	for (i = 0;  flag_array[i].name && flags; i++) {
76 
77 		mask = flag_array[i].mask;
78 		if ((flags & mask) != mask)
79 			continue;
80 
81 		str = flag_array[i].name;
82 		flags &= ~mask;
83 		if (!first && delim)
84 			trace_seq_puts(p, delim);
85 		else
86 			first = 0;
87 		trace_seq_puts(p, str);
88 	}
89 
90 	/* check for left over flags */
91 	if (flags) {
92 		if (!first && delim)
93 			trace_seq_puts(p, delim);
94 		trace_seq_printf(p, "0x%lx", flags);
95 	}
96 
97 	trace_seq_putc(p, 0);
98 
99 	return ret;
100 }
101 EXPORT_SYMBOL(trace_print_flags_seq);
102 
103 const char *
104 trace_print_symbols_seq(struct trace_seq *p, unsigned long val,
105 			const struct trace_print_flags *symbol_array)
106 {
107 	int i;
108 	const char *ret = trace_seq_buffer_ptr(p);
109 
110 	for (i = 0;  symbol_array[i].name; i++) {
111 
112 		if (val != symbol_array[i].mask)
113 			continue;
114 
115 		trace_seq_puts(p, symbol_array[i].name);
116 		break;
117 	}
118 
119 	if (ret == (const char *)(trace_seq_buffer_ptr(p)))
120 		trace_seq_printf(p, "0x%lx", val);
121 
122 	trace_seq_putc(p, 0);
123 
124 	return ret;
125 }
126 EXPORT_SYMBOL(trace_print_symbols_seq);
127 
128 #if BITS_PER_LONG == 32
129 const char *
130 trace_print_flags_seq_u64(struct trace_seq *p, const char *delim,
131 		      unsigned long long flags,
132 		      const struct trace_print_flags_u64 *flag_array)
133 {
134 	unsigned long long mask;
135 	const char *str;
136 	const char *ret = trace_seq_buffer_ptr(p);
137 	int i, first = 1;
138 
139 	for (i = 0;  flag_array[i].name && flags; i++) {
140 
141 		mask = flag_array[i].mask;
142 		if ((flags & mask) != mask)
143 			continue;
144 
145 		str = flag_array[i].name;
146 		flags &= ~mask;
147 		if (!first && delim)
148 			trace_seq_puts(p, delim);
149 		else
150 			first = 0;
151 		trace_seq_puts(p, str);
152 	}
153 
154 	/* check for left over flags */
155 	if (flags) {
156 		if (!first && delim)
157 			trace_seq_puts(p, delim);
158 		trace_seq_printf(p, "0x%llx", flags);
159 	}
160 
161 	trace_seq_putc(p, 0);
162 
163 	return ret;
164 }
165 EXPORT_SYMBOL(trace_print_flags_seq_u64);
166 
167 const char *
168 trace_print_symbols_seq_u64(struct trace_seq *p, unsigned long long val,
169 			 const struct trace_print_flags_u64 *symbol_array)
170 {
171 	int i;
172 	const char *ret = trace_seq_buffer_ptr(p);
173 
174 	for (i = 0;  symbol_array[i].name; i++) {
175 
176 		if (val != symbol_array[i].mask)
177 			continue;
178 
179 		trace_seq_puts(p, symbol_array[i].name);
180 		break;
181 	}
182 
183 	if (ret == (const char *)(trace_seq_buffer_ptr(p)))
184 		trace_seq_printf(p, "0x%llx", val);
185 
186 	trace_seq_putc(p, 0);
187 
188 	return ret;
189 }
190 EXPORT_SYMBOL(trace_print_symbols_seq_u64);
191 #endif
192 
193 const char *
194 trace_print_bitmask_seq(struct trace_seq *p, void *bitmask_ptr,
195 			unsigned int bitmask_size)
196 {
197 	const char *ret = trace_seq_buffer_ptr(p);
198 
199 	trace_seq_bitmask(p, bitmask_ptr, bitmask_size * 8);
200 	trace_seq_putc(p, 0);
201 
202 	return ret;
203 }
204 EXPORT_SYMBOL_GPL(trace_print_bitmask_seq);
205 
206 /**
207  * trace_print_hex_seq - print buffer as hex sequence
208  * @p: trace seq struct to write to
209  * @buf: The buffer to print
210  * @buf_len: Length of @buf in bytes
211  * @concatenate: Print @buf as single hex string or with spacing
212  *
213  * Prints the passed buffer as a hex sequence either as a whole,
214  * single hex string if @concatenate is true or with spacing after
215  * each byte in case @concatenate is false.
216  */
217 const char *
218 trace_print_hex_seq(struct trace_seq *p, const unsigned char *buf, int buf_len,
219 		    bool concatenate)
220 {
221 	int i;
222 	const char *ret = trace_seq_buffer_ptr(p);
223 	const char *fmt = concatenate ? "%*phN" : "%*ph";
224 
225 	for (i = 0; i < buf_len; i += 16)
226 		trace_seq_printf(p, fmt, min(buf_len - i, 16), &buf[i]);
227 	trace_seq_putc(p, 0);
228 
229 	return ret;
230 }
231 EXPORT_SYMBOL(trace_print_hex_seq);
232 
233 const char *
234 trace_print_array_seq(struct trace_seq *p, const void *buf, int count,
235 		      size_t el_size)
236 {
237 	const char *ret = trace_seq_buffer_ptr(p);
238 	const char *prefix = "";
239 	void *ptr = (void *)buf;
240 	size_t buf_len = count * el_size;
241 
242 	trace_seq_putc(p, '{');
243 
244 	while (ptr < buf + buf_len) {
245 		switch (el_size) {
246 		case 1:
247 			trace_seq_printf(p, "%s0x%x", prefix,
248 					 *(u8 *)ptr);
249 			break;
250 		case 2:
251 			trace_seq_printf(p, "%s0x%x", prefix,
252 					 *(u16 *)ptr);
253 			break;
254 		case 4:
255 			trace_seq_printf(p, "%s0x%x", prefix,
256 					 *(u32 *)ptr);
257 			break;
258 		case 8:
259 			trace_seq_printf(p, "%s0x%llx", prefix,
260 					 *(u64 *)ptr);
261 			break;
262 		default:
263 			trace_seq_printf(p, "BAD SIZE:%zu 0x%x", el_size,
264 					 *(u8 *)ptr);
265 			el_size = 1;
266 		}
267 		prefix = ",";
268 		ptr += el_size;
269 	}
270 
271 	trace_seq_putc(p, '}');
272 	trace_seq_putc(p, 0);
273 
274 	return ret;
275 }
276 EXPORT_SYMBOL(trace_print_array_seq);
277 
278 const char *
279 trace_print_hex_dump_seq(struct trace_seq *p, const char *prefix_str,
280 			 int prefix_type, int rowsize, int groupsize,
281 			 const void *buf, size_t len, bool ascii)
282 {
283 	const char *ret = trace_seq_buffer_ptr(p);
284 
285 	trace_seq_putc(p, '\n');
286 	trace_seq_hex_dump(p, prefix_str, prefix_type,
287 			   rowsize, groupsize, buf, len, ascii);
288 	trace_seq_putc(p, 0);
289 	return ret;
290 }
291 EXPORT_SYMBOL(trace_print_hex_dump_seq);
292 
293 int trace_raw_output_prep(struct trace_iterator *iter,
294 			  struct trace_event *trace_event)
295 {
296 	struct trace_event_call *event;
297 	struct trace_seq *s = &iter->seq;
298 	struct trace_seq *p = &iter->tmp_seq;
299 	struct trace_entry *entry;
300 
301 	event = container_of(trace_event, struct trace_event_call, event);
302 	entry = iter->ent;
303 
304 	if (entry->type != event->event.type) {
305 		WARN_ON_ONCE(1);
306 		return TRACE_TYPE_UNHANDLED;
307 	}
308 
309 	trace_seq_init(p);
310 	trace_seq_printf(s, "%s: ", trace_event_name(event));
311 
312 	return trace_handle_return(s);
313 }
314 EXPORT_SYMBOL(trace_raw_output_prep);
315 
316 void trace_event_printf(struct trace_iterator *iter, const char *fmt, ...)
317 {
318 	va_list ap;
319 
320 	va_start(ap, fmt);
321 	trace_check_vprintf(iter, trace_event_format(iter, fmt), ap);
322 	va_end(ap);
323 }
324 EXPORT_SYMBOL(trace_event_printf);
325 
326 static int trace_output_raw(struct trace_iterator *iter, char *name,
327 			    char *fmt, va_list ap)
328 {
329 	struct trace_seq *s = &iter->seq;
330 
331 	trace_seq_printf(s, "%s: ", name);
332 	trace_seq_vprintf(s, trace_event_format(iter, fmt), ap);
333 
334 	return trace_handle_return(s);
335 }
336 
337 int trace_output_call(struct trace_iterator *iter, char *name, char *fmt, ...)
338 {
339 	va_list ap;
340 	int ret;
341 
342 	va_start(ap, fmt);
343 	ret = trace_output_raw(iter, name, fmt, ap);
344 	va_end(ap);
345 
346 	return ret;
347 }
348 EXPORT_SYMBOL_GPL(trace_output_call);
349 
350 static inline const char *kretprobed(const char *name, unsigned long addr)
351 {
352 	if (is_kretprobe_trampoline(addr))
353 		return "[unknown/kretprobe'd]";
354 	return name;
355 }
356 
357 void
358 trace_seq_print_sym(struct trace_seq *s, unsigned long address, bool offset)
359 {
360 #ifdef CONFIG_KALLSYMS
361 	char str[KSYM_SYMBOL_LEN];
362 	const char *name;
363 
364 	if (offset)
365 		sprint_symbol(str, address);
366 	else
367 		kallsyms_lookup(address, NULL, NULL, NULL, str);
368 	name = kretprobed(str, address);
369 
370 	if (name && strlen(name)) {
371 		trace_seq_puts(s, name);
372 		return;
373 	}
374 #endif
375 	trace_seq_printf(s, "0x%08lx", address);
376 }
377 
378 #ifndef CONFIG_64BIT
379 # define IP_FMT "%08lx"
380 #else
381 # define IP_FMT "%016lx"
382 #endif
383 
384 static int seq_print_user_ip(struct trace_seq *s, struct mm_struct *mm,
385 			     unsigned long ip, unsigned long sym_flags)
386 {
387 	struct file *file = NULL;
388 	unsigned long vmstart = 0;
389 	int ret = 1;
390 
391 	if (s->full)
392 		return 0;
393 
394 	if (mm) {
395 		const struct vm_area_struct *vma;
396 
397 		mmap_read_lock(mm);
398 		vma = find_vma(mm, ip);
399 		if (vma) {
400 			file = vma->vm_file;
401 			vmstart = vma->vm_start;
402 		}
403 		if (file) {
404 			ret = trace_seq_path(s, &file->f_path);
405 			if (ret)
406 				trace_seq_printf(s, "[+0x%lx]",
407 						 ip - vmstart);
408 		}
409 		mmap_read_unlock(mm);
410 	}
411 	if (ret && ((sym_flags & TRACE_ITER_SYM_ADDR) || !file))
412 		trace_seq_printf(s, " <" IP_FMT ">", ip);
413 	return !trace_seq_has_overflowed(s);
414 }
415 
416 int
417 seq_print_ip_sym(struct trace_seq *s, unsigned long ip, unsigned long sym_flags)
418 {
419 	if (!ip) {
420 		trace_seq_putc(s, '0');
421 		goto out;
422 	}
423 
424 	trace_seq_print_sym(s, ip, sym_flags & TRACE_ITER_SYM_OFFSET);
425 
426 	if (sym_flags & TRACE_ITER_SYM_ADDR)
427 		trace_seq_printf(s, " <" IP_FMT ">", ip);
428 
429  out:
430 	return !trace_seq_has_overflowed(s);
431 }
432 
433 /**
434  * trace_print_lat_fmt - print the irq, preempt and lockdep fields
435  * @s: trace seq struct to write to
436  * @entry: The trace entry field from the ring buffer
437  *
438  * Prints the generic fields of irqs off, in hard or softirq, preempt
439  * count.
440  */
441 int trace_print_lat_fmt(struct trace_seq *s, struct trace_entry *entry)
442 {
443 	char hardsoft_irq;
444 	char need_resched;
445 	char irqs_off;
446 	int hardirq;
447 	int softirq;
448 	int bh_off;
449 	int nmi;
450 
451 	nmi = entry->flags & TRACE_FLAG_NMI;
452 	hardirq = entry->flags & TRACE_FLAG_HARDIRQ;
453 	softirq = entry->flags & TRACE_FLAG_SOFTIRQ;
454 	bh_off = entry->flags & TRACE_FLAG_BH_OFF;
455 
456 	irqs_off =
457 		(entry->flags & TRACE_FLAG_IRQS_OFF && bh_off) ? 'D' :
458 		(entry->flags & TRACE_FLAG_IRQS_OFF) ? 'd' :
459 		bh_off ? 'b' :
460 		(entry->flags & TRACE_FLAG_IRQS_NOSUPPORT) ? 'X' :
461 		'.';
462 
463 	switch (entry->flags & (TRACE_FLAG_NEED_RESCHED |
464 				TRACE_FLAG_PREEMPT_RESCHED)) {
465 	case TRACE_FLAG_NEED_RESCHED | TRACE_FLAG_PREEMPT_RESCHED:
466 		need_resched = 'N';
467 		break;
468 	case TRACE_FLAG_NEED_RESCHED:
469 		need_resched = 'n';
470 		break;
471 	case TRACE_FLAG_PREEMPT_RESCHED:
472 		need_resched = 'p';
473 		break;
474 	default:
475 		need_resched = '.';
476 		break;
477 	}
478 
479 	hardsoft_irq =
480 		(nmi && hardirq)     ? 'Z' :
481 		nmi                  ? 'z' :
482 		(hardirq && softirq) ? 'H' :
483 		hardirq              ? 'h' :
484 		softirq              ? 's' :
485 		                       '.' ;
486 
487 	trace_seq_printf(s, "%c%c%c",
488 			 irqs_off, need_resched, hardsoft_irq);
489 
490 	if (entry->preempt_count & 0xf)
491 		trace_seq_printf(s, "%x", entry->preempt_count & 0xf);
492 	else
493 		trace_seq_putc(s, '.');
494 
495 	if (entry->preempt_count & 0xf0)
496 		trace_seq_printf(s, "%x", entry->preempt_count >> 4);
497 	else
498 		trace_seq_putc(s, '.');
499 
500 	return !trace_seq_has_overflowed(s);
501 }
502 
503 static int
504 lat_print_generic(struct trace_seq *s, struct trace_entry *entry, int cpu)
505 {
506 	char comm[TASK_COMM_LEN];
507 
508 	trace_find_cmdline(entry->pid, comm);
509 
510 	trace_seq_printf(s, "%8.8s-%-7d %3d",
511 			 comm, entry->pid, cpu);
512 
513 	return trace_print_lat_fmt(s, entry);
514 }
515 
516 #undef MARK
517 #define MARK(v, s) {.val = v, .sym = s}
518 /* trace overhead mark */
519 static const struct trace_mark {
520 	unsigned long long	val; /* unit: nsec */
521 	char			sym;
522 } mark[] = {
523 	MARK(1000000000ULL	, '$'), /* 1 sec */
524 	MARK(100000000ULL	, '@'), /* 100 msec */
525 	MARK(10000000ULL	, '*'), /* 10 msec */
526 	MARK(1000000ULL		, '#'), /* 1000 usecs */
527 	MARK(100000ULL		, '!'), /* 100 usecs */
528 	MARK(10000ULL		, '+'), /* 10 usecs */
529 };
530 #undef MARK
531 
532 char trace_find_mark(unsigned long long d)
533 {
534 	int i;
535 	int size = ARRAY_SIZE(mark);
536 
537 	for (i = 0; i < size; i++) {
538 		if (d > mark[i].val)
539 			break;
540 	}
541 
542 	return (i == size) ? ' ' : mark[i].sym;
543 }
544 
545 static int
546 lat_print_timestamp(struct trace_iterator *iter, u64 next_ts)
547 {
548 	struct trace_array *tr = iter->tr;
549 	unsigned long verbose = tr->trace_flags & TRACE_ITER_VERBOSE;
550 	unsigned long in_ns = iter->iter_flags & TRACE_FILE_TIME_IN_NS;
551 	unsigned long long abs_ts = iter->ts - iter->array_buffer->time_start;
552 	unsigned long long rel_ts = next_ts - iter->ts;
553 	struct trace_seq *s = &iter->seq;
554 
555 	if (in_ns) {
556 		abs_ts = ns2usecs(abs_ts);
557 		rel_ts = ns2usecs(rel_ts);
558 	}
559 
560 	if (verbose && in_ns) {
561 		unsigned long abs_usec = do_div(abs_ts, USEC_PER_MSEC);
562 		unsigned long abs_msec = (unsigned long)abs_ts;
563 		unsigned long rel_usec = do_div(rel_ts, USEC_PER_MSEC);
564 		unsigned long rel_msec = (unsigned long)rel_ts;
565 
566 		trace_seq_printf(
567 			s, "[%08llx] %ld.%03ldms (+%ld.%03ldms): ",
568 			ns2usecs(iter->ts),
569 			abs_msec, abs_usec,
570 			rel_msec, rel_usec);
571 
572 	} else if (verbose && !in_ns) {
573 		trace_seq_printf(
574 			s, "[%016llx] %lld (+%lld): ",
575 			iter->ts, abs_ts, rel_ts);
576 
577 	} else if (!verbose && in_ns) {
578 		trace_seq_printf(
579 			s, " %4lldus%c: ",
580 			abs_ts,
581 			trace_find_mark(rel_ts * NSEC_PER_USEC));
582 
583 	} else { /* !verbose && !in_ns */
584 		trace_seq_printf(s, " %4lld: ", abs_ts);
585 	}
586 
587 	return !trace_seq_has_overflowed(s);
588 }
589 
590 static void trace_print_time(struct trace_seq *s, struct trace_iterator *iter,
591 			     unsigned long long ts)
592 {
593 	unsigned long secs, usec_rem;
594 	unsigned long long t;
595 
596 	if (iter->iter_flags & TRACE_FILE_TIME_IN_NS) {
597 		t = ns2usecs(ts);
598 		usec_rem = do_div(t, USEC_PER_SEC);
599 		secs = (unsigned long)t;
600 		trace_seq_printf(s, " %5lu.%06lu", secs, usec_rem);
601 	} else
602 		trace_seq_printf(s, " %12llu", ts);
603 }
604 
605 int trace_print_context(struct trace_iterator *iter)
606 {
607 	struct trace_array *tr = iter->tr;
608 	struct trace_seq *s = &iter->seq;
609 	struct trace_entry *entry = iter->ent;
610 	char comm[TASK_COMM_LEN];
611 
612 	trace_find_cmdline(entry->pid, comm);
613 
614 	trace_seq_printf(s, "%16s-%-7d ", comm, entry->pid);
615 
616 	if (tr->trace_flags & TRACE_ITER_RECORD_TGID) {
617 		unsigned int tgid = trace_find_tgid(entry->pid);
618 
619 		if (!tgid)
620 			trace_seq_printf(s, "(-------) ");
621 		else
622 			trace_seq_printf(s, "(%7d) ", tgid);
623 	}
624 
625 	trace_seq_printf(s, "[%03d] ", iter->cpu);
626 
627 	if (tr->trace_flags & TRACE_ITER_IRQ_INFO)
628 		trace_print_lat_fmt(s, entry);
629 
630 	trace_print_time(s, iter, iter->ts);
631 	trace_seq_puts(s, ": ");
632 
633 	return !trace_seq_has_overflowed(s);
634 }
635 
636 int trace_print_lat_context(struct trace_iterator *iter)
637 {
638 	struct trace_entry *entry, *next_entry;
639 	struct trace_array *tr = iter->tr;
640 	struct trace_seq *s = &iter->seq;
641 	unsigned long verbose = (tr->trace_flags & TRACE_ITER_VERBOSE);
642 	u64 next_ts;
643 
644 	next_entry = trace_find_next_entry(iter, NULL, &next_ts);
645 	if (!next_entry)
646 		next_ts = iter->ts;
647 
648 	/* trace_find_next_entry() may change iter->ent */
649 	entry = iter->ent;
650 
651 	if (verbose) {
652 		char comm[TASK_COMM_LEN];
653 
654 		trace_find_cmdline(entry->pid, comm);
655 
656 		trace_seq_printf(
657 			s, "%16s %7d %3d %d %08x %08lx ",
658 			comm, entry->pid, iter->cpu, entry->flags,
659 			entry->preempt_count & 0xf, iter->idx);
660 	} else {
661 		lat_print_generic(s, entry, iter->cpu);
662 	}
663 
664 	lat_print_timestamp(iter, next_ts);
665 
666 	return !trace_seq_has_overflowed(s);
667 }
668 
669 /**
670  * ftrace_find_event - find a registered event
671  * @type: the type of event to look for
672  *
673  * Returns an event of type @type otherwise NULL
674  * Called with trace_event_read_lock() held.
675  */
676 struct trace_event *ftrace_find_event(int type)
677 {
678 	struct trace_event *event;
679 	unsigned key;
680 
681 	key = type & (EVENT_HASHSIZE - 1);
682 
683 	hlist_for_each_entry(event, &event_hash[key], node) {
684 		if (event->type == type)
685 			return event;
686 	}
687 
688 	return NULL;
689 }
690 
691 static LIST_HEAD(ftrace_event_list);
692 
693 static int trace_search_list(struct list_head **list)
694 {
695 	struct trace_event *e;
696 	int next = __TRACE_LAST_TYPE;
697 
698 	if (list_empty(&ftrace_event_list)) {
699 		*list = &ftrace_event_list;
700 		return next;
701 	}
702 
703 	/*
704 	 * We used up all possible max events,
705 	 * lets see if somebody freed one.
706 	 */
707 	list_for_each_entry(e, &ftrace_event_list, list) {
708 		if (e->type != next)
709 			break;
710 		next++;
711 	}
712 
713 	/* Did we used up all 65 thousand events??? */
714 	if (next > TRACE_EVENT_TYPE_MAX)
715 		return 0;
716 
717 	*list = &e->list;
718 	return next;
719 }
720 
721 void trace_event_read_lock(void)
722 {
723 	down_read(&trace_event_sem);
724 }
725 
726 void trace_event_read_unlock(void)
727 {
728 	up_read(&trace_event_sem);
729 }
730 
731 /**
732  * register_trace_event - register output for an event type
733  * @event: the event type to register
734  *
735  * Event types are stored in a hash and this hash is used to
736  * find a way to print an event. If the @event->type is set
737  * then it will use that type, otherwise it will assign a
738  * type to use.
739  *
740  * If you assign your own type, please make sure it is added
741  * to the trace_type enum in trace.h, to avoid collisions
742  * with the dynamic types.
743  *
744  * Returns the event type number or zero on error.
745  */
746 int register_trace_event(struct trace_event *event)
747 {
748 	unsigned key;
749 	int ret = 0;
750 
751 	down_write(&trace_event_sem);
752 
753 	if (WARN_ON(!event))
754 		goto out;
755 
756 	if (WARN_ON(!event->funcs))
757 		goto out;
758 
759 	INIT_LIST_HEAD(&event->list);
760 
761 	if (!event->type) {
762 		struct list_head *list = NULL;
763 
764 		if (next_event_type > TRACE_EVENT_TYPE_MAX) {
765 
766 			event->type = trace_search_list(&list);
767 			if (!event->type)
768 				goto out;
769 
770 		} else {
771 
772 			event->type = next_event_type++;
773 			list = &ftrace_event_list;
774 		}
775 
776 		if (WARN_ON(ftrace_find_event(event->type)))
777 			goto out;
778 
779 		list_add_tail(&event->list, list);
780 
781 	} else if (WARN(event->type > __TRACE_LAST_TYPE,
782 			"Need to add type to trace.h")) {
783 		goto out;
784 	} else {
785 		/* Is this event already used */
786 		if (ftrace_find_event(event->type))
787 			goto out;
788 	}
789 
790 	if (event->funcs->trace == NULL)
791 		event->funcs->trace = trace_nop_print;
792 	if (event->funcs->raw == NULL)
793 		event->funcs->raw = trace_nop_print;
794 	if (event->funcs->hex == NULL)
795 		event->funcs->hex = trace_nop_print;
796 	if (event->funcs->binary == NULL)
797 		event->funcs->binary = trace_nop_print;
798 
799 	key = event->type & (EVENT_HASHSIZE - 1);
800 
801 	hlist_add_head(&event->node, &event_hash[key]);
802 
803 	ret = event->type;
804  out:
805 	up_write(&trace_event_sem);
806 
807 	return ret;
808 }
809 EXPORT_SYMBOL_GPL(register_trace_event);
810 
811 /*
812  * Used by module code with the trace_event_sem held for write.
813  */
814 int __unregister_trace_event(struct trace_event *event)
815 {
816 	hlist_del(&event->node);
817 	list_del(&event->list);
818 	return 0;
819 }
820 
821 /**
822  * unregister_trace_event - remove a no longer used event
823  * @event: the event to remove
824  */
825 int unregister_trace_event(struct trace_event *event)
826 {
827 	down_write(&trace_event_sem);
828 	__unregister_trace_event(event);
829 	up_write(&trace_event_sem);
830 
831 	return 0;
832 }
833 EXPORT_SYMBOL_GPL(unregister_trace_event);
834 
835 /*
836  * Standard events
837  */
838 
839 enum print_line_t trace_nop_print(struct trace_iterator *iter, int flags,
840 				  struct trace_event *event)
841 {
842 	trace_seq_printf(&iter->seq, "type: %d\n", iter->ent->type);
843 
844 	return trace_handle_return(&iter->seq);
845 }
846 
847 static void print_fn_trace(struct trace_seq *s, unsigned long ip,
848 			   unsigned long parent_ip, int flags)
849 {
850 	seq_print_ip_sym(s, ip, flags);
851 
852 	if ((flags & TRACE_ITER_PRINT_PARENT) && parent_ip) {
853 		trace_seq_puts(s, " <-");
854 		seq_print_ip_sym(s, parent_ip, flags);
855 	}
856 }
857 
858 /* TRACE_FN */
859 static enum print_line_t trace_fn_trace(struct trace_iterator *iter, int flags,
860 					struct trace_event *event)
861 {
862 	struct ftrace_entry *field;
863 	struct trace_seq *s = &iter->seq;
864 
865 	trace_assign_type(field, iter->ent);
866 
867 	print_fn_trace(s, field->ip, field->parent_ip, flags);
868 	trace_seq_putc(s, '\n');
869 
870 	return trace_handle_return(s);
871 }
872 
873 static enum print_line_t trace_fn_raw(struct trace_iterator *iter, int flags,
874 				      struct trace_event *event)
875 {
876 	struct ftrace_entry *field;
877 
878 	trace_assign_type(field, iter->ent);
879 
880 	trace_seq_printf(&iter->seq, "%lx %lx\n",
881 			 field->ip,
882 			 field->parent_ip);
883 
884 	return trace_handle_return(&iter->seq);
885 }
886 
887 static enum print_line_t trace_fn_hex(struct trace_iterator *iter, int flags,
888 				      struct trace_event *event)
889 {
890 	struct ftrace_entry *field;
891 	struct trace_seq *s = &iter->seq;
892 
893 	trace_assign_type(field, iter->ent);
894 
895 	SEQ_PUT_HEX_FIELD(s, field->ip);
896 	SEQ_PUT_HEX_FIELD(s, field->parent_ip);
897 
898 	return trace_handle_return(s);
899 }
900 
901 static enum print_line_t trace_fn_bin(struct trace_iterator *iter, int flags,
902 				      struct trace_event *event)
903 {
904 	struct ftrace_entry *field;
905 	struct trace_seq *s = &iter->seq;
906 
907 	trace_assign_type(field, iter->ent);
908 
909 	SEQ_PUT_FIELD(s, field->ip);
910 	SEQ_PUT_FIELD(s, field->parent_ip);
911 
912 	return trace_handle_return(s);
913 }
914 
915 static struct trace_event_functions trace_fn_funcs = {
916 	.trace		= trace_fn_trace,
917 	.raw		= trace_fn_raw,
918 	.hex		= trace_fn_hex,
919 	.binary		= trace_fn_bin,
920 };
921 
922 static struct trace_event trace_fn_event = {
923 	.type		= TRACE_FN,
924 	.funcs		= &trace_fn_funcs,
925 };
926 
927 /* TRACE_CTX an TRACE_WAKE */
928 static enum print_line_t trace_ctxwake_print(struct trace_iterator *iter,
929 					     char *delim)
930 {
931 	struct ctx_switch_entry *field;
932 	char comm[TASK_COMM_LEN];
933 	int S, T;
934 
935 
936 	trace_assign_type(field, iter->ent);
937 
938 	T = task_index_to_char(field->next_state);
939 	S = task_index_to_char(field->prev_state);
940 	trace_find_cmdline(field->next_pid, comm);
941 	trace_seq_printf(&iter->seq,
942 			 " %7d:%3d:%c %s [%03d] %7d:%3d:%c %s\n",
943 			 field->prev_pid,
944 			 field->prev_prio,
945 			 S, delim,
946 			 field->next_cpu,
947 			 field->next_pid,
948 			 field->next_prio,
949 			 T, comm);
950 
951 	return trace_handle_return(&iter->seq);
952 }
953 
954 static enum print_line_t trace_ctx_print(struct trace_iterator *iter, int flags,
955 					 struct trace_event *event)
956 {
957 	return trace_ctxwake_print(iter, "==>");
958 }
959 
960 static enum print_line_t trace_wake_print(struct trace_iterator *iter,
961 					  int flags, struct trace_event *event)
962 {
963 	return trace_ctxwake_print(iter, "  +");
964 }
965 
966 static int trace_ctxwake_raw(struct trace_iterator *iter, char S)
967 {
968 	struct ctx_switch_entry *field;
969 	int T;
970 
971 	trace_assign_type(field, iter->ent);
972 
973 	if (!S)
974 		S = task_index_to_char(field->prev_state);
975 	T = task_index_to_char(field->next_state);
976 	trace_seq_printf(&iter->seq, "%d %d %c %d %d %d %c\n",
977 			 field->prev_pid,
978 			 field->prev_prio,
979 			 S,
980 			 field->next_cpu,
981 			 field->next_pid,
982 			 field->next_prio,
983 			 T);
984 
985 	return trace_handle_return(&iter->seq);
986 }
987 
988 static enum print_line_t trace_ctx_raw(struct trace_iterator *iter, int flags,
989 				       struct trace_event *event)
990 {
991 	return trace_ctxwake_raw(iter, 0);
992 }
993 
994 static enum print_line_t trace_wake_raw(struct trace_iterator *iter, int flags,
995 					struct trace_event *event)
996 {
997 	return trace_ctxwake_raw(iter, '+');
998 }
999 
1000 
1001 static int trace_ctxwake_hex(struct trace_iterator *iter, char S)
1002 {
1003 	struct ctx_switch_entry *field;
1004 	struct trace_seq *s = &iter->seq;
1005 	int T;
1006 
1007 	trace_assign_type(field, iter->ent);
1008 
1009 	if (!S)
1010 		S = task_index_to_char(field->prev_state);
1011 	T = task_index_to_char(field->next_state);
1012 
1013 	SEQ_PUT_HEX_FIELD(s, field->prev_pid);
1014 	SEQ_PUT_HEX_FIELD(s, field->prev_prio);
1015 	SEQ_PUT_HEX_FIELD(s, S);
1016 	SEQ_PUT_HEX_FIELD(s, field->next_cpu);
1017 	SEQ_PUT_HEX_FIELD(s, field->next_pid);
1018 	SEQ_PUT_HEX_FIELD(s, field->next_prio);
1019 	SEQ_PUT_HEX_FIELD(s, T);
1020 
1021 	return trace_handle_return(s);
1022 }
1023 
1024 static enum print_line_t trace_ctx_hex(struct trace_iterator *iter, int flags,
1025 				       struct trace_event *event)
1026 {
1027 	return trace_ctxwake_hex(iter, 0);
1028 }
1029 
1030 static enum print_line_t trace_wake_hex(struct trace_iterator *iter, int flags,
1031 					struct trace_event *event)
1032 {
1033 	return trace_ctxwake_hex(iter, '+');
1034 }
1035 
1036 static enum print_line_t trace_ctxwake_bin(struct trace_iterator *iter,
1037 					   int flags, struct trace_event *event)
1038 {
1039 	struct ctx_switch_entry *field;
1040 	struct trace_seq *s = &iter->seq;
1041 
1042 	trace_assign_type(field, iter->ent);
1043 
1044 	SEQ_PUT_FIELD(s, field->prev_pid);
1045 	SEQ_PUT_FIELD(s, field->prev_prio);
1046 	SEQ_PUT_FIELD(s, field->prev_state);
1047 	SEQ_PUT_FIELD(s, field->next_cpu);
1048 	SEQ_PUT_FIELD(s, field->next_pid);
1049 	SEQ_PUT_FIELD(s, field->next_prio);
1050 	SEQ_PUT_FIELD(s, field->next_state);
1051 
1052 	return trace_handle_return(s);
1053 }
1054 
1055 static struct trace_event_functions trace_ctx_funcs = {
1056 	.trace		= trace_ctx_print,
1057 	.raw		= trace_ctx_raw,
1058 	.hex		= trace_ctx_hex,
1059 	.binary		= trace_ctxwake_bin,
1060 };
1061 
1062 static struct trace_event trace_ctx_event = {
1063 	.type		= TRACE_CTX,
1064 	.funcs		= &trace_ctx_funcs,
1065 };
1066 
1067 static struct trace_event_functions trace_wake_funcs = {
1068 	.trace		= trace_wake_print,
1069 	.raw		= trace_wake_raw,
1070 	.hex		= trace_wake_hex,
1071 	.binary		= trace_ctxwake_bin,
1072 };
1073 
1074 static struct trace_event trace_wake_event = {
1075 	.type		= TRACE_WAKE,
1076 	.funcs		= &trace_wake_funcs,
1077 };
1078 
1079 /* TRACE_STACK */
1080 
1081 static enum print_line_t trace_stack_print(struct trace_iterator *iter,
1082 					   int flags, struct trace_event *event)
1083 {
1084 	struct stack_entry *field;
1085 	struct trace_seq *s = &iter->seq;
1086 	unsigned long *p;
1087 	unsigned long *end;
1088 
1089 	trace_assign_type(field, iter->ent);
1090 	end = (unsigned long *)((long)iter->ent + iter->ent_size);
1091 
1092 	trace_seq_puts(s, "<stack trace>\n");
1093 
1094 	for (p = field->caller; p && p < end && *p != ULONG_MAX; p++) {
1095 
1096 		if (trace_seq_has_overflowed(s))
1097 			break;
1098 
1099 		trace_seq_puts(s, " => ");
1100 		seq_print_ip_sym(s, *p, flags);
1101 		trace_seq_putc(s, '\n');
1102 	}
1103 
1104 	return trace_handle_return(s);
1105 }
1106 
1107 static struct trace_event_functions trace_stack_funcs = {
1108 	.trace		= trace_stack_print,
1109 };
1110 
1111 static struct trace_event trace_stack_event = {
1112 	.type		= TRACE_STACK,
1113 	.funcs		= &trace_stack_funcs,
1114 };
1115 
1116 /* TRACE_USER_STACK */
1117 static enum print_line_t trace_user_stack_print(struct trace_iterator *iter,
1118 						int flags, struct trace_event *event)
1119 {
1120 	struct trace_array *tr = iter->tr;
1121 	struct userstack_entry *field;
1122 	struct trace_seq *s = &iter->seq;
1123 	struct mm_struct *mm = NULL;
1124 	unsigned int i;
1125 
1126 	trace_assign_type(field, iter->ent);
1127 
1128 	trace_seq_puts(s, "<user stack trace>\n");
1129 
1130 	if (tr->trace_flags & TRACE_ITER_SYM_USEROBJ) {
1131 		struct task_struct *task;
1132 		/*
1133 		 * we do the lookup on the thread group leader,
1134 		 * since individual threads might have already quit!
1135 		 */
1136 		rcu_read_lock();
1137 		task = find_task_by_vpid(field->tgid);
1138 		if (task)
1139 			mm = get_task_mm(task);
1140 		rcu_read_unlock();
1141 	}
1142 
1143 	for (i = 0; i < FTRACE_STACK_ENTRIES; i++) {
1144 		unsigned long ip = field->caller[i];
1145 
1146 		if (!ip || trace_seq_has_overflowed(s))
1147 			break;
1148 
1149 		trace_seq_puts(s, " => ");
1150 		seq_print_user_ip(s, mm, ip, flags);
1151 		trace_seq_putc(s, '\n');
1152 	}
1153 
1154 	if (mm)
1155 		mmput(mm);
1156 
1157 	return trace_handle_return(s);
1158 }
1159 
1160 static struct trace_event_functions trace_user_stack_funcs = {
1161 	.trace		= trace_user_stack_print,
1162 };
1163 
1164 static struct trace_event trace_user_stack_event = {
1165 	.type		= TRACE_USER_STACK,
1166 	.funcs		= &trace_user_stack_funcs,
1167 };
1168 
1169 /* TRACE_HWLAT */
1170 static enum print_line_t
1171 trace_hwlat_print(struct trace_iterator *iter, int flags,
1172 		  struct trace_event *event)
1173 {
1174 	struct trace_entry *entry = iter->ent;
1175 	struct trace_seq *s = &iter->seq;
1176 	struct hwlat_entry *field;
1177 
1178 	trace_assign_type(field, entry);
1179 
1180 	trace_seq_printf(s, "#%-5u inner/outer(us): %4llu/%-5llu ts:%lld.%09ld count:%d",
1181 			 field->seqnum,
1182 			 field->duration,
1183 			 field->outer_duration,
1184 			 (long long)field->timestamp.tv_sec,
1185 			 field->timestamp.tv_nsec, field->count);
1186 
1187 	if (field->nmi_count) {
1188 		/*
1189 		 * The generic sched_clock() is not NMI safe, thus
1190 		 * we only record the count and not the time.
1191 		 */
1192 		if (!IS_ENABLED(CONFIG_GENERIC_SCHED_CLOCK))
1193 			trace_seq_printf(s, " nmi-total:%llu",
1194 					 field->nmi_total_ts);
1195 		trace_seq_printf(s, " nmi-count:%u",
1196 				 field->nmi_count);
1197 	}
1198 
1199 	trace_seq_putc(s, '\n');
1200 
1201 	return trace_handle_return(s);
1202 }
1203 
1204 static enum print_line_t
1205 trace_hwlat_raw(struct trace_iterator *iter, int flags,
1206 		struct trace_event *event)
1207 {
1208 	struct hwlat_entry *field;
1209 	struct trace_seq *s = &iter->seq;
1210 
1211 	trace_assign_type(field, iter->ent);
1212 
1213 	trace_seq_printf(s, "%llu %lld %lld %09ld %u\n",
1214 			 field->duration,
1215 			 field->outer_duration,
1216 			 (long long)field->timestamp.tv_sec,
1217 			 field->timestamp.tv_nsec,
1218 			 field->seqnum);
1219 
1220 	return trace_handle_return(s);
1221 }
1222 
1223 static struct trace_event_functions trace_hwlat_funcs = {
1224 	.trace		= trace_hwlat_print,
1225 	.raw		= trace_hwlat_raw,
1226 };
1227 
1228 static struct trace_event trace_hwlat_event = {
1229 	.type		= TRACE_HWLAT,
1230 	.funcs		= &trace_hwlat_funcs,
1231 };
1232 
1233 /* TRACE_OSNOISE */
1234 static enum print_line_t
1235 trace_osnoise_print(struct trace_iterator *iter, int flags,
1236 		    struct trace_event *event)
1237 {
1238 	struct trace_entry *entry = iter->ent;
1239 	struct trace_seq *s = &iter->seq;
1240 	struct osnoise_entry *field;
1241 	u64 ratio, ratio_dec;
1242 	u64 net_runtime;
1243 
1244 	trace_assign_type(field, entry);
1245 
1246 	/*
1247 	 * compute the available % of cpu time.
1248 	 */
1249 	net_runtime = field->runtime - field->noise;
1250 	ratio = net_runtime * 10000000;
1251 	do_div(ratio, field->runtime);
1252 	ratio_dec = do_div(ratio, 100000);
1253 
1254 	trace_seq_printf(s, "%llu %10llu %3llu.%05llu %7llu",
1255 			 field->runtime,
1256 			 field->noise,
1257 			 ratio, ratio_dec,
1258 			 field->max_sample);
1259 
1260 	trace_seq_printf(s, " %6u", field->hw_count);
1261 	trace_seq_printf(s, " %6u", field->nmi_count);
1262 	trace_seq_printf(s, " %6u", field->irq_count);
1263 	trace_seq_printf(s, " %6u", field->softirq_count);
1264 	trace_seq_printf(s, " %6u", field->thread_count);
1265 
1266 	trace_seq_putc(s, '\n');
1267 
1268 	return trace_handle_return(s);
1269 }
1270 
1271 static enum print_line_t
1272 trace_osnoise_raw(struct trace_iterator *iter, int flags,
1273 		  struct trace_event *event)
1274 {
1275 	struct osnoise_entry *field;
1276 	struct trace_seq *s = &iter->seq;
1277 
1278 	trace_assign_type(field, iter->ent);
1279 
1280 	trace_seq_printf(s, "%lld %llu %llu %u %u %u %u %u\n",
1281 			 field->runtime,
1282 			 field->noise,
1283 			 field->max_sample,
1284 			 field->hw_count,
1285 			 field->nmi_count,
1286 			 field->irq_count,
1287 			 field->softirq_count,
1288 			 field->thread_count);
1289 
1290 	return trace_handle_return(s);
1291 }
1292 
1293 static struct trace_event_functions trace_osnoise_funcs = {
1294 	.trace		= trace_osnoise_print,
1295 	.raw		= trace_osnoise_raw,
1296 };
1297 
1298 static struct trace_event trace_osnoise_event = {
1299 	.type		= TRACE_OSNOISE,
1300 	.funcs		= &trace_osnoise_funcs,
1301 };
1302 
1303 /* TRACE_TIMERLAT */
1304 static enum print_line_t
1305 trace_timerlat_print(struct trace_iterator *iter, int flags,
1306 		     struct trace_event *event)
1307 {
1308 	struct trace_entry *entry = iter->ent;
1309 	struct trace_seq *s = &iter->seq;
1310 	struct timerlat_entry *field;
1311 
1312 	trace_assign_type(field, entry);
1313 
1314 	trace_seq_printf(s, "#%-5u context %6s timer_latency %9llu ns\n",
1315 			 field->seqnum,
1316 			 field->context ? "thread" : "irq",
1317 			 field->timer_latency);
1318 
1319 	return trace_handle_return(s);
1320 }
1321 
1322 static enum print_line_t
1323 trace_timerlat_raw(struct trace_iterator *iter, int flags,
1324 		   struct trace_event *event)
1325 {
1326 	struct timerlat_entry *field;
1327 	struct trace_seq *s = &iter->seq;
1328 
1329 	trace_assign_type(field, iter->ent);
1330 
1331 	trace_seq_printf(s, "%u %d %llu\n",
1332 			 field->seqnum,
1333 			 field->context,
1334 			 field->timer_latency);
1335 
1336 	return trace_handle_return(s);
1337 }
1338 
1339 static struct trace_event_functions trace_timerlat_funcs = {
1340 	.trace		= trace_timerlat_print,
1341 	.raw		= trace_timerlat_raw,
1342 };
1343 
1344 static struct trace_event trace_timerlat_event = {
1345 	.type		= TRACE_TIMERLAT,
1346 	.funcs		= &trace_timerlat_funcs,
1347 };
1348 
1349 /* TRACE_BPUTS */
1350 static enum print_line_t
1351 trace_bputs_print(struct trace_iterator *iter, int flags,
1352 		   struct trace_event *event)
1353 {
1354 	struct trace_entry *entry = iter->ent;
1355 	struct trace_seq *s = &iter->seq;
1356 	struct bputs_entry *field;
1357 
1358 	trace_assign_type(field, entry);
1359 
1360 	seq_print_ip_sym(s, field->ip, flags);
1361 	trace_seq_puts(s, ": ");
1362 	trace_seq_puts(s, field->str);
1363 
1364 	return trace_handle_return(s);
1365 }
1366 
1367 
1368 static enum print_line_t
1369 trace_bputs_raw(struct trace_iterator *iter, int flags,
1370 		struct trace_event *event)
1371 {
1372 	struct bputs_entry *field;
1373 	struct trace_seq *s = &iter->seq;
1374 
1375 	trace_assign_type(field, iter->ent);
1376 
1377 	trace_seq_printf(s, ": %lx : ", field->ip);
1378 	trace_seq_puts(s, field->str);
1379 
1380 	return trace_handle_return(s);
1381 }
1382 
1383 static struct trace_event_functions trace_bputs_funcs = {
1384 	.trace		= trace_bputs_print,
1385 	.raw		= trace_bputs_raw,
1386 };
1387 
1388 static struct trace_event trace_bputs_event = {
1389 	.type		= TRACE_BPUTS,
1390 	.funcs		= &trace_bputs_funcs,
1391 };
1392 
1393 /* TRACE_BPRINT */
1394 static enum print_line_t
1395 trace_bprint_print(struct trace_iterator *iter, int flags,
1396 		   struct trace_event *event)
1397 {
1398 	struct trace_entry *entry = iter->ent;
1399 	struct trace_seq *s = &iter->seq;
1400 	struct bprint_entry *field;
1401 
1402 	trace_assign_type(field, entry);
1403 
1404 	seq_print_ip_sym(s, field->ip, flags);
1405 	trace_seq_puts(s, ": ");
1406 	trace_seq_bprintf(s, field->fmt, field->buf);
1407 
1408 	return trace_handle_return(s);
1409 }
1410 
1411 
1412 static enum print_line_t
1413 trace_bprint_raw(struct trace_iterator *iter, int flags,
1414 		 struct trace_event *event)
1415 {
1416 	struct bprint_entry *field;
1417 	struct trace_seq *s = &iter->seq;
1418 
1419 	trace_assign_type(field, iter->ent);
1420 
1421 	trace_seq_printf(s, ": %lx : ", field->ip);
1422 	trace_seq_bprintf(s, field->fmt, field->buf);
1423 
1424 	return trace_handle_return(s);
1425 }
1426 
1427 static struct trace_event_functions trace_bprint_funcs = {
1428 	.trace		= trace_bprint_print,
1429 	.raw		= trace_bprint_raw,
1430 };
1431 
1432 static struct trace_event trace_bprint_event = {
1433 	.type		= TRACE_BPRINT,
1434 	.funcs		= &trace_bprint_funcs,
1435 };
1436 
1437 /* TRACE_PRINT */
1438 static enum print_line_t trace_print_print(struct trace_iterator *iter,
1439 					   int flags, struct trace_event *event)
1440 {
1441 	struct print_entry *field;
1442 	struct trace_seq *s = &iter->seq;
1443 
1444 	trace_assign_type(field, iter->ent);
1445 
1446 	seq_print_ip_sym(s, field->ip, flags);
1447 	trace_seq_printf(s, ": %s", field->buf);
1448 
1449 	return trace_handle_return(s);
1450 }
1451 
1452 static enum print_line_t trace_print_raw(struct trace_iterator *iter, int flags,
1453 					 struct trace_event *event)
1454 {
1455 	struct print_entry *field;
1456 
1457 	trace_assign_type(field, iter->ent);
1458 
1459 	trace_seq_printf(&iter->seq, "# %lx %s", field->ip, field->buf);
1460 
1461 	return trace_handle_return(&iter->seq);
1462 }
1463 
1464 static struct trace_event_functions trace_print_funcs = {
1465 	.trace		= trace_print_print,
1466 	.raw		= trace_print_raw,
1467 };
1468 
1469 static struct trace_event trace_print_event = {
1470 	.type	 	= TRACE_PRINT,
1471 	.funcs		= &trace_print_funcs,
1472 };
1473 
1474 static enum print_line_t trace_raw_data(struct trace_iterator *iter, int flags,
1475 					 struct trace_event *event)
1476 {
1477 	struct raw_data_entry *field;
1478 	int i;
1479 
1480 	trace_assign_type(field, iter->ent);
1481 
1482 	trace_seq_printf(&iter->seq, "# %x buf:", field->id);
1483 
1484 	for (i = 0; i < iter->ent_size - offsetof(struct raw_data_entry, buf); i++)
1485 		trace_seq_printf(&iter->seq, " %02x",
1486 				 (unsigned char)field->buf[i]);
1487 
1488 	trace_seq_putc(&iter->seq, '\n');
1489 
1490 	return trace_handle_return(&iter->seq);
1491 }
1492 
1493 static struct trace_event_functions trace_raw_data_funcs = {
1494 	.trace		= trace_raw_data,
1495 	.raw		= trace_raw_data,
1496 };
1497 
1498 static struct trace_event trace_raw_data_event = {
1499 	.type	 	= TRACE_RAW_DATA,
1500 	.funcs		= &trace_raw_data_funcs,
1501 };
1502 
1503 static enum print_line_t
1504 trace_func_repeats_raw(struct trace_iterator *iter, int flags,
1505 			 struct trace_event *event)
1506 {
1507 	struct func_repeats_entry *field;
1508 	struct trace_seq *s = &iter->seq;
1509 
1510 	trace_assign_type(field, iter->ent);
1511 
1512 	trace_seq_printf(s, "%lu %lu %u %llu\n",
1513 			 field->ip,
1514 			 field->parent_ip,
1515 			 field->count,
1516 			 FUNC_REPEATS_GET_DELTA_TS(field));
1517 
1518 	return trace_handle_return(s);
1519 }
1520 
1521 static enum print_line_t
1522 trace_func_repeats_print(struct trace_iterator *iter, int flags,
1523 			 struct trace_event *event)
1524 {
1525 	struct func_repeats_entry *field;
1526 	struct trace_seq *s = &iter->seq;
1527 
1528 	trace_assign_type(field, iter->ent);
1529 
1530 	print_fn_trace(s, field->ip, field->parent_ip, flags);
1531 	trace_seq_printf(s, " (repeats: %u, last_ts:", field->count);
1532 	trace_print_time(s, iter,
1533 			 iter->ts - FUNC_REPEATS_GET_DELTA_TS(field));
1534 	trace_seq_puts(s, ")\n");
1535 
1536 	return trace_handle_return(s);
1537 }
1538 
1539 static struct trace_event_functions trace_func_repeats_funcs = {
1540 	.trace		= trace_func_repeats_print,
1541 	.raw		= trace_func_repeats_raw,
1542 };
1543 
1544 static struct trace_event trace_func_repeats_event = {
1545 	.type	 	= TRACE_FUNC_REPEATS,
1546 	.funcs		= &trace_func_repeats_funcs,
1547 };
1548 
1549 static struct trace_event *events[] __initdata = {
1550 	&trace_fn_event,
1551 	&trace_ctx_event,
1552 	&trace_wake_event,
1553 	&trace_stack_event,
1554 	&trace_user_stack_event,
1555 	&trace_bputs_event,
1556 	&trace_bprint_event,
1557 	&trace_print_event,
1558 	&trace_hwlat_event,
1559 	&trace_osnoise_event,
1560 	&trace_timerlat_event,
1561 	&trace_raw_data_event,
1562 	&trace_func_repeats_event,
1563 	NULL
1564 };
1565 
1566 __init static int init_events(void)
1567 {
1568 	struct trace_event *event;
1569 	int i, ret;
1570 
1571 	for (i = 0; events[i]; i++) {
1572 		event = events[i];
1573 		ret = register_trace_event(event);
1574 		WARN_ONCE(!ret, "event %d failed to register", event->type);
1575 	}
1576 
1577 	return 0;
1578 }
1579 early_initcall(init_events);
1580