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