blob: d960f6b11b5e51a9bbefe0f6169eeecb0bb3783b [file] [log] [blame]
Greg Kroah-Hartmanb2441312017-11-01 15:07:57 +01001// SPDX-License-Identifier: GPL-2.0
Steven Rostedt770cb242009-03-05 21:35:29 -05002/*
3 * trace_export.c - export basic ftrace utilities to user space
4 *
5 * Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com>
6 */
7#include <linux/stringify.h>
8#include <linux/kallsyms.h>
9#include <linux/seq_file.h>
Steven Rostedt770cb242009-03-05 21:35:29 -050010#include <linux/uaccess.h>
11#include <linux/ftrace.h>
12#include <linux/module.h>
13#include <linux/init.h>
Steven Rostedt770cb242009-03-05 21:35:29 -050014
15#include "trace_output.h"
16
Steven Rostedt (VMware)3dd80952018-05-09 14:17:48 -040017/* Stub function for events with triggers */
18static int ftrace_event_register(struct trace_event_call *call,
19 enum trace_reg type, void *data)
20{
21 return 0;
22}
23
Steven Rostedt4e5292e2009-09-12 19:26:21 -040024#undef TRACE_SYSTEM
25#define TRACE_SYSTEM ftrace
Steven Rostedtda4d0302009-03-09 17:14:30 -040026
Jiri Olsae59a0bf2012-02-15 15:51:51 +010027/*
28 * The FTRACE_ENTRY_REG macro allows ftrace entry to define register
Qiujun Huang2b5894c2020-10-29 23:05:54 +080029 * function and thus become accessible via perf.
Jiri Olsae59a0bf2012-02-15 15:51:51 +010030 */
31#undef FTRACE_ENTRY_REG
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020032#define FTRACE_ENTRY_REG(name, struct_name, id, tstruct, print, regfn) \
33 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
Jiri Olsae59a0bf2012-02-15 15:51:51 +010034
Steven Rostedt4e5292e2009-09-12 19:26:21 -040035/* not needed for this file */
36#undef __field_struct
37#define __field_struct(type, item)
Steven Rostedtda4d0302009-03-09 17:14:30 -040038
Steven Rostedt4e5292e2009-09-12 19:26:21 -040039#undef __field
Li Zefan05ffa2d2009-09-14 15:54:52 +080040#define __field(type, item) type item;
41
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020042#undef __field_fn
43#define __field_fn(type, item) type item;
44
Li Zefan05ffa2d2009-09-14 15:54:52 +080045#undef __field_desc
46#define __field_desc(type, container, item) type item;
47
Steven Rostedt (VMware)46490792020-06-09 22:00:41 -040048#undef __field_packed
49#define __field_packed(type, container, item) type item;
50
Li Zefan05ffa2d2009-09-14 15:54:52 +080051#undef __array
52#define __array(type, item, size) type item[size];
53
54#undef __array_desc
55#define __array_desc(type, container, item, size) type item[size];
56
57#undef __dynamic_array
58#define __dynamic_array(type, item) type item[];
59
60#undef F_STRUCT
61#define F_STRUCT(args...) args
62
63#undef F_printk
64#define F_printk(fmt, args...) fmt, args
65
66#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020067#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
Jiri Olsa02aa3162012-02-15 15:51:53 +010068struct ____ftrace_##name { \
69 tstruct \
70}; \
71static void __always_unused ____ftrace_check_##name(void) \
72{ \
73 struct ____ftrace_##name *__entry = NULL; \
74 \
75 /* force compile-time check on F_printk() */ \
76 printk(print); \
Li Zefan05ffa2d2009-09-14 15:54:52 +080077}
78
79#undef FTRACE_ENTRY_DUP
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020080#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \
81 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
Li Zefan05ffa2d2009-09-14 15:54:52 +080082
83#include "trace_entries.h"
84
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020085#undef __field_ext
86#define __field_ext(_type, _item, _filter_type) { \
87 .type = #_type, .name = #_item, \
88 .size = sizeof(_type), .align = __alignof__(_type), \
89 is_signed_type(_type), .filter_type = _filter_type },
90
Steven Rostedt (VMware)46490792020-06-09 22:00:41 -040091
92#undef __field_ext_packed
93#define __field_ext_packed(_type, _item, _filter_type) { \
94 .type = #_type, .name = #_item, \
95 .size = sizeof(_type), .align = 1, \
96 is_signed_type(_type), .filter_type = _filter_type },
97
Steven Rostedt4e5292e2009-09-12 19:26:21 -040098#undef __field
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020099#define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
100
101#undef __field_fn
102#define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400103
104#undef __field_desc
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200105#define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400106
Steven Rostedt (VMware)46490792020-06-09 22:00:41 -0400107#undef __field_packed
108#define __field_packed(_type, _container, _item) __field_ext_packed(_type, _item, FILTER_OTHER)
109
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400110#undef __array
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200111#define __array(_type, _item, _len) { \
112 .type = #_type"["__stringify(_len)"]", .name = #_item, \
113 .size = sizeof(_type[_len]), .align = __alignof__(_type), \
114 is_signed_type(_type), .filter_type = FILTER_OTHER },
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400115
116#undef __array_desc
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200117#define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400118
119#undef __dynamic_array
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200120#define __dynamic_array(_type, _item) { \
121 .type = #_type "[]", .name = #_item, \
122 .size = 0, .align = __alignof__(_type), \
123 is_signed_type(_type), .filter_type = FILTER_OTHER },
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400124
125#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200126#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
127static struct trace_event_fields ftrace_event_fields_##name[] = { \
128 tstruct \
129 {} };
Tom Zanussie45f2e22009-03-31 00:49:16 -0500130
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400131#include "trace_entries.h"
132
Lai Jiangshan509e7602009-12-15 15:39:42 +0800133#undef __entry
134#define __entry REC
135
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400136#undef __field
137#define __field(type, item)
138
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200139#undef __field_fn
140#define __field_fn(type, item)
141
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400142#undef __field_desc
143#define __field_desc(type, container, item)
144
Steven Rostedt (VMware)46490792020-06-09 22:00:41 -0400145#undef __field_packed
146#define __field_packed(type, container, item)
147
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400148#undef __array
149#define __array(type, item, len)
150
151#undef __array_desc
152#define __array_desc(type, container, item, len)
153
154#undef __dynamic_array
155#define __dynamic_array(type, item)
156
Lai Jiangshan509e7602009-12-15 15:39:42 +0800157#undef F_printk
Wolfgang Mauerer01de9822012-03-22 11:18:20 +0100158#define F_printk(fmt, args...) __stringify(fmt) ", " __stringify(args)
Lai Jiangshan509e7602009-12-15 15:39:42 +0800159
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100160#undef FTRACE_ENTRY_REG
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200161#define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
Ben Dooks6dff4d72019-10-15 13:10:12 +0100162static struct trace_event_class __refdata event_class_ftrace_##call = { \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400163 .system = __stringify(TRACE_SYSTEM), \
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200164 .fields_array = ftrace_event_fields_##call, \
Li Zefanffb9f992010-05-24 16:24:52 +0800165 .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100166 .reg = regfn, \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400167}; \
168 \
Steven Rostedt (Red Hat)2425bcb2015-05-05 11:45:27 -0400169struct trace_event_call __used event_##call = { \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400170 .class = &event_class_ftrace_##call, \
Mathieu Desnoyersabb43f62014-04-09 17:06:08 -0400171 { \
172 .name = #call, \
173 }, \
174 .event.type = etype, \
Lai Jiangshan509e7602009-12-15 15:39:42 +0800175 .print_fmt = print, \
He Kuang754cb002015-03-03 15:21:33 +0800176 .flags = TRACE_EVENT_FL_IGNORE_ENABLE, \
Tom Zanussie1112b42009-03-31 00:48:49 -0500177}; \
Ben Dooks6dff4d72019-10-15 13:10:12 +0100178static struct trace_event_call __used \
Joe Perches33def842020-10-21 19:36:07 -0700179__section("_ftrace_events") *__event_##call = &event_##call;
Tom Zanussie1112b42009-03-31 00:48:49 -0500180
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100181#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200182#define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100183 FTRACE_ENTRY_REG(call, struct_name, etype, \
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200184 PARAMS(tstruct), PARAMS(print), NULL)
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100185
Yaowei Baic6650b22015-09-29 22:43:36 +0800186bool ftrace_event_is_function(struct trace_event_call *call)
Jiri Olsaced39002012-02-15 15:51:52 +0100187{
188 return call == &event_function;
189}
190
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400191#include "trace_entries.h"