xref: /aosp_15_r20/external/libtracefs/include/tracefs-local.h (revision 287e80b3a36113050663245e7f2c00d274188f18)
1*287e80b3SSadaf Ebrahimi /* SPDX-License-Identifier: LGPL-2.1 */
2*287e80b3SSadaf Ebrahimi /*
3*287e80b3SSadaf Ebrahimi  * Copyright (C) 2019, VMware, Tzvetomir Stoyanov <[email protected]>
4*287e80b3SSadaf Ebrahimi  *
5*287e80b3SSadaf Ebrahimi  */
6*287e80b3SSadaf Ebrahimi #ifndef _TRACE_FS_LOCAL_H
7*287e80b3SSadaf Ebrahimi #define _TRACE_FS_LOCAL_H
8*287e80b3SSadaf Ebrahimi 
9*287e80b3SSadaf Ebrahimi #include <pthread.h>
10*287e80b3SSadaf Ebrahimi 
11*287e80b3SSadaf Ebrahimi #define __hidden __attribute__((visibility ("hidden")))
12*287e80b3SSadaf Ebrahimi #define __weak __attribute__((weak))
13*287e80b3SSadaf Ebrahimi 
14*287e80b3SSadaf Ebrahimi #define ARRAY_SIZE(array) (sizeof(array) / sizeof((array)[0]))
15*287e80b3SSadaf Ebrahimi 
16*287e80b3SSadaf Ebrahimi /* Will cause a division by zero warning if cond is true */
17*287e80b3SSadaf Ebrahimi #define BUILD_BUG_ON(cond)			\
18*287e80b3SSadaf Ebrahimi 	do { if (!(1/!(cond))) { } } while (0)
19*287e80b3SSadaf Ebrahimi 
20*287e80b3SSadaf Ebrahimi #define HASH_BITS 10
21*287e80b3SSadaf Ebrahimi 
22*287e80b3SSadaf Ebrahimi struct tracefs_options_mask {
23*287e80b3SSadaf Ebrahimi 	unsigned long long	mask;
24*287e80b3SSadaf Ebrahimi };
25*287e80b3SSadaf Ebrahimi 
26*287e80b3SSadaf Ebrahimi struct follow_event {
27*287e80b3SSadaf Ebrahimi 	struct tep_event	*event;
28*287e80b3SSadaf Ebrahimi 	void			*callback_data;
29*287e80b3SSadaf Ebrahimi 	int (*callback)(struct tep_event *,
30*287e80b3SSadaf Ebrahimi 			struct tep_record *,
31*287e80b3SSadaf Ebrahimi 			int, void *);
32*287e80b3SSadaf Ebrahimi };
33*287e80b3SSadaf Ebrahimi 
34*287e80b3SSadaf Ebrahimi struct tracefs_instance {
35*287e80b3SSadaf Ebrahimi 	struct tracefs_options_mask	supported_opts;
36*287e80b3SSadaf Ebrahimi 	struct tracefs_options_mask	enabled_opts;
37*287e80b3SSadaf Ebrahimi 	struct follow_event		*followers;
38*287e80b3SSadaf Ebrahimi 	struct follow_event		*missed_followers;
39*287e80b3SSadaf Ebrahimi 	char				*trace_dir;
40*287e80b3SSadaf Ebrahimi 	char				*name;
41*287e80b3SSadaf Ebrahimi 	pthread_mutex_t			lock;
42*287e80b3SSadaf Ebrahimi 	int				ref;
43*287e80b3SSadaf Ebrahimi 	int				flags;
44*287e80b3SSadaf Ebrahimi 	int				ftrace_filter_fd;
45*287e80b3SSadaf Ebrahimi 	int				ftrace_notrace_fd;
46*287e80b3SSadaf Ebrahimi 	int				ftrace_marker_fd;
47*287e80b3SSadaf Ebrahimi 	int				ftrace_marker_raw_fd;
48*287e80b3SSadaf Ebrahimi 	int				nr_followers;
49*287e80b3SSadaf Ebrahimi 	int				nr_missed_followers;
50*287e80b3SSadaf Ebrahimi 	bool				pipe_keep_going;
51*287e80b3SSadaf Ebrahimi 	bool				iterate_keep_going;
52*287e80b3SSadaf Ebrahimi };
53*287e80b3SSadaf Ebrahimi 
54*287e80b3SSadaf Ebrahimi extern pthread_mutex_t toplevel_lock;
55*287e80b3SSadaf Ebrahimi 
trace_get_lock(struct tracefs_instance * instance)56*287e80b3SSadaf Ebrahimi static inline pthread_mutex_t *trace_get_lock(struct tracefs_instance *instance)
57*287e80b3SSadaf Ebrahimi {
58*287e80b3SSadaf Ebrahimi 	return instance ? &instance->lock : &toplevel_lock;
59*287e80b3SSadaf Ebrahimi }
60*287e80b3SSadaf Ebrahimi 
61*287e80b3SSadaf Ebrahimi void trace_put_instance(struct tracefs_instance *instance);
62*287e80b3SSadaf Ebrahimi int trace_get_instance(struct tracefs_instance *instance);
63*287e80b3SSadaf Ebrahimi 
64*287e80b3SSadaf Ebrahimi /* Can be overridden */
65*287e80b3SSadaf Ebrahimi void tracefs_warning(const char *fmt, ...);
66*287e80b3SSadaf Ebrahimi 
67*287e80b3SSadaf Ebrahimi int str_read_file(const char *file, char **buffer, bool warn);
68*287e80b3SSadaf Ebrahimi char *trace_append_file(const char *dir, const char *name);
69*287e80b3SSadaf Ebrahimi char *trace_find_tracing_dir(bool debugfs);
70*287e80b3SSadaf Ebrahimi 
71*287e80b3SSadaf Ebrahimi #ifndef ACCESSPERMS
72*287e80b3SSadaf Ebrahimi #define ACCESSPERMS (S_IRWXU|S_IRWXG|S_IRWXO) /* 0777 */
73*287e80b3SSadaf Ebrahimi #endif
74*287e80b3SSadaf Ebrahimi 
75*287e80b3SSadaf Ebrahimi #ifndef ALLPERMS
76*287e80b3SSadaf Ebrahimi #define ALLPERMS (S_ISUID|S_ISGID|S_ISVTX|S_IRWXU|S_IRWXG|S_IRWXO) /* 07777 */
77*287e80b3SSadaf Ebrahimi #endif
78*287e80b3SSadaf Ebrahimi 
79*287e80b3SSadaf Ebrahimi #ifndef DEFFILEMODE
80*287e80b3SSadaf Ebrahimi #define DEFFILEMODE (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH) /* 0666*/
81*287e80b3SSadaf Ebrahimi #endif
82*287e80b3SSadaf Ebrahimi 
83*287e80b3SSadaf Ebrahimi struct tracefs_options_mask *
84*287e80b3SSadaf Ebrahimi supported_opts_mask(struct tracefs_instance *instance);
85*287e80b3SSadaf Ebrahimi 
86*287e80b3SSadaf Ebrahimi struct tracefs_options_mask *
87*287e80b3SSadaf Ebrahimi enabled_opts_mask(struct tracefs_instance *instance);
88*287e80b3SSadaf Ebrahimi 
89*287e80b3SSadaf Ebrahimi char **trace_list_create_empty(void);
90*287e80b3SSadaf Ebrahimi int trace_list_pop(char **list);
91*287e80b3SSadaf Ebrahimi 
92*287e80b3SSadaf Ebrahimi char *append_string(char *str, const char *delim, const char *add);
93*287e80b3SSadaf Ebrahimi int trace_test_state(int state);
94*287e80b3SSadaf Ebrahimi bool trace_verify_event_field(struct tep_event *event,
95*287e80b3SSadaf Ebrahimi 			      const char *field_name,
96*287e80b3SSadaf Ebrahimi 			      const struct tep_format_field **ptr_field);
97*287e80b3SSadaf Ebrahimi int trace_append_filter(char **filter, unsigned int *state,
98*287e80b3SSadaf Ebrahimi 			unsigned int *open_parens,
99*287e80b3SSadaf Ebrahimi 			struct tep_event *event,
100*287e80b3SSadaf Ebrahimi 			enum tracefs_filter type,
101*287e80b3SSadaf Ebrahimi 			const char *field_name,
102*287e80b3SSadaf Ebrahimi 			enum tracefs_compare compare,
103*287e80b3SSadaf Ebrahimi 			 const char *val);
104*287e80b3SSadaf Ebrahimi 
105*287e80b3SSadaf Ebrahimi struct tracefs_synth *synth_init_from(struct tep_handle *tep,
106*287e80b3SSadaf Ebrahimi 				      const char *start_system,
107*287e80b3SSadaf Ebrahimi 				      const char *start_event);
108*287e80b3SSadaf Ebrahimi 
109*287e80b3SSadaf Ebrahimi #define HIST_COUNTER_TYPE	(TRACEFS_HIST_KEY_MAX + 100)
110*287e80b3SSadaf Ebrahimi int synth_add_start_field(struct tracefs_synth *synth,
111*287e80b3SSadaf Ebrahimi 			  const char *start_field,
112*287e80b3SSadaf Ebrahimi 			  const char *name,
113*287e80b3SSadaf Ebrahimi 			  enum tracefs_hist_key_type type, int cnt);
114*287e80b3SSadaf Ebrahimi 
115*287e80b3SSadaf Ebrahimi /* Internal interface for ftrace dynamic events */
116*287e80b3SSadaf Ebrahimi 
117*287e80b3SSadaf Ebrahimi struct tracefs_dynevent {
118*287e80b3SSadaf Ebrahimi 	char *trace_file;
119*287e80b3SSadaf Ebrahimi 	char *prefix;
120*287e80b3SSadaf Ebrahimi 	char *system;
121*287e80b3SSadaf Ebrahimi 	char *event;
122*287e80b3SSadaf Ebrahimi 	char *address;
123*287e80b3SSadaf Ebrahimi 	char *format;
124*287e80b3SSadaf Ebrahimi 	enum tracefs_dynevent_type type;
125*287e80b3SSadaf Ebrahimi };
126*287e80b3SSadaf Ebrahimi 
127*287e80b3SSadaf Ebrahimi struct tracefs_dynevent *
128*287e80b3SSadaf Ebrahimi dynevent_alloc(enum tracefs_dynevent_type type, const char *system,
129*287e80b3SSadaf Ebrahimi 	       const char *event, const char *address, const char *format);
130*287e80b3SSadaf Ebrahimi int dynevent_get_count(unsigned int types, const char *system);
131*287e80b3SSadaf Ebrahimi 
132*287e80b3SSadaf Ebrahimi int trace_load_events(struct tep_handle *tep,
133*287e80b3SSadaf Ebrahimi 		      const char *tracing_dir, const char *system);
134*287e80b3SSadaf Ebrahimi int trace_rescan_events(struct tep_handle *tep,
135*287e80b3SSadaf Ebrahimi 			const char *tracing_dir, const char *system);
136*287e80b3SSadaf Ebrahimi struct tep_event *get_tep_event(struct tep_handle *tep,
137*287e80b3SSadaf Ebrahimi 				const char *system, const char *name);
138*287e80b3SSadaf Ebrahimi 
139*287e80b3SSadaf Ebrahimi unsigned int quick_hash(const char *str);
140*287e80b3SSadaf Ebrahimi 
141*287e80b3SSadaf Ebrahimi #endif /* _TRACE_FS_LOCAL_H */
142