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 \ 179e4a9ea5eSSteven Rostedt __attribute__((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