1*cf84ac9aSAndroid Build Coastguard Worker /*
2*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2013 Ben Noordhuis <[email protected]>
3*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2013-2015 Dmitry V. Levin <[email protected]>
4*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2016 Eugene Syromyatnikov <[email protected]>
5*cf84ac9aSAndroid Build Coastguard Worker * Copyright (c) 2015-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 "defs.h"
32*cf84ac9aSAndroid Build Coastguard Worker
33*cf84ac9aSAndroid Build Coastguard Worker #include "perf_event_struct.h"
34*cf84ac9aSAndroid Build Coastguard Worker #include "print_fields.h"
35*cf84ac9aSAndroid Build Coastguard Worker
36*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/hw_breakpoint_len.h"
37*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/hw_breakpoint_type.h"
38*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_attr_size.h"
39*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_branch_sample_type.h"
40*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_event_open_flags.h"
41*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_event_read_format.h"
42*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_event_sample_format.h"
43*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_hw_cache_id.h"
44*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_hw_cache_op_id.h"
45*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_hw_cache_op_result_id.h"
46*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_hw_id.h"
47*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_sw_ids.h"
48*cf84ac9aSAndroid Build Coastguard Worker #include "xlat/perf_type_id.h"
49*cf84ac9aSAndroid Build Coastguard Worker
50*cf84ac9aSAndroid Build Coastguard Worker struct pea_desc {
51*cf84ac9aSAndroid Build Coastguard Worker struct perf_event_attr *attr;
52*cf84ac9aSAndroid Build Coastguard Worker uint32_t size;
53*cf84ac9aSAndroid Build Coastguard Worker };
54*cf84ac9aSAndroid Build Coastguard Worker
55*cf84ac9aSAndroid Build Coastguard Worker static void
free_pea_desc(void * pea_desc_ptr)56*cf84ac9aSAndroid Build Coastguard Worker free_pea_desc(void *pea_desc_ptr)
57*cf84ac9aSAndroid Build Coastguard Worker {
58*cf84ac9aSAndroid Build Coastguard Worker struct pea_desc *desc = pea_desc_ptr;
59*cf84ac9aSAndroid Build Coastguard Worker
60*cf84ac9aSAndroid Build Coastguard Worker free(desc->attr);
61*cf84ac9aSAndroid Build Coastguard Worker free(desc);
62*cf84ac9aSAndroid Build Coastguard Worker }
63*cf84ac9aSAndroid Build Coastguard Worker
64*cf84ac9aSAndroid Build Coastguard Worker int
fetch_perf_event_attr(struct tcb * const tcp,const kernel_ulong_t addr)65*cf84ac9aSAndroid Build Coastguard Worker fetch_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr)
66*cf84ac9aSAndroid Build Coastguard Worker {
67*cf84ac9aSAndroid Build Coastguard Worker struct pea_desc *desc;
68*cf84ac9aSAndroid Build Coastguard Worker struct perf_event_attr *attr;
69*cf84ac9aSAndroid Build Coastguard Worker uint32_t size;
70*cf84ac9aSAndroid Build Coastguard Worker
71*cf84ac9aSAndroid Build Coastguard Worker if (umove(tcp, addr + offsetof(struct perf_event_attr, size), &size)) {
72*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
73*cf84ac9aSAndroid Build Coastguard Worker return 1;
74*cf84ac9aSAndroid Build Coastguard Worker }
75*cf84ac9aSAndroid Build Coastguard Worker
76*cf84ac9aSAndroid Build Coastguard Worker if (size > sizeof(*attr))
77*cf84ac9aSAndroid Build Coastguard Worker size = sizeof(*attr);
78*cf84ac9aSAndroid Build Coastguard Worker
79*cf84ac9aSAndroid Build Coastguard Worker if (!size)
80*cf84ac9aSAndroid Build Coastguard Worker size = PERF_ATTR_SIZE_VER0;
81*cf84ac9aSAndroid Build Coastguard Worker
82*cf84ac9aSAndroid Build Coastguard Worker /*
83*cf84ac9aSAndroid Build Coastguard Worker * Kernel (rightfully) deems invalid attribute structures with size less
84*cf84ac9aSAndroid Build Coastguard Worker * than first published format size, and we do the same.
85*cf84ac9aSAndroid Build Coastguard Worker */
86*cf84ac9aSAndroid Build Coastguard Worker if (size < PERF_ATTR_SIZE_VER0) {
87*cf84ac9aSAndroid Build Coastguard Worker printaddr(addr);
88*cf84ac9aSAndroid Build Coastguard Worker return 1;
89*cf84ac9aSAndroid Build Coastguard Worker }
90*cf84ac9aSAndroid Build Coastguard Worker
91*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp))
92*cf84ac9aSAndroid Build Coastguard Worker size = offsetofend(struct perf_event_attr, config);
93*cf84ac9aSAndroid Build Coastguard Worker
94*cf84ac9aSAndroid Build Coastguard Worker /* Size should be multiple of 8, but kernel doesn't check for it */
95*cf84ac9aSAndroid Build Coastguard Worker /* size &= ~7; */
96*cf84ac9aSAndroid Build Coastguard Worker
97*cf84ac9aSAndroid Build Coastguard Worker attr = xcalloc(1, sizeof(*attr));
98*cf84ac9aSAndroid Build Coastguard Worker
99*cf84ac9aSAndroid Build Coastguard Worker if (umoven_or_printaddr(tcp, addr, size, attr)) {
100*cf84ac9aSAndroid Build Coastguard Worker free(attr);
101*cf84ac9aSAndroid Build Coastguard Worker
102*cf84ac9aSAndroid Build Coastguard Worker return 1;
103*cf84ac9aSAndroid Build Coastguard Worker }
104*cf84ac9aSAndroid Build Coastguard Worker
105*cf84ac9aSAndroid Build Coastguard Worker desc = xmalloc(sizeof(*desc));
106*cf84ac9aSAndroid Build Coastguard Worker
107*cf84ac9aSAndroid Build Coastguard Worker desc->attr = attr;
108*cf84ac9aSAndroid Build Coastguard Worker desc->size = size;
109*cf84ac9aSAndroid Build Coastguard Worker
110*cf84ac9aSAndroid Build Coastguard Worker set_tcb_priv_data(tcp, desc, free_pea_desc);
111*cf84ac9aSAndroid Build Coastguard Worker
112*cf84ac9aSAndroid Build Coastguard Worker return 0;
113*cf84ac9aSAndroid Build Coastguard Worker }
114*cf84ac9aSAndroid Build Coastguard Worker
115*cf84ac9aSAndroid Build Coastguard Worker void
print_perf_event_attr(struct tcb * const tcp,const kernel_ulong_t addr)116*cf84ac9aSAndroid Build Coastguard Worker print_perf_event_attr(struct tcb *const tcp, const kernel_ulong_t addr)
117*cf84ac9aSAndroid Build Coastguard Worker {
118*cf84ac9aSAndroid Build Coastguard Worker static const char *precise_ip_desc[] = {
119*cf84ac9aSAndroid Build Coastguard Worker "arbitrary skid",
120*cf84ac9aSAndroid Build Coastguard Worker "constant skid",
121*cf84ac9aSAndroid Build Coastguard Worker "requested to have 0 skid",
122*cf84ac9aSAndroid Build Coastguard Worker "must have 0 skid",
123*cf84ac9aSAndroid Build Coastguard Worker };
124*cf84ac9aSAndroid Build Coastguard Worker
125*cf84ac9aSAndroid Build Coastguard Worker struct pea_desc *desc;
126*cf84ac9aSAndroid Build Coastguard Worker struct perf_event_attr *attr;
127*cf84ac9aSAndroid Build Coastguard Worker uint32_t size;
128*cf84ac9aSAndroid Build Coastguard Worker uint32_t new_size;
129*cf84ac9aSAndroid Build Coastguard Worker int use_new_size = 0;
130*cf84ac9aSAndroid Build Coastguard Worker
131*cf84ac9aSAndroid Build Coastguard Worker /*
132*cf84ac9aSAndroid Build Coastguard Worker * Amusingly, kernel accepts structures with only part of the field
133*cf84ac9aSAndroid Build Coastguard Worker * present, so we making check like this (instead of checking
134*cf84ac9aSAndroid Build Coastguard Worker * offsetofend against size) in order to print fields as kernel sees
135*cf84ac9aSAndroid Build Coastguard Worker * them. This also should work great on big endian architectures.
136*cf84ac9aSAndroid Build Coastguard Worker */
137*cf84ac9aSAndroid Build Coastguard Worker #define _PERF_CHECK_FIELD(_field) \
138*cf84ac9aSAndroid Build Coastguard Worker do { \
139*cf84ac9aSAndroid Build Coastguard Worker if (offsetof(struct perf_event_attr, _field) >= size) \
140*cf84ac9aSAndroid Build Coastguard Worker goto print_perf_event_attr_out; \
141*cf84ac9aSAndroid Build Coastguard Worker } while (0)
142*cf84ac9aSAndroid Build Coastguard Worker
143*cf84ac9aSAndroid Build Coastguard Worker desc = get_tcb_priv_data(tcp);
144*cf84ac9aSAndroid Build Coastguard Worker
145*cf84ac9aSAndroid Build Coastguard Worker attr = desc->attr;
146*cf84ac9aSAndroid Build Coastguard Worker size = desc->size;
147*cf84ac9aSAndroid Build Coastguard Worker
148*cf84ac9aSAndroid Build Coastguard Worker /* The only error which expected to change size field currently */
149*cf84ac9aSAndroid Build Coastguard Worker if (tcp->u_error == E2BIG) {
150*cf84ac9aSAndroid Build Coastguard Worker if (umove(tcp, addr + offsetof(struct perf_event_attr, size),
151*cf84ac9aSAndroid Build Coastguard Worker &new_size))
152*cf84ac9aSAndroid Build Coastguard Worker use_new_size = -1;
153*cf84ac9aSAndroid Build Coastguard Worker else
154*cf84ac9aSAndroid Build Coastguard Worker use_new_size = 1;
155*cf84ac9aSAndroid Build Coastguard Worker }
156*cf84ac9aSAndroid Build Coastguard Worker
157*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL("{", *attr, type, perf_type_id, "PERF_TYPE_???");
158*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL(", ", *attr, size, perf_attr_size,
159*cf84ac9aSAndroid Build Coastguard Worker "PERF_ATTR_SIZE_???");
160*cf84ac9aSAndroid Build Coastguard Worker
161*cf84ac9aSAndroid Build Coastguard Worker if (use_new_size) {
162*cf84ac9aSAndroid Build Coastguard Worker tprints(" => ");
163*cf84ac9aSAndroid Build Coastguard Worker
164*cf84ac9aSAndroid Build Coastguard Worker if (use_new_size > 0)
165*cf84ac9aSAndroid Build Coastguard Worker printxval(perf_attr_size, new_size,
166*cf84ac9aSAndroid Build Coastguard Worker "PERF_ATTR_SIZE_???");
167*cf84ac9aSAndroid Build Coastguard Worker else
168*cf84ac9aSAndroid Build Coastguard Worker tprints("???");
169*cf84ac9aSAndroid Build Coastguard Worker }
170*cf84ac9aSAndroid Build Coastguard Worker
171*cf84ac9aSAndroid Build Coastguard Worker switch (attr->type) {
172*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_HARDWARE:
173*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL(", ", *attr, config, perf_hw_id,
174*cf84ac9aSAndroid Build Coastguard Worker "PERF_COUNT_HW_???");
175*cf84ac9aSAndroid Build Coastguard Worker break;
176*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_SOFTWARE:
177*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL(", ", *attr, config, perf_sw_ids,
178*cf84ac9aSAndroid Build Coastguard Worker "PERF_COUNT_SW_???");
179*cf84ac9aSAndroid Build Coastguard Worker break;
180*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_TRACEPOINT:
181*cf84ac9aSAndroid Build Coastguard Worker /*
182*cf84ac9aSAndroid Build Coastguard Worker * "The value to use in config can be obtained from under
183*cf84ac9aSAndroid Build Coastguard Worker * debugfs tracing/events/../../id if ftrace is enabled
184*cf84ac9aSAndroid Build Coastguard Worker * in the kernel."
185*cf84ac9aSAndroid Build Coastguard Worker */
186*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, config);
187*cf84ac9aSAndroid Build Coastguard Worker break;
188*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_HW_CACHE:
189*cf84ac9aSAndroid Build Coastguard Worker /*
190*cf84ac9aSAndroid Build Coastguard Worker * (perf_hw_cache_id) | (perf_hw_cache_op_id << 8) |
191*cf84ac9aSAndroid Build Coastguard Worker * (perf_hw_cache_op_result_id << 16)
192*cf84ac9aSAndroid Build Coastguard Worker */
193*cf84ac9aSAndroid Build Coastguard Worker tprints(", config=");
194*cf84ac9aSAndroid Build Coastguard Worker printxval(perf_hw_cache_id, attr->config & 0xFF,
195*cf84ac9aSAndroid Build Coastguard Worker "PERF_COUNT_HW_CACHE_???");
196*cf84ac9aSAndroid Build Coastguard Worker tprints("|");
197*cf84ac9aSAndroid Build Coastguard Worker printxval(perf_hw_cache_op_id, (attr->config >> 8) & 0xFF,
198*cf84ac9aSAndroid Build Coastguard Worker "PERF_COUNT_HW_CACHE_OP_???");
199*cf84ac9aSAndroid Build Coastguard Worker tprints("<<8|");
200*cf84ac9aSAndroid Build Coastguard Worker /*
201*cf84ac9aSAndroid Build Coastguard Worker * Current code (see set_ext_hw_attr in arch/x86/events/core.c,
202*cf84ac9aSAndroid Build Coastguard Worker * tile_map_cache_event in arch/tile/kernel/perf_event.c,
203*cf84ac9aSAndroid Build Coastguard Worker * arc_pmu_cache_event in arch/arc/kernel/perf_event.c,
204*cf84ac9aSAndroid Build Coastguard Worker * hw_perf_cache_event in arch/blackfin/kernel/perf_event.c,
205*cf84ac9aSAndroid Build Coastguard Worker * _hw_perf_cache_event in arch/metag/kernel/perf/perf_event.c,
206*cf84ac9aSAndroid Build Coastguard Worker * mipspmu_map_cache_event in arch/mips/kernel/perf_event_mipsxx.c,
207*cf84ac9aSAndroid Build Coastguard Worker * hw_perf_cache_event in arch/powerpc/perf/core-book3s.c,
208*cf84ac9aSAndroid Build Coastguard Worker * hw_perf_cache_event in arch/powerpc/perf/core-fsl-emb.c,
209*cf84ac9aSAndroid Build Coastguard Worker * hw_perf_cache_event in arch/sh/kernel/perf_event.c,
210*cf84ac9aSAndroid Build Coastguard Worker * sparc_map_cache_event in arch/sparc/kernel/perf_event.c,
211*cf84ac9aSAndroid Build Coastguard Worker * xtensa_pmu_cache_event in arch/xtensa/kernel/perf_event.c,
212*cf84ac9aSAndroid Build Coastguard Worker * armpmu_map_cache_event in drivers/perf/arm_pmu.c) assumes
213*cf84ac9aSAndroid Build Coastguard Worker * that cache result is 8 bits in size.
214*cf84ac9aSAndroid Build Coastguard Worker */
215*cf84ac9aSAndroid Build Coastguard Worker printxval(perf_hw_cache_op_result_id,
216*cf84ac9aSAndroid Build Coastguard Worker (attr->config >> 16) & 0xFF,
217*cf84ac9aSAndroid Build Coastguard Worker "PERF_COUNT_HW_CACHE_RESULT_???");
218*cf84ac9aSAndroid Build Coastguard Worker tprints("<<16");
219*cf84ac9aSAndroid Build Coastguard Worker if (attr->config >> 24) {
220*cf84ac9aSAndroid Build Coastguard Worker tprintf("|%#" PRIx64 "<<24", attr->config >> 24);
221*cf84ac9aSAndroid Build Coastguard Worker tprints_comment("PERF_COUNT_HW_CACHE_???");
222*cf84ac9aSAndroid Build Coastguard Worker }
223*cf84ac9aSAndroid Build Coastguard Worker break;
224*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_RAW:
225*cf84ac9aSAndroid Build Coastguard Worker /*
226*cf84ac9aSAndroid Build Coastguard Worker * "If type is PERF_TYPE_RAW, then a custom "raw" config
227*cf84ac9aSAndroid Build Coastguard Worker * value is needed. Most CPUs support events that are not
228*cf84ac9aSAndroid Build Coastguard Worker * covered by the "generalized" events. These are
229*cf84ac9aSAndroid Build Coastguard Worker * implementation defined; see your CPU manual (for example the
230*cf84ac9aSAndroid Build Coastguard Worker * Intel Volume 3B documentation or the AMD BIOS and Kernel
231*cf84ac9aSAndroid Build Coastguard Worker * Developer Guide). The libpfm4 library can be used to
232*cf84ac9aSAndroid Build Coastguard Worker * translate from the name in the architectural manuals
233*cf84ac9aSAndroid Build Coastguard Worker * to the raw hex value perf_event_open() expects in this
234*cf84ac9aSAndroid Build Coastguard Worker * field."
235*cf84ac9aSAndroid Build Coastguard Worker */
236*cf84ac9aSAndroid Build Coastguard Worker case PERF_TYPE_BREAKPOINT:
237*cf84ac9aSAndroid Build Coastguard Worker /*
238*cf84ac9aSAndroid Build Coastguard Worker * "If type is PERF_TYPE_BREAKPOINT, then leave config set
239*cf84ac9aSAndroid Build Coastguard Worker * to zero. Its parameters are set in other places."
240*cf84ac9aSAndroid Build Coastguard Worker */
241*cf84ac9aSAndroid Build Coastguard Worker default:
242*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, config);
243*cf84ac9aSAndroid Build Coastguard Worker break;
244*cf84ac9aSAndroid Build Coastguard Worker }
245*cf84ac9aSAndroid Build Coastguard Worker
246*cf84ac9aSAndroid Build Coastguard Worker if (abbrev(tcp))
247*cf84ac9aSAndroid Build Coastguard Worker goto print_perf_event_attr_out;
248*cf84ac9aSAndroid Build Coastguard Worker
249*cf84ac9aSAndroid Build Coastguard Worker if (attr->freq)
250*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, sample_freq);
251*cf84ac9aSAndroid Build Coastguard Worker else
252*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, sample_period);
253*cf84ac9aSAndroid Build Coastguard Worker
254*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_FLAGS(", ", *attr, sample_type, perf_event_sample_format,
255*cf84ac9aSAndroid Build Coastguard Worker "PERF_SAMPLE_???");
256*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_FLAGS(", ", *attr, read_format, perf_event_read_format,
257*cf84ac9aSAndroid Build Coastguard Worker "PERF_FORMAT_???");
258*cf84ac9aSAndroid Build Coastguard Worker
259*cf84ac9aSAndroid Build Coastguard Worker tprintf(", disabled=%u"
260*cf84ac9aSAndroid Build Coastguard Worker ", inherit=%u"
261*cf84ac9aSAndroid Build Coastguard Worker ", pinned=%u"
262*cf84ac9aSAndroid Build Coastguard Worker ", exclusive=%u"
263*cf84ac9aSAndroid Build Coastguard Worker ", exclusive_user=%u"
264*cf84ac9aSAndroid Build Coastguard Worker ", exclude_kernel=%u"
265*cf84ac9aSAndroid Build Coastguard Worker ", exclude_hv=%u"
266*cf84ac9aSAndroid Build Coastguard Worker ", exclude_idle=%u"
267*cf84ac9aSAndroid Build Coastguard Worker ", mmap=%u"
268*cf84ac9aSAndroid Build Coastguard Worker ", comm=%u"
269*cf84ac9aSAndroid Build Coastguard Worker ", freq=%u"
270*cf84ac9aSAndroid Build Coastguard Worker ", inherit_stat=%u"
271*cf84ac9aSAndroid Build Coastguard Worker ", enable_on_exec=%u"
272*cf84ac9aSAndroid Build Coastguard Worker ", task=%u"
273*cf84ac9aSAndroid Build Coastguard Worker ", watermark=%u"
274*cf84ac9aSAndroid Build Coastguard Worker ", precise_ip=%u",
275*cf84ac9aSAndroid Build Coastguard Worker attr->disabled,
276*cf84ac9aSAndroid Build Coastguard Worker attr->inherit,
277*cf84ac9aSAndroid Build Coastguard Worker attr->pinned,
278*cf84ac9aSAndroid Build Coastguard Worker attr->exclusive,
279*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_user,
280*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_kernel,
281*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_hv,
282*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_idle,
283*cf84ac9aSAndroid Build Coastguard Worker attr->mmap,
284*cf84ac9aSAndroid Build Coastguard Worker attr->comm,
285*cf84ac9aSAndroid Build Coastguard Worker attr->freq,
286*cf84ac9aSAndroid Build Coastguard Worker attr->inherit_stat,
287*cf84ac9aSAndroid Build Coastguard Worker attr->enable_on_exec,
288*cf84ac9aSAndroid Build Coastguard Worker attr->task,
289*cf84ac9aSAndroid Build Coastguard Worker attr->watermark,
290*cf84ac9aSAndroid Build Coastguard Worker attr->precise_ip);
291*cf84ac9aSAndroid Build Coastguard Worker tprints_comment(precise_ip_desc[attr->precise_ip]);
292*cf84ac9aSAndroid Build Coastguard Worker tprintf(", mmap_data=%u"
293*cf84ac9aSAndroid Build Coastguard Worker ", sample_id_all=%u"
294*cf84ac9aSAndroid Build Coastguard Worker ", exclude_host=%u"
295*cf84ac9aSAndroid Build Coastguard Worker ", exclude_guest=%u"
296*cf84ac9aSAndroid Build Coastguard Worker ", exclude_callchain_kernel=%u"
297*cf84ac9aSAndroid Build Coastguard Worker ", exclude_callchain_user=%u"
298*cf84ac9aSAndroid Build Coastguard Worker ", mmap2=%u"
299*cf84ac9aSAndroid Build Coastguard Worker ", comm_exec=%u"
300*cf84ac9aSAndroid Build Coastguard Worker ", use_clockid=%u"
301*cf84ac9aSAndroid Build Coastguard Worker ", context_switch=%u"
302*cf84ac9aSAndroid Build Coastguard Worker ", write_backward=%u"
303*cf84ac9aSAndroid Build Coastguard Worker ", namespaces=%u",
304*cf84ac9aSAndroid Build Coastguard Worker attr->mmap_data,
305*cf84ac9aSAndroid Build Coastguard Worker attr->sample_id_all,
306*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_host,
307*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_guest,
308*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_callchain_kernel,
309*cf84ac9aSAndroid Build Coastguard Worker attr->exclude_callchain_user,
310*cf84ac9aSAndroid Build Coastguard Worker attr->mmap2,
311*cf84ac9aSAndroid Build Coastguard Worker attr->comm_exec,
312*cf84ac9aSAndroid Build Coastguard Worker attr->use_clockid,
313*cf84ac9aSAndroid Build Coastguard Worker attr->context_switch,
314*cf84ac9aSAndroid Build Coastguard Worker attr->write_backward,
315*cf84ac9aSAndroid Build Coastguard Worker attr->namespaces);
316*cf84ac9aSAndroid Build Coastguard Worker
317*cf84ac9aSAndroid Build Coastguard Worker /*
318*cf84ac9aSAndroid Build Coastguard Worker * Print it only in case it is non-zero, since it may contain flags we
319*cf84ac9aSAndroid Build Coastguard Worker * are not aware about.
320*cf84ac9aSAndroid Build Coastguard Worker */
321*cf84ac9aSAndroid Build Coastguard Worker if (attr->__reserved_1) {
322*cf84ac9aSAndroid Build Coastguard Worker tprintf(", __reserved_1=%#" PRIx64,
323*cf84ac9aSAndroid Build Coastguard Worker (uint64_t) attr->__reserved_1);
324*cf84ac9aSAndroid Build Coastguard Worker tprints_comment("Bits 63..29");
325*cf84ac9aSAndroid Build Coastguard Worker }
326*cf84ac9aSAndroid Build Coastguard Worker
327*cf84ac9aSAndroid Build Coastguard Worker if (attr->watermark)
328*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, wakeup_watermark);
329*cf84ac9aSAndroid Build Coastguard Worker else
330*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, wakeup_events);
331*cf84ac9aSAndroid Build Coastguard Worker
332*cf84ac9aSAndroid Build Coastguard Worker if (attr->type == PERF_TYPE_BREAKPOINT)
333*cf84ac9aSAndroid Build Coastguard Worker /* Any combination of R/W with X is deemed invalid */
334*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL(", ", *attr, bp_type, hw_breakpoint_type,
335*cf84ac9aSAndroid Build Coastguard Worker (attr->bp_type <=
336*cf84ac9aSAndroid Build Coastguard Worker (HW_BREAKPOINT_X | HW_BREAKPOINT_RW))
337*cf84ac9aSAndroid Build Coastguard Worker ? "HW_BREAKPOINT_INVALID"
338*cf84ac9aSAndroid Build Coastguard Worker : "HW_BREAKPOINT_???");
339*cf84ac9aSAndroid Build Coastguard Worker
340*cf84ac9aSAndroid Build Coastguard Worker if (attr->type == PERF_TYPE_BREAKPOINT)
341*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, bp_addr);
342*cf84ac9aSAndroid Build Coastguard Worker else
343*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, config1);
344*cf84ac9aSAndroid Build Coastguard Worker
345*cf84ac9aSAndroid Build Coastguard Worker /*
346*cf84ac9aSAndroid Build Coastguard Worker * Fields after bp_addr/config1 are optional and may not present; check
347*cf84ac9aSAndroid Build Coastguard Worker * against size is needed.
348*cf84ac9aSAndroid Build Coastguard Worker */
349*cf84ac9aSAndroid Build Coastguard Worker
350*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(bp_len);
351*cf84ac9aSAndroid Build Coastguard Worker if (attr->type == PERF_TYPE_BREAKPOINT)
352*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, bp_len);
353*cf84ac9aSAndroid Build Coastguard Worker else
354*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, config2);
355*cf84ac9aSAndroid Build Coastguard Worker
356*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(branch_sample_type);
357*cf84ac9aSAndroid Build Coastguard Worker if (attr->sample_type & PERF_SAMPLE_BRANCH_STACK) {
358*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_FLAGS(", ", *attr, branch_sample_type,
359*cf84ac9aSAndroid Build Coastguard Worker perf_branch_sample_type,
360*cf84ac9aSAndroid Build Coastguard Worker "PERF_SAMPLE_BRANCH_???");
361*cf84ac9aSAndroid Build Coastguard Worker }
362*cf84ac9aSAndroid Build Coastguard Worker
363*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(sample_regs_user);
364*cf84ac9aSAndroid Build Coastguard Worker /*
365*cf84ac9aSAndroid Build Coastguard Worker * "This bit mask defines the set of user CPU registers to dump on
366*cf84ac9aSAndroid Build Coastguard Worker * samples. The layout of the register mask is architecture-specific and
367*cf84ac9aSAndroid Build Coastguard Worker * described in the kernel header
368*cf84ac9aSAndroid Build Coastguard Worker * arch/ARCH/include/uapi/asm/perf_regs.h."
369*cf84ac9aSAndroid Build Coastguard Worker */
370*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, sample_regs_user);
371*cf84ac9aSAndroid Build Coastguard Worker
372*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(sample_stack_user);
373*cf84ac9aSAndroid Build Coastguard Worker /*
374*cf84ac9aSAndroid Build Coastguard Worker * "size of the user stack to dump if PERF_SAMPLE_STACK_USER is
375*cf84ac9aSAndroid Build Coastguard Worker * specified."
376*cf84ac9aSAndroid Build Coastguard Worker */
377*cf84ac9aSAndroid Build Coastguard Worker if (attr->sample_type & PERF_SAMPLE_STACK_USER)
378*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, sample_stack_user);
379*cf84ac9aSAndroid Build Coastguard Worker
380*cf84ac9aSAndroid Build Coastguard Worker if (attr->use_clockid) {
381*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(clockid);
382*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_XVAL(", ", *attr, clockid, clocknames, "CLOCK_???");
383*cf84ac9aSAndroid Build Coastguard Worker }
384*cf84ac9aSAndroid Build Coastguard Worker
385*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(sample_regs_intr);
386*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_X(", ", *attr, sample_regs_intr);
387*cf84ac9aSAndroid Build Coastguard Worker
388*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(aux_watermark);
389*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, aux_watermark);
390*cf84ac9aSAndroid Build Coastguard Worker
391*cf84ac9aSAndroid Build Coastguard Worker _PERF_CHECK_FIELD(sample_max_stack);
392*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, sample_max_stack);
393*cf84ac9aSAndroid Build Coastguard Worker
394*cf84ac9aSAndroid Build Coastguard Worker /* _PERF_CHECK_FIELD(__reserved_2);
395*cf84ac9aSAndroid Build Coastguard Worker PRINT_FIELD_U(", ", *attr, __reserved2); */
396*cf84ac9aSAndroid Build Coastguard Worker
397*cf84ac9aSAndroid Build Coastguard Worker print_perf_event_attr_out:
398*cf84ac9aSAndroid Build Coastguard Worker if ((attr->size && (attr->size > size)) ||
399*cf84ac9aSAndroid Build Coastguard Worker (!attr->size && (size < PERF_ATTR_SIZE_VER0)))
400*cf84ac9aSAndroid Build Coastguard Worker tprints(", ...");
401*cf84ac9aSAndroid Build Coastguard Worker
402*cf84ac9aSAndroid Build Coastguard Worker tprints("}");
403*cf84ac9aSAndroid Build Coastguard Worker }
404*cf84ac9aSAndroid Build Coastguard Worker
SYS_FUNC(perf_event_open)405*cf84ac9aSAndroid Build Coastguard Worker SYS_FUNC(perf_event_open)
406*cf84ac9aSAndroid Build Coastguard Worker {
407*cf84ac9aSAndroid Build Coastguard Worker /*
408*cf84ac9aSAndroid Build Coastguard Worker * We try to copy out the whole structure on entering in order to check
409*cf84ac9aSAndroid Build Coastguard Worker * size value on exiting. We do not check the rest of the fields because
410*cf84ac9aSAndroid Build Coastguard Worker * they shouldn't be changed, but copy the whole structure instead
411*cf84ac9aSAndroid Build Coastguard Worker * of just size field because they could.
412*cf84ac9aSAndroid Build Coastguard Worker */
413*cf84ac9aSAndroid Build Coastguard Worker if (entering(tcp)) {
414*cf84ac9aSAndroid Build Coastguard Worker if (!fetch_perf_event_attr(tcp, tcp->u_arg[0]))
415*cf84ac9aSAndroid Build Coastguard Worker return 0;
416*cf84ac9aSAndroid Build Coastguard Worker } else {
417*cf84ac9aSAndroid Build Coastguard Worker print_perf_event_attr(tcp, tcp->u_arg[0]);
418*cf84ac9aSAndroid Build Coastguard Worker }
419*cf84ac9aSAndroid Build Coastguard Worker
420*cf84ac9aSAndroid Build Coastguard Worker tprintf(", %d, %d, ",
421*cf84ac9aSAndroid Build Coastguard Worker (int) tcp->u_arg[1],
422*cf84ac9aSAndroid Build Coastguard Worker (int) tcp->u_arg[2]);
423*cf84ac9aSAndroid Build Coastguard Worker printfd(tcp, tcp->u_arg[3]);
424*cf84ac9aSAndroid Build Coastguard Worker tprints(", ");
425*cf84ac9aSAndroid Build Coastguard Worker printflags64(perf_event_open_flags, tcp->u_arg[4], "PERF_FLAG_???");
426*cf84ac9aSAndroid Build Coastguard Worker
427*cf84ac9aSAndroid Build Coastguard Worker return RVAL_DECODED | RVAL_FD;
428*cf84ac9aSAndroid Build Coastguard Worker }
429