xref: /openbmc/linux/kernel/trace/trace_export.c (revision 33def849)
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 
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 
5405ffa2d0SLi Zefan #undef __array_desc
5505ffa2d0SLi Zefan #define __array_desc(type, container, item, size)	type item[size];
5605ffa2d0SLi Zefan 
5705ffa2d0SLi Zefan #undef __dynamic_array
5805ffa2d0SLi Zefan #define __dynamic_array(type, item)			type item[];
5905ffa2d0SLi Zefan 
6005ffa2d0SLi Zefan #undef F_STRUCT
6105ffa2d0SLi Zefan #define F_STRUCT(args...)				args
6205ffa2d0SLi Zefan 
6305ffa2d0SLi Zefan #undef F_printk
6405ffa2d0SLi Zefan #define F_printk(fmt, args...) fmt, args
6505ffa2d0SLi Zefan 
6605ffa2d0SLi Zefan #undef FTRACE_ENTRY
6704ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
6805ffa2d0SLi Zefan struct ____ftrace_##name {						\
6905ffa2d0SLi Zefan 	tstruct								\
7005ffa2d0SLi Zefan };									\
715e9b3972SLi Zefan static void __always_unused ____ftrace_check_##name(void)		\
7205ffa2d0SLi Zefan {									\
7305ffa2d0SLi Zefan 	struct ____ftrace_##name *__entry = NULL;			\
7405ffa2d0SLi Zefan 									\
755e9b3972SLi Zefan 	/* force compile-time check on F_printk() */			\
7605ffa2d0SLi Zefan 	printk(print);							\
7705ffa2d0SLi Zefan }
7805ffa2d0SLi Zefan 
7905ffa2d0SLi Zefan #undef FTRACE_ENTRY_DUP
8004ae87a5SPeter Zijlstra #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print)		\
8104ae87a5SPeter Zijlstra 	FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
8205ffa2d0SLi Zefan 
8305ffa2d0SLi Zefan #include "trace_entries.h"
8405ffa2d0SLi Zefan 
8504ae87a5SPeter Zijlstra #undef __field_ext
8604ae87a5SPeter Zijlstra #define __field_ext(_type, _item, _filter_type) {			\
8704ae87a5SPeter Zijlstra 	.type = #_type, .name = #_item,					\
8804ae87a5SPeter Zijlstra 	.size = sizeof(_type), .align = __alignof__(_type),		\
8904ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = _filter_type },
9004ae87a5SPeter Zijlstra 
914649079bSSteven Rostedt (VMware) 
924649079bSSteven Rostedt (VMware) #undef __field_ext_packed
934649079bSSteven Rostedt (VMware) #define __field_ext_packed(_type, _item, _filter_type) {	\
944649079bSSteven Rostedt (VMware) 	.type = #_type, .name = #_item,				\
954649079bSSteven Rostedt (VMware) 	.size = sizeof(_type), .align = 1,			\
964649079bSSteven Rostedt (VMware) 	is_signed_type(_type), .filter_type = _filter_type },
974649079bSSteven Rostedt (VMware) 
984e5292eaSSteven Rostedt #undef __field
9904ae87a5SPeter Zijlstra #define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
10004ae87a5SPeter Zijlstra 
10104ae87a5SPeter Zijlstra #undef __field_fn
10204ae87a5SPeter Zijlstra #define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
1034e5292eaSSteven Rostedt 
1044e5292eaSSteven Rostedt #undef __field_desc
10504ae87a5SPeter Zijlstra #define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
1064e5292eaSSteven Rostedt 
1074649079bSSteven Rostedt (VMware) #undef __field_packed
1084649079bSSteven Rostedt (VMware) #define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
1094649079bSSteven Rostedt (VMware) 
1104e5292eaSSteven Rostedt #undef __array
11104ae87a5SPeter Zijlstra #define __array(_type, _item, _len) {					\
11204ae87a5SPeter Zijlstra 	.type = #_type"["__stringify(_len)"]", .name = #_item,		\
11304ae87a5SPeter Zijlstra 	.size = sizeof(_type[_len]), .align = __alignof__(_type),	\
11404ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = FILTER_OTHER },
1154e5292eaSSteven Rostedt 
1164e5292eaSSteven Rostedt #undef __array_desc
11704ae87a5SPeter Zijlstra #define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
1184e5292eaSSteven Rostedt 
1194e5292eaSSteven Rostedt #undef __dynamic_array
12004ae87a5SPeter Zijlstra #define __dynamic_array(_type, _item) {					\
12104ae87a5SPeter Zijlstra 	.type = #_type "[]", .name = #_item,				\
12204ae87a5SPeter Zijlstra 	.size = 0, .align = __alignof__(_type),				\
12304ae87a5SPeter Zijlstra 	is_signed_type(_type), .filter_type = FILTER_OTHER },
1244e5292eaSSteven Rostedt 
1254e5292eaSSteven Rostedt #undef FTRACE_ENTRY
12604ae87a5SPeter Zijlstra #define FTRACE_ENTRY(name, struct_name, id, tstruct, print)		\
12704ae87a5SPeter Zijlstra static struct trace_event_fields ftrace_event_fields_##name[] = {	\
12804ae87a5SPeter Zijlstra 	tstruct								\
12904ae87a5SPeter Zijlstra 	{} };
130e45f2e2bSTom Zanussi 
1314e5292eaSSteven Rostedt #include "trace_entries.h"
1324e5292eaSSteven Rostedt 
133509e760cSLai Jiangshan #undef __entry
134509e760cSLai Jiangshan #define __entry REC
135509e760cSLai Jiangshan 
1364e5292eaSSteven Rostedt #undef __field
1374e5292eaSSteven Rostedt #define __field(type, item)
1384e5292eaSSteven Rostedt 
13904ae87a5SPeter Zijlstra #undef __field_fn
14004ae87a5SPeter Zijlstra #define __field_fn(type, item)
14104ae87a5SPeter Zijlstra 
1424e5292eaSSteven Rostedt #undef __field_desc
1434e5292eaSSteven Rostedt #define __field_desc(type, container, item)
1444e5292eaSSteven Rostedt 
1454649079bSSteven Rostedt (VMware) #undef __field_packed
1464649079bSSteven Rostedt (VMware) #define __field_packed(type, container, item)
1474649079bSSteven Rostedt (VMware) 
1484e5292eaSSteven Rostedt #undef __array
1494e5292eaSSteven Rostedt #define __array(type, item, len)
1504e5292eaSSteven Rostedt 
1514e5292eaSSteven Rostedt #undef __array_desc
1524e5292eaSSteven Rostedt #define __array_desc(type, container, item, len)
1534e5292eaSSteven Rostedt 
1544e5292eaSSteven Rostedt #undef __dynamic_array
1554e5292eaSSteven Rostedt #define __dynamic_array(type, item)
1564e5292eaSSteven Rostedt 
157509e760cSLai Jiangshan #undef F_printk
15801de982aSWolfgang Mauerer #define F_printk(fmt, args...) __stringify(fmt) ", "  __stringify(args)
159509e760cSLai Jiangshan 
160e59a0bffSJiri Olsa #undef FTRACE_ENTRY_REG
16104ae87a5SPeter Zijlstra #define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
1626dff4d7dSBen Dooks static struct trace_event_class __refdata event_class_ftrace_##call = {	\
1632e33af02SSteven Rostedt 	.system			= __stringify(TRACE_SYSTEM),		\
16404ae87a5SPeter Zijlstra 	.fields_array		= ftrace_event_fields_##call,		\
165ffb9f995SLi Zefan 	.fields			= LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
166e59a0bffSJiri Olsa 	.reg			= regfn,				\
1672e33af02SSteven Rostedt };									\
1682e33af02SSteven Rostedt 									\
1692425bcb9SSteven Rostedt (Red Hat) struct trace_event_call __used event_##call = {				\
1702e33af02SSteven Rostedt 	.class			= &event_class_ftrace_##call,		\
171abb43f69SMathieu Desnoyers 	{								\
172abb43f69SMathieu Desnoyers 		.name			= #call,			\
173abb43f69SMathieu Desnoyers 	},								\
174abb43f69SMathieu Desnoyers 	.event.type		= etype,				\
175509e760cSLai Jiangshan 	.print_fmt		= print,				\
176754cb007SHe Kuang 	.flags			= TRACE_EVENT_FL_IGNORE_ENABLE,		\
177e1112b4dSTom Zanussi };									\
1786dff4d7dSBen Dooks static struct trace_event_call __used						\
17933def849SJoe Perches __section("_ftrace_events") *__event_##call = &event_##call;
180e1112b4dSTom Zanussi 
181e59a0bffSJiri Olsa #undef FTRACE_ENTRY
18204ae87a5SPeter Zijlstra #define FTRACE_ENTRY(call, struct_name, etype, tstruct, print)		\
183e59a0bffSJiri Olsa 	FTRACE_ENTRY_REG(call, struct_name, etype,			\
18404ae87a5SPeter Zijlstra 			 PARAMS(tstruct), PARAMS(print), NULL)
185e59a0bffSJiri Olsa 
186c6650b2eSYaowei Bai bool ftrace_event_is_function(struct trace_event_call *call)
187ced39002SJiri Olsa {
188ced39002SJiri Olsa 	return call == &event_function;
189ced39002SJiri Olsa }
190ced39002SJiri Olsa 
1914e5292eaSSteven Rostedt #include "trace_entries.h"
192