xref: /aosp_15_r20/external/strace/tests-m32/perf_event_open.c (revision cf84ac9a129d8ea9952db616b4e9b904c4bdde56)
1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker  * Check verbose decoding of perf_event_open syscall.
3*cf84ac9aSAndroid Build Coastguard Worker  *
4*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker  * Copyright (c) 2016-2018 The strace developers.
6*cf84ac9aSAndroid Build Coastguard Worker  * All rights reserved.
7*cf84ac9aSAndroid Build Coastguard Worker  *
8*cf84ac9aSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
9*cf84ac9aSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
10*cf84ac9aSAndroid Build Coastguard Worker  * are met:
11*cf84ac9aSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
12*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
13*cf84ac9aSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
14*cf84ac9aSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
15*cf84ac9aSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
16*cf84ac9aSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
17*cf84ac9aSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
18*cf84ac9aSAndroid Build Coastguard Worker  *
19*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
20*cf84ac9aSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
21*cf84ac9aSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
22*cf84ac9aSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
23*cf84ac9aSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
24*cf84ac9aSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*cf84ac9aSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*cf84ac9aSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*cf84ac9aSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
28*cf84ac9aSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*cf84ac9aSAndroid Build Coastguard Worker  */
30*cf84ac9aSAndroid Build Coastguard Worker 
31*cf84ac9aSAndroid Build Coastguard Worker #include "tests.h"
32*cf84ac9aSAndroid Build Coastguard Worker #include <asm/unistd.h>
33*cf84ac9aSAndroid Build Coastguard Worker 
34*cf84ac9aSAndroid Build Coastguard Worker #if defined(__NR_perf_event_open) && defined(HAVE_LINUX_PERF_EVENT_H)
35*cf84ac9aSAndroid Build Coastguard Worker 
36*cf84ac9aSAndroid Build Coastguard Worker # include <inttypes.h>
37*cf84ac9aSAndroid Build Coastguard Worker # include <limits.h>
38*cf84ac9aSAndroid Build Coastguard Worker # include <stddef.h>
39*cf84ac9aSAndroid Build Coastguard Worker # include <stdio.h>
40*cf84ac9aSAndroid Build Coastguard Worker # include <stdlib.h>
41*cf84ac9aSAndroid Build Coastguard Worker # include <string.h>
42*cf84ac9aSAndroid Build Coastguard Worker # include <unistd.h>
43*cf84ac9aSAndroid Build Coastguard Worker 
44*cf84ac9aSAndroid Build Coastguard Worker # include <linux/perf_event.h>
45*cf84ac9aSAndroid Build Coastguard Worker 
46*cf84ac9aSAndroid Build Coastguard Worker # include "xlat.h"
47*cf84ac9aSAndroid Build Coastguard Worker # include "xlat/perf_event_open_flags.h"
48*cf84ac9aSAndroid Build Coastguard Worker # include "xlat/perf_attr_size.h"
49*cf84ac9aSAndroid Build Coastguard Worker 
50*cf84ac9aSAndroid Build Coastguard Worker # if ULONG_MAX > UINT_MAX /* Poor man's "whether long is 8 bytes?" */
51*cf84ac9aSAndroid Build Coastguard Worker #  define LONG_STR_PREFIX "ffffffff"
52*cf84ac9aSAndroid Build Coastguard Worker # else /* !(ULONG_MAX > UINT_MAX) */
53*cf84ac9aSAndroid Build Coastguard Worker #  define LONG_STR_PREFIX ""
54*cf84ac9aSAndroid Build Coastguard Worker # endif /* ULONG_MAX > UINT_MAX */
55*cf84ac9aSAndroid Build Coastguard Worker 
56*cf84ac9aSAndroid Build Coastguard Worker # ifndef PERF_TYPE_BREAKPOINT
57*cf84ac9aSAndroid Build Coastguard Worker #  define PERF_TYPE_BREAKPOINT 5
58*cf84ac9aSAndroid Build Coastguard Worker # endif
59*cf84ac9aSAndroid Build Coastguard Worker 
60*cf84ac9aSAndroid Build Coastguard Worker struct s32_val_str {
61*cf84ac9aSAndroid Build Coastguard Worker 	int32_t val;
62*cf84ac9aSAndroid Build Coastguard Worker 	const char *str;
63*cf84ac9aSAndroid Build Coastguard Worker };
64*cf84ac9aSAndroid Build Coastguard Worker 
65*cf84ac9aSAndroid Build Coastguard Worker struct u32_val_str {
66*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t val;
67*cf84ac9aSAndroid Build Coastguard Worker 	const char *str;
68*cf84ac9aSAndroid Build Coastguard Worker };
69*cf84ac9aSAndroid Build Coastguard Worker 
70*cf84ac9aSAndroid Build Coastguard Worker struct u64_val_str {
71*cf84ac9aSAndroid Build Coastguard Worker 	uint64_t val;
72*cf84ac9aSAndroid Build Coastguard Worker 	const char *str;
73*cf84ac9aSAndroid Build Coastguard Worker };
74*cf84ac9aSAndroid Build Coastguard Worker 
75*cf84ac9aSAndroid Build Coastguard Worker /* In order to avoid endianness-specific hackery. */
76*cf84ac9aSAndroid Build Coastguard Worker struct pea_flags {
77*cf84ac9aSAndroid Build Coastguard Worker 	uint64_t disabled			:1,
78*cf84ac9aSAndroid Build Coastguard Worker 		 inherit			:1,
79*cf84ac9aSAndroid Build Coastguard Worker 		 pinned				:1,
80*cf84ac9aSAndroid Build Coastguard Worker 		 exclusive			:1,
81*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_user			:1,
82*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_kernel			:1,
83*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_hv			:1,
84*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_idle			:1,
85*cf84ac9aSAndroid Build Coastguard Worker 		 mmap				:1,
86*cf84ac9aSAndroid Build Coastguard Worker 		 comm				:1,
87*cf84ac9aSAndroid Build Coastguard Worker 		 freq				:1,
88*cf84ac9aSAndroid Build Coastguard Worker 		 inherit_stat			:1,
89*cf84ac9aSAndroid Build Coastguard Worker 		 enable_on_exec			:1,
90*cf84ac9aSAndroid Build Coastguard Worker 		 task				:1,
91*cf84ac9aSAndroid Build Coastguard Worker 		 watermark			:1,
92*cf84ac9aSAndroid Build Coastguard Worker 		 precise_ip			:2,
93*cf84ac9aSAndroid Build Coastguard Worker 		 mmap_data			:1,
94*cf84ac9aSAndroid Build Coastguard Worker 		 sample_id_all			:1,
95*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_host			:1,
96*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_guest			:1,
97*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_callchain_kernel	:1,
98*cf84ac9aSAndroid Build Coastguard Worker 		 exclude_callchain_user		:1,
99*cf84ac9aSAndroid Build Coastguard Worker 		 mmap2				:1,
100*cf84ac9aSAndroid Build Coastguard Worker 		 comm_exec			:1,
101*cf84ac9aSAndroid Build Coastguard Worker 		 use_clockid			:1,
102*cf84ac9aSAndroid Build Coastguard Worker 		 context_switch			:1,
103*cf84ac9aSAndroid Build Coastguard Worker 		 write_backward			:1,
104*cf84ac9aSAndroid Build Coastguard Worker 		 namespaces			:1,
105*cf84ac9aSAndroid Build Coastguard Worker 		 __reserved_1			:35;
106*cf84ac9aSAndroid Build Coastguard Worker };
107*cf84ac9aSAndroid Build Coastguard Worker 
108*cf84ac9aSAndroid Build Coastguard Worker static const char *
printaddr(void * ptr)109*cf84ac9aSAndroid Build Coastguard Worker printaddr(void *ptr)
110*cf84ac9aSAndroid Build Coastguard Worker {
111*cf84ac9aSAndroid Build Coastguard Worker 	static char buf[sizeof("0x") + sizeof(void *) * 2];
112*cf84ac9aSAndroid Build Coastguard Worker 
113*cf84ac9aSAndroid Build Coastguard Worker 	if (ptr == NULL)
114*cf84ac9aSAndroid Build Coastguard Worker 		return "NULL";
115*cf84ac9aSAndroid Build Coastguard Worker 
116*cf84ac9aSAndroid Build Coastguard Worker 	snprintf(buf, sizeof(buf), "%#lx", (unsigned long)ptr);
117*cf84ac9aSAndroid Build Coastguard Worker 
118*cf84ac9aSAndroid Build Coastguard Worker 	return buf;
119*cf84ac9aSAndroid Build Coastguard Worker }
120*cf84ac9aSAndroid Build Coastguard Worker 
121*cf84ac9aSAndroid Build Coastguard Worker /*
122*cf84ac9aSAndroid Build Coastguard Worker  * Checklist:
123*cf84ac9aSAndroid Build Coastguard Worker  *
124*cf84ac9aSAndroid Build Coastguard Worker  * type - 8 IDs
125*cf84ac9aSAndroid Build Coastguard Worker  * config - 13 IDs (0..11 + random), depends on type
126*cf84ac9aSAndroid Build Coastguard Worker  * sample type - bitmask, up to 20 bits
127*cf84ac9aSAndroid Build Coastguard Worker  * read_format - 5 IDs
128*cf84ac9aSAndroid Build Coastguard Worker  * bp_type - 6, weird semantics (invalid/unknown)
129*cf84ac9aSAndroid Build Coastguard Worker  * branch_sample_type - bitmask, 16 bits
130*cf84ac9aSAndroid Build Coastguard Worker  * clockid - 13 values
131*cf84ac9aSAndroid Build Coastguard Worker  *
132*cf84ac9aSAndroid Build Coastguard Worker  * Unions:
133*cf84ac9aSAndroid Build Coastguard Worker  * sample_period/sample_freq
134*cf84ac9aSAndroid Build Coastguard Worker  * wakeup_event/wakeup_watermark
135*cf84ac9aSAndroid Build Coastguard Worker  * bp_addr/config1
136*cf84ac9aSAndroid Build Coastguard Worker  * bp_len/config2
137*cf84ac9aSAndroid Build Coastguard Worker  */
138*cf84ac9aSAndroid Build Coastguard Worker 
139*cf84ac9aSAndroid Build Coastguard Worker /*
140*cf84ac9aSAndroid Build Coastguard Worker  * The main idea behind all those numerous ifdefs is checking against version of
141*cf84ac9aSAndroid Build Coastguard Worker  * structure provided in kernel headers and not use one defined in strace
142*cf84ac9aSAndroid Build Coastguard Worker  * headers (assume the case when suddenly we add flag without proper update of
143*cf84ac9aSAndroid Build Coastguard Worker  * __reserved_1 field or something like this).
144*cf84ac9aSAndroid Build Coastguard Worker  */
145*cf84ac9aSAndroid Build Coastguard Worker static void
print_event_attr(struct perf_event_attr * attr_ptr,size_t size,const char * type,const char * config,const char * sample_type,const char * read_format,const char * precise_ip_desc,const char * bp_type,const char * branch_sample_type,const char * clockid,uint32_t available_size)146*cf84ac9aSAndroid Build Coastguard Worker print_event_attr(struct perf_event_attr *attr_ptr, size_t size,
147*cf84ac9aSAndroid Build Coastguard Worker 	const char *type, const char *config, const char *sample_type,
148*cf84ac9aSAndroid Build Coastguard Worker 	const char *read_format, const char *precise_ip_desc,
149*cf84ac9aSAndroid Build Coastguard Worker 	const char *bp_type, const char *branch_sample_type,
150*cf84ac9aSAndroid Build Coastguard Worker 	const char *clockid, uint32_t available_size)
151*cf84ac9aSAndroid Build Coastguard Worker {
152*cf84ac9aSAndroid Build Coastguard Worker 	/*
153*cf84ac9aSAndroid Build Coastguard Worker 	 * Currently, strace supports version 5 of the structure, which is
154*cf84ac9aSAndroid Build Coastguard Worker 	 * 112 bytes in size.
155*cf84ac9aSAndroid Build Coastguard Worker 	 */
156*cf84ac9aSAndroid Build Coastguard Worker 	enum {
157*cf84ac9aSAndroid Build Coastguard Worker 		STRACE_PEA_ABBREV_SIZE =
158*cf84ac9aSAndroid Build Coastguard Worker 			offsetof(struct perf_event_attr, config) +
159*cf84ac9aSAndroid Build Coastguard Worker 			sizeof(attr_ptr->config),
160*cf84ac9aSAndroid Build Coastguard Worker 		STRACE_PEA_SIZE = 112,
161*cf84ac9aSAndroid Build Coastguard Worker 	};
162*cf84ac9aSAndroid Build Coastguard Worker 
163*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t read_size;
164*cf84ac9aSAndroid Build Coastguard Worker 	struct perf_event_attr *attr;
165*cf84ac9aSAndroid Build Coastguard Worker # if VERBOSE
166*cf84ac9aSAndroid Build Coastguard Worker 	uint32_t cutoff;
167*cf84ac9aSAndroid Build Coastguard Worker 	uint64_t val;
168*cf84ac9aSAndroid Build Coastguard Worker 	uint64_t use_clockid;
169*cf84ac9aSAndroid Build Coastguard Worker 	union {
170*cf84ac9aSAndroid Build Coastguard Worker 		struct pea_flags flags;
171*cf84ac9aSAndroid Build Coastguard Worker 		uint64_t raw;
172*cf84ac9aSAndroid Build Coastguard Worker 	} flags_data;
173*cf84ac9aSAndroid Build Coastguard Worker # endif
174*cf84ac9aSAndroid Build Coastguard Worker 
175*cf84ac9aSAndroid Build Coastguard Worker 	read_size =
176*cf84ac9aSAndroid Build Coastguard Worker # if !VERBOSE
177*cf84ac9aSAndroid Build Coastguard Worker 		STRACE_PEA_ABBREV_SIZE;
178*cf84ac9aSAndroid Build Coastguard Worker # else
179*cf84ac9aSAndroid Build Coastguard Worker 		size < STRACE_PEA_SIZE ?
180*cf84ac9aSAndroid Build Coastguard Worker 			(size ? size : PERF_ATTR_SIZE_VER0) : STRACE_PEA_SIZE;
181*cf84ac9aSAndroid Build Coastguard Worker # endif
182*cf84ac9aSAndroid Build Coastguard Worker 
183*cf84ac9aSAndroid Build Coastguard Worker 	if (read_size > available_size) {
184*cf84ac9aSAndroid Build Coastguard Worker 		printf("%s", printaddr(attr_ptr));
185*cf84ac9aSAndroid Build Coastguard Worker 		return;
186*cf84ac9aSAndroid Build Coastguard Worker 	}
187*cf84ac9aSAndroid Build Coastguard Worker 
188*cf84ac9aSAndroid Build Coastguard Worker 	/*
189*cf84ac9aSAndroid Build Coastguard Worker 	 * Replicate kernel's behaviour regarding copying structure from
190*cf84ac9aSAndroid Build Coastguard Worker 	 * userspace.
191*cf84ac9aSAndroid Build Coastguard Worker 	 */
192*cf84ac9aSAndroid Build Coastguard Worker 	attr = calloc(1, STRACE_PEA_SIZE);
193*cf84ac9aSAndroid Build Coastguard Worker 
194*cf84ac9aSAndroid Build Coastguard Worker 	if (!attr)
195*cf84ac9aSAndroid Build Coastguard Worker 		error_msg_and_fail("calloc");
196*cf84ac9aSAndroid Build Coastguard Worker 
197*cf84ac9aSAndroid Build Coastguard Worker 
198*cf84ac9aSAndroid Build Coastguard Worker 	memcpy(attr, attr_ptr, read_size);
199*cf84ac9aSAndroid Build Coastguard Worker 
200*cf84ac9aSAndroid Build Coastguard Worker 	if (size && (size < PERF_ATTR_SIZE_VER0)) {
201*cf84ac9aSAndroid Build Coastguard Worker 		printf("%s", printaddr(attr_ptr));
202*cf84ac9aSAndroid Build Coastguard Worker 		free(attr);
203*cf84ac9aSAndroid Build Coastguard Worker 		return;
204*cf84ac9aSAndroid Build Coastguard Worker 	}
205*cf84ac9aSAndroid Build Coastguard Worker 
206*cf84ac9aSAndroid Build Coastguard Worker 	printf("{type=%s, size=", type);
207*cf84ac9aSAndroid Build Coastguard Worker 	if (size != attr->size) {
208*cf84ac9aSAndroid Build Coastguard Worker 		printxval(perf_attr_size, size, "PERF_ATTR_SIZE_???");
209*cf84ac9aSAndroid Build Coastguard Worker 		printf(" => ");
210*cf84ac9aSAndroid Build Coastguard Worker 	}
211*cf84ac9aSAndroid Build Coastguard Worker 	printxval(perf_attr_size, attr->size, "PERF_ATTR_SIZE_???");
212*cf84ac9aSAndroid Build Coastguard Worker 	printf(", config=%s, ", config);
213*cf84ac9aSAndroid Build Coastguard Worker 
214*cf84ac9aSAndroid Build Coastguard Worker 	if (!size)
215*cf84ac9aSAndroid Build Coastguard Worker 		size = PERF_ATTR_SIZE_VER0;
216*cf84ac9aSAndroid Build Coastguard Worker 
217*cf84ac9aSAndroid Build Coastguard Worker # if !VERBOSE
218*cf84ac9aSAndroid Build Coastguard Worker 	printf("...}");
219*cf84ac9aSAndroid Build Coastguard Worker # else /* !VERBOSE */
220*cf84ac9aSAndroid Build Coastguard Worker 	printf("%s=%" PRI__u64", sample_type=%s, read_format=%s",
221*cf84ac9aSAndroid Build Coastguard Worker 	       attr->freq ? "sample_freq" : "sample_period",
222*cf84ac9aSAndroid Build Coastguard Worker 	       attr->freq ? attr->sample_freq : attr->sample_period,
223*cf84ac9aSAndroid Build Coastguard Worker 	       sample_type, read_format);
224*cf84ac9aSAndroid Build Coastguard Worker 
225*cf84ac9aSAndroid Build Coastguard Worker 	printf(", disabled=%u"
226*cf84ac9aSAndroid Build Coastguard Worker 	       ", inherit=%u"
227*cf84ac9aSAndroid Build Coastguard Worker 	       ", pinned=%u"
228*cf84ac9aSAndroid Build Coastguard Worker 	       ", exclusive=%u"
229*cf84ac9aSAndroid Build Coastguard Worker 	       ", exclusive_user=%u"
230*cf84ac9aSAndroid Build Coastguard Worker 	       ", exclude_kernel=%u"
231*cf84ac9aSAndroid Build Coastguard Worker 	       ", exclude_hv=%u"
232*cf84ac9aSAndroid Build Coastguard Worker 	       ", exclude_idle=%u"
233*cf84ac9aSAndroid Build Coastguard Worker 	       ", mmap=%u"
234*cf84ac9aSAndroid Build Coastguard Worker 	       ", comm=%u"
235*cf84ac9aSAndroid Build Coastguard Worker 	       ", freq=%u"
236*cf84ac9aSAndroid Build Coastguard Worker 	       ", inherit_stat=%u"
237*cf84ac9aSAndroid Build Coastguard Worker 	       ", enable_on_exec=%u"
238*cf84ac9aSAndroid Build Coastguard Worker 	       ", task=%u"
239*cf84ac9aSAndroid Build Coastguard Worker 	       ", watermark=%u",
240*cf84ac9aSAndroid Build Coastguard Worker 	       attr->disabled,
241*cf84ac9aSAndroid Build Coastguard Worker 	       attr->inherit,
242*cf84ac9aSAndroid Build Coastguard Worker 	       attr->pinned,
243*cf84ac9aSAndroid Build Coastguard Worker 	       attr->exclusive,
244*cf84ac9aSAndroid Build Coastguard Worker 	       attr->exclude_user,
245*cf84ac9aSAndroid Build Coastguard Worker 	       attr->exclude_kernel,
246*cf84ac9aSAndroid Build Coastguard Worker 	       attr->exclude_hv,
247*cf84ac9aSAndroid Build Coastguard Worker 	       attr->exclude_idle,
248*cf84ac9aSAndroid Build Coastguard Worker 	       attr->mmap,
249*cf84ac9aSAndroid Build Coastguard Worker 	       attr->comm,
250*cf84ac9aSAndroid Build Coastguard Worker 	       attr->freq,
251*cf84ac9aSAndroid Build Coastguard Worker 	       attr->inherit_stat,
252*cf84ac9aSAndroid Build Coastguard Worker 	       attr->enable_on_exec,
253*cf84ac9aSAndroid Build Coastguard Worker 	       attr->task,
254*cf84ac9aSAndroid Build Coastguard Worker 	       attr->watermark);
255*cf84ac9aSAndroid Build Coastguard Worker 
256*cf84ac9aSAndroid Build Coastguard Worker 	flags_data.raw = ((uint64_t *) attr)[5];
257*cf84ac9aSAndroid Build Coastguard Worker 
258*cf84ac9aSAndroid Build Coastguard Worker 	val =
259*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_PRECISE_IP
260*cf84ac9aSAndroid Build Coastguard Worker 		attr->precise_ip;
261*cf84ac9aSAndroid Build Coastguard Worker # else
262*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.precise_ip;
263*cf84ac9aSAndroid Build Coastguard Worker # endif
264*cf84ac9aSAndroid Build Coastguard Worker 	printf(", precise_ip=%" PRIu64 " /* %s */", val, precise_ip_desc);
265*cf84ac9aSAndroid Build Coastguard Worker 
266*cf84ac9aSAndroid Build Coastguard Worker 	val =
267*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_MMAP_DATA
268*cf84ac9aSAndroid Build Coastguard Worker 		attr->mmap_data;
269*cf84ac9aSAndroid Build Coastguard Worker # else
270*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.mmap_data;
271*cf84ac9aSAndroid Build Coastguard Worker # endif
272*cf84ac9aSAndroid Build Coastguard Worker 	printf(", mmap_data=%" PRIu64, val);
273*cf84ac9aSAndroid Build Coastguard Worker 
274*cf84ac9aSAndroid Build Coastguard Worker 	val =
275*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_SAMPLE_ID_ALL
276*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_id_all;
277*cf84ac9aSAndroid Build Coastguard Worker # else
278*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.sample_id_all;
279*cf84ac9aSAndroid Build Coastguard Worker # endif
280*cf84ac9aSAndroid Build Coastguard Worker 	printf(", sample_id_all=%" PRIu64, val);
281*cf84ac9aSAndroid Build Coastguard Worker 
282*cf84ac9aSAndroid Build Coastguard Worker 	val =
283*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_EXCLUDE_HOST
284*cf84ac9aSAndroid Build Coastguard Worker 		attr->exclude_host;
285*cf84ac9aSAndroid Build Coastguard Worker # else
286*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.exclude_host;
287*cf84ac9aSAndroid Build Coastguard Worker # endif
288*cf84ac9aSAndroid Build Coastguard Worker 	printf(", exclude_host=%" PRIu64, val);
289*cf84ac9aSAndroid Build Coastguard Worker 
290*cf84ac9aSAndroid Build Coastguard Worker 	val =
291*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_EXCLUDE_GUEST
292*cf84ac9aSAndroid Build Coastguard Worker 		attr->exclude_guest;
293*cf84ac9aSAndroid Build Coastguard Worker # else
294*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.exclude_guest;
295*cf84ac9aSAndroid Build Coastguard Worker # endif
296*cf84ac9aSAndroid Build Coastguard Worker 	printf(", exclude_guest=%" PRIu64, val);
297*cf84ac9aSAndroid Build Coastguard Worker 
298*cf84ac9aSAndroid Build Coastguard Worker 	val =
299*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_EXCLUDE_CALLCHAIN_KERNEL
300*cf84ac9aSAndroid Build Coastguard Worker 		attr->exclude_callchain_kernel;
301*cf84ac9aSAndroid Build Coastguard Worker # else
302*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.exclude_callchain_kernel;
303*cf84ac9aSAndroid Build Coastguard Worker # endif
304*cf84ac9aSAndroid Build Coastguard Worker 	printf(", exclude_callchain_kernel=%" PRIu64, val);
305*cf84ac9aSAndroid Build Coastguard Worker 
306*cf84ac9aSAndroid Build Coastguard Worker 	val =
307*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_EXCLUDE_CALLCHAIN_USER
308*cf84ac9aSAndroid Build Coastguard Worker 		attr->exclude_callchain_user;
309*cf84ac9aSAndroid Build Coastguard Worker # else
310*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.exclude_callchain_user;
311*cf84ac9aSAndroid Build Coastguard Worker # endif
312*cf84ac9aSAndroid Build Coastguard Worker 	printf(", exclude_callchain_user=%" PRIu64, val);
313*cf84ac9aSAndroid Build Coastguard Worker 
314*cf84ac9aSAndroid Build Coastguard Worker 	val =
315*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_MMAP2
316*cf84ac9aSAndroid Build Coastguard Worker 		attr->mmap2;
317*cf84ac9aSAndroid Build Coastguard Worker # else
318*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.mmap2;
319*cf84ac9aSAndroid Build Coastguard Worker # endif
320*cf84ac9aSAndroid Build Coastguard Worker 	printf(", mmap2=%" PRIu64, val);
321*cf84ac9aSAndroid Build Coastguard Worker 
322*cf84ac9aSAndroid Build Coastguard Worker 	val =
323*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_COMM_EXEC
324*cf84ac9aSAndroid Build Coastguard Worker 		attr->comm_exec;
325*cf84ac9aSAndroid Build Coastguard Worker # else
326*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.comm_exec;
327*cf84ac9aSAndroid Build Coastguard Worker # endif
328*cf84ac9aSAndroid Build Coastguard Worker 	printf(", comm_exec=%" PRIu64, val);
329*cf84ac9aSAndroid Build Coastguard Worker 
330*cf84ac9aSAndroid Build Coastguard Worker 	use_clockid = val =
331*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_USE_CLOCKID
332*cf84ac9aSAndroid Build Coastguard Worker 		attr->use_clockid;
333*cf84ac9aSAndroid Build Coastguard Worker # else
334*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.use_clockid;
335*cf84ac9aSAndroid Build Coastguard Worker # endif
336*cf84ac9aSAndroid Build Coastguard Worker 	printf(", use_clockid=%" PRIu64, val);
337*cf84ac9aSAndroid Build Coastguard Worker 
338*cf84ac9aSAndroid Build Coastguard Worker 	val =
339*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_CONTEXT_SWITCH
340*cf84ac9aSAndroid Build Coastguard Worker 		attr->context_switch;
341*cf84ac9aSAndroid Build Coastguard Worker # else
342*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.context_switch;
343*cf84ac9aSAndroid Build Coastguard Worker # endif
344*cf84ac9aSAndroid Build Coastguard Worker 	printf(", context_switch=%" PRIu64, val);
345*cf84ac9aSAndroid Build Coastguard Worker 
346*cf84ac9aSAndroid Build Coastguard Worker 	val =
347*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_WRITE_BACKWARD
348*cf84ac9aSAndroid Build Coastguard Worker 		attr->write_backward;
349*cf84ac9aSAndroid Build Coastguard Worker # else
350*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.write_backward;
351*cf84ac9aSAndroid Build Coastguard Worker # endif
352*cf84ac9aSAndroid Build Coastguard Worker 	printf(", write_backward=%" PRIu64, val);
353*cf84ac9aSAndroid Build Coastguard Worker 
354*cf84ac9aSAndroid Build Coastguard Worker 	val =
355*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_NAMESPACES
356*cf84ac9aSAndroid Build Coastguard Worker 		attr->namespaces;
357*cf84ac9aSAndroid Build Coastguard Worker # else
358*cf84ac9aSAndroid Build Coastguard Worker 		flags_data.flags.namespaces;
359*cf84ac9aSAndroid Build Coastguard Worker # endif
360*cf84ac9aSAndroid Build Coastguard Worker 	printf(", namespaces=%" PRIu64, val);
361*cf84ac9aSAndroid Build Coastguard Worker 
362*cf84ac9aSAndroid Build Coastguard Worker 	val = flags_data.flags.__reserved_1;
363*cf84ac9aSAndroid Build Coastguard Worker 	if (val)
364*cf84ac9aSAndroid Build Coastguard Worker 		printf(", __reserved_1=%#" PRIx64 " /* Bits 63..29 */", val);
365*cf84ac9aSAndroid Build Coastguard Worker 
366*cf84ac9aSAndroid Build Coastguard Worker 	printf(", %s=%u",
367*cf84ac9aSAndroid Build Coastguard Worker 		attr->watermark ? "wakeup_watermark" : "wakeup_events",
368*cf84ac9aSAndroid Build Coastguard Worker 		attr->watermark ? attr->wakeup_watermark : attr->wakeup_events);
369*cf84ac9aSAndroid Build Coastguard Worker 
370*cf84ac9aSAndroid Build Coastguard Worker 	if (attr->type == PERF_TYPE_BREAKPOINT)
371*cf84ac9aSAndroid Build Coastguard Worker 		printf(", bp_type=%s", bp_type);
372*cf84ac9aSAndroid Build Coastguard Worker 
373*cf84ac9aSAndroid Build Coastguard Worker 	val =
374*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_CONFIG1
375*cf84ac9aSAndroid Build Coastguard Worker 		attr->config1;
376*cf84ac9aSAndroid Build Coastguard Worker # else
377*cf84ac9aSAndroid Build Coastguard Worker 		((uint64_t *) attr)[56 / sizeof(uint64_t)];
378*cf84ac9aSAndroid Build Coastguard Worker # endif
379*cf84ac9aSAndroid Build Coastguard Worker 	printf(", %s=%#" PRIx64,
380*cf84ac9aSAndroid Build Coastguard Worker 	       attr->type == PERF_TYPE_BREAKPOINT ? "bp_addr" : "config1",
381*cf84ac9aSAndroid Build Coastguard Worker 	       val);
382*cf84ac9aSAndroid Build Coastguard Worker 
383*cf84ac9aSAndroid Build Coastguard Worker 	/* End of version 0 of the structure */
384*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 64) {
385*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 64;
386*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
387*cf84ac9aSAndroid Build Coastguard Worker 	}
388*cf84ac9aSAndroid Build Coastguard Worker 
389*cf84ac9aSAndroid Build Coastguard Worker 	val =
390*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_CONFIG2
391*cf84ac9aSAndroid Build Coastguard Worker 		attr->config2;
392*cf84ac9aSAndroid Build Coastguard Worker # else
393*cf84ac9aSAndroid Build Coastguard Worker 		((uint64_t *) attr)[64 / sizeof(uint64_t)];
394*cf84ac9aSAndroid Build Coastguard Worker # endif
395*cf84ac9aSAndroid Build Coastguard Worker 	if (attr->type == PERF_TYPE_BREAKPOINT)
396*cf84ac9aSAndroid Build Coastguard Worker 		printf(", bp_len=%" PRIu64, val);
397*cf84ac9aSAndroid Build Coastguard Worker 	else
398*cf84ac9aSAndroid Build Coastguard Worker 		printf(", config2=%#" PRIx64, val);
399*cf84ac9aSAndroid Build Coastguard Worker 
400*cf84ac9aSAndroid Build Coastguard Worker 	/* End of version 1 of the structure */
401*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 72) {
402*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 72;
403*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
404*cf84ac9aSAndroid Build Coastguard Worker 	}
405*cf84ac9aSAndroid Build Coastguard Worker 
406*cf84ac9aSAndroid Build Coastguard Worker 	/*
407*cf84ac9aSAndroid Build Coastguard Worker 	 * Print branch sample type only in case  PERF_SAMPLE_BRANCH_STACK
408*cf84ac9aSAndroid Build Coastguard Worker 	 * is set in the sample_type field.
409*cf84ac9aSAndroid Build Coastguard Worker 	 */
410*cf84ac9aSAndroid Build Coastguard Worker 	if (attr->sample_type & (1 << 11))
411*cf84ac9aSAndroid Build Coastguard Worker 		printf(", branch_sample_type=%s", branch_sample_type);
412*cf84ac9aSAndroid Build Coastguard Worker 
413*cf84ac9aSAndroid Build Coastguard Worker 	/* End of version 2 of the structure */
414*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 80) {
415*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 80;
416*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
417*cf84ac9aSAndroid Build Coastguard Worker 	}
418*cf84ac9aSAndroid Build Coastguard Worker 
419*cf84ac9aSAndroid Build Coastguard Worker 	val =
420*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_SAMPLE_REGS_USER
421*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_regs_user;
422*cf84ac9aSAndroid Build Coastguard Worker # else
423*cf84ac9aSAndroid Build Coastguard Worker 		((uint64_t *) attr)[80 / sizeof(uint64_t)];
424*cf84ac9aSAndroid Build Coastguard Worker # endif
425*cf84ac9aSAndroid Build Coastguard Worker 	printf(", sample_regs_user=%#" PRIx64, val);
426*cf84ac9aSAndroid Build Coastguard Worker 
427*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 88) {
428*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 88;
429*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
430*cf84ac9aSAndroid Build Coastguard Worker 	}
431*cf84ac9aSAndroid Build Coastguard Worker 
432*cf84ac9aSAndroid Build Coastguard Worker 	val =
433*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_SAMPLE_STACK_USER
434*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_stack_user;
435*cf84ac9aSAndroid Build Coastguard Worker # else
436*cf84ac9aSAndroid Build Coastguard Worker 		((uint32_t *) attr)[88 / sizeof(uint32_t)];
437*cf84ac9aSAndroid Build Coastguard Worker # endif
438*cf84ac9aSAndroid Build Coastguard Worker 	/*
439*cf84ac9aSAndroid Build Coastguard Worker 	 * Print branch sample type only in case PERF_SAMPLE_STACK_USER
440*cf84ac9aSAndroid Build Coastguard Worker 	 * is set in the sample_type field.
441*cf84ac9aSAndroid Build Coastguard Worker 	 */
442*cf84ac9aSAndroid Build Coastguard Worker 	if (attr->sample_type & (1 << 13))
443*cf84ac9aSAndroid Build Coastguard Worker 		printf(", sample_stack_user=%#" PRIx32, (uint32_t) val);
444*cf84ac9aSAndroid Build Coastguard Worker 
445*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 92) {
446*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 92;
447*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
448*cf84ac9aSAndroid Build Coastguard Worker 	}
449*cf84ac9aSAndroid Build Coastguard Worker 
450*cf84ac9aSAndroid Build Coastguard Worker 	if (use_clockid)
451*cf84ac9aSAndroid Build Coastguard Worker 		printf(", clockid=%s", clockid);
452*cf84ac9aSAndroid Build Coastguard Worker 
453*cf84ac9aSAndroid Build Coastguard Worker 	/* End of version 3 of the structure */
454*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 96) {
455*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 96;
456*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
457*cf84ac9aSAndroid Build Coastguard Worker 	}
458*cf84ac9aSAndroid Build Coastguard Worker 
459*cf84ac9aSAndroid Build Coastguard Worker 	val =
460*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_SAMPLE_REGS_INTR
461*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_regs_intr;
462*cf84ac9aSAndroid Build Coastguard Worker # else
463*cf84ac9aSAndroid Build Coastguard Worker 		((uint64_t *) attr)[96 / sizeof(uint64_t)];
464*cf84ac9aSAndroid Build Coastguard Worker # endif
465*cf84ac9aSAndroid Build Coastguard Worker 	printf(", sample_regs_intr=%#" PRIx64, val);
466*cf84ac9aSAndroid Build Coastguard Worker 
467*cf84ac9aSAndroid Build Coastguard Worker 	/* End of version 4 of the structure */
468*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 104) {
469*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 104;
470*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
471*cf84ac9aSAndroid Build Coastguard Worker 	}
472*cf84ac9aSAndroid Build Coastguard Worker 
473*cf84ac9aSAndroid Build Coastguard Worker 	val =
474*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_AUX_WATERMARK
475*cf84ac9aSAndroid Build Coastguard Worker 		attr->aux_watermark;
476*cf84ac9aSAndroid Build Coastguard Worker # else
477*cf84ac9aSAndroid Build Coastguard Worker 		((uint32_t *) attr)[104 / sizeof(uint32_t)];
478*cf84ac9aSAndroid Build Coastguard Worker # endif
479*cf84ac9aSAndroid Build Coastguard Worker 	printf(", aux_watermark=%" PRIu32, (uint32_t) val);
480*cf84ac9aSAndroid Build Coastguard Worker 
481*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 108) {
482*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 108;
483*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
484*cf84ac9aSAndroid Build Coastguard Worker 	}
485*cf84ac9aSAndroid Build Coastguard Worker 
486*cf84ac9aSAndroid Build Coastguard Worker 	val =
487*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_SAMPLE_MAX_STACK
488*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_max_stack;
489*cf84ac9aSAndroid Build Coastguard Worker # else
490*cf84ac9aSAndroid Build Coastguard Worker 		((uint16_t *) attr)[108 / sizeof(uint16_t)];
491*cf84ac9aSAndroid Build Coastguard Worker # endif
492*cf84ac9aSAndroid Build Coastguard Worker 	printf(", sample_max_stack=%" PRIu16, (uint16_t) val);
493*cf84ac9aSAndroid Build Coastguard Worker 
494*cf84ac9aSAndroid Build Coastguard Worker 	if (size <= 110) {
495*cf84ac9aSAndroid Build Coastguard Worker 		cutoff = 110;
496*cf84ac9aSAndroid Build Coastguard Worker 		goto end;
497*cf84ac9aSAndroid Build Coastguard Worker 	}
498*cf84ac9aSAndroid Build Coastguard Worker 
499*cf84ac9aSAndroid Build Coastguard Worker 	cutoff = STRACE_PEA_SIZE;
500*cf84ac9aSAndroid Build Coastguard Worker 
501*cf84ac9aSAndroid Build Coastguard Worker end:
502*cf84ac9aSAndroid Build Coastguard Worker 	if (size > cutoff)
503*cf84ac9aSAndroid Build Coastguard Worker 		printf(", ...");
504*cf84ac9aSAndroid Build Coastguard Worker 
505*cf84ac9aSAndroid Build Coastguard Worker 	printf("}");
506*cf84ac9aSAndroid Build Coastguard Worker # endif /* !VERBOSE */
507*cf84ac9aSAndroid Build Coastguard Worker 
508*cf84ac9aSAndroid Build Coastguard Worker 	free(attr);
509*cf84ac9aSAndroid Build Coastguard Worker }
510*cf84ac9aSAndroid Build Coastguard Worker 
511*cf84ac9aSAndroid Build Coastguard Worker /* These require aligned access, so no byte-grain checks possible */
512*cf84ac9aSAndroid Build Coastguard Worker # if defined SPARC || defined SPARC64 || defined POWERPC || defined POWERPC64
513*cf84ac9aSAndroid Build Coastguard Worker #  define ATTR_REC(sz) { tail_alloc((sz + 7) & ~7), sz }
514*cf84ac9aSAndroid Build Coastguard Worker # else
515*cf84ac9aSAndroid Build Coastguard Worker #  define ATTR_REC(sz) { tail_alloc(sz), sz }
516*cf84ac9aSAndroid Build Coastguard Worker # endif
517*cf84ac9aSAndroid Build Coastguard Worker 
518*cf84ac9aSAndroid Build Coastguard Worker # define BRANCH_TYPE_ALL \
519*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_USER|" \
520*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_KERNEL|" \
521*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_HV|" \
522*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_ANY|" \
523*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_ANY_CALL|" \
524*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_ANY_RETURN|" \
525*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_IND_CALL|" \
526*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_ABORT_TX|" \
527*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_IN_TX|" \
528*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_NO_TX|" \
529*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_COND|" \
530*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_CALL_STACK|" \
531*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_IND_JUMP|" \
532*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_CALL|" \
533*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_NO_FLAGS|" \
534*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_NO_CYCLES|" \
535*cf84ac9aSAndroid Build Coastguard Worker 	"PERF_SAMPLE_BRANCH_TYPE_SAVE"
536*cf84ac9aSAndroid Build Coastguard Worker 
537*cf84ac9aSAndroid Build Coastguard Worker int
main(void)538*cf84ac9aSAndroid Build Coastguard Worker main(void)
539*cf84ac9aSAndroid Build Coastguard Worker {
540*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_small_size = PERF_ATTR_SIZE_VER0 - 8;
541*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v0_size = PERF_ATTR_SIZE_VER0;
542*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v1_size = PERF_ATTR_SIZE_VER1;
543*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v2_size = PERF_ATTR_SIZE_VER2;
544*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v2_5_size = PERF_ATTR_SIZE_VER2 + 8;
545*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v2_75_size = PERF_ATTR_SIZE_VER2 + 12;
546*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v3_size = PERF_ATTR_SIZE_VER3;
547*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v4_size = PERF_ATTR_SIZE_VER4;
548*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v4_5_size = PERF_ATTR_SIZE_VER4 + 4;
549*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v4_625_size = PERF_ATTR_SIZE_VER4 + 5;
550*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v4_875_size = PERF_ATTR_SIZE_VER4 + 7;
551*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_v5_size = PERF_ATTR_SIZE_VER5;
552*cf84ac9aSAndroid Build Coastguard Worker 	static const size_t attr_big_size = PERF_ATTR_SIZE_VER5 + 32;
553*cf84ac9aSAndroid Build Coastguard Worker 
554*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u64_val_str attr_types[] = {
555*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_HARDWARE) },
556*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_SOFTWARE) },
557*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_TRACEPOINT) },
558*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_HW_CACHE) },
559*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_RAW) },
560*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_TYPE_BREAKPOINT) },
561*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0x6) " /* PERF_TYPE_??? */" },
562*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0xdeadc0de) " /* PERF_TYPE_??? */" },
563*cf84ac9aSAndroid Build Coastguard Worker 	};
564*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u64_val_str
565*cf84ac9aSAndroid Build Coastguard Worker 	    attr_configs[ARRAY_SIZE(attr_types)][3] = {
566*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_HARDWARE */ {
567*cf84ac9aSAndroid Build Coastguard Worker 			{ 9, "PERF_COUNT_HW_REF_CPU_CYCLES" },
568*cf84ac9aSAndroid Build Coastguard Worker 			{ 10, "0xa /* PERF_COUNT_HW_??? */" },
569*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xfaceca75deadb0d4)
570*cf84ac9aSAndroid Build Coastguard Worker 				" /* PERF_COUNT_HW_??? */" },
571*cf84ac9aSAndroid Build Coastguard Worker 		},
572*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_SOFTWARE */ {
573*cf84ac9aSAndroid Build Coastguard Worker 			{ 10, "PERF_COUNT_SW_BPF_OUTPUT" },
574*cf84ac9aSAndroid Build Coastguard Worker 			{ 11, "0xb /* PERF_COUNT_SW_??? */" },
575*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xdec0ded1dec0ded2)
576*cf84ac9aSAndroid Build Coastguard Worker 				" /* PERF_COUNT_SW_??? */" },
577*cf84ac9aSAndroid Build Coastguard Worker 		},
578*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_TRACEPOINT */ {
579*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0) },
580*cf84ac9aSAndroid Build Coastguard Worker 			{ 4207856245U, "4207856245" },
581*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(16051074073505095380) },
582*cf84ac9aSAndroid Build Coastguard Worker 		},
583*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_HW_CACHE */ {
584*cf84ac9aSAndroid Build Coastguard Worker 			{ 0, "PERF_COUNT_HW_CACHE_L1D|"
585*cf84ac9aSAndroid Build Coastguard Worker 				"PERF_COUNT_HW_CACHE_OP_READ<<8|"
586*cf84ac9aSAndroid Build Coastguard Worker 				"PERF_COUNT_HW_CACHE_RESULT_ACCESS<<16" },
587*cf84ac9aSAndroid Build Coastguard Worker 			{ 0x020207, "0x7 /* PERF_COUNT_HW_CACHE_??? */|"
588*cf84ac9aSAndroid Build Coastguard Worker 				"PERF_COUNT_HW_CACHE_OP_PREFETCH<<8|"
589*cf84ac9aSAndroid Build Coastguard Worker 				"0x2 /* PERF_COUNT_HW_CACHE_RESULT_??? */<<16" },
590*cf84ac9aSAndroid Build Coastguard Worker 			{ 0xdeadf157ed010306ULL, "PERF_COUNT_HW_CACHE_NODE|"
591*cf84ac9aSAndroid Build Coastguard Worker 				"0x3 /* PERF_COUNT_HW_CACHE_OP_??? */<<8|"
592*cf84ac9aSAndroid Build Coastguard Worker 				"PERF_COUNT_HW_CACHE_RESULT_MISS<<16|"
593*cf84ac9aSAndroid Build Coastguard Worker 				"0xdeadf157ed<<24 "
594*cf84ac9aSAndroid Build Coastguard Worker 				"/* PERF_COUNT_HW_CACHE_??? */" },
595*cf84ac9aSAndroid Build Coastguard Worker 		},
596*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_RAW */ {
597*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0) },
598*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0xda7a1057) },
599*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xdec0ded7dec0ded8) },
600*cf84ac9aSAndroid Build Coastguard Worker 		},
601*cf84ac9aSAndroid Build Coastguard Worker 		/* PERF_TYPE_BREAKPOINT */ {
602*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0) },
603*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0xbadc0ded) },
604*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xdec0ded9dec0deda) },
605*cf84ac9aSAndroid Build Coastguard Worker 		},
606*cf84ac9aSAndroid Build Coastguard Worker 		/* invalid 1 */ {
607*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0) },
608*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0xbeeff00d) },
609*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xdec0dedbdec0dedc) },
610*cf84ac9aSAndroid Build Coastguard Worker 		},
611*cf84ac9aSAndroid Build Coastguard Worker 		/* invalid 2 */ {
612*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0) },
613*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_STR(0xca75dead) },
614*cf84ac9aSAndroid Build Coastguard Worker 			{ ARG_ULL_STR(0xdec0dedddec0dede) },
615*cf84ac9aSAndroid Build Coastguard Worker 		},
616*cf84ac9aSAndroid Build Coastguard Worker 	};
617*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u64_val_str sample_types[] = {
618*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0) },
619*cf84ac9aSAndroid Build Coastguard Worker 		{ 0x800, "PERF_SAMPLE_BRANCH_STACK" },
620*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_ULL_STR(0xdeadc0deda700000) " /* PERF_SAMPLE_??? */" },
621*cf84ac9aSAndroid Build Coastguard Worker 		{ 0xffffffffffffffffULL,
622*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_IP|PERF_SAMPLE_TID|PERF_SAMPLE_TIME|"
623*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_ADDR|PERF_SAMPLE_READ|"
624*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_CALLCHAIN|PERF_SAMPLE_ID|PERF_SAMPLE_CPU|"
625*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_PERIOD|PERF_SAMPLE_STREAM_ID|"
626*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_RAW|PERF_SAMPLE_BRANCH_STACK|"
627*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_REGS_USER|PERF_SAMPLE_STACK_USER|"
628*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_WEIGHT|PERF_SAMPLE_DATA_SRC|"
629*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_IDENTIFIER|PERF_SAMPLE_TRANSACTION|"
630*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_SAMPLE_REGS_INTR|PERF_SAMPLE_PHYS_ADDR|"
631*cf84ac9aSAndroid Build Coastguard Worker 			"0xfffffffffff00000" },
632*cf84ac9aSAndroid Build Coastguard Worker 	};
633*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u64_val_str read_formats[] = {
634*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0) },
635*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(PERF_FORMAT_TOTAL_TIME_ENABLED) },
636*cf84ac9aSAndroid Build Coastguard Worker 		{ 0xf, "PERF_FORMAT_TOTAL_TIME_ENABLED|"
637*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FORMAT_TOTAL_TIME_RUNNING|"
638*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FORMAT_ID|PERF_FORMAT_GROUP" },
639*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_ULL_STR(0xdeadf157dec0ded0) " /* PERF_FORMAT_??? */" },
640*cf84ac9aSAndroid Build Coastguard Worker 		{ 0xffffffffffffffffULL,
641*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FORMAT_TOTAL_TIME_ENABLED|"
642*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FORMAT_TOTAL_TIME_RUNNING|"
643*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FORMAT_ID|PERF_FORMAT_GROUP|"
644*cf84ac9aSAndroid Build Coastguard Worker 			"0xfffffffffffffff0" },
645*cf84ac9aSAndroid Build Coastguard Worker 	};
646*cf84ac9aSAndroid Build Coastguard Worker 	static const char *precise_ip_descs[] = {
647*cf84ac9aSAndroid Build Coastguard Worker 		"arbitrary skid",
648*cf84ac9aSAndroid Build Coastguard Worker 		"constant skid",
649*cf84ac9aSAndroid Build Coastguard Worker 		"requested to have 0 skid",
650*cf84ac9aSAndroid Build Coastguard Worker 		"must have 0 skid",
651*cf84ac9aSAndroid Build Coastguard Worker 	};
652*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u32_val_str bp_types[] = {
653*cf84ac9aSAndroid Build Coastguard Worker 		{ 0, "HW_BREAKPOINT_EMPTY" },
654*cf84ac9aSAndroid Build Coastguard Worker 		{ 1, "HW_BREAKPOINT_R" },
655*cf84ac9aSAndroid Build Coastguard Worker 		{ 3, "HW_BREAKPOINT_RW" },
656*cf84ac9aSAndroid Build Coastguard Worker 		{ 5, "0x5 /* HW_BREAKPOINT_INVALID */" },
657*cf84ac9aSAndroid Build Coastguard Worker 		{ 8, "0x8 /* HW_BREAKPOINT_??? */" },
658*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0xface1e55) " /* HW_BREAKPOINT_??? */" },
659*cf84ac9aSAndroid Build Coastguard Worker 	};
660*cf84ac9aSAndroid Build Coastguard Worker 	static const struct u64_val_str branch_sample_types[] = {
661*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0) },
662*cf84ac9aSAndroid Build Coastguard Worker 		{ 0x80, "PERF_SAMPLE_BRANCH_ABORT_TX" },
663*cf84ac9aSAndroid Build Coastguard Worker 		{ 0x1ffff, BRANCH_TYPE_ALL },
664*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_ULL_STR(0xdeadcaffeeec0000)
665*cf84ac9aSAndroid Build Coastguard Worker 			" /* PERF_SAMPLE_BRANCH_??? */" },
666*cf84ac9aSAndroid Build Coastguard Worker 		{ 0xffffffffffffffffULL,
667*cf84ac9aSAndroid Build Coastguard Worker 			BRANCH_TYPE_ALL "|0xfffffffffffe0000" }
668*cf84ac9aSAndroid Build Coastguard Worker 	};
669*cf84ac9aSAndroid Build Coastguard Worker 	static const struct s32_val_str clockids[] = {
670*cf84ac9aSAndroid Build Coastguard Worker 		{ 11, "CLOCK_TAI" },
671*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0xc) " /* CLOCK_??? */" },
672*cf84ac9aSAndroid Build Coastguard Worker 		{ ARG_STR(0xbeeffeed) " /* CLOCK_??? */" },
673*cf84ac9aSAndroid Build Coastguard Worker 	};
674*cf84ac9aSAndroid Build Coastguard Worker 
675*cf84ac9aSAndroid Build Coastguard Worker 
676*cf84ac9aSAndroid Build Coastguard Worker 	struct {
677*cf84ac9aSAndroid Build Coastguard Worker 		struct perf_event_attr *ptr;
678*cf84ac9aSAndroid Build Coastguard Worker 		size_t size;
679*cf84ac9aSAndroid Build Coastguard Worker 	} attrs[] = {
680*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(sizeof(struct perf_event_attr)),
681*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v0_size),
682*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v1_size),
683*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v2_size),
684*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v2_5_size),
685*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v2_75_size),
686*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v3_size),
687*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v4_size),
688*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v4_5_size),
689*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v4_625_size),
690*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v4_875_size),
691*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_v5_size),
692*cf84ac9aSAndroid Build Coastguard Worker 		ATTR_REC(attr_big_size),
693*cf84ac9aSAndroid Build Coastguard Worker 	};
694*cf84ac9aSAndroid Build Coastguard Worker 
695*cf84ac9aSAndroid Build Coastguard Worker 	TAIL_ALLOC_OBJECT_CONST_PTR(struct perf_event_attr, small_attr);
696*cf84ac9aSAndroid Build Coastguard Worker 
697*cf84ac9aSAndroid Build Coastguard Worker 	struct {
698*cf84ac9aSAndroid Build Coastguard Worker 		struct perf_event_attr *attr;
699*cf84ac9aSAndroid Build Coastguard Worker 		pid_t pid;
700*cf84ac9aSAndroid Build Coastguard Worker 		int cpu;
701*cf84ac9aSAndroid Build Coastguard Worker 		int group_fd;
702*cf84ac9aSAndroid Build Coastguard Worker 		unsigned long flags;
703*cf84ac9aSAndroid Build Coastguard Worker 		const char *flags_str;
704*cf84ac9aSAndroid Build Coastguard Worker 	} args[] = {
705*cf84ac9aSAndroid Build Coastguard Worker 		{ NULL,           0xfacef00d, 0xbadabba7, -1,
706*cf84ac9aSAndroid Build Coastguard Worker 			(unsigned long) 0xFFFFFFFFFFFFFFFFLLU,
707*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
708*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC|"
709*cf84ac9aSAndroid Build Coastguard Worker 			"0x" LONG_STR_PREFIX "fffffff0"
710*cf84ac9aSAndroid Build Coastguard Worker 			},
711*cf84ac9aSAndroid Build Coastguard Worker 		{ small_attr + 1, 0,          0,          0,
712*cf84ac9aSAndroid Build Coastguard Worker 			0, "0" },
713*cf84ac9aSAndroid Build Coastguard Worker 		{ small_attr,     -1,         -1,         1,
714*cf84ac9aSAndroid Build Coastguard Worker 			PERF_FLAG_FD_NO_GROUP | PERF_FLAG_FD_OUTPUT |
715*cf84ac9aSAndroid Build Coastguard Worker 			PERF_FLAG_PID_CGROUP | PERF_FLAG_FD_CLOEXEC,
716*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FLAG_FD_NO_GROUP|PERF_FLAG_FD_OUTPUT|"
717*cf84ac9aSAndroid Build Coastguard Worker 			"PERF_FLAG_PID_CGROUP|PERF_FLAG_FD_CLOEXEC" },
718*cf84ac9aSAndroid Build Coastguard Worker 		{ (struct perf_event_attr *) (uintptr_t) 0xfffffacefffffeedULL,
719*cf84ac9aSAndroid Build Coastguard Worker 			          -100,       100,        0xface1e55,
720*cf84ac9aSAndroid Build Coastguard Worker 			PERF_FLAG_FD_CLOEXEC, "PERF_FLAG_FD_CLOEXEC" },
721*cf84ac9aSAndroid Build Coastguard Worker 	};
722*cf84ac9aSAndroid Build Coastguard Worker 
723*cf84ac9aSAndroid Build Coastguard Worker 	size_t i;
724*cf84ac9aSAndroid Build Coastguard Worker 	int rc;
725*cf84ac9aSAndroid Build Coastguard Worker 
726*cf84ac9aSAndroid Build Coastguard Worker 	fill_memory(small_attr, sizeof(*small_attr));
727*cf84ac9aSAndroid Build Coastguard Worker 	small_attr->size = attr_small_size;
728*cf84ac9aSAndroid Build Coastguard Worker 
729*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(args); i++) {
730*cf84ac9aSAndroid Build Coastguard Worker 		rc = syscall(__NR_perf_event_open, args[i].attr, args[i].pid,
731*cf84ac9aSAndroid Build Coastguard Worker 			     args[i].cpu, args[i].group_fd, args[i].flags);
732*cf84ac9aSAndroid Build Coastguard Worker 		printf("perf_event_open(%s, %d, %d, %d, %s) = %s\n",
733*cf84ac9aSAndroid Build Coastguard Worker 		       printaddr(args[i].attr), args[i].pid, args[i].cpu,
734*cf84ac9aSAndroid Build Coastguard Worker 		       args[i].group_fd, args[i].flags_str, sprintrc(rc));
735*cf84ac9aSAndroid Build Coastguard Worker 	}
736*cf84ac9aSAndroid Build Coastguard Worker 
737*cf84ac9aSAndroid Build Coastguard Worker 	for (i = 0; i < ARRAY_SIZE(attrs) * ARRAY_SIZE(attr_types) *
738*cf84ac9aSAndroid Build Coastguard Worker 	    ARRAY_SIZE(attr_configs[0]) + 1; i++) {
739*cf84ac9aSAndroid Build Coastguard Worker 		struct perf_event_attr *attr = attrs[i % ARRAY_SIZE(attrs)].ptr;
740*cf84ac9aSAndroid Build Coastguard Worker 		uint32_t size = attrs[i % ARRAY_SIZE(attrs)].size;
741*cf84ac9aSAndroid Build Coastguard Worker 		unsigned char fill_start = 0x80 + i;
742*cf84ac9aSAndroid Build Coastguard Worker 		size_t type_idx = i % ARRAY_SIZE(attr_types);
743*cf84ac9aSAndroid Build Coastguard Worker 		size_t config_idx = i % ARRAY_SIZE(attr_configs[0]);
744*cf84ac9aSAndroid Build Coastguard Worker 		size_t sample_type_idx = i % ARRAY_SIZE(sample_types);
745*cf84ac9aSAndroid Build Coastguard Worker 		size_t read_format_idx = i % ARRAY_SIZE(read_formats);
746*cf84ac9aSAndroid Build Coastguard Worker 		size_t bp_type_idx = (i / ARRAY_SIZE(attr_configs[0])) %
747*cf84ac9aSAndroid Build Coastguard Worker 			ARRAY_SIZE(bp_types);
748*cf84ac9aSAndroid Build Coastguard Worker 		size_t branch_sample_type_idx = (i / ARRAY_SIZE(sample_types)) %
749*cf84ac9aSAndroid Build Coastguard Worker 			ARRAY_SIZE(branch_sample_types);
750*cf84ac9aSAndroid Build Coastguard Worker 		size_t clockid_idx = i % ARRAY_SIZE(clockids);
751*cf84ac9aSAndroid Build Coastguard Worker 		size_t args_idx = i % ARRAY_SIZE(args);
752*cf84ac9aSAndroid Build Coastguard Worker 		const char *ip_desc_str;
753*cf84ac9aSAndroid Build Coastguard Worker 
754*cf84ac9aSAndroid Build Coastguard Worker 		fill_memory_ex(attr, size, fill_start, 0xff);
755*cf84ac9aSAndroid Build Coastguard Worker 
756*cf84ac9aSAndroid Build Coastguard Worker 		attr->type = attr_types[type_idx].val;
757*cf84ac9aSAndroid Build Coastguard Worker 		attr->size = size;
758*cf84ac9aSAndroid Build Coastguard Worker 		attr->config = attr_configs[type_idx][config_idx].val;
759*cf84ac9aSAndroid Build Coastguard Worker 		attr->sample_type = sample_types[sample_type_idx].val;
760*cf84ac9aSAndroid Build Coastguard Worker 		attr->read_format = read_formats[read_format_idx].val;
761*cf84ac9aSAndroid Build Coastguard Worker 
762*cf84ac9aSAndroid Build Coastguard Worker 		if ((i % 11) == 5)
763*cf84ac9aSAndroid Build Coastguard Worker 			attr->__reserved_1 = 0;
764*cf84ac9aSAndroid Build Coastguard Worker 
765*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_BP_TYPE
766*cf84ac9aSAndroid Build Coastguard Worker 		attr->bp_type =
767*cf84ac9aSAndroid Build Coastguard Worker # else
768*cf84ac9aSAndroid Build Coastguard Worker 		((uint32_t *) attr)[52 / sizeof(uint32_t)] =
769*cf84ac9aSAndroid Build Coastguard Worker # endif
770*cf84ac9aSAndroid Build Coastguard Worker 			bp_types[bp_type_idx].val;
771*cf84ac9aSAndroid Build Coastguard Worker 
772*cf84ac9aSAndroid Build Coastguard Worker 		if (size >= 80)
773*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_BRANCH_SAMPLE_TYPE
774*cf84ac9aSAndroid Build Coastguard Worker 			attr->branch_sample_type =
775*cf84ac9aSAndroid Build Coastguard Worker # else
776*cf84ac9aSAndroid Build Coastguard Worker 			((uint64_t *) attr)[72 / sizeof(uint64_t)] =
777*cf84ac9aSAndroid Build Coastguard Worker # endif
778*cf84ac9aSAndroid Build Coastguard Worker 				branch_sample_types[branch_sample_type_idx].val;
779*cf84ac9aSAndroid Build Coastguard Worker 
780*cf84ac9aSAndroid Build Coastguard Worker 		if (size >= 96)
781*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_CLOCKID
782*cf84ac9aSAndroid Build Coastguard Worker 			attr->clockid =
783*cf84ac9aSAndroid Build Coastguard Worker # else
784*cf84ac9aSAndroid Build Coastguard Worker 			((uint32_t *) attr)[92 / sizeof(uint32_t)] =
785*cf84ac9aSAndroid Build Coastguard Worker # endif
786*cf84ac9aSAndroid Build Coastguard Worker 				clockids[clockid_idx].val;
787*cf84ac9aSAndroid Build Coastguard Worker 
788*cf84ac9aSAndroid Build Coastguard Worker # ifdef HAVE_STRUCT_PERF_EVENT_ATTR_PRECISE_IP
789*cf84ac9aSAndroid Build Coastguard Worker 		ip_desc_str = precise_ip_descs[attr->precise_ip];
790*cf84ac9aSAndroid Build Coastguard Worker # else
791*cf84ac9aSAndroid Build Coastguard Worker 		union {
792*cf84ac9aSAndroid Build Coastguard Worker 			struct pea_flags flags;
793*cf84ac9aSAndroid Build Coastguard Worker 			uint64_t raw;
794*cf84ac9aSAndroid Build Coastguard Worker 		} flags_data = { .raw = ((uint64_t *) attr)[5] };
795*cf84ac9aSAndroid Build Coastguard Worker 
796*cf84ac9aSAndroid Build Coastguard Worker 		ip_desc_str = precise_ip_descs[flags_data.flags.precise_ip];
797*cf84ac9aSAndroid Build Coastguard Worker # endif
798*cf84ac9aSAndroid Build Coastguard Worker 
799*cf84ac9aSAndroid Build Coastguard Worker 		if (i == 0)
800*cf84ac9aSAndroid Build Coastguard Worker 			attr->size = size + 8;
801*cf84ac9aSAndroid Build Coastguard Worker 
802*cf84ac9aSAndroid Build Coastguard Worker 		if (i == 1)
803*cf84ac9aSAndroid Build Coastguard Worker 			attr->size = 0;
804*cf84ac9aSAndroid Build Coastguard Worker 
805*cf84ac9aSAndroid Build Coastguard Worker 		rc = syscall(__NR_perf_event_open, attr, args[args_idx].pid,
806*cf84ac9aSAndroid Build Coastguard Worker 			     args[args_idx].cpu, args[args_idx].group_fd,
807*cf84ac9aSAndroid Build Coastguard Worker 			     args[args_idx].flags);
808*cf84ac9aSAndroid Build Coastguard Worker 
809*cf84ac9aSAndroid Build Coastguard Worker 		printf("perf_event_open(");
810*cf84ac9aSAndroid Build Coastguard Worker 		print_event_attr(attr, i ? ((i == 1) ? 0 : size) : size + 8,
811*cf84ac9aSAndroid Build Coastguard Worker 				 attr_types[type_idx].str,
812*cf84ac9aSAndroid Build Coastguard Worker 				 attr_configs[type_idx][config_idx].str,
813*cf84ac9aSAndroid Build Coastguard Worker 				 sample_types[sample_type_idx].str,
814*cf84ac9aSAndroid Build Coastguard Worker 				 read_formats[read_format_idx].str,
815*cf84ac9aSAndroid Build Coastguard Worker 				 ip_desc_str,
816*cf84ac9aSAndroid Build Coastguard Worker 				 bp_types[bp_type_idx].str,
817*cf84ac9aSAndroid Build Coastguard Worker 				 branch_sample_types[branch_sample_type_idx].str,
818*cf84ac9aSAndroid Build Coastguard Worker 				 clockids[clockid_idx].str, size);
819*cf84ac9aSAndroid Build Coastguard Worker 		printf(", %d, %d, %d, %s) = %s\n", args[args_idx].pid,
820*cf84ac9aSAndroid Build Coastguard Worker 		       args[args_idx].cpu, args[args_idx].group_fd,
821*cf84ac9aSAndroid Build Coastguard Worker 		       args[args_idx].flags_str, sprintrc(rc));
822*cf84ac9aSAndroid Build Coastguard Worker 	}
823*cf84ac9aSAndroid Build Coastguard Worker 
824*cf84ac9aSAndroid Build Coastguard Worker 	puts("+++ exited with 0 +++");
825*cf84ac9aSAndroid Build Coastguard Worker 	return 0;
826*cf84ac9aSAndroid Build Coastguard Worker }
827*cf84ac9aSAndroid Build Coastguard Worker 
828*cf84ac9aSAndroid Build Coastguard Worker #else
829*cf84ac9aSAndroid Build Coastguard Worker 
830*cf84ac9aSAndroid Build Coastguard Worker SKIP_MAIN_UNDEFINED("__NR_perf_event_open && HAVE_LINUX_PERF_EVENT_H");
831*cf84ac9aSAndroid Build Coastguard Worker 
832*cf84ac9aSAndroid Build Coastguard Worker #endif
833