12025cf9eSThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
2718c602dSAdrian Hunter /*
3718c602dSAdrian Hunter * auxtrace.h: AUX area trace support
4718c602dSAdrian Hunter * Copyright (c) 2013-2015, Intel Corporation.
5718c602dSAdrian Hunter */
6718c602dSAdrian Hunter
7718c602dSAdrian Hunter #ifndef __PERF_AUXTRACE_H
8718c602dSAdrian Hunter #define __PERF_AUXTRACE_H
9718c602dSAdrian Hunter
10718c602dSAdrian Hunter #include <sys/types.h>
11a43783aeSArnaldo Carvalho de Melo #include <errno.h>
12718c602dSAdrian Hunter #include <stdbool.h>
139e0cc4feSAdrian Hunter #include <stddef.h>
14ea49e01cSArnaldo Carvalho de Melo #include <stdio.h> // FILE
15e5027893SAdrian Hunter #include <linux/list.h>
16718c602dSAdrian Hunter #include <linux/perf_event.h>
17718c602dSAdrian Hunter #include <linux/types.h>
18c4d9d95fSIan Rogers #include <perf/cpumap.h>
19291ed51dSArnaldo Carvalho de Melo #include <asm/bitsperlong.h>
2091854f9aSArnaldo Carvalho de Melo #include <asm/barrier.h>
21718c602dSAdrian Hunter
229e0cc4feSAdrian Hunter union perf_event;
239e0cc4feSAdrian Hunter struct perf_session;
2463503dbaSJiri Olsa struct evlist;
25853f37d7SAdrian Hunter struct evsel;
269e0cc4feSAdrian Hunter struct perf_tool;
27a5830532SJiri Olsa struct mmap;
28bd23ac11SArnaldo Carvalho de Melo struct perf_sample;
29f6986c95SAdrian Hunter struct option;
309e0cc4feSAdrian Hunter struct record_opts;
31ea49e01cSArnaldo Carvalho de Melo struct perf_record_auxtrace_error;
3272932371SJiri Olsa struct perf_record_auxtrace_info;
3385ed4729SAdrian Hunter struct events_stats;
34ad60ba0cSAdrian Hunter struct perf_pmu;
35718c602dSAdrian Hunter
3647729258SArnaldo Carvalho de Melo enum auxtrace_error_type {
3747729258SArnaldo Carvalho de Melo PERF_AUXTRACE_ERROR_ITRACE = 1,
3847729258SArnaldo Carvalho de Melo PERF_AUXTRACE_ERROR_MAX
3947729258SArnaldo Carvalho de Melo };
4047729258SArnaldo Carvalho de Melo
41c3fcadf0SAdrian Hunter /* Auxtrace records must have the same alignment as perf event records */
42c3fcadf0SAdrian Hunter #define PERF_AUXTRACE_RECORD_ALIGNMENT 8
43c3fcadf0SAdrian Hunter
4473f75fb1SAdrian Hunter enum auxtrace_type {
4573f75fb1SAdrian Hunter PERF_AUXTRACE_UNKNOWN,
4655ea4ab4SAdrian Hunter PERF_AUXTRACE_INTEL_PT,
47d0170af7SAdrian Hunter PERF_AUXTRACE_INTEL_BTS,
48a818c563SMathieu Poirier PERF_AUXTRACE_CS_ETM,
49ffd3d18cSKim Phillips PERF_AUXTRACE_ARM_SPE,
50b96e6615SThomas Richter PERF_AUXTRACE_S390_CPUMSF,
51057381a7SQi Liu PERF_AUXTRACE_HISI_PTT,
5273f75fb1SAdrian Hunter };
5373f75fb1SAdrian Hunter
54f6986c95SAdrian Hunter enum itrace_period_type {
55f6986c95SAdrian Hunter PERF_ITRACE_PERIOD_INSTRUCTIONS,
56f6986c95SAdrian Hunter PERF_ITRACE_PERIOD_TICKS,
57f6986c95SAdrian Hunter PERF_ITRACE_PERIOD_NANOSECS,
58f6986c95SAdrian Hunter };
59f6986c95SAdrian Hunter
60cb971438SAdrian Hunter #define AUXTRACE_ERR_FLG_OVERFLOW (1 << ('o' - 'a'))
61cb971438SAdrian Hunter #define AUXTRACE_ERR_FLG_DATA_LOST (1 << ('l' - 'a'))
62cb971438SAdrian Hunter
63935aac2dSAdrian Hunter #define AUXTRACE_LOG_FLG_ALL_PERF_EVTS (1 << ('a' - 'a'))
64a7fdd30aSAdrian Hunter #define AUXTRACE_LOG_FLG_ON_ERROR (1 << ('e' - 'a'))
654b2b2c6aSAdrian Hunter #define AUXTRACE_LOG_FLG_USE_STDOUT (1 << ('o' - 'a'))
66935aac2dSAdrian Hunter
67f6986c95SAdrian Hunter /**
68f6986c95SAdrian Hunter * struct itrace_synth_opts - AUX area tracing synthesis options.
69f6986c95SAdrian Hunter * @set: indicates whether or not options have been set
704eb06815SAndi Kleen * @default_no_sample: Default to no sampling.
71f6986c95SAdrian Hunter * @inject: indicates the event (not just the sample) must be fully synthesized
72f6986c95SAdrian Hunter * because 'perf inject' will write it out
73f6986c95SAdrian Hunter * @instructions: whether to synthesize 'instructions' events
74*7e55b956SSteinar H. Gunderson * @cycles: whether to synthesize 'cycles' events
75*7e55b956SSteinar H. Gunderson * (not fully accurate, since CYC packets are only emitted
76*7e55b956SSteinar H. Gunderson * together with other events, such as branches)
77f6986c95SAdrian Hunter * @branches: whether to synthesize 'branches' events
789f74d770STan Xiaojun * (branch misses only for Arm SPE)
7953c76b0eSAdrian Hunter * @transactions: whether to synthesize events for transactions
803bdafdffSAdrian Hunter * @ptwrites: whether to synthesize events for ptwrites
8170d110d7SAdrian Hunter * @pwr_events: whether to synthesize power events
82181ebb5eSAdrian Hunter * @other_events: whether to synthesize other events recorded due to the use of
83181ebb5eSAdrian Hunter * aux_output
848ee9a9abSAdrian Hunter * @intr_events: whether to synthesize interrupt events
85f6986c95SAdrian Hunter * @errors: whether to synthesize decoder error events
86f6986c95SAdrian Hunter * @dont_decode: whether to skip decoding entirely
87f6986c95SAdrian Hunter * @log: write a decoding log
88f6986c95SAdrian Hunter * @calls: limit branch samples to calls (can be combined with @returns)
89f6986c95SAdrian Hunter * @returns: limit branch samples to returns (can be combined with @calls)
90f6986c95SAdrian Hunter * @callchain: add callchain to 'instructions' events
911c5c25b3SAdrian Hunter * @add_callchain: add callchain to existing event records
9250f73637SAdrian Hunter * @thread_stack: feed branches to the thread_stack
93601897b5SAdrian Hunter * @last_branch: add branch context to 'instruction' events
94ec90e42cSAdrian Hunter * @add_last_branch: add branch context to existing event records
95b6778fe1SAdrian Hunter * @approx_ipc: approximate IPC
969f74d770STan Xiaojun * @flc: whether to synthesize first level cache events
979f74d770STan Xiaojun * @llc: whether to synthesize last level cache events
989f74d770STan Xiaojun * @tlb: whether to synthesize TLB events
999f74d770STan Xiaojun * @remote_access: whether to synthesize remote access events
100014a771cSLeo Yan * @mem: whether to synthesize memory events
10118f49494SAdrian Hunter * @timeless_decoding: prefer "timeless" decoding i.e. ignore timestamps
10283d7f5f1SAdrian Hunter * @vm_time_correlation: perform VM Time Correlation
10383d7f5f1SAdrian Hunter * @vm_tm_corr_dry_run: VM Time Correlation dry-run
10483d7f5f1SAdrian Hunter * @vm_tm_corr_args: VM Time Correlation implementation-specific arguments
105f6986c95SAdrian Hunter * @callchain_sz: maximum callchain size
106601897b5SAdrian Hunter * @last_branch_sz: branch context size
107f6986c95SAdrian Hunter * @period: 'instructions' events period
108f6986c95SAdrian Hunter * @period_type: 'instructions' events period type
109d1706b39SAndi Kleen * @initial_skip: skip N events at the beginning.
110644e0840SAdrian Hunter * @cpu_bitmap: CPUs for which to synthesize events, or NULL for all
11133526f36SAdrian Hunter * @ptime_range: time intervals to trace or NULL
11233526f36SAdrian Hunter * @range_num: number of time intervals to trace
113cb971438SAdrian Hunter * @error_plus_flags: flags to affect what errors are reported
114cb971438SAdrian Hunter * @error_minus_flags: flags to affect what errors are reported
115935aac2dSAdrian Hunter * @log_plus_flags: flags to affect what is logged
116935aac2dSAdrian Hunter * @log_minus_flags: flags to affect what is logged
11751971536SAdrian Hunter * @quick: quicker (less detailed) decoding
118a7fdd30aSAdrian Hunter * @log_on_error_size: size of log to keep for outputting log only on errors
119f6986c95SAdrian Hunter */
120f6986c95SAdrian Hunter struct itrace_synth_opts {
121f6986c95SAdrian Hunter bool set;
1224eb06815SAndi Kleen bool default_no_sample;
123f6986c95SAdrian Hunter bool inject;
124f6986c95SAdrian Hunter bool instructions;
125*7e55b956SSteinar H. Gunderson bool cycles;
126f6986c95SAdrian Hunter bool branches;
12753c76b0eSAdrian Hunter bool transactions;
1283bdafdffSAdrian Hunter bool ptwrites;
12970d110d7SAdrian Hunter bool pwr_events;
130181ebb5eSAdrian Hunter bool other_events;
1318ee9a9abSAdrian Hunter bool intr_events;
132f6986c95SAdrian Hunter bool errors;
133f6986c95SAdrian Hunter bool dont_decode;
134f6986c95SAdrian Hunter bool log;
135f6986c95SAdrian Hunter bool calls;
136f6986c95SAdrian Hunter bool returns;
137f6986c95SAdrian Hunter bool callchain;
1381c5c25b3SAdrian Hunter bool add_callchain;
13950f73637SAdrian Hunter bool thread_stack;
140601897b5SAdrian Hunter bool last_branch;
141ec90e42cSAdrian Hunter bool add_last_branch;
142b6778fe1SAdrian Hunter bool approx_ipc;
1439f74d770STan Xiaojun bool flc;
1449f74d770STan Xiaojun bool llc;
1459f74d770STan Xiaojun bool tlb;
1469f74d770STan Xiaojun bool remote_access;
147014a771cSLeo Yan bool mem;
14818f49494SAdrian Hunter bool timeless_decoding;
14983d7f5f1SAdrian Hunter bool vm_time_correlation;
15083d7f5f1SAdrian Hunter bool vm_tm_corr_dry_run;
15183d7f5f1SAdrian Hunter char *vm_tm_corr_args;
152f6986c95SAdrian Hunter unsigned int callchain_sz;
153601897b5SAdrian Hunter unsigned int last_branch_sz;
154f6986c95SAdrian Hunter unsigned long long period;
155f6986c95SAdrian Hunter enum itrace_period_type period_type;
156d1706b39SAndi Kleen unsigned long initial_skip;
157644e0840SAdrian Hunter unsigned long *cpu_bitmap;
15833526f36SAdrian Hunter struct perf_time_interval *ptime_range;
15933526f36SAdrian Hunter int range_num;
160cb971438SAdrian Hunter unsigned int error_plus_flags;
161cb971438SAdrian Hunter unsigned int error_minus_flags;
162935aac2dSAdrian Hunter unsigned int log_plus_flags;
163935aac2dSAdrian Hunter unsigned int log_minus_flags;
16451971536SAdrian Hunter unsigned int quick;
165a7fdd30aSAdrian Hunter unsigned int log_on_error_size;
166f6986c95SAdrian Hunter };
167f6986c95SAdrian Hunter
168718c602dSAdrian Hunter /**
16999fa2984SAdrian Hunter * struct auxtrace_index_entry - indexes a AUX area tracing event within a
17099fa2984SAdrian Hunter * perf.data file.
17199fa2984SAdrian Hunter * @file_offset: offset within the perf.data file
17299fa2984SAdrian Hunter * @sz: size of the event
17399fa2984SAdrian Hunter */
17499fa2984SAdrian Hunter struct auxtrace_index_entry {
17599fa2984SAdrian Hunter u64 file_offset;
17699fa2984SAdrian Hunter u64 sz;
17799fa2984SAdrian Hunter };
17899fa2984SAdrian Hunter
17999fa2984SAdrian Hunter #define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256
18099fa2984SAdrian Hunter
18199fa2984SAdrian Hunter /**
18299fa2984SAdrian Hunter * struct auxtrace_index - index of AUX area tracing events within a perf.data
18399fa2984SAdrian Hunter * file.
18499fa2984SAdrian Hunter * @list: linking a number of arrays of entries
18599fa2984SAdrian Hunter * @nr: number of entries
18699fa2984SAdrian Hunter * @entries: array of entries
18799fa2984SAdrian Hunter */
18899fa2984SAdrian Hunter struct auxtrace_index {
18999fa2984SAdrian Hunter struct list_head list;
19099fa2984SAdrian Hunter size_t nr;
19199fa2984SAdrian Hunter struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
19299fa2984SAdrian Hunter };
19399fa2984SAdrian Hunter
19499fa2984SAdrian Hunter /**
195c446870dSAdrian Hunter * struct auxtrace - session callbacks to allow AUX area data decoding.
196c446870dSAdrian Hunter * @process_event: lets the decoder see all session events
197b818ec61SAdrian Hunter * @process_auxtrace_event: process a PERF_RECORD_AUXTRACE event
198ac2f445fSAdrian Hunter * @queue_data: queue an AUX sample or PERF_RECORD_AUXTRACE event for later
199ac2f445fSAdrian Hunter * processing
200b04b8dd1SAdrian Hunter * @dump_auxtrace_sample: dump AUX area sample data
201c446870dSAdrian Hunter * @flush_events: process any remaining data
202c446870dSAdrian Hunter * @free_events: free resources associated with event processing
203c446870dSAdrian Hunter * @free: free resources associated with the session
204c446870dSAdrian Hunter */
205c446870dSAdrian Hunter struct auxtrace {
206c446870dSAdrian Hunter int (*process_event)(struct perf_session *session,
207c446870dSAdrian Hunter union perf_event *event,
208c446870dSAdrian Hunter struct perf_sample *sample,
209c446870dSAdrian Hunter struct perf_tool *tool);
21073f75fb1SAdrian Hunter int (*process_auxtrace_event)(struct perf_session *session,
21173f75fb1SAdrian Hunter union perf_event *event,
21273f75fb1SAdrian Hunter struct perf_tool *tool);
213ac2f445fSAdrian Hunter int (*queue_data)(struct perf_session *session,
214ac2f445fSAdrian Hunter struct perf_sample *sample, union perf_event *event,
215ac2f445fSAdrian Hunter u64 data_offset);
216b04b8dd1SAdrian Hunter void (*dump_auxtrace_sample)(struct perf_session *session,
217b04b8dd1SAdrian Hunter struct perf_sample *sample);
218c446870dSAdrian Hunter int (*flush_events)(struct perf_session *session,
219c446870dSAdrian Hunter struct perf_tool *tool);
220c446870dSAdrian Hunter void (*free_events)(struct perf_session *session);
221c446870dSAdrian Hunter void (*free)(struct perf_session *session);
222853f37d7SAdrian Hunter bool (*evsel_is_auxtrace)(struct perf_session *session,
223853f37d7SAdrian Hunter struct evsel *evsel);
224c446870dSAdrian Hunter };
225c446870dSAdrian Hunter
226c446870dSAdrian Hunter /**
227e5027893SAdrian Hunter * struct auxtrace_buffer - a buffer containing AUX area tracing data.
228e5027893SAdrian Hunter * @list: buffers are queued in a list held by struct auxtrace_queue
229e5027893SAdrian Hunter * @size: size of the buffer in bytes
230e5027893SAdrian Hunter * @pid: in per-thread mode, the pid this buffer is associated with
231e5027893SAdrian Hunter * @tid: in per-thread mode, the tid this buffer is associated with
232e5027893SAdrian Hunter * @cpu: in per-cpu mode, the cpu this buffer is associated with
233e5027893SAdrian Hunter * @data: actual buffer data (can be null if the data has not been loaded)
234e5027893SAdrian Hunter * @data_offset: file offset at which the buffer can be read
235e5027893SAdrian Hunter * @mmap_addr: mmap address at which the buffer can be read
236e5027893SAdrian Hunter * @mmap_size: size of the mmap at @mmap_addr
237e5027893SAdrian Hunter * @data_needs_freeing: @data was malloc'd so free it when it is no longer
238e5027893SAdrian Hunter * needed
239e5027893SAdrian Hunter * @consecutive: the original data was split up and this buffer is consecutive
240e5027893SAdrian Hunter * to the previous buffer
241e5027893SAdrian Hunter * @offset: offset as determined by aux_head / aux_tail members of struct
242e5027893SAdrian Hunter * perf_event_mmap_page
243e5027893SAdrian Hunter * @reference: an implementation-specific reference determined when the data is
244e5027893SAdrian Hunter * recorded
245e5027893SAdrian Hunter * @buffer_nr: used to number each buffer
246e5027893SAdrian Hunter * @use_size: implementation actually only uses this number of bytes
247e5027893SAdrian Hunter * @use_data: implementation actually only uses data starting at this address
248e5027893SAdrian Hunter */
249e5027893SAdrian Hunter struct auxtrace_buffer {
250e5027893SAdrian Hunter struct list_head list;
251e5027893SAdrian Hunter size_t size;
252e5027893SAdrian Hunter pid_t pid;
253e5027893SAdrian Hunter pid_t tid;
2546d18804bSIan Rogers struct perf_cpu cpu;
255e5027893SAdrian Hunter void *data;
256e5027893SAdrian Hunter off_t data_offset;
257e5027893SAdrian Hunter void *mmap_addr;
258e5027893SAdrian Hunter size_t mmap_size;
259e5027893SAdrian Hunter bool data_needs_freeing;
260e5027893SAdrian Hunter bool consecutive;
261e5027893SAdrian Hunter u64 offset;
262e5027893SAdrian Hunter u64 reference;
263e5027893SAdrian Hunter u64 buffer_nr;
264e5027893SAdrian Hunter size_t use_size;
265e5027893SAdrian Hunter void *use_data;
266e5027893SAdrian Hunter };
267e5027893SAdrian Hunter
268e5027893SAdrian Hunter /**
269e5027893SAdrian Hunter * struct auxtrace_queue - a queue of AUX area tracing data buffers.
270e5027893SAdrian Hunter * @head: head of buffer list
271e5027893SAdrian Hunter * @tid: in per-thread mode, the tid this queue is associated with
272e5027893SAdrian Hunter * @cpu: in per-cpu mode, the cpu this queue is associated with
273e5027893SAdrian Hunter * @set: %true once this queue has been dedicated to a specific thread or cpu
274e5027893SAdrian Hunter * @priv: implementation-specific data
275e5027893SAdrian Hunter */
276e5027893SAdrian Hunter struct auxtrace_queue {
277e5027893SAdrian Hunter struct list_head head;
278e5027893SAdrian Hunter pid_t tid;
279e5027893SAdrian Hunter int cpu;
280e5027893SAdrian Hunter bool set;
281e5027893SAdrian Hunter void *priv;
282e5027893SAdrian Hunter };
283e5027893SAdrian Hunter
284e5027893SAdrian Hunter /**
285e5027893SAdrian Hunter * struct auxtrace_queues - an array of AUX area tracing queues.
286e5027893SAdrian Hunter * @queue_array: array of queues
287e5027893SAdrian Hunter * @nr_queues: number of queues
288e5027893SAdrian Hunter * @new_data: set whenever new data is queued
289e5027893SAdrian Hunter * @populated: queues have been fully populated using the auxtrace_index
290e5027893SAdrian Hunter * @next_buffer_nr: used to number each buffer
291e5027893SAdrian Hunter */
292e5027893SAdrian Hunter struct auxtrace_queues {
293e5027893SAdrian Hunter struct auxtrace_queue *queue_array;
294e5027893SAdrian Hunter unsigned int nr_queues;
295e5027893SAdrian Hunter bool new_data;
296e5027893SAdrian Hunter bool populated;
297e5027893SAdrian Hunter u64 next_buffer_nr;
298e5027893SAdrian Hunter };
299e5027893SAdrian Hunter
300e5027893SAdrian Hunter /**
301f9397155SAdrian Hunter * struct auxtrace_heap_item - element of struct auxtrace_heap.
302f9397155SAdrian Hunter * @queue_nr: queue number
303f9397155SAdrian Hunter * @ordinal: value used for sorting (lowest ordinal is top of the heap) expected
304f9397155SAdrian Hunter * to be a timestamp
305f9397155SAdrian Hunter */
306f9397155SAdrian Hunter struct auxtrace_heap_item {
307f9397155SAdrian Hunter unsigned int queue_nr;
308f9397155SAdrian Hunter u64 ordinal;
309f9397155SAdrian Hunter };
310f9397155SAdrian Hunter
311f9397155SAdrian Hunter /**
312f9397155SAdrian Hunter * struct auxtrace_heap - a heap suitable for sorting AUX area tracing queues.
313f9397155SAdrian Hunter * @heap_array: the heap
314f9397155SAdrian Hunter * @heap_cnt: the number of elements in the heap
315f9397155SAdrian Hunter * @heap_sz: maximum number of elements (grows as needed)
316f9397155SAdrian Hunter */
317f9397155SAdrian Hunter struct auxtrace_heap {
318f9397155SAdrian Hunter struct auxtrace_heap_item *heap_array;
319f9397155SAdrian Hunter unsigned int heap_cnt;
320f9397155SAdrian Hunter unsigned int heap_sz;
321f9397155SAdrian Hunter };
322f9397155SAdrian Hunter
323f9397155SAdrian Hunter /**
324718c602dSAdrian Hunter * struct auxtrace_mmap - records an mmap of the auxtrace buffer.
325718c602dSAdrian Hunter * @base: address of mapped area
326718c602dSAdrian Hunter * @userpg: pointer to buffer's perf_event_mmap_page
327718c602dSAdrian Hunter * @mask: %0 if @len is not a power of two, otherwise (@len - %1)
328718c602dSAdrian Hunter * @len: size of mapped area
329718c602dSAdrian Hunter * @prev: previous aux_head
330718c602dSAdrian Hunter * @idx: index of this mmap
331718c602dSAdrian Hunter * @tid: tid for a per-thread mmap (also set if there is only 1 tid on a per-cpu
332718c602dSAdrian Hunter * mmap) otherwise %0
333718c602dSAdrian Hunter * @cpu: cpu number for a per-cpu mmap otherwise %-1
334718c602dSAdrian Hunter */
335718c602dSAdrian Hunter struct auxtrace_mmap {
336718c602dSAdrian Hunter void *base;
337718c602dSAdrian Hunter void *userpg;
338718c602dSAdrian Hunter size_t mask;
339718c602dSAdrian Hunter size_t len;
340718c602dSAdrian Hunter u64 prev;
341718c602dSAdrian Hunter int idx;
342718c602dSAdrian Hunter pid_t tid;
343718c602dSAdrian Hunter int cpu;
344718c602dSAdrian Hunter };
345718c602dSAdrian Hunter
346718c602dSAdrian Hunter /**
347718c602dSAdrian Hunter * struct auxtrace_mmap_params - parameters to set up struct auxtrace_mmap.
348718c602dSAdrian Hunter * @mask: %0 if @len is not a power of two, otherwise (@len - %1)
349718c602dSAdrian Hunter * @offset: file offset of mapped area
350718c602dSAdrian Hunter * @len: size of mapped area
351718c602dSAdrian Hunter * @prot: mmap memory protection
352718c602dSAdrian Hunter * @idx: index of this mmap
353718c602dSAdrian Hunter * @tid: tid for a per-thread mmap (also set if there is only 1 tid on a per-cpu
354718c602dSAdrian Hunter * mmap) otherwise %0
355d01508f2SAdrian Hunter * @mmap_needed: set to %false for non-auxtrace events. This is needed because
356d01508f2SAdrian Hunter * auxtrace mmapping is done in the same code path as non-auxtrace
357d01508f2SAdrian Hunter * mmapping but not every evsel that needs non-auxtrace mmapping
358d01508f2SAdrian Hunter * also needs auxtrace mmapping.
359718c602dSAdrian Hunter * @cpu: cpu number for a per-cpu mmap otherwise %-1
360718c602dSAdrian Hunter */
361718c602dSAdrian Hunter struct auxtrace_mmap_params {
362718c602dSAdrian Hunter size_t mask;
363718c602dSAdrian Hunter off_t offset;
364718c602dSAdrian Hunter size_t len;
365718c602dSAdrian Hunter int prot;
366718c602dSAdrian Hunter int idx;
367718c602dSAdrian Hunter pid_t tid;
368d01508f2SAdrian Hunter bool mmap_needed;
3696d18804bSIan Rogers struct perf_cpu cpu;
370718c602dSAdrian Hunter };
371718c602dSAdrian Hunter
3729e0cc4feSAdrian Hunter /**
3739e0cc4feSAdrian Hunter * struct auxtrace_record - callbacks for recording AUX area data.
3749e0cc4feSAdrian Hunter * @recording_options: validate and process recording options
3759e0cc4feSAdrian Hunter * @info_priv_size: return the size of the private data in auxtrace_info_event
3769e0cc4feSAdrian Hunter * @info_fill: fill-in the private data in auxtrace_info_event
3779e0cc4feSAdrian Hunter * @free: free this auxtrace record structure
378d20031bbSAdrian Hunter * @snapshot_start: starting a snapshot
379d20031bbSAdrian Hunter * @snapshot_finish: finishing a snapshot
380d20031bbSAdrian Hunter * @find_snapshot: find data to snapshot within auxtrace mmap
381d20031bbSAdrian Hunter * @parse_snapshot_options: parse snapshot options
3829e0cc4feSAdrian Hunter * @reference: provide a 64-bit reference number for auxtrace_event
3839e0cc4feSAdrian Hunter * @read_finish: called after reading from an auxtrace mmap
384b818ec61SAdrian Hunter * @alignment: alignment (if any) for AUX area data
385f0bb7ee8SAdrian Hunter * @default_aux_sample_size: default sample size for --aux sample option
386ad60ba0cSAdrian Hunter * @pmu: associated pmu
387ad60ba0cSAdrian Hunter * @evlist: selected events list
3889e0cc4feSAdrian Hunter */
3899e0cc4feSAdrian Hunter struct auxtrace_record {
3909e0cc4feSAdrian Hunter int (*recording_options)(struct auxtrace_record *itr,
39163503dbaSJiri Olsa struct evlist *evlist,
3929e0cc4feSAdrian Hunter struct record_opts *opts);
39314a05e13SMathieu Poirier size_t (*info_priv_size)(struct auxtrace_record *itr,
39463503dbaSJiri Olsa struct evlist *evlist);
3959e0cc4feSAdrian Hunter int (*info_fill)(struct auxtrace_record *itr,
3969e0cc4feSAdrian Hunter struct perf_session *session,
39772932371SJiri Olsa struct perf_record_auxtrace_info *auxtrace_info,
3989e0cc4feSAdrian Hunter size_t priv_size);
3999e0cc4feSAdrian Hunter void (*free)(struct auxtrace_record *itr);
400d20031bbSAdrian Hunter int (*snapshot_start)(struct auxtrace_record *itr);
401d20031bbSAdrian Hunter int (*snapshot_finish)(struct auxtrace_record *itr);
402d20031bbSAdrian Hunter int (*find_snapshot)(struct auxtrace_record *itr, int idx,
403d20031bbSAdrian Hunter struct auxtrace_mmap *mm, unsigned char *data,
404d20031bbSAdrian Hunter u64 *head, u64 *old);
405d20031bbSAdrian Hunter int (*parse_snapshot_options)(struct auxtrace_record *itr,
406d20031bbSAdrian Hunter struct record_opts *opts,
407d20031bbSAdrian Hunter const char *str);
4089e0cc4feSAdrian Hunter u64 (*reference)(struct auxtrace_record *itr);
4099e0cc4feSAdrian Hunter int (*read_finish)(struct auxtrace_record *itr, int idx);
41083b2ea25SAdrian Hunter unsigned int alignment;
411f0bb7ee8SAdrian Hunter unsigned int default_aux_sample_size;
412ad60ba0cSAdrian Hunter struct perf_pmu *pmu;
413ad60ba0cSAdrian Hunter struct evlist *evlist;
4149e0cc4feSAdrian Hunter };
4159e0cc4feSAdrian Hunter
4161b36c03eSAdrian Hunter /**
4171b36c03eSAdrian Hunter * struct addr_filter - address filter.
4181b36c03eSAdrian Hunter * @list: list node
4191b36c03eSAdrian Hunter * @range: true if it is a range filter
4201b36c03eSAdrian Hunter * @start: true if action is 'filter' or 'start'
4211b36c03eSAdrian Hunter * @action: 'filter', 'start' or 'stop' ('tracestop' is accepted but converted
4221b36c03eSAdrian Hunter * to 'stop')
4231b36c03eSAdrian Hunter * @sym_from: symbol name for the filter address
4241b36c03eSAdrian Hunter * @sym_to: symbol name that determines the filter size
4251b36c03eSAdrian Hunter * @sym_from_idx: selects n'th from symbols with the same name (0 means global
4261b36c03eSAdrian Hunter * and less than 0 means symbol must be unique)
4271b36c03eSAdrian Hunter * @sym_to_idx: same as @sym_from_idx but for @sym_to
4281b36c03eSAdrian Hunter * @addr: filter address
4291b36c03eSAdrian Hunter * @size: filter region size (for range filters)
4301b36c03eSAdrian Hunter * @filename: DSO file name or NULL for the kernel
4311b36c03eSAdrian Hunter * @str: allocated string that contains the other string members
4321b36c03eSAdrian Hunter */
4331b36c03eSAdrian Hunter struct addr_filter {
4341b36c03eSAdrian Hunter struct list_head list;
4351b36c03eSAdrian Hunter bool range;
4361b36c03eSAdrian Hunter bool start;
4371b36c03eSAdrian Hunter const char *action;
4381b36c03eSAdrian Hunter const char *sym_from;
4391b36c03eSAdrian Hunter const char *sym_to;
4401b36c03eSAdrian Hunter int sym_from_idx;
4411b36c03eSAdrian Hunter int sym_to_idx;
4421b36c03eSAdrian Hunter u64 addr;
4431b36c03eSAdrian Hunter u64 size;
4441b36c03eSAdrian Hunter const char *filename;
4451b36c03eSAdrian Hunter char *str;
4461b36c03eSAdrian Hunter };
4471b36c03eSAdrian Hunter
4481b36c03eSAdrian Hunter /**
4491b36c03eSAdrian Hunter * struct addr_filters - list of address filters.
4501b36c03eSAdrian Hunter * @head: list of address filters
4511b36c03eSAdrian Hunter * @cnt: number of address filters
4521b36c03eSAdrian Hunter */
4531b36c03eSAdrian Hunter struct addr_filters {
4541b36c03eSAdrian Hunter struct list_head head;
4551b36c03eSAdrian Hunter int cnt;
4561b36c03eSAdrian Hunter };
4571b36c03eSAdrian Hunter
458f2a39fe8SArnaldo Carvalho de Melo struct auxtrace_cache;
459f2a39fe8SArnaldo Carvalho de Melo
460e31f0d01SAdrian Hunter #ifdef HAVE_AUXTRACE_SUPPORT
461e31f0d01SAdrian Hunter
462bbc49f12SLeo Yan u64 compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm);
463bbc49f12SLeo Yan int compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail);
464bbc49f12SLeo Yan
auxtrace_mmap__read_head(struct auxtrace_mmap * mm,int kernel_is_64_bit __maybe_unused)465bbc49f12SLeo Yan static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm,
466bbc49f12SLeo Yan int kernel_is_64_bit __maybe_unused)
467718c602dSAdrian Hunter {
468718c602dSAdrian Hunter struct perf_event_mmap_page *pc = mm->userpg;
469bbc49f12SLeo Yan u64 head;
470bbc49f12SLeo Yan
471bbc49f12SLeo Yan #if BITS_PER_LONG == 32
472bbc49f12SLeo Yan if (kernel_is_64_bit)
473bbc49f12SLeo Yan return compat_auxtrace_mmap__read_head(mm);
474bbc49f12SLeo Yan #endif
475bbc49f12SLeo Yan head = READ_ONCE(pc->aux_head);
476718c602dSAdrian Hunter
477718c602dSAdrian Hunter /* Ensure all reads are done after we read the head */
478bde1e7d9SLeo Yan smp_rmb();
479718c602dSAdrian Hunter return head;
480718c602dSAdrian Hunter }
481718c602dSAdrian Hunter
auxtrace_mmap__write_tail(struct auxtrace_mmap * mm,u64 tail,int kernel_is_64_bit __maybe_unused)482bbc49f12SLeo Yan static inline int auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail,
483bbc49f12SLeo Yan int kernel_is_64_bit __maybe_unused)
484718c602dSAdrian Hunter {
485718c602dSAdrian Hunter struct perf_event_mmap_page *pc = mm->userpg;
486718c602dSAdrian Hunter
487bbc49f12SLeo Yan #if BITS_PER_LONG == 32
488bbc49f12SLeo Yan if (kernel_is_64_bit)
489bbc49f12SLeo Yan return compat_auxtrace_mmap__write_tail(mm, tail);
490bbc49f12SLeo Yan #endif
491718c602dSAdrian Hunter /* Ensure all reads are done before we write the tail out */
492bde1e7d9SLeo Yan smp_mb();
4931ea3cb15SLeo Yan WRITE_ONCE(pc->aux_tail, tail);
494bbc49f12SLeo Yan return 0;
495718c602dSAdrian Hunter }
496718c602dSAdrian Hunter
497718c602dSAdrian Hunter int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
498718c602dSAdrian Hunter struct auxtrace_mmap_params *mp,
499718c602dSAdrian Hunter void *userpg, int fd);
500718c602dSAdrian Hunter void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
501718c602dSAdrian Hunter void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
502718c602dSAdrian Hunter off_t auxtrace_offset,
503718c602dSAdrian Hunter unsigned int auxtrace_pages,
504718c602dSAdrian Hunter bool auxtrace_overwrite);
505718c602dSAdrian Hunter void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
506d01508f2SAdrian Hunter struct evlist *evlist,
50784bd5abaSAdrian Hunter struct evsel *evsel, int idx);
508718c602dSAdrian Hunter
5099e0cc4feSAdrian Hunter typedef int (*process_auxtrace_t)(struct perf_tool *tool,
510a5830532SJiri Olsa struct mmap *map,
5119e0cc4feSAdrian Hunter union perf_event *event, void *data1,
5129e0cc4feSAdrian Hunter size_t len1, void *data2, size_t len2);
5139e0cc4feSAdrian Hunter
514a5830532SJiri Olsa int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr,
5159e0cc4feSAdrian Hunter struct perf_tool *tool, process_auxtrace_t fn);
5169e0cc4feSAdrian Hunter
517a5830532SJiri Olsa int auxtrace_mmap__read_snapshot(struct mmap *map,
518d20031bbSAdrian Hunter struct auxtrace_record *itr,
519d20031bbSAdrian Hunter struct perf_tool *tool, process_auxtrace_t fn,
520d20031bbSAdrian Hunter size_t snapshot_size);
521d20031bbSAdrian Hunter
522e5027893SAdrian Hunter int auxtrace_queues__init(struct auxtrace_queues *queues);
523e5027893SAdrian Hunter int auxtrace_queues__add_event(struct auxtrace_queues *queues,
524e5027893SAdrian Hunter struct perf_session *session,
525e5027893SAdrian Hunter union perf_event *event, off_t data_offset,
526e5027893SAdrian Hunter struct auxtrace_buffer **buffer_ptr);
527ac2f445fSAdrian Hunter struct auxtrace_queue *
528ac2f445fSAdrian Hunter auxtrace_queues__sample_queue(struct auxtrace_queues *queues,
529ac2f445fSAdrian Hunter struct perf_sample *sample,
530ac2f445fSAdrian Hunter struct perf_session *session);
531ac2f445fSAdrian Hunter int auxtrace_queues__add_sample(struct auxtrace_queues *queues,
532ac2f445fSAdrian Hunter struct perf_session *session,
533ac2f445fSAdrian Hunter struct perf_sample *sample, u64 data_offset,
534ac2f445fSAdrian Hunter u64 reference);
535e5027893SAdrian Hunter void auxtrace_queues__free(struct auxtrace_queues *queues);
53699fa2984SAdrian Hunter int auxtrace_queues__process_index(struct auxtrace_queues *queues,
53799fa2984SAdrian Hunter struct perf_session *session);
538ac2f445fSAdrian Hunter int auxtrace_queue_data(struct perf_session *session, bool samples,
539ac2f445fSAdrian Hunter bool events);
540e5027893SAdrian Hunter struct auxtrace_buffer *auxtrace_buffer__next(struct auxtrace_queue *queue,
541e5027893SAdrian Hunter struct auxtrace_buffer *buffer);
5426aa3afc9SAdrian Hunter void *auxtrace_buffer__get_data_rw(struct auxtrace_buffer *buffer, int fd, bool rw);
auxtrace_buffer__get_data(struct auxtrace_buffer * buffer,int fd)5436aa3afc9SAdrian Hunter static inline void *auxtrace_buffer__get_data(struct auxtrace_buffer *buffer, int fd)
5446aa3afc9SAdrian Hunter {
5456aa3afc9SAdrian Hunter return auxtrace_buffer__get_data_rw(buffer, fd, false);
5466aa3afc9SAdrian Hunter }
547e5027893SAdrian Hunter void auxtrace_buffer__put_data(struct auxtrace_buffer *buffer);
548e5027893SAdrian Hunter void auxtrace_buffer__drop_data(struct auxtrace_buffer *buffer);
549e5027893SAdrian Hunter void auxtrace_buffer__free(struct auxtrace_buffer *buffer);
550f9397155SAdrian Hunter
551f9397155SAdrian Hunter int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr,
552f9397155SAdrian Hunter u64 ordinal);
553f9397155SAdrian Hunter void auxtrace_heap__pop(struct auxtrace_heap *heap);
554f9397155SAdrian Hunter void auxtrace_heap__free(struct auxtrace_heap *heap);
555f9397155SAdrian Hunter
556c3278f02SAdrian Hunter struct auxtrace_cache_entry {
557c3278f02SAdrian Hunter struct hlist_node hash;
558c3278f02SAdrian Hunter u32 key;
559c3278f02SAdrian Hunter };
560c3278f02SAdrian Hunter
561c3278f02SAdrian Hunter struct auxtrace_cache *auxtrace_cache__new(unsigned int bits, size_t entry_size,
562c3278f02SAdrian Hunter unsigned int limit_percent);
563c3278f02SAdrian Hunter void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache);
564c3278f02SAdrian Hunter void *auxtrace_cache__alloc_entry(struct auxtrace_cache *c);
565c3278f02SAdrian Hunter void auxtrace_cache__free_entry(struct auxtrace_cache *c, void *entry);
566c3278f02SAdrian Hunter int auxtrace_cache__add(struct auxtrace_cache *c, u32 key,
567c3278f02SAdrian Hunter struct auxtrace_cache_entry *entry);
568fd62c109SAdrian Hunter void auxtrace_cache__remove(struct auxtrace_cache *c, u32 key);
569c3278f02SAdrian Hunter void *auxtrace_cache__lookup(struct auxtrace_cache *c, u32 key);
570c3278f02SAdrian Hunter
57163503dbaSJiri Olsa struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
5729e0cc4feSAdrian Hunter int *err);
5739e0cc4feSAdrian Hunter
574d20031bbSAdrian Hunter int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,
575d20031bbSAdrian Hunter struct record_opts *opts,
576d20031bbSAdrian Hunter const char *str);
577f0bb7ee8SAdrian Hunter int auxtrace_parse_sample_options(struct auxtrace_record *itr,
578f0bb7ee8SAdrian Hunter struct evlist *evlist,
579f0bb7ee8SAdrian Hunter struct record_opts *opts, const char *str);
580d58b3f7eSAdrian Hunter void auxtrace_regroup_aux_output(struct evlist *evlist);
5819e0cc4feSAdrian Hunter int auxtrace_record__options(struct auxtrace_record *itr,
58263503dbaSJiri Olsa struct evlist *evlist,
5839e0cc4feSAdrian Hunter struct record_opts *opts);
58414a05e13SMathieu Poirier size_t auxtrace_record__info_priv_size(struct auxtrace_record *itr,
58563503dbaSJiri Olsa struct evlist *evlist);
5869e0cc4feSAdrian Hunter int auxtrace_record__info_fill(struct auxtrace_record *itr,
5879e0cc4feSAdrian Hunter struct perf_session *session,
58872932371SJiri Olsa struct perf_record_auxtrace_info *auxtrace_info,
5899e0cc4feSAdrian Hunter size_t priv_size);
5909e0cc4feSAdrian Hunter void auxtrace_record__free(struct auxtrace_record *itr);
591d20031bbSAdrian Hunter int auxtrace_record__snapshot_start(struct auxtrace_record *itr);
592ce7b0e42SAlexander Shishkin int auxtrace_record__snapshot_finish(struct auxtrace_record *itr, bool on_exit);
593d20031bbSAdrian Hunter int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,
594d20031bbSAdrian Hunter struct auxtrace_mmap *mm,
595d20031bbSAdrian Hunter unsigned char *data, u64 *head, u64 *old);
5969e0cc4feSAdrian Hunter u64 auxtrace_record__reference(struct auxtrace_record *itr);
597ad60ba0cSAdrian Hunter int auxtrace_record__read_finish(struct auxtrace_record *itr, int idx);
5989e0cc4feSAdrian Hunter
59999fa2984SAdrian Hunter int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event,
60099fa2984SAdrian Hunter off_t file_offset);
60199fa2984SAdrian Hunter int auxtrace_index__write(int fd, struct list_head *head);
60299fa2984SAdrian Hunter int auxtrace_index__process(int fd, u64 size, struct perf_session *session,
60399fa2984SAdrian Hunter bool needs_swap);
60499fa2984SAdrian Hunter void auxtrace_index__free(struct list_head *head);
60599fa2984SAdrian Hunter
6067151c1d1SAdrian Hunter void auxtrace_synth_guest_error(struct perf_record_auxtrace_error *auxtrace_error, int type,
6077151c1d1SAdrian Hunter int code, int cpu, pid_t pid, pid_t tid, u64 ip,
6087151c1d1SAdrian Hunter const char *msg, u64 timestamp,
6097151c1d1SAdrian Hunter pid_t machine_pid, int vcpu);
61072932371SJiri Olsa void auxtrace_synth_error(struct perf_record_auxtrace_error *auxtrace_error, int type,
61185ed4729SAdrian Hunter int code, int cpu, pid_t pid, pid_t tid, u64 ip,
61216bd4321SAdrian Hunter const char *msg, u64 timestamp);
61385ed4729SAdrian Hunter
61489f1688aSJiri Olsa int perf_event__process_auxtrace_info(struct perf_session *session,
61589f1688aSJiri Olsa union perf_event *event);
6167336555aSJiri Olsa s64 perf_event__process_auxtrace(struct perf_session *session,
6177336555aSJiri Olsa union perf_event *event);
61889f1688aSJiri Olsa int perf_event__process_auxtrace_error(struct perf_session *session,
61989f1688aSJiri Olsa union perf_event *event);
620e621b8ffSAdrian Hunter int itrace_do_parse_synth_opts(struct itrace_synth_opts *synth_opts,
621e621b8ffSAdrian Hunter const char *str, int unset);
622f6986c95SAdrian Hunter int itrace_parse_synth_opts(const struct option *opt, const char *str,
623f6986c95SAdrian Hunter int unset);
6244eb06815SAndi Kleen void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts,
6254eb06815SAndi Kleen bool no_sample);
6269e0cc4feSAdrian Hunter
62785ed4729SAdrian Hunter size_t perf_event__fprintf_auxtrace_error(union perf_event *event, FILE *fp);
62885ed4729SAdrian Hunter void perf_session__auxtrace_error_inc(struct perf_session *session,
62985ed4729SAdrian Hunter union perf_event *event);
63085ed4729SAdrian Hunter void events_stats__auxtrace_error_warn(const struct events_stats *stats);
63185ed4729SAdrian Hunter
6321b36c03eSAdrian Hunter void addr_filters__init(struct addr_filters *filts);
6331b36c03eSAdrian Hunter void addr_filters__exit(struct addr_filters *filts);
6341b36c03eSAdrian Hunter int addr_filters__parse_bare_filter(struct addr_filters *filts,
6351b36c03eSAdrian Hunter const char *filter);
63663503dbaSJiri Olsa int auxtrace_parse_filters(struct evlist *evlist);
6371b36c03eSAdrian Hunter
638f2a39fe8SArnaldo Carvalho de Melo int auxtrace__process_event(struct perf_session *session, union perf_event *event,
639f2a39fe8SArnaldo Carvalho de Melo struct perf_sample *sample, struct perf_tool *tool);
640b04b8dd1SAdrian Hunter void auxtrace__dump_auxtrace_sample(struct perf_session *session,
641b04b8dd1SAdrian Hunter struct perf_sample *sample);
642f2a39fe8SArnaldo Carvalho de Melo int auxtrace__flush_events(struct perf_session *session, struct perf_tool *tool);
643f2a39fe8SArnaldo Carvalho de Melo void auxtrace__free_events(struct perf_session *session);
644f2a39fe8SArnaldo Carvalho de Melo void auxtrace__free(struct perf_session *session);
645853f37d7SAdrian Hunter bool auxtrace__evsel_is_auxtrace(struct perf_session *session,
646853f37d7SAdrian Hunter struct evsel *evsel);
647c446870dSAdrian Hunter
648c12e039dSAndi Kleen #define ITRACE_HELP \
6491e8f7869SAdrian Hunter " i[period]: synthesize instructions events\n" \
650*7e55b956SSteinar H. Gunderson " y[period]: synthesize cycles events (same period as i)\n" \
6519f74d770STan Xiaojun " b: synthesize branches events (branch misses for Arm SPE)\n" \
652c12e039dSAndi Kleen " c: synthesize branches events (calls only)\n" \
653c12e039dSAndi Kleen " r: synthesize branches events (returns only)\n" \
654c12e039dSAndi Kleen " x: synthesize transactions events\n" \
655c12e039dSAndi Kleen " w: synthesize ptwrite events\n" \
656c12e039dSAndi Kleen " p: synthesize power events\n" \
6571e8f7869SAdrian Hunter " o: synthesize other events recorded due to the use\n" \
6581e8f7869SAdrian Hunter " of aux-output (refer to perf record)\n" \
6598ee9a9abSAdrian Hunter " I: synthesize interrupt or similar (asynchronous) events\n" \
6608ee9a9abSAdrian Hunter " (e.g. Intel PT Event Trace)\n" \
661cb971438SAdrian Hunter " e[flags]: synthesize error events\n" \
662cb971438SAdrian Hunter " each flag must be preceded by + or -\n" \
663cb971438SAdrian Hunter " error flags are: o (overflow)\n" \
664cb971438SAdrian Hunter " l (data lost)\n" \
665935aac2dSAdrian Hunter " d[flags]: create a debug log\n" \
666935aac2dSAdrian Hunter " each flag must be preceded by + or -\n" \
667935aac2dSAdrian Hunter " log flags are: a (all perf events)\n" \
6684b2b2c6aSAdrian Hunter " o (output to stdout)\n" \
6699f74d770STan Xiaojun " f: synthesize first level cache events\n" \
6709f74d770STan Xiaojun " m: synthesize last level cache events\n" \
6719f74d770STan Xiaojun " t: synthesize TLB events\n" \
6729f74d770STan Xiaojun " a: synthesize remote access events\n" \
673c12e039dSAndi Kleen " g[len]: synthesize a call chain (use with i or x)\n" \
6741e8f7869SAdrian Hunter " G[len]: synthesize a call chain on existing event records\n" \
675c12e039dSAndi Kleen " l[len]: synthesize last branch entries (use with i or x)\n" \
6761e8f7869SAdrian Hunter " L[len]: synthesize last branch entries on existing event records\n" \
677c12e039dSAndi Kleen " sNUMBER: skip initial number of events\n" \
67851971536SAdrian Hunter " q: quicker (less detailed) decoding\n" \
679b6778fe1SAdrian Hunter " A: approximate IPC\n" \
680cf14013bSAdrian Hunter " Z: prefer to ignore timestamps (so-called \"timeless\" decoding)\n" \
681c12e039dSAndi Kleen " PERIOD[ns|us|ms|i|t]: specify period to sample stream\n" \
682*7e55b956SSteinar H. Gunderson " concatenate multiple options. Default is iybxwpe or cewp\n"
683c12e039dSAndi Kleen
68433526f36SAdrian Hunter static inline
itrace_synth_opts__set_time_range(struct itrace_synth_opts * opts,struct perf_time_interval * ptime_range,int range_num)68533526f36SAdrian Hunter void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts,
68633526f36SAdrian Hunter struct perf_time_interval *ptime_range,
68733526f36SAdrian Hunter int range_num)
68833526f36SAdrian Hunter {
68933526f36SAdrian Hunter opts->ptime_range = ptime_range;
69033526f36SAdrian Hunter opts->range_num = range_num;
69133526f36SAdrian Hunter }
69233526f36SAdrian Hunter
69333526f36SAdrian Hunter static inline
itrace_synth_opts__clear_time_range(struct itrace_synth_opts * opts)69433526f36SAdrian Hunter void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts)
69533526f36SAdrian Hunter {
69633526f36SAdrian Hunter opts->ptime_range = NULL;
69733526f36SAdrian Hunter opts->range_num = 0;
69833526f36SAdrian Hunter }
699c12e039dSAndi Kleen
700e31f0d01SAdrian Hunter #else
701b4209025SArnaldo Carvalho de Melo #include "debug.h"
702e31f0d01SAdrian Hunter
703e31f0d01SAdrian Hunter static inline struct auxtrace_record *
auxtrace_record__init(struct evlist * evlist __maybe_unused,int * err)70463503dbaSJiri Olsa auxtrace_record__init(struct evlist *evlist __maybe_unused,
705b8f8eb84SArnaldo Carvalho de Melo int *err)
706e31f0d01SAdrian Hunter {
707e31f0d01SAdrian Hunter *err = 0;
708e31f0d01SAdrian Hunter return NULL;
709e31f0d01SAdrian Hunter }
710e31f0d01SAdrian Hunter
711e31f0d01SAdrian Hunter static inline
auxtrace_record__free(struct auxtrace_record * itr __maybe_unused)712e31f0d01SAdrian Hunter void auxtrace_record__free(struct auxtrace_record *itr __maybe_unused)
713e31f0d01SAdrian Hunter {
714e31f0d01SAdrian Hunter }
715e31f0d01SAdrian Hunter
716e31f0d01SAdrian Hunter static inline
auxtrace_record__options(struct auxtrace_record * itr __maybe_unused,struct evlist * evlist __maybe_unused,struct record_opts * opts __maybe_unused)717e31f0d01SAdrian Hunter int auxtrace_record__options(struct auxtrace_record *itr __maybe_unused,
71863503dbaSJiri Olsa struct evlist *evlist __maybe_unused,
719e31f0d01SAdrian Hunter struct record_opts *opts __maybe_unused)
720e31f0d01SAdrian Hunter {
721e31f0d01SAdrian Hunter return 0;
722e31f0d01SAdrian Hunter }
723e31f0d01SAdrian Hunter
72404612968SArnaldo Carvalho de Melo static inline
perf_event__process_auxtrace_info(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)72504612968SArnaldo Carvalho de Melo int perf_event__process_auxtrace_info(struct perf_session *session __maybe_unused,
72604612968SArnaldo Carvalho de Melo union perf_event *event __maybe_unused)
72704612968SArnaldo Carvalho de Melo {
72804612968SArnaldo Carvalho de Melo return 0;
72904612968SArnaldo Carvalho de Melo }
73004612968SArnaldo Carvalho de Melo
73104612968SArnaldo Carvalho de Melo static inline
perf_event__process_auxtrace(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)73204612968SArnaldo Carvalho de Melo s64 perf_event__process_auxtrace(struct perf_session *session __maybe_unused,
73304612968SArnaldo Carvalho de Melo union perf_event *event __maybe_unused)
73404612968SArnaldo Carvalho de Melo {
73504612968SArnaldo Carvalho de Melo return 0;
73604612968SArnaldo Carvalho de Melo }
73704612968SArnaldo Carvalho de Melo
73804612968SArnaldo Carvalho de Melo static inline
perf_event__process_auxtrace_error(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)73904612968SArnaldo Carvalho de Melo int perf_event__process_auxtrace_error(struct perf_session *session __maybe_unused,
74004612968SArnaldo Carvalho de Melo union perf_event *event __maybe_unused)
74104612968SArnaldo Carvalho de Melo {
74204612968SArnaldo Carvalho de Melo return 0;
74304612968SArnaldo Carvalho de Melo }
744e31f0d01SAdrian Hunter
745e31f0d01SAdrian Hunter static inline
perf_session__auxtrace_error_inc(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused)746e31f0d01SAdrian Hunter void perf_session__auxtrace_error_inc(struct perf_session *session
747e31f0d01SAdrian Hunter __maybe_unused,
748e31f0d01SAdrian Hunter union perf_event *event
749e31f0d01SAdrian Hunter __maybe_unused)
750e31f0d01SAdrian Hunter {
751e31f0d01SAdrian Hunter }
752e31f0d01SAdrian Hunter
753e31f0d01SAdrian Hunter static inline
events_stats__auxtrace_error_warn(const struct events_stats * stats __maybe_unused)754e31f0d01SAdrian Hunter void events_stats__auxtrace_error_warn(const struct events_stats *stats
755e31f0d01SAdrian Hunter __maybe_unused)
756e31f0d01SAdrian Hunter {
757e31f0d01SAdrian Hunter }
758e31f0d01SAdrian Hunter
759e31f0d01SAdrian Hunter static inline
itrace_do_parse_synth_opts(struct itrace_synth_opts * synth_opts __maybe_unused,const char * str __maybe_unused,int unset __maybe_unused)760e621b8ffSAdrian Hunter int itrace_do_parse_synth_opts(struct itrace_synth_opts *synth_opts __maybe_unused,
761e621b8ffSAdrian Hunter const char *str __maybe_unused, int unset __maybe_unused)
762e621b8ffSAdrian Hunter {
763e621b8ffSAdrian Hunter pr_err("AUX area tracing not supported\n");
764e621b8ffSAdrian Hunter return -EINVAL;
765e621b8ffSAdrian Hunter }
766e621b8ffSAdrian Hunter
767e621b8ffSAdrian Hunter static inline
itrace_parse_synth_opts(const struct option * opt __maybe_unused,const char * str __maybe_unused,int unset __maybe_unused)768e31f0d01SAdrian Hunter int itrace_parse_synth_opts(const struct option *opt __maybe_unused,
769e31f0d01SAdrian Hunter const char *str __maybe_unused,
770e31f0d01SAdrian Hunter int unset __maybe_unused)
771e31f0d01SAdrian Hunter {
772e31f0d01SAdrian Hunter pr_err("AUX area tracing not supported\n");
773e31f0d01SAdrian Hunter return -EINVAL;
774e31f0d01SAdrian Hunter }
775e31f0d01SAdrian Hunter
776e31f0d01SAdrian Hunter static inline
auxtrace_parse_snapshot_options(struct auxtrace_record * itr __maybe_unused,struct record_opts * opts __maybe_unused,const char * str)7772dd6d8a1SAdrian Hunter int auxtrace_parse_snapshot_options(struct auxtrace_record *itr __maybe_unused,
7782dd6d8a1SAdrian Hunter struct record_opts *opts __maybe_unused,
7792dd6d8a1SAdrian Hunter const char *str)
7802dd6d8a1SAdrian Hunter {
7812dd6d8a1SAdrian Hunter if (!str)
7822dd6d8a1SAdrian Hunter return 0;
7832dd6d8a1SAdrian Hunter pr_err("AUX area tracing not supported\n");
7842dd6d8a1SAdrian Hunter return -EINVAL;
7852dd6d8a1SAdrian Hunter }
7862dd6d8a1SAdrian Hunter
7872dd6d8a1SAdrian Hunter static inline
auxtrace_parse_sample_options(struct auxtrace_record * itr __maybe_unused,struct evlist * evlist __maybe_unused,struct record_opts * opts __maybe_unused,const char * str)788f0bb7ee8SAdrian Hunter int auxtrace_parse_sample_options(struct auxtrace_record *itr __maybe_unused,
789f0bb7ee8SAdrian Hunter struct evlist *evlist __maybe_unused,
790f0bb7ee8SAdrian Hunter struct record_opts *opts __maybe_unused,
791f0bb7ee8SAdrian Hunter const char *str)
792f0bb7ee8SAdrian Hunter {
793f0bb7ee8SAdrian Hunter if (!str)
794f0bb7ee8SAdrian Hunter return 0;
795f0bb7ee8SAdrian Hunter pr_err("AUX area tracing not supported\n");
796f0bb7ee8SAdrian Hunter return -EINVAL;
797f0bb7ee8SAdrian Hunter }
798f0bb7ee8SAdrian Hunter
799f0bb7ee8SAdrian Hunter static inline
auxtrace_regroup_aux_output(struct evlist * evlist __maybe_unused)800d58b3f7eSAdrian Hunter void auxtrace_regroup_aux_output(struct evlist *evlist __maybe_unused)
801d58b3f7eSAdrian Hunter {
802d58b3f7eSAdrian Hunter }
803d58b3f7eSAdrian Hunter
804d58b3f7eSAdrian Hunter static inline
auxtrace__process_event(struct perf_session * session __maybe_unused,union perf_event * event __maybe_unused,struct perf_sample * sample __maybe_unused,struct perf_tool * tool __maybe_unused)805e31f0d01SAdrian Hunter int auxtrace__process_event(struct perf_session *session __maybe_unused,
806e31f0d01SAdrian Hunter union perf_event *event __maybe_unused,
807e31f0d01SAdrian Hunter struct perf_sample *sample __maybe_unused,
808e31f0d01SAdrian Hunter struct perf_tool *tool __maybe_unused)
809e31f0d01SAdrian Hunter {
810e31f0d01SAdrian Hunter return 0;
811e31f0d01SAdrian Hunter }
812e31f0d01SAdrian Hunter
813e31f0d01SAdrian Hunter static inline
auxtrace__dump_auxtrace_sample(struct perf_session * session __maybe_unused,struct perf_sample * sample __maybe_unused)814b04b8dd1SAdrian Hunter void auxtrace__dump_auxtrace_sample(struct perf_session *session __maybe_unused,
815b04b8dd1SAdrian Hunter struct perf_sample *sample __maybe_unused)
816b04b8dd1SAdrian Hunter {
817b04b8dd1SAdrian Hunter }
818b04b8dd1SAdrian Hunter
819b04b8dd1SAdrian Hunter static inline
auxtrace__flush_events(struct perf_session * session __maybe_unused,struct perf_tool * tool __maybe_unused)820e31f0d01SAdrian Hunter int auxtrace__flush_events(struct perf_session *session __maybe_unused,
821e31f0d01SAdrian Hunter struct perf_tool *tool __maybe_unused)
822e31f0d01SAdrian Hunter {
823e31f0d01SAdrian Hunter return 0;
824e31f0d01SAdrian Hunter }
825e31f0d01SAdrian Hunter
826e31f0d01SAdrian Hunter static inline
auxtrace__free_events(struct perf_session * session __maybe_unused)827e31f0d01SAdrian Hunter void auxtrace__free_events(struct perf_session *session __maybe_unused)
828e31f0d01SAdrian Hunter {
829e31f0d01SAdrian Hunter }
830e31f0d01SAdrian Hunter
831e31f0d01SAdrian Hunter static inline
auxtrace_cache__free(struct auxtrace_cache * auxtrace_cache __maybe_unused)832e31f0d01SAdrian Hunter void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache __maybe_unused)
833e31f0d01SAdrian Hunter {
834e31f0d01SAdrian Hunter }
835e31f0d01SAdrian Hunter
836e31f0d01SAdrian Hunter static inline
auxtrace__free(struct perf_session * session __maybe_unused)837e31f0d01SAdrian Hunter void auxtrace__free(struct perf_session *session __maybe_unused)
838e31f0d01SAdrian Hunter {
839e31f0d01SAdrian Hunter }
840e31f0d01SAdrian Hunter
841e31f0d01SAdrian Hunter static inline
auxtrace_index__write(int fd __maybe_unused,struct list_head * head __maybe_unused)842e31f0d01SAdrian Hunter int auxtrace_index__write(int fd __maybe_unused,
843e31f0d01SAdrian Hunter struct list_head *head __maybe_unused)
844e31f0d01SAdrian Hunter {
845e31f0d01SAdrian Hunter return -EINVAL;
846e31f0d01SAdrian Hunter }
847e31f0d01SAdrian Hunter
848e31f0d01SAdrian Hunter static inline
auxtrace_index__process(int fd __maybe_unused,u64 size __maybe_unused,struct perf_session * session __maybe_unused,bool needs_swap __maybe_unused)849e31f0d01SAdrian Hunter int auxtrace_index__process(int fd __maybe_unused,
850e31f0d01SAdrian Hunter u64 size __maybe_unused,
851e31f0d01SAdrian Hunter struct perf_session *session __maybe_unused,
852e31f0d01SAdrian Hunter bool needs_swap __maybe_unused)
853e31f0d01SAdrian Hunter {
854e31f0d01SAdrian Hunter return -EINVAL;
855e31f0d01SAdrian Hunter }
856e31f0d01SAdrian Hunter
857e31f0d01SAdrian Hunter static inline
auxtrace_index__free(struct list_head * head __maybe_unused)858e31f0d01SAdrian Hunter void auxtrace_index__free(struct list_head *head __maybe_unused)
859e31f0d01SAdrian Hunter {
860e31f0d01SAdrian Hunter }
861e31f0d01SAdrian Hunter
8621b36c03eSAdrian Hunter static inline
auxtrace__evsel_is_auxtrace(struct perf_session * session __maybe_unused,struct evsel * evsel __maybe_unused)863853f37d7SAdrian Hunter bool auxtrace__evsel_is_auxtrace(struct perf_session *session __maybe_unused,
864853f37d7SAdrian Hunter struct evsel *evsel __maybe_unused)
865853f37d7SAdrian Hunter {
866853f37d7SAdrian Hunter return false;
867853f37d7SAdrian Hunter }
868853f37d7SAdrian Hunter
869853f37d7SAdrian Hunter static inline
auxtrace_parse_filters(struct evlist * evlist __maybe_unused)87063503dbaSJiri Olsa int auxtrace_parse_filters(struct evlist *evlist __maybe_unused)
8711b36c03eSAdrian Hunter {
8721b36c03eSAdrian Hunter return 0;
8731b36c03eSAdrian Hunter }
8741b36c03eSAdrian Hunter
875e31f0d01SAdrian Hunter int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
876e31f0d01SAdrian Hunter struct auxtrace_mmap_params *mp,
877e31f0d01SAdrian Hunter void *userpg, int fd);
878e31f0d01SAdrian Hunter void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
879e31f0d01SAdrian Hunter void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
880e31f0d01SAdrian Hunter off_t auxtrace_offset,
881e31f0d01SAdrian Hunter unsigned int auxtrace_pages,
882e31f0d01SAdrian Hunter bool auxtrace_overwrite);
883e31f0d01SAdrian Hunter void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
884d01508f2SAdrian Hunter struct evlist *evlist,
88584bd5abaSAdrian Hunter struct evsel *evsel, int idx);
886e31f0d01SAdrian Hunter
887c12e039dSAndi Kleen #define ITRACE_HELP ""
888c12e039dSAndi Kleen
88933526f36SAdrian Hunter static inline
itrace_synth_opts__set_time_range(struct itrace_synth_opts * opts __maybe_unused,struct perf_time_interval * ptime_range __maybe_unused,int range_num __maybe_unused)89033526f36SAdrian Hunter void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts
89133526f36SAdrian Hunter __maybe_unused,
89233526f36SAdrian Hunter struct perf_time_interval *ptime_range
89333526f36SAdrian Hunter __maybe_unused,
89433526f36SAdrian Hunter int range_num __maybe_unused)
89533526f36SAdrian Hunter {
89633526f36SAdrian Hunter }
89733526f36SAdrian Hunter
89833526f36SAdrian Hunter static inline
itrace_synth_opts__clear_time_range(struct itrace_synth_opts * opts __maybe_unused)89933526f36SAdrian Hunter void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts
90033526f36SAdrian Hunter __maybe_unused)
90133526f36SAdrian Hunter {
90233526f36SAdrian Hunter }
90333526f36SAdrian Hunter
904e31f0d01SAdrian Hunter #endif
905e31f0d01SAdrian Hunter
906718c602dSAdrian Hunter #endif
907