1 // SPDX-License-Identifier: GPL-2.0
10 #include <linux/kernel.h>
11 #include <linux/err.h>
12 #include <traceevent/event-parse.h>
13 #include <api/fs/tracing_path.h>
14 #include <api/fs/fs.h>
15 #include "trace-event.h"
20 * global trace_event object used by trace_event__tp_format
22 * TODO There's no cleanup call for this. Add some sort of
23 * __exit function support and call trace_event__cleanup
26 static struct trace_event tevent
;
27 static bool tevent_initialized
;
29 int trace_event__init(struct trace_event
*t
)
31 struct tep_handle
*pevent
= tep_alloc();
34 t
->plugin_list
= tep_load_plugins(pevent
);
38 return pevent
? 0 : -1;
41 static int trace_event__init2(void)
43 int be
= tep_host_bigendian();
44 struct tep_handle
*pevent
;
46 if (trace_event__init(&tevent
))
49 pevent
= tevent
.pevent
;
50 tep_set_flag(pevent
, TEP_NSEC_OUTPUT
);
51 tep_set_file_bigendian(pevent
, be
);
52 tep_set_host_bigendian(pevent
, be
);
53 tevent_initialized
= true;
57 int trace_event__register_resolver(struct machine
*machine
,
58 tep_func_resolver_t
*func
)
60 if (!tevent_initialized
&& trace_event__init2())
63 return tep_set_function_resolver(tevent
.pevent
, func
, machine
);
66 void trace_event__cleanup(struct trace_event
*t
)
68 tep_unload_plugins(t
->plugin_list
, t
->pevent
);
73 * Returns pointer with encoded error via <linux/err.h> interface.
75 static struct tep_event
*
76 tp_format(const char *sys
, const char *name
)
78 char *tp_dir
= get_events_file(sys
);
79 struct tep_handle
*pevent
= tevent
.pevent
;
80 struct tep_event
*event
= NULL
;
87 return ERR_PTR(-errno
);
89 scnprintf(path
, PATH_MAX
, "%s/%s/format", tp_dir
, name
);
90 put_events_file(tp_dir
);
92 err
= filename__read_str(path
, &data
, &size
);
96 tep_parse_format(pevent
, &event
, data
, size
, sys
);
103 * Returns pointer with encoded error via <linux/err.h> interface.
106 trace_event__tp_format(const char *sys
, const char *name
)
108 if (!tevent_initialized
&& trace_event__init2())
109 return ERR_PTR(-ENOMEM
);
111 return tp_format(sys
, name
);
114 struct tep_event
*trace_event__tp_format_id(int id
)
116 if (!tevent_initialized
&& trace_event__init2())
117 return ERR_PTR(-ENOMEM
);
119 return tep_find_event(tevent
.pevent
, id
);