162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci#ifndef _PERF_TRACE_BEAUTY_H
362306a36Sopenharmony_ci#define _PERF_TRACE_BEAUTY_H
462306a36Sopenharmony_ci
562306a36Sopenharmony_ci#include <linux/kernel.h>
662306a36Sopenharmony_ci#include <linux/types.h>
762306a36Sopenharmony_ci#include <sys/types.h>
862306a36Sopenharmony_ci#include <stdbool.h>
962306a36Sopenharmony_ci
1062306a36Sopenharmony_cistruct strarray {
1162306a36Sopenharmony_ci	u64	    offset;
1262306a36Sopenharmony_ci	int	    nr_entries;
1362306a36Sopenharmony_ci	const char *prefix;
1462306a36Sopenharmony_ci	const char * const *entries;
1562306a36Sopenharmony_ci};
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#define DEFINE_STRARRAY(array, _prefix) struct strarray strarray__##array = { \
1862306a36Sopenharmony_ci	.nr_entries = ARRAY_SIZE(array), \
1962306a36Sopenharmony_ci	.entries = array, \
2062306a36Sopenharmony_ci	.prefix = _prefix, \
2162306a36Sopenharmony_ci}
2262306a36Sopenharmony_ci
2362306a36Sopenharmony_ci#define DEFINE_STRARRAY_OFFSET(array, _prefix, off) struct strarray strarray__##array = { \
2462306a36Sopenharmony_ci	.offset	    = off, \
2562306a36Sopenharmony_ci	.nr_entries = ARRAY_SIZE(array), \
2662306a36Sopenharmony_ci	.entries = array, \
2762306a36Sopenharmony_ci	.prefix = _prefix, \
2862306a36Sopenharmony_ci}
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_cisize_t strarray__scnprintf(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
3162306a36Sopenharmony_cisize_t strarray__scnprintf_suffix(struct strarray *sa, char *bf, size_t size, const char *intfmt, bool show_suffix, int val);
3262306a36Sopenharmony_cisize_t strarray__scnprintf_flags(struct strarray *sa, char *bf, size_t size, bool show_prefix, unsigned long flags);
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_cibool strarray__strtoul(struct strarray *sa, char *bf, size_t size, u64 *ret);
3562306a36Sopenharmony_cibool strarray__strtoul_flags(struct strarray *sa, char *bf, size_t size, u64 *ret);
3662306a36Sopenharmony_ci
3762306a36Sopenharmony_cistruct trace;
3862306a36Sopenharmony_cistruct thread;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cistruct file {
4162306a36Sopenharmony_ci	char *pathname;
4262306a36Sopenharmony_ci	int  dev_maj;
4362306a36Sopenharmony_ci};
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_cistruct file *thread__files_entry(struct thread *thread, int fd);
4662306a36Sopenharmony_ci
4762306a36Sopenharmony_cistruct strarrays {
4862306a36Sopenharmony_ci	int		nr_entries;
4962306a36Sopenharmony_ci	struct strarray **entries;
5062306a36Sopenharmony_ci};
5162306a36Sopenharmony_ci
5262306a36Sopenharmony_ci#define DEFINE_STRARRAYS(array) struct strarrays strarrays__##array = { \
5362306a36Sopenharmony_ci	.nr_entries = ARRAY_SIZE(array), \
5462306a36Sopenharmony_ci	.entries = array, \
5562306a36Sopenharmony_ci}
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cisize_t strarrays__scnprintf(struct strarrays *sas, char *bf, size_t size, const char *intfmt, bool show_prefix, int val);
5862306a36Sopenharmony_ci
5962306a36Sopenharmony_cibool strarrays__strtoul(struct strarrays *sas, char *bf, size_t size, u64 *ret);
6062306a36Sopenharmony_ci
6162306a36Sopenharmony_cisize_t pid__scnprintf_fd(struct trace *trace, pid_t pid, int fd, char *bf, size_t size);
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ciextern struct strarray strarray__socket_families;
6462306a36Sopenharmony_ci
6562306a36Sopenharmony_ciextern struct strarray strarray__socket_level;
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_ci/**
6862306a36Sopenharmony_ci * augmented_arg: extra payload for syscall pointer arguments
6962306a36Sopenharmony_ci
7062306a36Sopenharmony_ci * If perf_sample->raw_size is more than what a syscall sys_enter_FOO puts, then
7162306a36Sopenharmony_ci * its the arguments contents, so that we can show more than just a
7262306a36Sopenharmony_ci * pointer. This will be done initially with eBPF, the start of that is at the
7362306a36Sopenharmony_ci * tools/perf/util/bpf_skel/augmented_syscalls.bpf.c that will eventually be
7462306a36Sopenharmony_ci * done automagically caching the running kernel tracefs events data into an
7562306a36Sopenharmony_ci * eBPF C script, that then gets compiled and its .o file cached for subsequent
7662306a36Sopenharmony_ci * use. For char pointers like the ones for 'open' like syscalls its easy, for
7762306a36Sopenharmony_ci * the rest we should use DWARF or better, BTF, much more compact.
7862306a36Sopenharmony_ci *
7962306a36Sopenharmony_ci * @size: 8 if all we need is an integer, otherwise all of the augmented arg.
8062306a36Sopenharmony_ci * @int_arg: will be used for integer like pointer contents, like 'accept's 'upeer_addrlen'
8162306a36Sopenharmony_ci * @value: u64 aligned, for structs, pathnames
8262306a36Sopenharmony_ci */
8362306a36Sopenharmony_cistruct augmented_arg {
8462306a36Sopenharmony_ci	int  size;
8562306a36Sopenharmony_ci	int  int_arg;
8662306a36Sopenharmony_ci	u64  value[];
8762306a36Sopenharmony_ci};
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_cistruct syscall_arg_fmt;
9062306a36Sopenharmony_ci
9162306a36Sopenharmony_ci/**
9262306a36Sopenharmony_ci * @val: value of syscall argument being formatted
9362306a36Sopenharmony_ci * @len: for tracepoint dynamic arrays, if fmt->nr_entries == 0, then its not a fixed array, look at arg->len
9462306a36Sopenharmony_ci * @args: All the args, use syscall_args__val(arg, nth) to access one
9562306a36Sopenharmony_ci * @augmented_args: Extra data that can be collected, for instance, with eBPF for expanding the pathname for open, etc
9662306a36Sopenharmony_ci * @augmented_args_size: augmented_args total payload size
9762306a36Sopenharmony_ci * @thread: tid state (maps, pid, tid, etc)
9862306a36Sopenharmony_ci * @trace: 'perf trace' internals: all threads, etc
9962306a36Sopenharmony_ci * @parm: private area, may be an strarray, for instance
10062306a36Sopenharmony_ci * @idx: syscall arg idx (is this the first?)
10162306a36Sopenharmony_ci * @mask: a syscall arg may mask another arg, see syscall_arg__scnprintf_futex_op
10262306a36Sopenharmony_ci * @show_string_prefix: When there is a common prefix in a string table, show it or not
10362306a36Sopenharmony_ci */
10462306a36Sopenharmony_ci
10562306a36Sopenharmony_cistruct syscall_arg {
10662306a36Sopenharmony_ci	unsigned long val;
10762306a36Sopenharmony_ci	unsigned char *args;
10862306a36Sopenharmony_ci	struct syscall_arg_fmt *fmt;
10962306a36Sopenharmony_ci	struct {
11062306a36Sopenharmony_ci		struct augmented_arg *args;
11162306a36Sopenharmony_ci		int		     size;
11262306a36Sopenharmony_ci	} augmented;
11362306a36Sopenharmony_ci	struct thread *thread;
11462306a36Sopenharmony_ci	struct trace  *trace;
11562306a36Sopenharmony_ci	void	      *parm;
11662306a36Sopenharmony_ci	u16	      len;
11762306a36Sopenharmony_ci	u8	      idx;
11862306a36Sopenharmony_ci	u8	      mask;
11962306a36Sopenharmony_ci	bool	      show_string_prefix;
12062306a36Sopenharmony_ci};
12162306a36Sopenharmony_ci
12262306a36Sopenharmony_ciunsigned long syscall_arg__val(struct syscall_arg *arg, u8 idx);
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_strarray_flags(char *bf, size_t size, struct syscall_arg *arg);
12562306a36Sopenharmony_ci#define SCA_STRARRAY_FLAGS syscall_arg__scnprintf_strarray_flags
12662306a36Sopenharmony_ci
12762306a36Sopenharmony_cibool syscall_arg__strtoul_strarray(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
12862306a36Sopenharmony_ci#define STUL_STRARRAY syscall_arg__strtoul_strarray
12962306a36Sopenharmony_ci
13062306a36Sopenharmony_cibool syscall_arg__strtoul_strarray_flags(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
13162306a36Sopenharmony_ci#define STUL_STRARRAY_FLAGS syscall_arg__strtoul_strarray_flags
13262306a36Sopenharmony_ci
13362306a36Sopenharmony_cibool syscall_arg__strtoul_strarrays(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
13462306a36Sopenharmony_ci#define STUL_STRARRAYS syscall_arg__strtoul_strarrays
13562306a36Sopenharmony_ci
13662306a36Sopenharmony_cisize_t syscall_arg__scnprintf_x86_irq_vectors(char *bf, size_t size, struct syscall_arg *arg);
13762306a36Sopenharmony_ci#define SCA_X86_IRQ_VECTORS syscall_arg__scnprintf_x86_irq_vectors
13862306a36Sopenharmony_ci
13962306a36Sopenharmony_cibool syscall_arg__strtoul_x86_irq_vectors(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
14062306a36Sopenharmony_ci#define STUL_X86_IRQ_VECTORS syscall_arg__strtoul_x86_irq_vectors
14162306a36Sopenharmony_ci
14262306a36Sopenharmony_cisize_t syscall_arg__scnprintf_x86_MSR(char *bf, size_t size, struct syscall_arg *arg);
14362306a36Sopenharmony_ci#define SCA_X86_MSR syscall_arg__scnprintf_x86_MSR
14462306a36Sopenharmony_ci
14562306a36Sopenharmony_cibool syscall_arg__strtoul_x86_MSR(char *bf, size_t size, struct syscall_arg *arg, u64 *ret);
14662306a36Sopenharmony_ci#define STUL_X86_MSR syscall_arg__strtoul_x86_MSR
14762306a36Sopenharmony_ci
14862306a36Sopenharmony_cisize_t syscall_arg__scnprintf_strarrays(char *bf, size_t size, struct syscall_arg *arg);
14962306a36Sopenharmony_ci#define SCA_STRARRAYS syscall_arg__scnprintf_strarrays
15062306a36Sopenharmony_ci
15162306a36Sopenharmony_cisize_t syscall_arg__scnprintf_fd(char *bf, size_t size, struct syscall_arg *arg);
15262306a36Sopenharmony_ci#define SCA_FD syscall_arg__scnprintf_fd
15362306a36Sopenharmony_ci
15462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_hex(char *bf, size_t size, struct syscall_arg *arg);
15562306a36Sopenharmony_ci#define SCA_HEX syscall_arg__scnprintf_hex
15662306a36Sopenharmony_ci
15762306a36Sopenharmony_cisize_t syscall_arg__scnprintf_ptr(char *bf, size_t size, struct syscall_arg *arg);
15862306a36Sopenharmony_ci#define SCA_PTR syscall_arg__scnprintf_ptr
15962306a36Sopenharmony_ci
16062306a36Sopenharmony_cisize_t syscall_arg__scnprintf_int(char *bf, size_t size, struct syscall_arg *arg);
16162306a36Sopenharmony_ci#define SCA_INT syscall_arg__scnprintf_int
16262306a36Sopenharmony_ci
16362306a36Sopenharmony_cisize_t syscall_arg__scnprintf_long(char *bf, size_t size, struct syscall_arg *arg);
16462306a36Sopenharmony_ci#define SCA_LONG syscall_arg__scnprintf_long
16562306a36Sopenharmony_ci
16662306a36Sopenharmony_cisize_t syscall_arg__scnprintf_pid(char *bf, size_t size, struct syscall_arg *arg);
16762306a36Sopenharmony_ci#define SCA_PID syscall_arg__scnprintf_pid
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_cisize_t syscall_arg__scnprintf_clone_flags(char *bf, size_t size, struct syscall_arg *arg);
17062306a36Sopenharmony_ci#define SCA_CLONE_FLAGS syscall_arg__scnprintf_clone_flags
17162306a36Sopenharmony_ci
17262306a36Sopenharmony_cisize_t syscall_arg__scnprintf_fcntl_cmd(char *bf, size_t size, struct syscall_arg *arg);
17362306a36Sopenharmony_ci#define SCA_FCNTL_CMD syscall_arg__scnprintf_fcntl_cmd
17462306a36Sopenharmony_ci
17562306a36Sopenharmony_cisize_t syscall_arg__scnprintf_fcntl_arg(char *bf, size_t size, struct syscall_arg *arg);
17662306a36Sopenharmony_ci#define SCA_FCNTL_ARG syscall_arg__scnprintf_fcntl_arg
17762306a36Sopenharmony_ci
17862306a36Sopenharmony_cisize_t syscall_arg__scnprintf_flock(char *bf, size_t size, struct syscall_arg *arg);
17962306a36Sopenharmony_ci#define SCA_FLOCK syscall_arg__scnprintf_flock
18062306a36Sopenharmony_ci
18162306a36Sopenharmony_cisize_t syscall_arg__scnprintf_fsmount_attr_flags(char *bf, size_t size, struct syscall_arg *arg);
18262306a36Sopenharmony_ci#define SCA_FSMOUNT_ATTR_FLAGS syscall_arg__scnprintf_fsmount_attr_flags
18362306a36Sopenharmony_ci
18462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_fspick_flags(char *bf, size_t size, struct syscall_arg *arg);
18562306a36Sopenharmony_ci#define SCA_FSPICK_FLAGS syscall_arg__scnprintf_fspick_flags
18662306a36Sopenharmony_ci
18762306a36Sopenharmony_cisize_t syscall_arg__scnprintf_ioctl_cmd(char *bf, size_t size, struct syscall_arg *arg);
18862306a36Sopenharmony_ci#define SCA_IOCTL_CMD syscall_arg__scnprintf_ioctl_cmd
18962306a36Sopenharmony_ci
19062306a36Sopenharmony_cisize_t syscall_arg__scnprintf_kcmp_type(char *bf, size_t size, struct syscall_arg *arg);
19162306a36Sopenharmony_ci#define SCA_KCMP_TYPE syscall_arg__scnprintf_kcmp_type
19262306a36Sopenharmony_ci
19362306a36Sopenharmony_cisize_t syscall_arg__scnprintf_kcmp_idx(char *bf, size_t size, struct syscall_arg *arg);
19462306a36Sopenharmony_ci#define SCA_KCMP_IDX syscall_arg__scnprintf_kcmp_idx
19562306a36Sopenharmony_ci
19662306a36Sopenharmony_ciunsigned long syscall_arg__mask_val_mount_flags(struct syscall_arg *arg, unsigned long flags);
19762306a36Sopenharmony_ci#define SCAMV_MOUNT_FLAGS syscall_arg__mask_val_mount_flags
19862306a36Sopenharmony_ci
19962306a36Sopenharmony_cisize_t syscall_arg__scnprintf_mount_flags(char *bf, size_t size, struct syscall_arg *arg);
20062306a36Sopenharmony_ci#define SCA_MOUNT_FLAGS syscall_arg__scnprintf_mount_flags
20162306a36Sopenharmony_ci
20262306a36Sopenharmony_cisize_t syscall_arg__scnprintf_move_mount_flags(char *bf, size_t size, struct syscall_arg *arg);
20362306a36Sopenharmony_ci#define SCA_MOVE_MOUNT_FLAGS syscall_arg__scnprintf_move_mount_flags
20462306a36Sopenharmony_ci
20562306a36Sopenharmony_cisize_t syscall_arg__scnprintf_pkey_alloc_access_rights(char *bf, size_t size, struct syscall_arg *arg);
20662306a36Sopenharmony_ci#define SCA_PKEY_ALLOC_ACCESS_RIGHTS syscall_arg__scnprintf_pkey_alloc_access_rights
20762306a36Sopenharmony_ci
20862306a36Sopenharmony_cisize_t syscall_arg__scnprintf_open_flags(char *bf, size_t size, struct syscall_arg *arg);
20962306a36Sopenharmony_ci#define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
21062306a36Sopenharmony_ci
21162306a36Sopenharmony_cisize_t syscall_arg__scnprintf_x86_arch_prctl_code(char *bf, size_t size, struct syscall_arg *arg);
21262306a36Sopenharmony_ci#define SCA_X86_ARCH_PRCTL_CODE syscall_arg__scnprintf_x86_arch_prctl_code
21362306a36Sopenharmony_ci
21462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_prctl_option(char *bf, size_t size, struct syscall_arg *arg);
21562306a36Sopenharmony_ci#define SCA_PRCTL_OPTION syscall_arg__scnprintf_prctl_option
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ciextern struct strarray strarray__prctl_options;
21862306a36Sopenharmony_ci
21962306a36Sopenharmony_cisize_t syscall_arg__scnprintf_prctl_arg2(char *bf, size_t size, struct syscall_arg *arg);
22062306a36Sopenharmony_ci#define SCA_PRCTL_ARG2 syscall_arg__scnprintf_prctl_arg2
22162306a36Sopenharmony_ci
22262306a36Sopenharmony_cisize_t syscall_arg__scnprintf_prctl_arg3(char *bf, size_t size, struct syscall_arg *arg);
22362306a36Sopenharmony_ci#define SCA_PRCTL_ARG3 syscall_arg__scnprintf_prctl_arg3
22462306a36Sopenharmony_ci
22562306a36Sopenharmony_cisize_t syscall_arg__scnprintf_renameat2_flags(char *bf, size_t size, struct syscall_arg *arg);
22662306a36Sopenharmony_ci#define SCA_RENAMEAT2_FLAGS syscall_arg__scnprintf_renameat2_flags
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_cisize_t syscall_arg__scnprintf_sockaddr(char *bf, size_t size, struct syscall_arg *arg);
22962306a36Sopenharmony_ci#define SCA_SOCKADDR syscall_arg__scnprintf_sockaddr
23062306a36Sopenharmony_ci
23162306a36Sopenharmony_cisize_t syscall_arg__scnprintf_socket_protocol(char *bf, size_t size, struct syscall_arg *arg);
23262306a36Sopenharmony_ci#define SCA_SK_PROTO syscall_arg__scnprintf_socket_protocol
23362306a36Sopenharmony_ci
23462306a36Sopenharmony_cisize_t syscall_arg__scnprintf_socket_level(char *bf, size_t size, struct syscall_arg *arg);
23562306a36Sopenharmony_ci#define SCA_SK_LEVEL syscall_arg__scnprintf_socket_level
23662306a36Sopenharmony_ci
23762306a36Sopenharmony_cisize_t syscall_arg__scnprintf_statx_flags(char *bf, size_t size, struct syscall_arg *arg);
23862306a36Sopenharmony_ci#define SCA_STATX_FLAGS syscall_arg__scnprintf_statx_flags
23962306a36Sopenharmony_ci
24062306a36Sopenharmony_cisize_t syscall_arg__scnprintf_statx_mask(char *bf, size_t size, struct syscall_arg *arg);
24162306a36Sopenharmony_ci#define SCA_STATX_MASK syscall_arg__scnprintf_statx_mask
24262306a36Sopenharmony_ci
24362306a36Sopenharmony_cisize_t syscall_arg__scnprintf_sync_file_range_flags(char *bf, size_t size, struct syscall_arg *arg);
24462306a36Sopenharmony_ci#define SCA_SYNC_FILE_RANGE_FLAGS syscall_arg__scnprintf_sync_file_range_flags
24562306a36Sopenharmony_ci
24662306a36Sopenharmony_cisize_t syscall_arg__scnprintf_timespec(char *bf, size_t size, struct syscall_arg *arg);
24762306a36Sopenharmony_ci#define SCA_TIMESPEC syscall_arg__scnprintf_timespec
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_cisize_t open__scnprintf_flags(unsigned long flags, char *bf, size_t size, bool show_prefix);
25062306a36Sopenharmony_ci
25162306a36Sopenharmony_civoid syscall_arg__set_ret_scnprintf(struct syscall_arg *arg,
25262306a36Sopenharmony_ci				    size_t (*ret_scnprintf)(char *bf, size_t size, struct syscall_arg *arg));
25362306a36Sopenharmony_ci
25462306a36Sopenharmony_ciconst char *arch_syscalls__strerrno(const char *arch, int err);
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci#endif /* _PERF_TRACE_BEAUTY_H */
257