xref: /openbmc/linux/kernel/trace/trace_export.c (revision 04ae87a5)
1b2441318SGreg Kroah-Hartman // SPDX-License-Identifier: GPL-2.0
2770cb243SSteven Rostedt /*
3770cb243SSteven Rostedt  * trace_export.c - export basic ftrace utilities to user space
4770cb243SSteven Rostedt  *
5770cb243SSteven Rostedt  * Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com>
6770cb243SSteven Rostedt  */
7770cb243SSteven Rostedt #include <linux/stringify.h>
8770cb243SSteven Rostedt #include <linux/kallsyms.h>
9770cb243SSteven Rostedt #include <linux/seq_file.h>
10770cb243SSteven Rostedt #include <linux/uaccess.h>
11770cb243SSteven Rostedt #include <linux/ftrace.h>
12770cb243SSteven Rostedt #include <linux/module.h>
13770cb243SSteven Rostedt #include <linux/init.h>
14770cb243SSteven Rostedt 
15770cb243SSteven Rostedt #include "trace_output.h"
16770cb243SSteven Rostedt 
173dd80953SSteven Rostedt (VMware) /* Stub function for events with triggers */
183dd80953SSteven Rostedt (VMware) static int ftrace_event_register(struct trace_event_call *call,
193dd80953SSteven Rostedt (VMware) 				 enum trace_reg type, void *data)
203dd80953SSteven Rostedt (VMware) {
213dd80953SSteven Rostedt (VMware) 	return 0;
223dd80953SSteven Rostedt (VMware) }
233dd80953SSteven Rostedt (VMware) 
244e5292eaSSteven Rostedt #undef TRACE_SYSTEM
254e5292eaSSteven Rostedt #define TRACE_SYSTEM	ftrace
26da4d0302SSteven Rostedt 
27e59a0bffSJiri Olsa /*
28e59a0bffSJiri Olsa  * The FTRACE_ENTRY_REG macro allows ftrace entry to define register
29e59a0bffSJiri Olsa  * function and thus become accesible via perf.
30e59a0bffSJiri Olsa  */
31e59a0bffSJiri Olsa #undef FTRACE_ENTRY_REG
3204ae87a5SPeter Zijlstra #define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \
3304ae87a5SPeter Zijlstra 	FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
34e59a0bffSJiri Olsa 
354e5292eaSSteven Rostedt /* not needed for this file */
364e5292eaSSteven Rostedt #undef __field_struct
374e5292eaSSteven Rostedt #define __field_struct(type, item)
38da4d0302SSteven Rostedt 
394e5292eaSSteven Rostedt #undef __field
4005ffa2d0SLi Zefan #define __field(type, item)				type item;
4105ffa2d0SLi Zefan 
4204ae87a5SPeter Zijlstra #undef __field_fn
4304ae87a5SPeter Zijlstra #define __field_fn(type, item)				type item;
4404ae87a5SPeter Zijlstra 
4505ffa2d0SLi Zefan #undef __field_desc
4605ffa2d0SLi Zefan #define __field_desc(type, container, item)		type item;
4705ffa2d0SLi Zefan 
4805ffa2d0SLi Zefan #undef __array
4905ffa2d0SLi Zefan #define __array(type, item, size)			type item[size];
5005ffa2d0SLi Zefan 
5105ffa2d0SLi Zefan #undef __array_desc
5205ffa2d0SLi Zefan #define __array_desc(type, container, item, size)	type item[size];
5305ffa2d0SLi Zefan 
5405ffa2d0SLi Zefan #undef __dynamic_array
5505ffa2d0SLi Zefan #define __dynamic_array(type, item)			type item[];
5605ffa2d0SLi Zefan 
5705ffa2d0SLi Zefan #undef F_STRUCT
5805ffa2d0SLi Zefan #define F_STRUCT(args...)				args
5905ffa2d0SLi Zefan 
6005ffa2d0SLi Zefan #undef F_printk
6105ffa2d0SLi Zefan #define F_printk(fmt, args...) fmt, args
6205ffa2d0SLi Zefan 
6305ffa2d0SLi Zefan #undef FTRACE_ENTRY
6404ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
6505ffa2d0SLi Zefan struct ____ftrace_##name {						\
6605ffa2d0SLi Zefan 	tstruct								\
6705ffa2d0SLi Zefan };									\
685e9b3972SLi Zefan static void __always_unused ____ftrace_check_##name(void)		\
6905ffa2d0SLi Zefan {									\
7005ffa2d0SLi Zefan 	struct ____ftrace_##name *__entry = NULL;			\
7105ffa2d0SLi Zefan 									\
725e9b3972SLi Zefan 	/* force compile-time check on F_printk() */			\
7305ffa2d0SLi Zefan 	printk(print);							\
7405ffa2d0SLi Zefan }
7505ffa2d0SLi Zefan 
7605ffa2d0SLi Zefan #undef FTRACE_ENTRY_DUP
7704ae87a5SPeter Zijlstra #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print)		\
7804ae87a5SPeter Zijlstra 	FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
7905ffa2d0SLi Zefan 
8005ffa2d0SLi Zefan #include "trace_entries.h"
8105ffa2d0SLi Zefan 
8204ae87a5SPeter Zijlstra #undef __field_ext
8304ae87a5SPeter Zijlstra #define __field_ext(_type, _item, _filter_type) {			\
8404ae87a5SPeter Zijlstra 	.type = #_type, .name = #_item,					\
8504ae87a5SPeter Zijlstra 	.size = sizeof(_type), .align = __alignof__(_type),		\
8604ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = _filter_type },
8704ae87a5SPeter Zijlstra 
884e5292eaSSteven Rostedt #undef __field
8904ae87a5SPeter Zijlstra #define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
9004ae87a5SPeter Zijlstra 
9104ae87a5SPeter Zijlstra #undef __field_fn
9204ae87a5SPeter Zijlstra #define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
934e5292eaSSteven Rostedt 
944e5292eaSSteven Rostedt #undef __field_desc
9504ae87a5SPeter Zijlstra #define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
964e5292eaSSteven Rostedt 
974e5292eaSSteven Rostedt #undef __array
9804ae87a5SPeter Zijlstra #define __array(_type, _item, _len) {					\
9904ae87a5SPeter Zijlstra 	.type = #_type"["__stringify(_len)"]", .name = #_item,		\
10004ae87a5SPeter Zijlstra 	.size = sizeof(_type[_len]), .align = __alignof__(_type),	\
10104ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = FILTER_OTHER },
1024e5292eaSSteven Rostedt 
1034e5292eaSSteven Rostedt #undef __array_desc
10404ae87a5SPeter Zijlstra #define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
1054e5292eaSSteven Rostedt 
1064e5292eaSSteven Rostedt #undef __dynamic_array
10704ae87a5SPeter Zijlstra #define __dynamic_array(_type, _item) {					\
10804ae87a5SPeter Zijlstra 	.type = #_type "[]", .name = #_item,				\
10904ae87a5SPeter Zijlstra 	.size = 0, .align = __alignof__(_type),				\
11004ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = FILTER_OTHER },
1114e5292eaSSteven Rostedt 
1124e5292eaSSteven Rostedt #undef FTRACE_ENTRY
11304ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
11404ae87a5SPeter Zijlstra static struct trace_event_fields ftrace_event_fields_##name[] = {	\
11504ae87a5SPeter Zijlstra 	tstruct								\
11604ae87a5SPeter Zijlstra 	{} };
117e45f2e2bSTom Zanussi 
1184e5292eaSSteven Rostedt #include "trace_entries.h"
1194e5292eaSSteven Rostedt 
120509e760cSLai Jiangshan #undef __entry
121509e760cSLai Jiangshan #define __entry REC
122509e760cSLai Jiangshan 
1234e5292eaSSteven Rostedt #undef __field
1244e5292eaSSteven Rostedt #define __field(type, item)
1254e5292eaSSteven Rostedt 
12604ae87a5SPeter Zijlstra #undef __field_fn
12704ae87a5SPeter Zijlstra #define __field_fn(type, item)
12804ae87a5SPeter Zijlstra 
1294e5292eaSSteven Rostedt #undef __field_desc
1304e5292eaSSteven Rostedt #define __field_desc(type, container, item)
1314e5292eaSSteven Rostedt 
1324e5292eaSSteven Rostedt #undef __array
1334e5292eaSSteven Rostedt #define __array(type, item, len)
1344e5292eaSSteven Rostedt 
1354e5292eaSSteven Rostedt #undef __array_desc
1364e5292eaSSteven Rostedt #define __array_desc(type, container, item, len)
1374e5292eaSSteven Rostedt 
1384e5292eaSSteven Rostedt #undef __dynamic_array
1394e5292eaSSteven Rostedt #define __dynamic_array(type, item)
1404e5292eaSSteven Rostedt 
141509e760cSLai Jiangshan #undef F_printk
14201de982aSWolfgang Mauerer #define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)
143509e760cSLai Jiangshan 
144e59a0bffSJiri Olsa #undef FTRACE_ENTRY_REG
14504ae87a5SPeter Zijlstra #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
1462425bcb9SSteven Rostedt (Red Hat) struct trace_event_class __refdata event_class_ftrace_##call = {	\
1472e33af02SSteven Rostedt 	.system			= __stringify(TRACE_SYSTEM),		\
14804ae87a5SPeter Zijlstra 	.fields_array		= ftrace_event_fields_##call,		\
149ffb9f995SLi Zefan 	.fields			= LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
150e59a0bffSJiri Olsa 	.reg			= regfn,				\
1512e33af02SSteven Rostedt };									\
1522e33af02SSteven Rostedt 									\
1532425bcb9SSteven Rostedt (Red Hat) struct trace_event_call __used event_##call = {				\
1542e33af02SSteven Rostedt 	.class			= &event_class_ftrace_##call,		\
155abb43f69SMathieu Desnoyers 	{								\
156abb43f69SMathieu Desnoyers 		.name			= #call,			\
157abb43f69SMathieu Desnoyers 	},								\
158abb43f69SMathieu Desnoyers 	.event.type		= etype,				\
159509e760cSLai Jiangshan 	.print_fmt		= print,				\
160754cb007SHe Kuang 	.flags			= TRACE_EVENT_FL_IGNORE_ENABLE,		\
161e1112b4dSTom Zanussi };									\
1622425bcb9SSteven Rostedt (Red Hat) struct trace_event_call __used						\
163e4a9ea5eSSteven Rostedt __attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
164e1112b4dSTom Zanussi 
165e59a0bffSJiri Olsa #undef FTRACE_ENTRY
16604ae87a5SPeter Zijlstra #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print)		\
167e59a0bffSJiri Olsa 	FTRACE_ENTRY_REG(call, struct_name, etype,			\
16804ae87a5SPeter Zijlstra 			 PARAMS(tstruct), PARAMS(print), NULL)
169e59a0bffSJiri Olsa 
170c6650b2eSYaowei Bai bool ftrace_event_is_function(struct trace_event_call *call)
171ced39002SJiri Olsa {
172ced39002SJiri Olsa 	return call == &event_function;
173ced39002SJiri Olsa }
174ced39002SJiri Olsa 
1754e5292eaSSteven Rostedt #include "trace_entries.h"
176