1770cb243SSteven Rostedt /* 2770cb243SSteven Rostedt * trace_export.c - export basic ftrace utilities to user space 3770cb243SSteven Rostedt * 4770cb243SSteven Rostedt * Copyright (C) 2009 Steven Rostedt <srostedt@redhat.com> 5770cb243SSteven Rostedt */ 6770cb243SSteven Rostedt #include <linux/stringify.h> 7770cb243SSteven Rostedt #include <linux/kallsyms.h> 8770cb243SSteven Rostedt #include <linux/seq_file.h> 9770cb243SSteven Rostedt #include <linux/debugfs.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 #include <linux/fs.h> 15770cb243SSteven Rostedt 16770cb243SSteven Rostedt #include "trace_output.h" 17770cb243SSteven Rostedt 184e5292eaSSteven Rostedt #undef TRACE_SYSTEM 194e5292eaSSteven Rostedt #define TRACE_SYSTEM ftrace 20da4d0302SSteven Rostedt 214e5292eaSSteven Rostedt /* not needed for this file */ 224e5292eaSSteven Rostedt #undef __field_struct 234e5292eaSSteven Rostedt #define __field_struct(type, item) 24da4d0302SSteven Rostedt 254e5292eaSSteven Rostedt #undef __field 2605ffa2d0SLi Zefan #define __field(type, item) type item; 2705ffa2d0SLi Zefan 2805ffa2d0SLi Zefan #undef __field_desc 2905ffa2d0SLi Zefan #define __field_desc(type, container, item) type item; 3005ffa2d0SLi Zefan 3105ffa2d0SLi Zefan #undef __array 3205ffa2d0SLi Zefan #define __array(type, item, size) type item[size]; 3305ffa2d0SLi Zefan 3405ffa2d0SLi Zefan #undef __array_desc 3505ffa2d0SLi Zefan #define __array_desc(type, container, item, size) type item[size]; 3605ffa2d0SLi Zefan 3705ffa2d0SLi Zefan #undef __dynamic_array 3805ffa2d0SLi Zefan #define __dynamic_array(type, item) type item[]; 3905ffa2d0SLi Zefan 4005ffa2d0SLi Zefan #undef F_STRUCT 4105ffa2d0SLi Zefan #define F_STRUCT(args...) args 4205ffa2d0SLi Zefan 4305ffa2d0SLi Zefan #undef F_printk 4405ffa2d0SLi Zefan #define F_printk(fmt, args...) fmt, args 4505ffa2d0SLi Zefan 4605ffa2d0SLi Zefan #undef FTRACE_ENTRY 4705ffa2d0SLi Zefan #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ 4805ffa2d0SLi Zefan struct ____ftrace_##name { \ 4905ffa2d0SLi Zefan tstruct \ 5005ffa2d0SLi Zefan }; \ 515e9b3972SLi Zefan static void __always_unused ____ftrace_check_##name(void) \ 5205ffa2d0SLi Zefan { \ 5305ffa2d0SLi Zefan struct ____ftrace_##name *__entry = NULL; \ 5405ffa2d0SLi Zefan \ 555e9b3972SLi Zefan /* force compile-time check on F_printk() */ \ 5605ffa2d0SLi Zefan printk(print); \ 5705ffa2d0SLi Zefan } 5805ffa2d0SLi Zefan 5905ffa2d0SLi Zefan #undef FTRACE_ENTRY_DUP 6005ffa2d0SLi Zefan #define FTRACE_ENTRY_DUP(name, struct_name, id, tstruct, print) \ 6105ffa2d0SLi Zefan FTRACE_ENTRY(name, struct_name, id, PARAMS(tstruct), PARAMS(print)) 6205ffa2d0SLi Zefan 6305ffa2d0SLi Zefan #include "trace_entries.h" 6405ffa2d0SLi Zefan 654e5292eaSSteven Rostedt #undef __field 664e5292eaSSteven Rostedt #define __field(type, item) \ 674e5292eaSSteven Rostedt ret = trace_define_field(event_call, #type, #item, \ 684e5292eaSSteven Rostedt offsetof(typeof(field), item), \ 694e5292eaSSteven Rostedt sizeof(field.item), \ 704e5292eaSSteven Rostedt is_signed_type(type), FILTER_OTHER); \ 714e5292eaSSteven Rostedt if (ret) \ 724e5292eaSSteven Rostedt return ret; 734e5292eaSSteven Rostedt 744e5292eaSSteven Rostedt #undef __field_desc 754e5292eaSSteven Rostedt #define __field_desc(type, container, item) \ 764e5292eaSSteven Rostedt ret = trace_define_field(event_call, #type, #item, \ 774e5292eaSSteven Rostedt offsetof(typeof(field), \ 784e5292eaSSteven Rostedt container.item), \ 794e5292eaSSteven Rostedt sizeof(field.container.item), \ 804e5292eaSSteven Rostedt is_signed_type(type), FILTER_OTHER); \ 814e5292eaSSteven Rostedt if (ret) \ 824e5292eaSSteven Rostedt return ret; 834e5292eaSSteven Rostedt 844e5292eaSSteven Rostedt #undef __array 854e5292eaSSteven Rostedt #define __array(type, item, len) \ 864e5292eaSSteven Rostedt BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 874e5292eaSSteven Rostedt ret = trace_define_field(event_call, #type "[" #len "]", #item, \ 884e5292eaSSteven Rostedt offsetof(typeof(field), item), \ 89fb7ae981SLai Jiangshan sizeof(field.item), \ 90fb7ae981SLai Jiangshan is_signed_type(type), FILTER_OTHER); \ 914e5292eaSSteven Rostedt if (ret) \ 924e5292eaSSteven Rostedt return ret; 934e5292eaSSteven Rostedt 944e5292eaSSteven Rostedt #undef __array_desc 954e5292eaSSteven Rostedt #define __array_desc(type, container, item, len) \ 964e5292eaSSteven Rostedt BUILD_BUG_ON(len > MAX_FILTER_STR_VAL); \ 974e5292eaSSteven Rostedt ret = trace_define_field(event_call, #type "[" #len "]", #item, \ 984e5292eaSSteven Rostedt offsetof(typeof(field), \ 994e5292eaSSteven Rostedt container.item), \ 100fb7ae981SLai Jiangshan sizeof(field.container.item), \ 101fb7ae981SLai Jiangshan is_signed_type(type), FILTER_OTHER); \ 1024e5292eaSSteven Rostedt if (ret) \ 1034e5292eaSSteven Rostedt return ret; 1044e5292eaSSteven Rostedt 1054e5292eaSSteven Rostedt #undef __dynamic_array 106809826a3SLai Jiangshan #define __dynamic_array(type, item) \ 107809826a3SLai Jiangshan ret = trace_define_field(event_call, #type, #item, \ 108809826a3SLai Jiangshan offsetof(typeof(field), item), \ 109809826a3SLai Jiangshan 0, is_signed_type(type), FILTER_OTHER);\ 110809826a3SLai Jiangshan if (ret) \ 111809826a3SLai Jiangshan return ret; 1124e5292eaSSteven Rostedt 1134e5292eaSSteven Rostedt #undef FTRACE_ENTRY 1144e5292eaSSteven Rostedt #define FTRACE_ENTRY(name, struct_name, id, tstruct, print) \ 1154e5292eaSSteven Rostedt int \ 1164e5292eaSSteven Rostedt ftrace_define_fields_##name(struct ftrace_event_call *event_call) \ 117e45f2e2bSTom Zanussi { \ 1184e5292eaSSteven Rostedt struct struct_name field; \ 119e45f2e2bSTom Zanussi int ret; \ 120e45f2e2bSTom Zanussi \ 1214e5292eaSSteven Rostedt tstruct; \ 122e45f2e2bSTom Zanussi \ 123e45f2e2bSTom Zanussi return ret; \ 124e45f2e2bSTom Zanussi } 125e45f2e2bSTom Zanussi 1264e5292eaSSteven Rostedt #include "trace_entries.h" 1274e5292eaSSteven Rostedt 128d7a4b414SFrederic Weisbecker static int ftrace_raw_init_event(struct ftrace_event_call *call) 129d7a4b414SFrederic Weisbecker { 1302e33af02SSteven Rostedt INIT_LIST_HEAD(&call->class->fields); 131d7a4b414SFrederic Weisbecker return 0; 132d7a4b414SFrederic Weisbecker } 1334e5292eaSSteven Rostedt 134509e760cSLai Jiangshan #undef __entry 135509e760cSLai Jiangshan #define __entry REC 136509e760cSLai Jiangshan 1374e5292eaSSteven Rostedt #undef __field 1384e5292eaSSteven Rostedt #define __field(type, item) 1394e5292eaSSteven Rostedt 1404e5292eaSSteven Rostedt #undef __field_desc 1414e5292eaSSteven Rostedt #define __field_desc(type, container, item) 1424e5292eaSSteven Rostedt 1434e5292eaSSteven Rostedt #undef __array 1444e5292eaSSteven Rostedt #define __array(type, item, len) 1454e5292eaSSteven Rostedt 1464e5292eaSSteven Rostedt #undef __array_desc 1474e5292eaSSteven Rostedt #define __array_desc(type, container, item, len) 1484e5292eaSSteven Rostedt 1494e5292eaSSteven Rostedt #undef __dynamic_array 1504e5292eaSSteven Rostedt #define __dynamic_array(type, item) 1514e5292eaSSteven Rostedt 152509e760cSLai Jiangshan #undef F_printk 153509e760cSLai Jiangshan #define F_printk(fmt, args...) #fmt ", " __stringify(args) 154509e760cSLai Jiangshan 1554e5292eaSSteven Rostedt #undef FTRACE_ENTRY 1564e5292eaSSteven Rostedt #define FTRACE_ENTRY(call, struct_name, type, tstruct, print) \ 157770cb243SSteven Rostedt \ 1582e33af02SSteven Rostedt struct ftrace_event_class event_class_ftrace_##call = { \ 1592e33af02SSteven Rostedt .system = __stringify(TRACE_SYSTEM), \ 1602e33af02SSteven Rostedt .define_fields = ftrace_define_fields_##call, \ 1612e33af02SSteven Rostedt }; \ 1622e33af02SSteven Rostedt \ 163e1112b4dSTom Zanussi struct ftrace_event_call __used \ 164770cb243SSteven Rostedt __attribute__((__aligned__(4))) \ 165770cb243SSteven Rostedt __attribute__((section("_ftrace_events"))) event_##call = { \ 166770cb243SSteven Rostedt .name = #call, \ 1674e5292eaSSteven Rostedt .id = type, \ 1682e33af02SSteven Rostedt .class = &event_class_ftrace_##call, \ 169d7a4b414SFrederic Weisbecker .raw_init = ftrace_raw_init_event, \ 170509e760cSLai Jiangshan .print_fmt = print, \ 171e1112b4dSTom Zanussi }; \ 172e1112b4dSTom Zanussi 1734e5292eaSSteven Rostedt #include "trace_entries.h" 174