1794f594eSArnaldo Carvalho de Melo // SPDX-License-Identifier: LGPL-2.1
262de344eSArnaldo Carvalho de Melo #ifndef PERF_FLAG_FD_NO_GROUP
362de344eSArnaldo Carvalho de Melo # define PERF_FLAG_FD_NO_GROUP (1UL << 0)
462de344eSArnaldo Carvalho de Melo #endif
562de344eSArnaldo Carvalho de Melo
662de344eSArnaldo Carvalho de Melo #ifndef PERF_FLAG_FD_OUTPUT
762de344eSArnaldo Carvalho de Melo # define PERF_FLAG_FD_OUTPUT (1UL << 1)
862de344eSArnaldo Carvalho de Melo #endif
962de344eSArnaldo Carvalho de Melo
1062de344eSArnaldo Carvalho de Melo #ifndef PERF_FLAG_PID_CGROUP
1162de344eSArnaldo Carvalho de Melo # define PERF_FLAG_PID_CGROUP (1UL << 2) /* pid=cgroup id, per-cpu mode only */
1262de344eSArnaldo Carvalho de Melo #endif
1362de344eSArnaldo Carvalho de Melo
1462de344eSArnaldo Carvalho de Melo #ifndef PERF_FLAG_FD_CLOEXEC
1562de344eSArnaldo Carvalho de Melo # define PERF_FLAG_FD_CLOEXEC (1UL << 3) /* O_CLOEXEC */
1662de344eSArnaldo Carvalho de Melo #endif
1762de344eSArnaldo Carvalho de Melo
syscall_arg__scnprintf_perf_flags(char * bf,size_t size,struct syscall_arg * arg)1862de344eSArnaldo Carvalho de Melo static size_t syscall_arg__scnprintf_perf_flags(char *bf, size_t size,
1962de344eSArnaldo Carvalho de Melo struct syscall_arg *arg)
2062de344eSArnaldo Carvalho de Melo {
21c65c83ffSArnaldo Carvalho de Melo bool show_prefix = arg->show_string_prefix;
22c65c83ffSArnaldo Carvalho de Melo const char *prefix = "PERF_";
2362de344eSArnaldo Carvalho de Melo int printed = 0, flags = arg->val;
2462de344eSArnaldo Carvalho de Melo
2562de344eSArnaldo Carvalho de Melo if (flags == 0)
2662de344eSArnaldo Carvalho de Melo return 0;
2762de344eSArnaldo Carvalho de Melo
2862de344eSArnaldo Carvalho de Melo #define P_FLAG(n) \
2962de344eSArnaldo Carvalho de Melo if (flags & PERF_FLAG_##n) { \
30c65c83ffSArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, "%s%s%s", printed ? "|" : "", show_prefix ? prefix : "", #n); \
3162de344eSArnaldo Carvalho de Melo flags &= ~PERF_FLAG_##n; \
3262de344eSArnaldo Carvalho de Melo }
3362de344eSArnaldo Carvalho de Melo
3462de344eSArnaldo Carvalho de Melo P_FLAG(FD_NO_GROUP);
3562de344eSArnaldo Carvalho de Melo P_FLAG(FD_OUTPUT);
3662de344eSArnaldo Carvalho de Melo P_FLAG(PID_CGROUP);
3762de344eSArnaldo Carvalho de Melo P_FLAG(FD_CLOEXEC);
3862de344eSArnaldo Carvalho de Melo #undef P_FLAG
3962de344eSArnaldo Carvalho de Melo
4062de344eSArnaldo Carvalho de Melo if (flags)
4162de344eSArnaldo Carvalho de Melo printed += scnprintf(bf + printed, size - printed, "%s%#x", printed ? "|" : "", flags);
4262de344eSArnaldo Carvalho de Melo
4362de344eSArnaldo Carvalho de Melo return printed;
4462de344eSArnaldo Carvalho de Melo }
4562de344eSArnaldo Carvalho de Melo
4662de344eSArnaldo Carvalho de Melo #define SCA_PERF_FLAGS syscall_arg__scnprintf_perf_flags
47*a9cd6c67SArnaldo Carvalho de Melo
48*a9cd6c67SArnaldo Carvalho de Melo struct attr_fprintf_args {
49*a9cd6c67SArnaldo Carvalho de Melo size_t size, printed;
50*a9cd6c67SArnaldo Carvalho de Melo char *bf;
51*a9cd6c67SArnaldo Carvalho de Melo bool first;
52*a9cd6c67SArnaldo Carvalho de Melo };
53*a9cd6c67SArnaldo Carvalho de Melo
attr__fprintf(FILE * fp __maybe_unused,const char * name,const char * val,void * priv)54*a9cd6c67SArnaldo Carvalho de Melo static int attr__fprintf(FILE *fp __maybe_unused, const char *name, const char *val, void *priv)
55*a9cd6c67SArnaldo Carvalho de Melo {
56*a9cd6c67SArnaldo Carvalho de Melo struct attr_fprintf_args *args = priv;
57*a9cd6c67SArnaldo Carvalho de Melo size_t printed = scnprintf(args->bf + args->printed , args->size - args->printed, "%s%s: %s", args->first ? "" : ", ", name, val);
58*a9cd6c67SArnaldo Carvalho de Melo
59*a9cd6c67SArnaldo Carvalho de Melo args->first = false;
60*a9cd6c67SArnaldo Carvalho de Melo args->printed += printed;
61*a9cd6c67SArnaldo Carvalho de Melo return printed;
62*a9cd6c67SArnaldo Carvalho de Melo }
63*a9cd6c67SArnaldo Carvalho de Melo
perf_event_attr___scnprintf(struct perf_event_attr * attr,char * bf,size_t size,bool show_zeros __maybe_unused)64*a9cd6c67SArnaldo Carvalho de Melo static size_t perf_event_attr___scnprintf(struct perf_event_attr *attr, char *bf, size_t size, bool show_zeros __maybe_unused)
65*a9cd6c67SArnaldo Carvalho de Melo {
66*a9cd6c67SArnaldo Carvalho de Melo struct attr_fprintf_args args = {
67*a9cd6c67SArnaldo Carvalho de Melo .printed = scnprintf(bf, size, "{ "),
68*a9cd6c67SArnaldo Carvalho de Melo .size = size,
69*a9cd6c67SArnaldo Carvalho de Melo .first = true,
70*a9cd6c67SArnaldo Carvalho de Melo .bf = bf,
71*a9cd6c67SArnaldo Carvalho de Melo };
72*a9cd6c67SArnaldo Carvalho de Melo
73*a9cd6c67SArnaldo Carvalho de Melo perf_event_attr__fprintf(stdout, attr, attr__fprintf, &args);
74*a9cd6c67SArnaldo Carvalho de Melo return args.printed + scnprintf(bf + args.printed, size - args.printed, " }");
75*a9cd6c67SArnaldo Carvalho de Melo }
76*a9cd6c67SArnaldo Carvalho de Melo
syscall_arg__scnprintf_augmented_perf_event_attr(struct syscall_arg * arg,char * bf,size_t size)77*a9cd6c67SArnaldo Carvalho de Melo static size_t syscall_arg__scnprintf_augmented_perf_event_attr(struct syscall_arg *arg, char *bf, size_t size)
78*a9cd6c67SArnaldo Carvalho de Melo {
79*a9cd6c67SArnaldo Carvalho de Melo return perf_event_attr___scnprintf((void *)arg->augmented.args, bf, size, arg->trace->show_zeros);
80*a9cd6c67SArnaldo Carvalho de Melo }
81*a9cd6c67SArnaldo Carvalho de Melo
syscall_arg__scnprintf_perf_event_attr(char * bf,size_t size,struct syscall_arg * arg)82*a9cd6c67SArnaldo Carvalho de Melo static size_t syscall_arg__scnprintf_perf_event_attr(char *bf, size_t size, struct syscall_arg *arg)
83*a9cd6c67SArnaldo Carvalho de Melo {
84*a9cd6c67SArnaldo Carvalho de Melo if (arg->augmented.args)
85*a9cd6c67SArnaldo Carvalho de Melo return syscall_arg__scnprintf_augmented_perf_event_attr(arg, bf, size);
86*a9cd6c67SArnaldo Carvalho de Melo
87*a9cd6c67SArnaldo Carvalho de Melo return scnprintf(bf, size, "%#lx", arg->val);
88*a9cd6c67SArnaldo Carvalho de Melo }
89*a9cd6c67SArnaldo Carvalho de Melo
90*a9cd6c67SArnaldo Carvalho de Melo #define SCA_PERF_ATTR syscall_arg__scnprintf_perf_event_attr
91