xref: /openbmc/linux/kernel/trace/trace_export.c (revision e7186af7)
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 */
ftrace_event_register(struct trace_event_call * call,enum trace_reg type,void * data)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
292b5894ccSQiujun Huang  * function and thus become accessible 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 
484649079bSSteven Rostedt (VMware) #undef __field_packed
494649079bSSteven Rostedt (VMware) #define __field_packed(type, container, item)		type item;
504649079bSSteven Rostedt (VMware) 
5105ffa2d0SLi Zefan #undef __array
5205ffa2d0SLi Zefan #define __array(type, item, size)			type item[size];
5305ffa2d0SLi Zefan 
54*e7186af7SSteven Rostedt (Google) #undef __stack_array
55*e7186af7SSteven Rostedt (Google) #define __stack_array(type, item, size, field)		__array(type, item, size)
56*e7186af7SSteven Rostedt (Google) 
5705ffa2d0SLi Zefan #undef __array_desc
5805ffa2d0SLi Zefan #define __array_desc(type, container, item, size)	type item[size];
5905ffa2d0SLi Zefan 
6005ffa2d0SLi Zefan #undef __dynamic_array
6105ffa2d0SLi Zefan #define __dynamic_array(type, item)			type item[];
6205ffa2d0SLi Zefan 
6305ffa2d0SLi Zefan #undef F_STRUCT
6405ffa2d0SLi Zefan #define F_STRUCT(args...)				args
6505ffa2d0SLi Zefan 
6605ffa2d0SLi Zefan #undef F_printk
6705ffa2d0SLi Zefan #define F_printk(fmt, args...) fmt, args
6805ffa2d0SLi Zefan 
6905ffa2d0SLi Zefan #undef FTRACE_ENTRY
7004ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
7105ffa2d0SLi Zefan struct ____ftrace_##name {						\
7205ffa2d0SLi Zefan 	tstruct								\
7305ffa2d0SLi Zefan };									\
745e9b3972SLi Zefan static void __always_unused ____ftrace_check_##name(void)		\
7505ffa2d0SLi Zefan {									\
7605ffa2d0SLi Zefan 	struct ____ftrace_##name *__entry = NULL;			\
7705ffa2d0SLi Zefan 									\
785e9b3972SLi Zefan 	/* force compile-time check on F_printk() */			\
7905ffa2d0SLi Zefan 	printk(print);							\
8005ffa2d0SLi Zefan }
8105ffa2d0SLi Zefan 
8205ffa2d0SLi Zefan #undef FTRACE_ENTRY_DUP
8304ae87a5SPeter Zijlstra #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print)		\
8404ae87a5SPeter Zijlstra 	FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
8505ffa2d0SLi Zefan 
8605ffa2d0SLi Zefan #include "trace_entries.h"
8705ffa2d0SLi Zefan 
8804ae87a5SPeter Zijlstra #undef __field_ext
8904ae87a5SPeter Zijlstra #define __field_ext(_type, _item, _filter_type) {			\
9004ae87a5SPeter Zijlstra 	.type = #_type, .name = #_item,					\
9104ae87a5SPeter Zijlstra 	.size = sizeof(_type), .align = __alignof__(_type),		\
9204ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = _filter_type },
9304ae87a5SPeter Zijlstra 
944649079bSSteven Rostedt (VMware) 
954649079bSSteven Rostedt (VMware) #undef __field_ext_packed
964649079bSSteven Rostedt (VMware) #define __field_ext_packed(_type, _item, _filter_type) {	\
974649079bSSteven Rostedt (VMware) 	.type = #_type, .name = #_item,				\
984649079bSSteven Rostedt (VMware) 	.size = sizeof(_type), .align = 1,			\
994649079bSSteven Rostedt (VMware) 	is_signed_type(_type), .filter_type = _filter_type },
1004649079bSSteven Rostedt (VMware) 
1014e5292eaSSteven Rostedt #undef __field
10204ae87a5SPeter Zijlstra #define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
10304ae87a5SPeter Zijlstra 
10404ae87a5SPeter Zijlstra #undef __field_fn
10504ae87a5SPeter Zijlstra #define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
1064e5292eaSSteven Rostedt 
1074e5292eaSSteven Rostedt #undef __field_desc
10804ae87a5SPeter Zijlstra #define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
1094e5292eaSSteven Rostedt 
1104649079bSSteven Rostedt (VMware) #undef __field_packed
1114649079bSSteven Rostedt (VMware) #define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
1124649079bSSteven Rostedt (VMware) 
1134e5292eaSSteven Rostedt #undef __array
11404ae87a5SPeter Zijlstra #define __array(_type, _item, _len) {					\
11504ae87a5SPeter Zijlstra 	.type = #_type"["__stringify(_len)"]", .name = #_item,		\
11604ae87a5SPeter Zijlstra 	.size = sizeof(_type[_len]), .align = __alignof__(_type),	\
117b6c7abd1SYafang Shao 	is_signed_type(_type), .filter_type = FILTER_OTHER,			\
118b6c7abd1SYafang Shao 	.len = _len },
1194e5292eaSSteven Rostedt 
120*e7186af7SSteven Rostedt (Google) #undef __stack_array
121*e7186af7SSteven Rostedt (Google) #define __stack_array(_type, _item, _len, _field) __array(_type, _item, _len)
122*e7186af7SSteven Rostedt (Google) 
1234e5292eaSSteven Rostedt #undef __array_desc
12404ae87a5SPeter Zijlstra #define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
1254e5292eaSSteven Rostedt 
1264e5292eaSSteven Rostedt #undef __dynamic_array
12704ae87a5SPeter Zijlstra #define __dynamic_array(_type, _item) {					\
12804ae87a5SPeter Zijlstra 	.type = #_type "[]", .name = #_item,				\
12904ae87a5SPeter Zijlstra 	.size = 0, .align = __alignof__(_type),				\
13004ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = FILTER_OTHER },
1314e5292eaSSteven Rostedt 
1324e5292eaSSteven Rostedt #undef FTRACE_ENTRY
13304ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
13404ae87a5SPeter Zijlstra static struct trace_event_fields ftrace_event_fields_##name[] = {	\
13504ae87a5SPeter Zijlstra 	tstruct								\
13604ae87a5SPeter Zijlstra 	{} };
137e45f2e2bSTom Zanussi 
1384e5292eaSSteven Rostedt #include "trace_entries.h"
1394e5292eaSSteven Rostedt 
140509e760cSLai Jiangshan #undef __entry
141509e760cSLai Jiangshan #define __entry REC
142509e760cSLai Jiangshan 
1434e5292eaSSteven Rostedt #undef __field
1444e5292eaSSteven Rostedt #define __field(type, item)
1454e5292eaSSteven Rostedt 
14604ae87a5SPeter Zijlstra #undef __field_fn
14704ae87a5SPeter Zijlstra #define __field_fn(type, item)
14804ae87a5SPeter Zijlstra 
1494e5292eaSSteven Rostedt #undef __field_desc
1504e5292eaSSteven Rostedt #define __field_desc(type, container, item)
1514e5292eaSSteven Rostedt 
1524649079bSSteven Rostedt (VMware) #undef __field_packed
1534649079bSSteven Rostedt (VMware) #define __field_packed(type, container, item)
1544649079bSSteven Rostedt (VMware) 
1554e5292eaSSteven Rostedt #undef __array
1564e5292eaSSteven Rostedt #define __array(type, item, len)
1574e5292eaSSteven Rostedt 
158*e7186af7SSteven Rostedt (Google) #undef __stack_array
159*e7186af7SSteven Rostedt (Google) #define __stack_array(type, item, len, field)
160*e7186af7SSteven Rostedt (Google) 
1614e5292eaSSteven Rostedt #undef __array_desc
1624e5292eaSSteven Rostedt #define __array_desc(type, container, item, len)
1634e5292eaSSteven Rostedt 
1644e5292eaSSteven Rostedt #undef __dynamic_array
1654e5292eaSSteven Rostedt #define __dynamic_array(type, item)
1664e5292eaSSteven Rostedt 
167509e760cSLai Jiangshan #undef F_printk
16801de982aSWolfgang Mauerer #define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)
169509e760cSLai Jiangshan 
170e59a0bffSJiri Olsa #undef FTRACE_ENTRY_REG
17104ae87a5SPeter Zijlstra #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
1726dff4d7dSBen Dooks static struct trace_event_class __refdata event_class_ftrace_##call = {	\
1732e33af02SSteven Rostedt 	.system			= __stringify(TRACE_SYSTEM),		\
17404ae87a5SPeter Zijlstra 	.fields_array		= ftrace_event_fields_##call,		\
175ffb9f995SLi Zefan 	.fields			= LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
176e59a0bffSJiri Olsa 	.reg			= regfn,				\
1772e33af02SSteven Rostedt };									\
1782e33af02SSteven Rostedt 									\
1792425bcb9SSteven Rostedt (Red Hat) struct trace_event_call __used event_##call = {				\
1802e33af02SSteven Rostedt 	.class			= &event_class_ftrace_##call,		\
181abb43f69SMathieu Desnoyers 	{								\
182abb43f69SMathieu Desnoyers 		.name			= #call,			\
183abb43f69SMathieu Desnoyers 	},								\
184abb43f69SMathieu Desnoyers 	.event.type		= etype,				\
185509e760cSLai Jiangshan 	.print_fmt		= print,				\
186754cb007SHe Kuang 	.flags			= TRACE_EVENT_FL_IGNORE_ENABLE,		\
187e1112b4dSTom Zanussi };									\
1886dff4d7dSBen Dooks static struct trace_event_call __used						\
18933def849SJoe Perches __section("_ftrace_events") *__event_##call = &event_##call;
190e1112b4dSTom Zanussi 
191e59a0bffSJiri Olsa #undef FTRACE_ENTRY
19204ae87a5SPeter Zijlstra #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print)		\
193e59a0bffSJiri Olsa 	FTRACE_ENTRY_REG(call, struct_name, etype,			\
19404ae87a5SPeter Zijlstra 			 PARAMS(tstruct), PARAMS(print), NULL)
195e59a0bffSJiri Olsa 
ftrace_event_is_function(struct trace_event_call * call)196c6650b2eSYaowei Bai bool ftrace_event_is_function(struct trace_event_call *call)
197ced39002SJiri Olsa {
198ced39002SJiri Olsa 	return call == &event_function;
199ced39002SJiri Olsa }
200ced39002SJiri Olsa 
2014e5292eaSSteven Rostedt #include "trace_entries.h"
202