xref: /OK3568_Linux_fs/kernel/tools/perf/trace/beauty/beauty.h (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */
2*4882a593Smuzhiyun #ifndef _PERF_TRACE_BEAUTY_H
3*4882a593Smuzhiyun #define _PERF_TRACE_BEAUTY_H
4*4882a593Smuzhiyun 
5*4882a593Smuzhiyun #include <linux/kernel.h>
6*4882a593Smuzhiyun #include <linux/types.h>
7*4882a593Smuzhiyun #include <sys/types.h>
8*4882a593Smuzhiyun #include <stdbool.h>
9*4882a593Smuzhiyun 
10*4882a593Smuzhiyun struct strarray {
11*4882a593Smuzhiyun 	u64	    offset;
12*4882a593Smuzhiyun 	int	    nr_entries;
13*4882a593Smuzhiyun 	const char *prefix;
14*4882a593Smuzhiyun 	const char **entries;
15*4882a593Smuzhiyun };
16*4882a593Smuzhiyun 
17*4882a593Smuzhiyun #define DEFINE_STRARRAY(array, _prefix) struct strarray strarray__##array = { \
18*4882a593Smuzhiyun 	.nr_entries = ARRAY_SIZE(array), \
19*4882a593Smuzhiyun 	.entries = array, \
20*4882a593Smuzhiyun 	.prefix = _prefix, \
21*4882a593Smuzhiyun }
22*4882a593Smuzhiyun 
23*4882a593Smuzhiyun #define DEFINE_STRARRAY_OFFSET(array, _prefix, off) struct strarray strarray__##array = { \
24*4882a593Smuzhiyun 	.offset	    = off, \
25*4882a593Smuzhiyun 	.nr_entries = ARRAY_SIZE(array), \
26*4882a593Smuzhiyun 	.entries = array, \
27*4882a593Smuzhiyun 	.prefix = _prefix, \
28*4882a593Smuzhiyun }
29*4882a593Smuzhiyun 
30*4882a593Smuzhiyun size_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
31*4882a593Smuzhiyun size_t strarray__scnprintf_suffix(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_suffix, int val);
32*4882a593Smuzhiyun size_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags);
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun bool strarray__strtoul(struct strarray *sa, char *bf, size_t size, u64 *ret);
35*4882a593Smuzhiyun bool strarray__strtoul_flags(struct strarray *sa, char *bf, size_t size, u64 *ret);
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun struct trace;
38*4882a593Smuzhiyun struct thread;
39*4882a593Smuzhiyun 
40*4882a593Smuzhiyun struct file {
41*4882a593Smuzhiyun 	char *pathname;
42*4882a593Smuzhiyun 	int  dev_maj;
43*4882a593Smuzhiyun };
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun struct file *thread__files_entry(struct thread *thread, int fd);
46*4882a593Smuzhiyun 
47*4882a593Smuzhiyun struct strarrays {
48*4882a593Smuzhiyun 	int		nr_entries;
49*4882a593Smuzhiyun 	struct strarray **entries;
50*4882a593Smuzhiyun };
51*4882a593Smuzhiyun 
52*4882a593Smuzhiyun #define DEFINE_STRARRAYS(array) struct strarrays strarrays__##array = { \
53*4882a593Smuzhiyun 	.nr_entries = ARRAY_SIZE(array), \
54*4882a593Smuzhiyun 	.entries = array, \
55*4882a593Smuzhiyun }
56*4882a593Smuzhiyun 
57*4882a593Smuzhiyun size_t strarrays__scnprintf(struct strarrays *sas, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
58*4882a593Smuzhiyun 
59*4882a593Smuzhiyun bool strarrays__strtoul(struct strarrays *sas, char *bf, size_t size, u64 *ret);
60*4882a593Smuzhiyun 
61*4882a593Smuzhiyun size_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_t size);
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun extern struct strarray strarray__socket_families;
64*4882a593Smuzhiyun 
65*4882a593Smuzhiyun /**
66*4882a593Smuzhiyun  * augmented_arg: extra payload for syscall pointer arguments
67*4882a593Smuzhiyun 
68*4882a593Smuzhiyun  * If perf_sample->raw_size is more than what a syscall sys_enter_FOO puts,
69*4882a593Smuzhiyun  * then its the arguments contents, so that we can show more than just a
70*4882a593Smuzhiyun  * pointer. This will be done initially with eBPF, the start of that is at the
71*4882a593Smuzhiyun  * tools/perf/examples/bpf/augmented_syscalls.c example for the openat, but
72*4882a593Smuzhiyun  * will eventually be done automagically caching the running kernel tracefs
73*4882a593Smuzhiyun  * events data into an eBPF C script, that then gets compiled and its .o file
74*4882a593Smuzhiyun  * cached for subsequent use. For char pointers like the ones for 'open' like
75*4882a593Smuzhiyun  * syscalls its easy, for the rest we should use DWARF or better, BTF, much
76*4882a593Smuzhiyun  * more compact.
77*4882a593Smuzhiyun  *
78*4882a593Smuzhiyun  * @size: 8 if all we need is an integer, otherwise all of the augmented arg.
79*4882a593Smuzhiyun  * @int_arg: will be used for integer like pointer contents, like 'accept's 'upeer_addrlen'
80*4882a593Smuzhiyun  * @value: u64 aligned, for structs, pathnames
81*4882a593Smuzhiyun  */
82*4882a593Smuzhiyun struct augmented_arg {
83*4882a593Smuzhiyun 	int  size;
84*4882a593Smuzhiyun 	int  int_arg;
85*4882a593Smuzhiyun 	u64  value[];
86*4882a593Smuzhiyun };
87*4882a593Smuzhiyun 
88*4882a593Smuzhiyun struct syscall_arg_fmt;
89*4882a593Smuzhiyun 
90*4882a593Smuzhiyun /**
91*4882a593Smuzhiyun  * @val: value of syscall argument being formatted
92*4882a593Smuzhiyun  * @len: for tracepoint dynamic arrays, if fmt->nr_entries == 0, then its not a fixed array, look at arg->len
93*4882a593Smuzhiyun  * @args: All the args, use syscall_args__val(arg, nth) to access one
94*4882a593Smuzhiyun  * @augmented_args: Extra data that can be collected, for instance, with eBPF for expanding the pathname for open, etc
95*4882a593Smuzhiyun  * @augmented_args_size: augmented_args total payload size
96*4882a593Smuzhiyun  * @thread: tid state (maps, pid, tid, etc)
97*4882a593Smuzhiyun  * @trace: 'perf trace' internals: all threads, etc
98*4882a593Smuzhiyun  * @parm: private area, may be an strarray, for instance
99*4882a593Smuzhiyun  * @idx: syscall arg idx (is this the first?)
100*4882a593Smuzhiyun  * @mask: a syscall arg may mask another arg, see syscall_arg__scnprintf_futex_op
101*4882a593Smuzhiyun  * @show_string_prefix: When there is a common prefix in a string table, show it or not
102*4882a593Smuzhiyun  */
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun struct syscall_arg {
105*4882a593Smuzhiyun 	unsigned long val;
106*4882a593Smuzhiyun 	unsigned char *args;
107*4882a593Smuzhiyun 	struct syscall_arg_fmt *fmt;
108*4882a593Smuzhiyun 	struct {
109*4882a593Smuzhiyun 		struct augmented_arg *args;
110*4882a593Smuzhiyun 		int		     size;
111*4882a593Smuzhiyun 	} augmented;
112*4882a593Smuzhiyun 	struct thread *thread;
113*4882a593Smuzhiyun 	struct trace  *trace;
114*4882a593Smuzhiyun 	void	      *parm;
115*4882a593Smuzhiyun 	u16	      len;
116*4882a593Smuzhiyun 	u8	      idx;
117*4882a593Smuzhiyun 	u8	      mask;
118*4882a593Smuzhiyun 	bool	      show_string_prefix;
119*4882a593Smuzhiyun };
120*4882a593Smuzhiyun 
121*4882a593Smuzhiyun unsigned long syscall_arg__val(struct syscall_arg *arg, u8 idx);
122*4882a593Smuzhiyun 
123*4882a593Smuzhiyun size_t syscall_arg__scnprintf_strarray_flags(char *bf, size_t size, struct syscall_arg *arg);
124*4882a593Smuzhiyun #define SCA_STRARRAY_FLAGS syscall_arg__scnprintf_strarray_flags
125*4882a593Smuzhiyun 
126*4882a593Smuzhiyun bool syscall_arg__strtoul_strarray(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
127*4882a593Smuzhiyun #define STUL_STRARRAY syscall_arg__strtoul_strarray
128*4882a593Smuzhiyun 
129*4882a593Smuzhiyun bool syscall_arg__strtoul_strarray_flags(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
130*4882a593Smuzhiyun #define STUL_STRARRAY_FLAGS syscall_arg__strtoul_strarray_flags
131*4882a593Smuzhiyun 
132*4882a593Smuzhiyun bool syscall_arg__strtoul_strarrays(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
133*4882a593Smuzhiyun #define STUL_STRARRAYS syscall_arg__strtoul_strarrays
134*4882a593Smuzhiyun 
135*4882a593Smuzhiyun size_t syscall_arg__scnprintf_x86_irq_vectors(char *bf, size_t size, struct syscall_arg *arg);
136*4882a593Smuzhiyun #define SCA_X86_IRQ_VECTORS syscall_arg__scnprintf_x86_irq_vectors
137*4882a593Smuzhiyun 
138*4882a593Smuzhiyun bool syscall_arg__strtoul_x86_irq_vectors(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
139*4882a593Smuzhiyun #define STUL_X86_IRQ_VECTORS syscall_arg__strtoul_x86_irq_vectors
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun size_t syscall_arg__scnprintf_x86_MSR(char *bf, size_t size, struct syscall_arg *arg);
142*4882a593Smuzhiyun #define SCA_X86_MSR syscall_arg__scnprintf_x86_MSR
143*4882a593Smuzhiyun 
144*4882a593Smuzhiyun bool syscall_arg__strtoul_x86_MSR(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
145*4882a593Smuzhiyun #define STUL_X86_MSR syscall_arg__strtoul_x86_MSR
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun size_t syscall_arg__scnprintf_strarrays(char *bf, size_t size, struct syscall_arg *arg);
148*4882a593Smuzhiyun #define SCA_STRARRAYS syscall_arg__scnprintf_strarrays
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun size_t syscall_arg__scnprintf_fd(char *bf, size_t size, struct syscall_arg *arg);
151*4882a593Smuzhiyun #define SCA_FD syscall_arg__scnprintf_fd
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun size_t syscall_arg__scnprintf_hex(char *bf, size_t size, struct syscall_arg *arg);
154*4882a593Smuzhiyun #define SCA_HEX syscall_arg__scnprintf_hex
155*4882a593Smuzhiyun 
156*4882a593Smuzhiyun size_t syscall_arg__scnprintf_ptr(char *bf, size_t size, struct syscall_arg *arg);
157*4882a593Smuzhiyun #define SCA_PTR syscall_arg__scnprintf_ptr
158*4882a593Smuzhiyun 
159*4882a593Smuzhiyun size_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg);
160*4882a593Smuzhiyun #define SCA_INT syscall_arg__scnprintf_int
161*4882a593Smuzhiyun 
162*4882a593Smuzhiyun size_t syscall_arg__scnprintf_long(char *bf, size_t size, struct syscall_arg *arg);
163*4882a593Smuzhiyun #define SCA_LONG syscall_arg__scnprintf_long
164*4882a593Smuzhiyun 
165*4882a593Smuzhiyun size_t syscall_arg__scnprintf_pid(char *bf, size_t size, struct syscall_arg *arg);
166*4882a593Smuzhiyun #define SCA_PID syscall_arg__scnprintf_pid
167*4882a593Smuzhiyun 
168*4882a593Smuzhiyun size_t syscall_arg__scnprintf_clone_flags(char *bf, size_t size, struct syscall_arg *arg);
169*4882a593Smuzhiyun #define SCA_CLONE_FLAGS syscall_arg__scnprintf_clone_flags
170*4882a593Smuzhiyun 
171*4882a593Smuzhiyun size_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arg *arg);
172*4882a593Smuzhiyun #define SCA_FCNTL_CMD syscall_arg__scnprintf_fcntl_cmd
173*4882a593Smuzhiyun 
174*4882a593Smuzhiyun size_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_arg *arg);
175*4882a593Smuzhiyun #define SCA_FCNTL_ARG syscall_arg__scnprintf_fcntl_arg
176*4882a593Smuzhiyun 
177*4882a593Smuzhiyun size_t syscall_arg__scnprintf_flock(char *bf, size_t size, struct syscall_arg *arg);
178*4882a593Smuzhiyun #define SCA_FLOCK syscall_arg__scnprintf_flock
179*4882a593Smuzhiyun 
180*4882a593Smuzhiyun size_t syscall_arg__scnprintf_fsmount_attr_flags(char *bf, size_t size, struct syscall_arg *arg);
181*4882a593Smuzhiyun #define SCA_FSMOUNT_ATTR_FLAGS syscall_arg__scnprintf_fsmount_attr_flags
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun size_t syscall_arg__scnprintf_fspick_flags(char *bf, size_t size, struct syscall_arg *arg);
184*4882a593Smuzhiyun #define SCA_FSPICK_FLAGS syscall_arg__scnprintf_fspick_flags
185*4882a593Smuzhiyun 
186*4882a593Smuzhiyun size_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg);
187*4882a593Smuzhiyun #define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd
188*4882a593Smuzhiyun 
189*4882a593Smuzhiyun size_t syscall_arg__scnprintf_kcmp_type(char *bf, size_t size, struct syscall_arg *arg);
190*4882a593Smuzhiyun #define SCA_KCMP_TYPE syscall_arg__scnprintf_kcmp_type
191*4882a593Smuzhiyun 
192*4882a593Smuzhiyun size_t syscall_arg__scnprintf_kcmp_idx(char *bf, size_t size, struct syscall_arg *arg);
193*4882a593Smuzhiyun #define SCA_KCMP_IDX syscall_arg__scnprintf_kcmp_idx
194*4882a593Smuzhiyun 
195*4882a593Smuzhiyun unsigned long syscall_arg__mask_val_mount_flags(struct syscall_arg *arg, unsigned long flags);
196*4882a593Smuzhiyun #define SCAMV_MOUNT_FLAGS syscall_arg__mask_val_mount_flags
197*4882a593Smuzhiyun 
198*4882a593Smuzhiyun size_t syscall_arg__scnprintf_mount_flags(char *bf, size_t size, struct syscall_arg *arg);
199*4882a593Smuzhiyun #define SCA_MOUNT_FLAGS syscall_arg__scnprintf_mount_flags
200*4882a593Smuzhiyun 
201*4882a593Smuzhiyun size_t syscall_arg__scnprintf_move_mount_flags(char *bf, size_t size, struct syscall_arg *arg);
202*4882a593Smuzhiyun #define SCA_MOVE_MOUNT_FLAGS syscall_arg__scnprintf_move_mount_flags
203*4882a593Smuzhiyun 
204*4882a593Smuzhiyun size_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg);
205*4882a593Smuzhiyun #define SCA_PKEY_ALLOC_ACCESS_RIGHTS syscall_arg__scnprintf_pkey_alloc_access_rights
206*4882a593Smuzhiyun 
207*4882a593Smuzhiyun size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
208*4882a593Smuzhiyun #define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
209*4882a593Smuzhiyun 
210*4882a593Smuzhiyun size_t syscall_arg__scnprintf_x86_arch_prctl_code(char *bf, size_t size, struct syscall_arg *arg);
211*4882a593Smuzhiyun #define SCA_X86_ARCH_PRCTL_CODE syscall_arg__scnprintf_x86_arch_prctl_code
212*4882a593Smuzhiyun 
213*4882a593Smuzhiyun size_t syscall_arg__scnprintf_prctl_option(char *bf, size_t size, struct syscall_arg *arg);
214*4882a593Smuzhiyun #define SCA_PRCTL_OPTION syscall_arg__scnprintf_prctl_option
215*4882a593Smuzhiyun 
216*4882a593Smuzhiyun extern struct strarray strarray__prctl_options;
217*4882a593Smuzhiyun 
218*4882a593Smuzhiyun size_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_arg *arg);
219*4882a593Smuzhiyun #define SCA_PRCTL_ARG2 syscall_arg__scnprintf_prctl_arg2
220*4882a593Smuzhiyun 
221*4882a593Smuzhiyun size_t syscall_arg__scnprintf_prctl_arg3(char *bf, size_t size, struct syscall_arg *arg);
222*4882a593Smuzhiyun #define SCA_PRCTL_ARG3 syscall_arg__scnprintf_prctl_arg3
223*4882a593Smuzhiyun 
224*4882a593Smuzhiyun size_t syscall_arg__scnprintf_renameat2_flags(char *bf, size_t size, struct syscall_arg *arg);
225*4882a593Smuzhiyun #define SCA_RENAMEAT2_FLAGS syscall_arg__scnprintf_renameat2_flags
226*4882a593Smuzhiyun 
227*4882a593Smuzhiyun size_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg);
228*4882a593Smuzhiyun #define SCA_SOCKADDR syscall_arg__scnprintf_sockaddr
229*4882a593Smuzhiyun 
230*4882a593Smuzhiyun size_t syscall_arg__scnprintf_socket_protocol(char *bf, size_t size, struct syscall_arg *arg);
231*4882a593Smuzhiyun #define SCA_SK_PROTO syscall_arg__scnprintf_socket_protocol
232*4882a593Smuzhiyun 
233*4882a593Smuzhiyun size_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg);
234*4882a593Smuzhiyun #define SCA_STATX_FLAGS syscall_arg__scnprintf_statx_flags
235*4882a593Smuzhiyun 
236*4882a593Smuzhiyun size_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg);
237*4882a593Smuzhiyun #define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask
238*4882a593Smuzhiyun 
239*4882a593Smuzhiyun size_t syscall_arg__scnprintf_sync_file_range_flags(char *bf, size_t size, struct syscall_arg *arg);
240*4882a593Smuzhiyun #define SCA_SYNC_FILE_RANGE_FLAGS syscall_arg__scnprintf_sync_file_range_flags
241*4882a593Smuzhiyun 
242*4882a593Smuzhiyun size_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix);
243*4882a593Smuzhiyun 
244*4882a593Smuzhiyun void syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
245*4882a593Smuzhiyun 				    size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg));
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun const char *arch_syscalls__strerrno(const char *arch, int err);
248*4882a593Smuzhiyun 
249*4882a593Smuzhiyun #endif /* _PERF_TRACE_BEAUTY_H */
250