cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

auxtrace.h (29177B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 * auxtrace.h: AUX area trace support
      4 * Copyright (c) 2013-2015, Intel Corporation.
      5 */
      6
      7#ifndef __PERF_AUXTRACE_H
      8#define __PERF_AUXTRACE_H
      9
     10#include <sys/types.h>
     11#include <errno.h>
     12#include <stdbool.h>
     13#include <stddef.h>
     14#include <stdio.h> // FILE
     15#include <linux/list.h>
     16#include <linux/perf_event.h>
     17#include <linux/types.h>
     18#include <internal/cpumap.h>
     19#include <asm/bitsperlong.h>
     20#include <asm/barrier.h>
     21
     22union perf_event;
     23struct perf_session;
     24struct evlist;
     25struct evsel;
     26struct perf_tool;
     27struct mmap;
     28struct perf_sample;
     29struct option;
     30struct record_opts;
     31struct perf_record_auxtrace_error;
     32struct perf_record_auxtrace_info;
     33struct events_stats;
     34struct perf_pmu;
     35
     36enum auxtrace_error_type {
     37       PERF_AUXTRACE_ERROR_ITRACE  = 1,
     38       PERF_AUXTRACE_ERROR_MAX
     39};
     40
     41/* Auxtrace records must have the same alignment as perf event records */
     42#define PERF_AUXTRACE_RECORD_ALIGNMENT 8
     43
     44enum auxtrace_type {
     45	PERF_AUXTRACE_UNKNOWN,
     46	PERF_AUXTRACE_INTEL_PT,
     47	PERF_AUXTRACE_INTEL_BTS,
     48	PERF_AUXTRACE_CS_ETM,
     49	PERF_AUXTRACE_ARM_SPE,
     50	PERF_AUXTRACE_S390_CPUMSF,
     51};
     52
     53enum itrace_period_type {
     54	PERF_ITRACE_PERIOD_INSTRUCTIONS,
     55	PERF_ITRACE_PERIOD_TICKS,
     56	PERF_ITRACE_PERIOD_NANOSECS,
     57};
     58
     59#define AUXTRACE_ERR_FLG_OVERFLOW	(1 << ('o' - 'a'))
     60#define AUXTRACE_ERR_FLG_DATA_LOST	(1 << ('l' - 'a'))
     61
     62#define AUXTRACE_LOG_FLG_ALL_PERF_EVTS	(1 << ('a' - 'a'))
     63#define AUXTRACE_LOG_FLG_USE_STDOUT	(1 << ('o' - 'a'))
     64
     65/**
     66 * struct itrace_synth_opts - AUX area tracing synthesis options.
     67 * @set: indicates whether or not options have been set
     68 * @default_no_sample: Default to no sampling.
     69 * @inject: indicates the event (not just the sample) must be fully synthesized
     70 *          because 'perf inject' will write it out
     71 * @instructions: whether to synthesize 'instructions' events
     72 * @branches: whether to synthesize 'branches' events
     73 *            (branch misses only for Arm SPE)
     74 * @transactions: whether to synthesize events for transactions
     75 * @ptwrites: whether to synthesize events for ptwrites
     76 * @pwr_events: whether to synthesize power events
     77 * @other_events: whether to synthesize other events recorded due to the use of
     78 *                aux_output
     79 * @intr_events: whether to synthesize interrupt events
     80 * @errors: whether to synthesize decoder error events
     81 * @dont_decode: whether to skip decoding entirely
     82 * @log: write a decoding log
     83 * @calls: limit branch samples to calls (can be combined with @returns)
     84 * @returns: limit branch samples to returns (can be combined with @calls)
     85 * @callchain: add callchain to 'instructions' events
     86 * @add_callchain: add callchain to existing event records
     87 * @thread_stack: feed branches to the thread_stack
     88 * @last_branch: add branch context to 'instruction' events
     89 * @add_last_branch: add branch context to existing event records
     90 * @approx_ipc: approximate IPC
     91 * @flc: whether to synthesize first level cache events
     92 * @llc: whether to synthesize last level cache events
     93 * @tlb: whether to synthesize TLB events
     94 * @remote_access: whether to synthesize remote access events
     95 * @mem: whether to synthesize memory events
     96 * @timeless_decoding: prefer "timeless" decoding i.e. ignore timestamps
     97 * @vm_time_correlation: perform VM Time Correlation
     98 * @vm_tm_corr_dry_run: VM Time Correlation dry-run
     99 * @vm_tm_corr_args:  VM Time Correlation implementation-specific arguments
    100 * @callchain_sz: maximum callchain size
    101 * @last_branch_sz: branch context size
    102 * @period: 'instructions' events period
    103 * @period_type: 'instructions' events period type
    104 * @initial_skip: skip N events at the beginning.
    105 * @cpu_bitmap: CPUs for which to synthesize events, or NULL for all
    106 * @ptime_range: time intervals to trace or NULL
    107 * @range_num: number of time intervals to trace
    108 * @error_plus_flags: flags to affect what errors are reported
    109 * @error_minus_flags: flags to affect what errors are reported
    110 * @log_plus_flags: flags to affect what is logged
    111 * @log_minus_flags: flags to affect what is logged
    112 * @quick: quicker (less detailed) decoding
    113 */
    114struct itrace_synth_opts {
    115	bool			set;
    116	bool			default_no_sample;
    117	bool			inject;
    118	bool			instructions;
    119	bool			branches;
    120	bool			transactions;
    121	bool			ptwrites;
    122	bool			pwr_events;
    123	bool			other_events;
    124	bool			intr_events;
    125	bool			errors;
    126	bool			dont_decode;
    127	bool			log;
    128	bool			calls;
    129	bool			returns;
    130	bool			callchain;
    131	bool			add_callchain;
    132	bool			thread_stack;
    133	bool			last_branch;
    134	bool			add_last_branch;
    135	bool			approx_ipc;
    136	bool			flc;
    137	bool			llc;
    138	bool			tlb;
    139	bool			remote_access;
    140	bool			mem;
    141	bool			timeless_decoding;
    142	bool			vm_time_correlation;
    143	bool			vm_tm_corr_dry_run;
    144	char			*vm_tm_corr_args;
    145	unsigned int		callchain_sz;
    146	unsigned int		last_branch_sz;
    147	unsigned long long	period;
    148	enum itrace_period_type	period_type;
    149	unsigned long		initial_skip;
    150	unsigned long		*cpu_bitmap;
    151	struct perf_time_interval *ptime_range;
    152	int			range_num;
    153	unsigned int		error_plus_flags;
    154	unsigned int		error_minus_flags;
    155	unsigned int		log_plus_flags;
    156	unsigned int		log_minus_flags;
    157	unsigned int		quick;
    158};
    159
    160/**
    161 * struct auxtrace_index_entry - indexes a AUX area tracing event within a
    162 *                               perf.data file.
    163 * @file_offset: offset within the perf.data file
    164 * @sz: size of the event
    165 */
    166struct auxtrace_index_entry {
    167	u64			file_offset;
    168	u64			sz;
    169};
    170
    171#define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256
    172
    173/**
    174 * struct auxtrace_index - index of AUX area tracing events within a perf.data
    175 *                         file.
    176 * @list: linking a number of arrays of entries
    177 * @nr: number of entries
    178 * @entries: array of entries
    179 */
    180struct auxtrace_index {
    181	struct list_head	list;
    182	size_t			nr;
    183	struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
    184};
    185
    186/**
    187 * struct auxtrace - session callbacks to allow AUX area data decoding.
    188 * @process_event: lets the decoder see all session events
    189 * @process_auxtrace_event: process a PERF_RECORD_AUXTRACE event
    190 * @queue_data: queue an AUX sample or PERF_RECORD_AUXTRACE event for later
    191 *              processing
    192 * @dump_auxtrace_sample: dump AUX area sample data
    193 * @flush_events: process any remaining data
    194 * @free_events: free resources associated with event processing
    195 * @free: free resources associated with the session
    196 */
    197struct auxtrace {
    198	int (*process_event)(struct perf_session *session,
    199			     union perf_event *event,
    200			     struct perf_sample *sample,
    201			     struct perf_tool *tool);
    202	int (*process_auxtrace_event)(struct perf_session *session,
    203				      union perf_event *event,
    204				      struct perf_tool *tool);
    205	int (*queue_data)(struct perf_session *session,
    206			  struct perf_sample *sample, union perf_event *event,
    207			  u64 data_offset);
    208	void (*dump_auxtrace_sample)(struct perf_session *session,
    209				     struct perf_sample *sample);
    210	int (*flush_events)(struct perf_session *session,
    211			    struct perf_tool *tool);
    212	void (*free_events)(struct perf_session *session);
    213	void (*free)(struct perf_session *session);
    214	bool (*evsel_is_auxtrace)(struct perf_session *session,
    215				  struct evsel *evsel);
    216};
    217
    218/**
    219 * struct auxtrace_buffer - a buffer containing AUX area tracing data.
    220 * @list: buffers are queued in a list held by struct auxtrace_queue
    221 * @size: size of the buffer in bytes
    222 * @pid: in per-thread mode, the pid this buffer is associated with
    223 * @tid: in per-thread mode, the tid this buffer is associated with
    224 * @cpu: in per-cpu mode, the cpu this buffer is associated with
    225 * @data: actual buffer data (can be null if the data has not been loaded)
    226 * @data_offset: file offset at which the buffer can be read
    227 * @mmap_addr: mmap address at which the buffer can be read
    228 * @mmap_size: size of the mmap at @mmap_addr
    229 * @data_needs_freeing: @data was malloc'd so free it when it is no longer
    230 *                      needed
    231 * @consecutive: the original data was split up and this buffer is consecutive
    232 *               to the previous buffer
    233 * @offset: offset as determined by aux_head / aux_tail members of struct
    234 *          perf_event_mmap_page
    235 * @reference: an implementation-specific reference determined when the data is
    236 *             recorded
    237 * @buffer_nr: used to number each buffer
    238 * @use_size: implementation actually only uses this number of bytes
    239 * @use_data: implementation actually only uses data starting at this address
    240 */
    241struct auxtrace_buffer {
    242	struct list_head	list;
    243	size_t			size;
    244	pid_t			pid;
    245	pid_t			tid;
    246	struct perf_cpu		cpu;
    247	void			*data;
    248	off_t			data_offset;
    249	void			*mmap_addr;
    250	size_t			mmap_size;
    251	bool			data_needs_freeing;
    252	bool			consecutive;
    253	u64			offset;
    254	u64			reference;
    255	u64			buffer_nr;
    256	size_t			use_size;
    257	void			*use_data;
    258};
    259
    260/**
    261 * struct auxtrace_queue - a queue of AUX area tracing data buffers.
    262 * @head: head of buffer list
    263 * @tid: in per-thread mode, the tid this queue is associated with
    264 * @cpu: in per-cpu mode, the cpu this queue is associated with
    265 * @set: %true once this queue has been dedicated to a specific thread or cpu
    266 * @priv: implementation-specific data
    267 */
    268struct auxtrace_queue {
    269	struct list_head	head;
    270	pid_t			tid;
    271	int			cpu;
    272	bool			set;
    273	void			*priv;
    274};
    275
    276/**
    277 * struct auxtrace_queues - an array of AUX area tracing queues.
    278 * @queue_array: array of queues
    279 * @nr_queues: number of queues
    280 * @new_data: set whenever new data is queued
    281 * @populated: queues have been fully populated using the auxtrace_index
    282 * @next_buffer_nr: used to number each buffer
    283 */
    284struct auxtrace_queues {
    285	struct auxtrace_queue	*queue_array;
    286	unsigned int		nr_queues;
    287	bool			new_data;
    288	bool			populated;
    289	u64			next_buffer_nr;
    290};
    291
    292/**
    293 * struct auxtrace_heap_item - element of struct auxtrace_heap.
    294 * @queue_nr: queue number
    295 * @ordinal: value used for sorting (lowest ordinal is top of the heap) expected
    296 *           to be a timestamp
    297 */
    298struct auxtrace_heap_item {
    299	unsigned int		queue_nr;
    300	u64			ordinal;
    301};
    302
    303/**
    304 * struct auxtrace_heap - a heap suitable for sorting AUX area tracing queues.
    305 * @heap_array: the heap
    306 * @heap_cnt: the number of elements in the heap
    307 * @heap_sz: maximum number of elements (grows as needed)
    308 */
    309struct auxtrace_heap {
    310	struct auxtrace_heap_item	*heap_array;
    311	unsigned int		heap_cnt;
    312	unsigned int		heap_sz;
    313};
    314
    315/**
    316 * struct auxtrace_mmap - records an mmap of the auxtrace buffer.
    317 * @base: address of mapped area
    318 * @userpg: pointer to buffer's perf_event_mmap_page
    319 * @mask: %0 if @len is not a power of two, otherwise (@len - %1)
    320 * @len: size of mapped area
    321 * @prev: previous aux_head
    322 * @idx: index of this mmap
    323 * @tid: tid for a per-thread mmap (also set if there is only 1 tid on a per-cpu
    324 *       mmap) otherwise %0
    325 * @cpu: cpu number for a per-cpu mmap otherwise %-1
    326 */
    327struct auxtrace_mmap {
    328	void		*base;
    329	void		*userpg;
    330	size_t		mask;
    331	size_t		len;
    332	u64		prev;
    333	int		idx;
    334	pid_t		tid;
    335	int		cpu;
    336};
    337
    338/**
    339 * struct auxtrace_mmap_params - parameters to set up struct auxtrace_mmap.
    340 * @mask: %0 if @len is not a power of two, otherwise (@len - %1)
    341 * @offset: file offset of mapped area
    342 * @len: size of mapped area
    343 * @prot: mmap memory protection
    344 * @idx: index of this mmap
    345 * @tid: tid for a per-thread mmap (also set if there is only 1 tid on a per-cpu
    346 *       mmap) otherwise %0
    347 * @mmap_needed: set to %false for non-auxtrace events. This is needed because
    348 *               auxtrace mmapping is done in the same code path as non-auxtrace
    349 *               mmapping but not every evsel that needs non-auxtrace mmapping
    350 *               also needs auxtrace mmapping.
    351 * @cpu: cpu number for a per-cpu mmap otherwise %-1
    352 */
    353struct auxtrace_mmap_params {
    354	size_t		mask;
    355	off_t		offset;
    356	size_t		len;
    357	int		prot;
    358	int		idx;
    359	pid_t		tid;
    360	bool		mmap_needed;
    361	struct perf_cpu	cpu;
    362};
    363
    364/**
    365 * struct auxtrace_record - callbacks for recording AUX area data.
    366 * @recording_options: validate and process recording options
    367 * @info_priv_size: return the size of the private data in auxtrace_info_event
    368 * @info_fill: fill-in the private data in auxtrace_info_event
    369 * @free: free this auxtrace record structure
    370 * @snapshot_start: starting a snapshot
    371 * @snapshot_finish: finishing a snapshot
    372 * @find_snapshot: find data to snapshot within auxtrace mmap
    373 * @parse_snapshot_options: parse snapshot options
    374 * @reference: provide a 64-bit reference number for auxtrace_event
    375 * @read_finish: called after reading from an auxtrace mmap
    376 * @alignment: alignment (if any) for AUX area data
    377 * @default_aux_sample_size: default sample size for --aux sample option
    378 * @pmu: associated pmu
    379 * @evlist: selected events list
    380 */
    381struct auxtrace_record {
    382	int (*recording_options)(struct auxtrace_record *itr,
    383				 struct evlist *evlist,
    384				 struct record_opts *opts);
    385	size_t (*info_priv_size)(struct auxtrace_record *itr,
    386				 struct evlist *evlist);
    387	int (*info_fill)(struct auxtrace_record *itr,
    388			 struct perf_session *session,
    389			 struct perf_record_auxtrace_info *auxtrace_info,
    390			 size_t priv_size);
    391	void (*free)(struct auxtrace_record *itr);
    392	int (*snapshot_start)(struct auxtrace_record *itr);
    393	int (*snapshot_finish)(struct auxtrace_record *itr);
    394	int (*find_snapshot)(struct auxtrace_record *itr, int idx,
    395			     struct auxtrace_mmap *mm, unsigned char *data,
    396			     u64 *head, u64 *old);
    397	int (*parse_snapshot_options)(struct auxtrace_record *itr,
    398				      struct record_opts *opts,
    399				      const char *str);
    400	u64 (*reference)(struct auxtrace_record *itr);
    401	int (*read_finish)(struct auxtrace_record *itr, int idx);
    402	unsigned int alignment;
    403	unsigned int default_aux_sample_size;
    404	struct perf_pmu *pmu;
    405	struct evlist *evlist;
    406};
    407
    408/**
    409 * struct addr_filter - address filter.
    410 * @list: list node
    411 * @range: true if it is a range filter
    412 * @start: true if action is 'filter' or 'start'
    413 * @action: 'filter', 'start' or 'stop' ('tracestop' is accepted but converted
    414 *          to 'stop')
    415 * @sym_from: symbol name for the filter address
    416 * @sym_to: symbol name that determines the filter size
    417 * @sym_from_idx: selects n'th from symbols with the same name (0 means global
    418 *                and less than 0 means symbol must be unique)
    419 * @sym_to_idx: same as @sym_from_idx but for @sym_to
    420 * @addr: filter address
    421 * @size: filter region size (for range filters)
    422 * @filename: DSO file name or NULL for the kernel
    423 * @str: allocated string that contains the other string members
    424 */
    425struct addr_filter {
    426	struct list_head	list;
    427	bool			range;
    428	bool			start;
    429	const char		*action;
    430	const char		*sym_from;
    431	const char		*sym_to;
    432	int			sym_from_idx;
    433	int			sym_to_idx;
    434	u64			addr;
    435	u64			size;
    436	const char		*filename;
    437	char			*str;
    438};
    439
    440/**
    441 * struct addr_filters - list of address filters.
    442 * @head: list of address filters
    443 * @cnt: number of address filters
    444 */
    445struct addr_filters {
    446	struct list_head	head;
    447	int			cnt;
    448};
    449
    450struct auxtrace_cache;
    451
    452#ifdef HAVE_AUXTRACE_SUPPORT
    453
    454u64 compat_auxtrace_mmap__read_head(struct auxtrace_mmap *mm);
    455int compat_auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail);
    456
    457static inline u64 auxtrace_mmap__read_head(struct auxtrace_mmap *mm,
    458					   int kernel_is_64_bit __maybe_unused)
    459{
    460	struct perf_event_mmap_page *pc = mm->userpg;
    461	u64 head;
    462
    463#if BITS_PER_LONG == 32
    464	if (kernel_is_64_bit)
    465		return compat_auxtrace_mmap__read_head(mm);
    466#endif
    467	head = READ_ONCE(pc->aux_head);
    468
    469	/* Ensure all reads are done after we read the head */
    470	smp_rmb();
    471	return head;
    472}
    473
    474static inline int auxtrace_mmap__write_tail(struct auxtrace_mmap *mm, u64 tail,
    475					    int kernel_is_64_bit __maybe_unused)
    476{
    477	struct perf_event_mmap_page *pc = mm->userpg;
    478
    479#if BITS_PER_LONG == 32
    480	if (kernel_is_64_bit)
    481		return compat_auxtrace_mmap__write_tail(mm, tail);
    482#endif
    483	/* Ensure all reads are done before we write the tail out */
    484	smp_mb();
    485	WRITE_ONCE(pc->aux_tail, tail);
    486	return 0;
    487}
    488
    489int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
    490			struct auxtrace_mmap_params *mp,
    491			void *userpg, int fd);
    492void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
    493void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
    494				off_t auxtrace_offset,
    495				unsigned int auxtrace_pages,
    496				bool auxtrace_overwrite);
    497void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
    498				   struct evlist *evlist,
    499				   struct evsel *evsel, int idx);
    500
    501typedef int (*process_auxtrace_t)(struct perf_tool *tool,
    502				  struct mmap *map,
    503				  union perf_event *event, void *data1,
    504				  size_t len1, void *data2, size_t len2);
    505
    506int auxtrace_mmap__read(struct mmap *map, struct auxtrace_record *itr,
    507			struct perf_tool *tool, process_auxtrace_t fn);
    508
    509int auxtrace_mmap__read_snapshot(struct mmap *map,
    510				 struct auxtrace_record *itr,
    511				 struct perf_tool *tool, process_auxtrace_t fn,
    512				 size_t snapshot_size);
    513
    514int auxtrace_queues__init(struct auxtrace_queues *queues);
    515int auxtrace_queues__add_event(struct auxtrace_queues *queues,
    516			       struct perf_session *session,
    517			       union perf_event *event, off_t data_offset,
    518			       struct auxtrace_buffer **buffer_ptr);
    519struct auxtrace_queue *
    520auxtrace_queues__sample_queue(struct auxtrace_queues *queues,
    521			      struct perf_sample *sample,
    522			      struct perf_session *session);
    523int auxtrace_queues__add_sample(struct auxtrace_queues *queues,
    524				struct perf_session *session,
    525				struct perf_sample *sample, u64 data_offset,
    526				u64 reference);
    527void auxtrace_queues__free(struct auxtrace_queues *queues);
    528int auxtrace_queues__process_index(struct auxtrace_queues *queues,
    529				   struct perf_session *session);
    530int auxtrace_queue_data(struct perf_session *session, bool samples,
    531			bool events);
    532struct auxtrace_buffer *auxtrace_buffer__next(struct auxtrace_queue *queue,
    533					      struct auxtrace_buffer *buffer);
    534void *auxtrace_buffer__get_data_rw(struct auxtrace_buffer *buffer, int fd, bool rw);
    535static inline void *auxtrace_buffer__get_data(struct auxtrace_buffer *buffer, int fd)
    536{
    537	return auxtrace_buffer__get_data_rw(buffer, fd, false);
    538}
    539void auxtrace_buffer__put_data(struct auxtrace_buffer *buffer);
    540void auxtrace_buffer__drop_data(struct auxtrace_buffer *buffer);
    541void auxtrace_buffer__free(struct auxtrace_buffer *buffer);
    542
    543int auxtrace_heap__add(struct auxtrace_heap *heap, unsigned int queue_nr,
    544		       u64 ordinal);
    545void auxtrace_heap__pop(struct auxtrace_heap *heap);
    546void auxtrace_heap__free(struct auxtrace_heap *heap);
    547
    548struct auxtrace_cache_entry {
    549	struct hlist_node hash;
    550	u32 key;
    551};
    552
    553struct auxtrace_cache *auxtrace_cache__new(unsigned int bits, size_t entry_size,
    554					   unsigned int limit_percent);
    555void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache);
    556void *auxtrace_cache__alloc_entry(struct auxtrace_cache *c);
    557void auxtrace_cache__free_entry(struct auxtrace_cache *c, void *entry);
    558int auxtrace_cache__add(struct auxtrace_cache *c, u32 key,
    559			struct auxtrace_cache_entry *entry);
    560void auxtrace_cache__remove(struct auxtrace_cache *c, u32 key);
    561void *auxtrace_cache__lookup(struct auxtrace_cache *c, u32 key);
    562
    563struct auxtrace_record *auxtrace_record__init(struct evlist *evlist,
    564					      int *err);
    565
    566int auxtrace_parse_snapshot_options(struct auxtrace_record *itr,
    567				    struct record_opts *opts,
    568				    const char *str);
    569int auxtrace_parse_sample_options(struct auxtrace_record *itr,
    570				  struct evlist *evlist,
    571				  struct record_opts *opts, const char *str);
    572void auxtrace_regroup_aux_output(struct evlist *evlist);
    573int auxtrace_record__options(struct auxtrace_record *itr,
    574			     struct evlist *evlist,
    575			     struct record_opts *opts);
    576size_t auxtrace_record__info_priv_size(struct auxtrace_record *itr,
    577				       struct evlist *evlist);
    578int auxtrace_record__info_fill(struct auxtrace_record *itr,
    579			       struct perf_session *session,
    580			       struct perf_record_auxtrace_info *auxtrace_info,
    581			       size_t priv_size);
    582void auxtrace_record__free(struct auxtrace_record *itr);
    583int auxtrace_record__snapshot_start(struct auxtrace_record *itr);
    584int auxtrace_record__snapshot_finish(struct auxtrace_record *itr, bool on_exit);
    585int auxtrace_record__find_snapshot(struct auxtrace_record *itr, int idx,
    586				   struct auxtrace_mmap *mm,
    587				   unsigned char *data, u64 *head, u64 *old);
    588u64 auxtrace_record__reference(struct auxtrace_record *itr);
    589int auxtrace_record__read_finish(struct auxtrace_record *itr, int idx);
    590
    591int auxtrace_index__auxtrace_event(struct list_head *head, union perf_event *event,
    592				   off_t file_offset);
    593int auxtrace_index__write(int fd, struct list_head *head);
    594int auxtrace_index__process(int fd, u64 size, struct perf_session *session,
    595			    bool needs_swap);
    596void auxtrace_index__free(struct list_head *head);
    597
    598void auxtrace_synth_error(struct perf_record_auxtrace_error *auxtrace_error, int type,
    599			  int code, int cpu, pid_t pid, pid_t tid, u64 ip,
    600			  const char *msg, u64 timestamp);
    601
    602int perf_event__process_auxtrace_info(struct perf_session *session,
    603				      union perf_event *event);
    604s64 perf_event__process_auxtrace(struct perf_session *session,
    605				 union perf_event *event);
    606int perf_event__process_auxtrace_error(struct perf_session *session,
    607				       union perf_event *event);
    608int itrace_do_parse_synth_opts(struct itrace_synth_opts *synth_opts,
    609			       const char *str, int unset);
    610int itrace_parse_synth_opts(const struct option *opt, const char *str,
    611			    int unset);
    612void itrace_synth_opts__set_default(struct itrace_synth_opts *synth_opts,
    613				    bool no_sample);
    614
    615size_t perf_event__fprintf_auxtrace_error(union perf_event *event, FILE *fp);
    616void perf_session__auxtrace_error_inc(struct perf_session *session,
    617				      union perf_event *event);
    618void events_stats__auxtrace_error_warn(const struct events_stats *stats);
    619
    620void addr_filters__init(struct addr_filters *filts);
    621void addr_filters__exit(struct addr_filters *filts);
    622int addr_filters__parse_bare_filter(struct addr_filters *filts,
    623				    const char *filter);
    624int auxtrace_parse_filters(struct evlist *evlist);
    625
    626int auxtrace__process_event(struct perf_session *session, union perf_event *event,
    627			    struct perf_sample *sample, struct perf_tool *tool);
    628void auxtrace__dump_auxtrace_sample(struct perf_session *session,
    629				    struct perf_sample *sample);
    630int auxtrace__flush_events(struct perf_session *session, struct perf_tool *tool);
    631void auxtrace__free_events(struct perf_session *session);
    632void auxtrace__free(struct perf_session *session);
    633bool auxtrace__evsel_is_auxtrace(struct perf_session *session,
    634				 struct evsel *evsel);
    635
    636#define ITRACE_HELP \
    637"				i[period]:    		synthesize instructions events\n" \
    638"				b:	    		synthesize branches events (branch misses for Arm SPE)\n" \
    639"				c:	    		synthesize branches events (calls only)\n"	\
    640"				r:	    		synthesize branches events (returns only)\n" \
    641"				x:	    		synthesize transactions events\n"		\
    642"				w:	    		synthesize ptwrite events\n"		\
    643"				p:	    		synthesize power events\n"			\
    644"				o:			synthesize other events recorded due to the use\n" \
    645"							of aux-output (refer to perf record)\n"	\
    646"				I:			synthesize interrupt or similar (asynchronous) events\n" \
    647"							(e.g. Intel PT Event Trace)\n" \
    648"				e[flags]:		synthesize error events\n" \
    649"							each flag must be preceded by + or -\n" \
    650"							error flags are: o (overflow)\n" \
    651"									 l (data lost)\n" \
    652"				d[flags]:		create a debug log\n" \
    653"							each flag must be preceded by + or -\n" \
    654"							log flags are: a (all perf events)\n" \
    655"							               o (output to stdout)\n" \
    656"				f:	    		synthesize first level cache events\n" \
    657"				m:	    		synthesize last level cache events\n" \
    658"				t:	    		synthesize TLB events\n" \
    659"				a:	    		synthesize remote access events\n" \
    660"				g[len]:     		synthesize a call chain (use with i or x)\n" \
    661"				G[len]:			synthesize a call chain on existing event records\n" \
    662"				l[len]:     		synthesize last branch entries (use with i or x)\n" \
    663"				L[len]:			synthesize last branch entries on existing event records\n" \
    664"				sNUMBER:    		skip initial number of events\n"		\
    665"				q:			quicker (less detailed) decoding\n" \
    666"				A:			approximate IPC\n" \
    667"				Z:			prefer to ignore timestamps (so-called \"timeless\" decoding)\n" \
    668"				PERIOD[ns|us|ms|i|t]:   specify period to sample stream\n" \
    669"				concatenate multiple options. Default is ibxwpe or cewp\n"
    670
    671static inline
    672void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts,
    673				       struct perf_time_interval *ptime_range,
    674				       int range_num)
    675{
    676	opts->ptime_range = ptime_range;
    677	opts->range_num = range_num;
    678}
    679
    680static inline
    681void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts)
    682{
    683	opts->ptime_range = NULL;
    684	opts->range_num = 0;
    685}
    686
    687#else
    688#include "debug.h"
    689
    690static inline struct auxtrace_record *
    691auxtrace_record__init(struct evlist *evlist __maybe_unused,
    692		      int *err)
    693{
    694	*err = 0;
    695	return NULL;
    696}
    697
    698static inline
    699void auxtrace_record__free(struct auxtrace_record *itr __maybe_unused)
    700{
    701}
    702
    703static inline
    704int auxtrace_record__options(struct auxtrace_record *itr __maybe_unused,
    705			     struct evlist *evlist __maybe_unused,
    706			     struct record_opts *opts __maybe_unused)
    707{
    708	return 0;
    709}
    710
    711static inline
    712int perf_event__process_auxtrace_info(struct perf_session *session __maybe_unused,
    713				      union perf_event *event __maybe_unused)
    714{
    715	return 0;
    716}
    717
    718static inline
    719s64 perf_event__process_auxtrace(struct perf_session *session __maybe_unused,
    720				 union perf_event *event __maybe_unused)
    721{
    722	return 0;
    723}
    724
    725static inline
    726int perf_event__process_auxtrace_error(struct perf_session *session __maybe_unused,
    727				       union perf_event *event __maybe_unused)
    728{
    729	return 0;
    730}
    731
    732static inline
    733void perf_session__auxtrace_error_inc(struct perf_session *session
    734				      __maybe_unused,
    735				      union perf_event *event
    736				      __maybe_unused)
    737{
    738}
    739
    740static inline
    741void events_stats__auxtrace_error_warn(const struct events_stats *stats
    742				       __maybe_unused)
    743{
    744}
    745
    746static inline
    747int itrace_do_parse_synth_opts(struct itrace_synth_opts *synth_opts __maybe_unused,
    748			       const char *str __maybe_unused, int unset __maybe_unused)
    749{
    750	pr_err("AUX area tracing not supported\n");
    751	return -EINVAL;
    752}
    753
    754static inline
    755int itrace_parse_synth_opts(const struct option *opt __maybe_unused,
    756			    const char *str __maybe_unused,
    757			    int unset __maybe_unused)
    758{
    759	pr_err("AUX area tracing not supported\n");
    760	return -EINVAL;
    761}
    762
    763static inline
    764int auxtrace_parse_snapshot_options(struct auxtrace_record *itr __maybe_unused,
    765				    struct record_opts *opts __maybe_unused,
    766				    const char *str)
    767{
    768	if (!str)
    769		return 0;
    770	pr_err("AUX area tracing not supported\n");
    771	return -EINVAL;
    772}
    773
    774static inline
    775int auxtrace_parse_sample_options(struct auxtrace_record *itr __maybe_unused,
    776				  struct evlist *evlist __maybe_unused,
    777				  struct record_opts *opts __maybe_unused,
    778				  const char *str)
    779{
    780	if (!str)
    781		return 0;
    782	pr_err("AUX area tracing not supported\n");
    783	return -EINVAL;
    784}
    785
    786static inline
    787void auxtrace_regroup_aux_output(struct evlist *evlist __maybe_unused)
    788{
    789}
    790
    791static inline
    792int auxtrace__process_event(struct perf_session *session __maybe_unused,
    793			    union perf_event *event __maybe_unused,
    794			    struct perf_sample *sample __maybe_unused,
    795			    struct perf_tool *tool __maybe_unused)
    796{
    797	return 0;
    798}
    799
    800static inline
    801void auxtrace__dump_auxtrace_sample(struct perf_session *session __maybe_unused,
    802				    struct perf_sample *sample __maybe_unused)
    803{
    804}
    805
    806static inline
    807int auxtrace__flush_events(struct perf_session *session __maybe_unused,
    808			   struct perf_tool *tool __maybe_unused)
    809{
    810	return 0;
    811}
    812
    813static inline
    814void auxtrace__free_events(struct perf_session *session __maybe_unused)
    815{
    816}
    817
    818static inline
    819void auxtrace_cache__free(struct auxtrace_cache *auxtrace_cache __maybe_unused)
    820{
    821}
    822
    823static inline
    824void auxtrace__free(struct perf_session *session __maybe_unused)
    825{
    826}
    827
    828static inline
    829int auxtrace_index__write(int fd __maybe_unused,
    830			  struct list_head *head __maybe_unused)
    831{
    832	return -EINVAL;
    833}
    834
    835static inline
    836int auxtrace_index__process(int fd __maybe_unused,
    837			    u64 size __maybe_unused,
    838			    struct perf_session *session __maybe_unused,
    839			    bool needs_swap __maybe_unused)
    840{
    841	return -EINVAL;
    842}
    843
    844static inline
    845void auxtrace_index__free(struct list_head *head __maybe_unused)
    846{
    847}
    848
    849static inline
    850bool auxtrace__evsel_is_auxtrace(struct perf_session *session __maybe_unused,
    851				 struct evsel *evsel __maybe_unused)
    852{
    853	return false;
    854}
    855
    856static inline
    857int auxtrace_parse_filters(struct evlist *evlist __maybe_unused)
    858{
    859	return 0;
    860}
    861
    862int auxtrace_mmap__mmap(struct auxtrace_mmap *mm,
    863			struct auxtrace_mmap_params *mp,
    864			void *userpg, int fd);
    865void auxtrace_mmap__munmap(struct auxtrace_mmap *mm);
    866void auxtrace_mmap_params__init(struct auxtrace_mmap_params *mp,
    867				off_t auxtrace_offset,
    868				unsigned int auxtrace_pages,
    869				bool auxtrace_overwrite);
    870void auxtrace_mmap_params__set_idx(struct auxtrace_mmap_params *mp,
    871				   struct evlist *evlist,
    872				   struct evsel *evsel, int idx);
    873
    874#define ITRACE_HELP ""
    875
    876static inline
    877void itrace_synth_opts__set_time_range(struct itrace_synth_opts *opts
    878				       __maybe_unused,
    879				       struct perf_time_interval *ptime_range
    880				       __maybe_unused,
    881				       int range_num __maybe_unused)
    882{
    883}
    884
    885static inline
    886void itrace_synth_opts__clear_time_range(struct itrace_synth_opts *opts
    887					 __maybe_unused)
    888{
    889}
    890
    891#endif
    892
    893#endif