|
68 | 68 | # define MSG_CMSG_CLOEXEC 0x40000000
|
69 | 69 | #endif
|
70 | 70 |
|
| 71 | +#ifndef PERF_FLAG_FD_NO_GROUP |
| 72 | +# define PERF_FLAG_FD_NO_GROUP (1UL << 0) |
| 73 | +#endif |
| 74 | + |
| 75 | +#ifndef PERF_FLAG_FD_OUTPUT |
| 76 | +# define PERF_FLAG_FD_OUTPUT (1UL << 1) |
| 77 | +#endif |
| 78 | + |
| 79 | +#ifndef PERF_FLAG_PID_CGROUP |
| 80 | +# define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */ |
| 81 | +#endif |
| 82 | + |
| 83 | +#ifndef PERF_FLAG_FD_CLOEXEC |
| 84 | +# define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */ |
| 85 | +#endif |
| 86 | + |
| 87 | + |
71 | 88 | struct tp_field {
|
72 | 89 | int offset;
|
73 | 90 | union {
|
@@ -358,6 +375,14 @@ static size_t syscall_arg__scnprintf_hex(char *bf, size_t size,
|
358 | 375 |
|
359 | 376 | #define SCA_HEX syscall_arg__scnprintf_hex
|
360 | 377 |
|
| 378 | +static size_t syscall_arg__scnprintf_int(char *bf, size_t size, |
| 379 | + struct syscall_arg *arg) |
| 380 | +{ |
| 381 | + return scnprintf(bf, size, "%d", arg->val); |
| 382 | +} |
| 383 | + |
| 384 | +#define SCA_INT syscall_arg__scnprintf_int |
| 385 | + |
361 | 386 | static size_t syscall_arg__scnprintf_mmap_prot(char *bf, size_t size,
|
362 | 387 | struct syscall_arg *arg)
|
363 | 388 | {
|
@@ -810,6 +835,34 @@ static size_t syscall_arg__scnprintf_open_flags(char *bf, size_t size,
|
810 | 835 |
|
811 | 836 | #define SCA_OPEN_FLAGS syscall_arg__scnprintf_open_flags
|
812 | 837 |
|
| 838 | +static size_t syscall_arg__scnprintf_perf_flags(char *bf, size_t size, |
| 839 | + struct syscall_arg *arg) |
| 840 | +{ |
| 841 | + int printed = 0, flags = arg->val; |
| 842 | + |
| 843 | + if (flags == 0) |
| 844 | + return 0; |
| 845 | + |
| 846 | +#define P_FLAG(n) \ |
| 847 | + if (flags & PERF_FLAG_##n) { \ |
| 848 | + printed += scnprintf(bf + printed, size - printed, "%s%s", printed ? "|" : "", #n); \ |
| 849 | + flags &= ~PERF_FLAG_##n; \ |
| 850 | + } |
| 851 | + |
| 852 | + P_FLAG(FD_NO_GROUP); |
| 853 | + P_FLAG(FD_OUTPUT); |
| 854 | + P_FLAG(PID_CGROUP); |
| 855 | + P_FLAG(FD_CLOEXEC); |
| 856 | +#undef P_FLAG |
| 857 | + |
| 858 | + if (flags) |
| 859 | + printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags); |
| 860 | + |
| 861 | + return printed; |
| 862 | +} |
| 863 | + |
| 864 | +#define SCA_PERF_FLAGS syscall_arg__scnprintf_perf_flags |
| 865 | + |
813 | 866 | static size_t syscall_arg__scnprintf_eventfd_flags(char *bf, size_t size,
|
814 | 867 | struct syscall_arg *arg)
|
815 | 868 | {
|
@@ -1077,6 +1130,11 @@ static struct syscall_fmt {
|
1077 | 1130 | { .name = "openat", .errmsg = true,
|
1078 | 1131 | .arg_scnprintf = { [0] = SCA_FDAT, /* dfd */
|
1079 | 1132 | [2] = SCA_OPEN_FLAGS, /* flags */ }, },
|
| 1133 | + { .name = "perf_event_open", .errmsg = true, |
| 1134 | + .arg_scnprintf = { [1] = SCA_INT, /* pid */ |
| 1135 | + [2] = SCA_INT, /* cpu */ |
| 1136 | + [3] = SCA_FD, /* group_fd */ |
| 1137 | + [4] = SCA_PERF_FLAGS, /* flags */ }, }, |
1080 | 1138 | { .name = "pipe2", .errmsg = true,
|
1081 | 1139 | .arg_scnprintf = { [1] = SCA_PIPE_FLAGS, /* flags */ }, },
|
1082 | 1140 | { .name = "poll", .errmsg = true, .timeout = true, },
|
|
0 commit comments