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