1/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * dlfilter.h: Interface to perf script --dlfilter shared object
4 * Copyright (c) 2021, Intel Corporation.
5 */
6
7#ifndef PERF_UTIL_DLFILTER_H
8#define PERF_UTIL_DLFILTER_H
9
10struct perf_session;
11union  perf_event;
12struct perf_sample;
13struct evsel;
14struct machine;
15struct addr_location;
16struct perf_dlfilter_fns;
17struct perf_dlfilter_sample;
18struct perf_dlfilter_al;
19
20struct dlfilter {
21	char				*file;
22	void				*handle;
23	void				*data;
24	struct perf_session		*session;
25	bool				ctx_valid;
26	bool				in_start;
27	bool				in_stop;
28	int				dlargc;
29	char				**dlargv;
30
31	union perf_event		*event;
32	struct perf_sample		*sample;
33	struct evsel			*evsel;
34	struct machine			*machine;
35	struct addr_location		*al;
36	struct addr_location		*addr_al;
37	struct perf_dlfilter_sample	*d_sample;
38	struct perf_dlfilter_al		*d_ip_al;
39	struct perf_dlfilter_al		*d_addr_al;
40
41	int (*start)(void **data, void *ctx);
42	int (*stop)(void *data, void *ctx);
43
44	int (*filter_event)(void *data,
45			    const struct perf_dlfilter_sample *sample,
46			    void *ctx);
47	int (*filter_event_early)(void *data,
48				  const struct perf_dlfilter_sample *sample,
49				  void *ctx);
50
51	struct perf_dlfilter_fns *fns;
52};
53
54struct dlfilter *dlfilter__new(const char *file, int dlargc, char **dlargv);
55
56int dlfilter__start(struct dlfilter *d, struct perf_session *session);
57
58int dlfilter__do_filter_event(struct dlfilter *d,
59			      union perf_event *event,
60			      struct perf_sample *sample,
61			      struct evsel *evsel,
62			      struct machine *machine,
63			      struct addr_location *al,
64			      struct addr_location *addr_al,
65			      bool early);
66
67void dlfilter__cleanup(struct dlfilter *d);
68
69static inline int dlfilter__filter_event(struct dlfilter *d,
70					 union perf_event *event,
71					 struct perf_sample *sample,
72					 struct evsel *evsel,
73					 struct machine *machine,
74					 struct addr_location *al,
75					 struct addr_location *addr_al)
76{
77	if (!d || !d->filter_event)
78		return 0;
79	return dlfilter__do_filter_event(d, event, sample, evsel, machine, al, addr_al, false);
80}
81
82static inline int dlfilter__filter_event_early(struct dlfilter *d,
83					       union perf_event *event,
84					       struct perf_sample *sample,
85					       struct evsel *evsel,
86					       struct machine *machine,
87					       struct addr_location *al,
88					       struct addr_location *addr_al)
89{
90	if (!d || !d->filter_event_early)
91		return 0;
92	return dlfilter__do_filter_event(d, event, sample, evsel, machine, al, addr_al, true);
93}
94
95int list_available_dlfilters(const struct option *opt, const char *s, int unset);
96bool get_filter_desc(const char *dirname, const char *name, char **desc,
97		     char **long_desc);
98
99#endif
100