blob: 77ce5a3b6773e75ff2a117e0913b3588b1cfa529 [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
29 * function and thus become accesible via perf.
30 */
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
48#undef __array
49#define __array(type, item, size) type item[size];
50
51#undef __array_desc
52#define __array_desc(type, container, item, size) type item[size];
53
54#undef __dynamic_array
55#define __dynamic_array(type, item) type item[];
56
57#undef F_STRUCT
58#define F_STRUCT(args...) args
59
60#undef F_printk
61#define F_printk(fmt, args...) fmt, args
62
63#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020064#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
Jiri Olsa02aa3162012-02-15 15:51:53 +010065struct ____ftrace_##name { \
66 tstruct \
67}; \
68static void __always_unused ____ftrace_check_##name(void) \
69{ \
70 struct ____ftrace_##name *__entry = NULL; \
71 \
72 /* force compile-time check on F_printk() */ \
73 printk(print); \
Li Zefan05ffa2d2009-09-14 15:54:52 +080074}
75
76#undef FTRACE_ENTRY_DUP
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020077#define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \
78 FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print))
Li Zefan05ffa2d2009-09-14 15:54:52 +080079
80#include "trace_entries.h"
81
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020082#undef __field_ext
83#define __field_ext(_type, _item, _filter_type) { \
84 .type = #_type, .name = #_item, \
85 .size = sizeof(_type), .align = __alignof__(_type), \
86 is_signed_type(_type), .filter_type = _filter_type },
87
Steven Rostedt4e5292e2009-09-12 19:26:21 -040088#undef __field
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020089#define __field(_type, _item) __field_ext(_type, _item, FILTER_OTHER)
90
91#undef __field_fn
92#define __field_fn(_type, _item) __field_ext(_type, _item, FILTER_TRACE_FN)
Steven Rostedt4e5292e2009-09-12 19:26:21 -040093
94#undef __field_desc
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020095#define __field_desc(_type, _container, _item) __field_ext(_type, _item, FILTER_OTHER)
Steven Rostedt4e5292e2009-09-12 19:26:21 -040096
97#undef __array
Peter Zijlstra04ae87a2019-10-24 22:26:59 +020098#define __array(_type, _item, _len) { \
99 .type = #_type"["__stringify(_len)"]", .name = #_item, \
100 .size = sizeof(_type[_len]), .align = __alignof__(_type), \
101 is_signed_type(_type), .filter_type = FILTER_OTHER },
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400102
103#undef __array_desc
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200104#define __array_desc(_type, _container, _item, _len) __array(_type, _item, _len)
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400105
106#undef __dynamic_array
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200107#define __dynamic_array(_type, _item) { \
108 .type = #_type "[]", .name = #_item, \
109 .size = 0, .align = __alignof__(_type), \
110 is_signed_type(_type), .filter_type = FILTER_OTHER },
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400111
112#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200113#define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \
114static struct trace_event_fields ftrace_event_fields_##name[] = { \
115 tstruct \
116 {} };
Tom Zanussie45f2e22009-03-31 00:49:16 -0500117
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400118#include "trace_entries.h"
119
Lai Jiangshan509e7602009-12-15 15:39:42 +0800120#undef __entry
121#define __entry REC
122
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400123#undef __field
124#define __field(type, item)
125
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200126#undef __field_fn
127#define __field_fn(type, item)
128
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400129#undef __field_desc
130#define __field_desc(type, container, item)
131
132#undef __array
133#define __array(type, item, len)
134
135#undef __array_desc
136#define __array_desc(type, container, item, len)
137
138#undef __dynamic_array
139#define __dynamic_array(type, item)
140
Lai Jiangshan509e7602009-12-15 15:39:42 +0800141#undef F_printk
Wolfgang Mauerer01de9822012-03-22 11:18:20 +0100142#define F_printk(fmt, args...) __stringify(fmt) ", " __stringify(args)
Lai Jiangshan509e7602009-12-15 15:39:42 +0800143
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100144#undef FTRACE_ENTRY_REG
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200145#define FTRACE_ENTRY_REG(call, struct_name, etype, tstruct, print, regfn) \
Ben Dooks6dff4d72019-10-15 13:10:12 +0100146static struct trace_event_class __refdata event_class_ftrace_##call = { \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400147 .system = __stringify(TRACE_SYSTEM), \
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200148 .fields_array = ftrace_event_fields_##call, \
Li Zefanffb9f992010-05-24 16:24:52 +0800149 .fields = LIST_HEAD_INIT(event_class_ftrace_##call.fields),\
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100150 .reg = regfn, \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400151}; \
152 \
Steven Rostedt (Red Hat)2425bcb2015-05-05 11:45:27 -0400153struct trace_event_call __used event_##call = { \
Steven Rostedt2e33af02010-04-22 10:35:55 -0400154 .class = &event_class_ftrace_##call, \
Mathieu Desnoyersabb43f62014-04-09 17:06:08 -0400155 { \
156 .name = #call, \
157 }, \
158 .event.type = etype, \
Lai Jiangshan509e7602009-12-15 15:39:42 +0800159 .print_fmt = print, \
He Kuang754cb002015-03-03 15:21:33 +0800160 .flags = TRACE_EVENT_FL_IGNORE_ENABLE, \
Tom Zanussie1112b42009-03-31 00:48:49 -0500161}; \
Ben Dooks6dff4d72019-10-15 13:10:12 +0100162static struct trace_event_call __used \
Steven Rostedte4a9ea52011-01-27 09:15:30 -0500163__attribute__((section("_ftrace_events"))) *__event_##call = &event_##call;
Tom Zanussie1112b42009-03-31 00:48:49 -0500164
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100165#undef FTRACE_ENTRY
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200166#define FTRACE_ENTRY(call, struct_name, etype, tstruct, print) \
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100167 FTRACE_ENTRY_REG(call, struct_name, etype, \
Peter Zijlstra04ae87a2019-10-24 22:26:59 +0200168 PARAMS(tstruct), PARAMS(print), NULL)
Jiri Olsae59a0bf2012-02-15 15:51:51 +0100169
Yaowei Baic6650b22015-09-29 22:43:36 +0800170bool ftrace_event_is_function(struct trace_event_call *call)
Jiri Olsaced39002012-02-15 15:51:52 +0100171{
172 return call == &event_function;
173}
174
Steven Rostedt4e5292e2009-09-12 19:26:21 -0400175#include "trace_entries.h"