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