129f5ffd3SJiri Olsa 297978b3eSJiri Olsa #include <stdio.h> 397978b3eSJiri Olsa #include <unistd.h> 497978b3eSJiri Olsa #include <stdlib.h> 597978b3eSJiri Olsa #include <errno.h> 697978b3eSJiri Olsa #include <sys/types.h> 797978b3eSJiri Olsa #include <sys/stat.h> 897978b3eSJiri Olsa #include <fcntl.h> 997978b3eSJiri Olsa #include <linux/kernel.h> 1029f5ffd3SJiri Olsa #include <traceevent/event-parse.h> 1129f5ffd3SJiri Olsa #include "trace-event.h" 12c3168b0dSArnaldo Carvalho de Melo #include "machine.h" 1397978b3eSJiri Olsa #include "util.h" 1497978b3eSJiri Olsa 1597978b3eSJiri Olsa /* 1697978b3eSJiri Olsa * global trace_event object used by trace_event__tp_format 1797978b3eSJiri Olsa * 1897978b3eSJiri Olsa * TODO There's no cleanup call for this. Add some sort of 1997978b3eSJiri Olsa * __exit function support and call trace_event__cleanup 2097978b3eSJiri Olsa * there. 2197978b3eSJiri Olsa */ 2297978b3eSJiri Olsa static struct trace_event tevent; 23c3168b0dSArnaldo Carvalho de Melo static bool tevent_initialized; 2429f5ffd3SJiri Olsa 2529f5ffd3SJiri Olsa int trace_event__init(struct trace_event *t) 2629f5ffd3SJiri Olsa { 2729f5ffd3SJiri Olsa struct pevent *pevent = pevent_alloc(); 2829f5ffd3SJiri Olsa 2929f5ffd3SJiri Olsa if (pevent) { 3029f5ffd3SJiri Olsa t->plugin_list = traceevent_load_plugins(pevent); 3129f5ffd3SJiri Olsa t->pevent = pevent; 3229f5ffd3SJiri Olsa } 3329f5ffd3SJiri Olsa 3429f5ffd3SJiri Olsa return pevent ? 0 : -1; 3529f5ffd3SJiri Olsa } 3629f5ffd3SJiri Olsa 37c3168b0dSArnaldo Carvalho de Melo static int trace_event__init2(void) 38c3168b0dSArnaldo Carvalho de Melo { 39c3168b0dSArnaldo Carvalho de Melo int be = traceevent_host_bigendian(); 40c3168b0dSArnaldo Carvalho de Melo struct pevent *pevent; 41c3168b0dSArnaldo Carvalho de Melo 42c3168b0dSArnaldo Carvalho de Melo if (trace_event__init(&tevent)) 43c3168b0dSArnaldo Carvalho de Melo return -1; 44c3168b0dSArnaldo Carvalho de Melo 45c3168b0dSArnaldo Carvalho de Melo pevent = tevent.pevent; 46c3168b0dSArnaldo Carvalho de Melo pevent_set_flag(pevent, PEVENT_NSEC_OUTPUT); 47c3168b0dSArnaldo Carvalho de Melo pevent_set_file_bigendian(pevent, be); 48c3168b0dSArnaldo Carvalho de Melo pevent_set_host_bigendian(pevent, be); 49c3168b0dSArnaldo Carvalho de Melo tevent_initialized = true; 50c3168b0dSArnaldo Carvalho de Melo return 0; 51c3168b0dSArnaldo Carvalho de Melo } 52c3168b0dSArnaldo Carvalho de Melo 53*959c2199SArnaldo Carvalho de Melo int trace_event__register_resolver(struct machine *machine, 54*959c2199SArnaldo Carvalho de Melo pevent_func_resolver_t *func) 55c3168b0dSArnaldo Carvalho de Melo { 56c3168b0dSArnaldo Carvalho de Melo if (!tevent_initialized && trace_event__init2()) 57c3168b0dSArnaldo Carvalho de Melo return -1; 58c3168b0dSArnaldo Carvalho de Melo 59*959c2199SArnaldo Carvalho de Melo return pevent_set_function_resolver(tevent.pevent, func, machine); 60c3168b0dSArnaldo Carvalho de Melo } 61c3168b0dSArnaldo Carvalho de Melo 6229f5ffd3SJiri Olsa void trace_event__cleanup(struct trace_event *t) 6329f5ffd3SJiri Olsa { 648d0c2224SNamhyung Kim traceevent_unload_plugins(t->plugin_list, t->pevent); 6529f5ffd3SJiri Olsa pevent_free(t->pevent); 6629f5ffd3SJiri Olsa } 6797978b3eSJiri Olsa 6897978b3eSJiri Olsa static struct event_format* 6997978b3eSJiri Olsa tp_format(const char *sys, const char *name) 7097978b3eSJiri Olsa { 7197978b3eSJiri Olsa struct pevent *pevent = tevent.pevent; 7297978b3eSJiri Olsa struct event_format *event = NULL; 7397978b3eSJiri Olsa char path[PATH_MAX]; 7497978b3eSJiri Olsa size_t size; 7597978b3eSJiri Olsa char *data; 7697978b3eSJiri Olsa 7797978b3eSJiri Olsa scnprintf(path, PATH_MAX, "%s/%s/%s/format", 7897978b3eSJiri Olsa tracing_events_path, sys, name); 7997978b3eSJiri Olsa 8097978b3eSJiri Olsa if (filename__read_str(path, &data, &size)) 8197978b3eSJiri Olsa return NULL; 8297978b3eSJiri Olsa 8397978b3eSJiri Olsa pevent_parse_format(pevent, &event, data, size, sys); 8497978b3eSJiri Olsa 8597978b3eSJiri Olsa free(data); 8697978b3eSJiri Olsa return event; 8797978b3eSJiri Olsa } 8897978b3eSJiri Olsa 8997978b3eSJiri Olsa struct event_format* 9097978b3eSJiri Olsa trace_event__tp_format(const char *sys, const char *name) 9197978b3eSJiri Olsa { 92c3168b0dSArnaldo Carvalho de Melo if (!tevent_initialized && trace_event__init2()) 9397978b3eSJiri Olsa return NULL; 9497978b3eSJiri Olsa 9597978b3eSJiri Olsa return tp_format(sys, name); 9697978b3eSJiri Olsa } 97