xref: /openbmc/linux/tools/perf/util/cs-etm.c (revision ecc23d0a422a3118fcf6e4f0a46e17a6c2047b02)
1  // SPDX-License-Identifier: GPL-2.0
2  /*
3   * Copyright(C) 2015-2018 Linaro Limited.
4   *
5   * Author: Tor Jeremiassen <tor@ti.com>
6   * Author: Mathieu Poirier <mathieu.poirier@linaro.org>
7   */
8  
9  #include <linux/kernel.h>
10  #include <linux/bitfield.h>
11  #include <linux/bitops.h>
12  #include <linux/coresight-pmu.h>
13  #include <linux/err.h>
14  #include <linux/log2.h>
15  #include <linux/types.h>
16  #include <linux/zalloc.h>
17  
18  #include <stdlib.h>
19  
20  #include "auxtrace.h"
21  #include "color.h"
22  #include "cs-etm.h"
23  #include "cs-etm-decoder/cs-etm-decoder.h"
24  #include "debug.h"
25  #include "dso.h"
26  #include "evlist.h"
27  #include "intlist.h"
28  #include "machine.h"
29  #include "map.h"
30  #include "perf.h"
31  #include "session.h"
32  #include "map_symbol.h"
33  #include "branch.h"
34  #include "symbol.h"
35  #include "tool.h"
36  #include "thread.h"
37  #include "thread-stack.h"
38  #include "tsc.h"
39  #include <tools/libc_compat.h>
40  #include "util/synthetic-events.h"
41  #include "util/util.h"
42  
43  struct cs_etm_auxtrace {
44  	struct auxtrace auxtrace;
45  	struct auxtrace_queues queues;
46  	struct auxtrace_heap heap;
47  	struct itrace_synth_opts synth_opts;
48  	struct perf_session *session;
49  	struct perf_tsc_conversion tc;
50  
51  	/*
52  	 * Timeless has no timestamps in the trace so overlapping mmap lookups
53  	 * are less accurate but produces smaller trace data. We use context IDs
54  	 * in the trace instead of matching timestamps with fork records so
55  	 * they're not really needed in the general case. Overlapping mmaps
56  	 * happen in cases like between a fork and an exec.
57  	 */
58  	bool timeless_decoding;
59  
60  	/*
61  	 * Per-thread ignores the trace channel ID and instead assumes that
62  	 * everything in a buffer comes from the same process regardless of
63  	 * which CPU it ran on. It also implies no context IDs so the TID is
64  	 * taken from the auxtrace buffer.
65  	 */
66  	bool per_thread_decoding;
67  	bool snapshot_mode;
68  	bool data_queued;
69  	bool has_virtual_ts; /* Virtual/Kernel timestamps in the trace. */
70  
71  	int num_cpu;
72  	u64 latest_kernel_timestamp;
73  	u32 auxtrace_type;
74  	u64 branches_sample_type;
75  	u64 branches_id;
76  	u64 instructions_sample_type;
77  	u64 instructions_sample_period;
78  	u64 instructions_id;
79  	u64 **metadata;
80  	unsigned int pmu_type;
81  	enum cs_etm_pid_fmt pid_fmt;
82  };
83  
84  struct cs_etm_traceid_queue {
85  	u8 trace_chan_id;
86  	u64 period_instructions;
87  	size_t last_branch_pos;
88  	union perf_event *event_buf;
89  	struct thread *thread;
90  	struct thread *prev_packet_thread;
91  	ocsd_ex_level prev_packet_el;
92  	ocsd_ex_level el;
93  	struct branch_stack *last_branch;
94  	struct branch_stack *last_branch_rb;
95  	struct cs_etm_packet *prev_packet;
96  	struct cs_etm_packet *packet;
97  	struct cs_etm_packet_queue packet_queue;
98  };
99  
100  struct cs_etm_queue {
101  	struct cs_etm_auxtrace *etm;
102  	struct cs_etm_decoder *decoder;
103  	struct auxtrace_buffer *buffer;
104  	unsigned int queue_nr;
105  	u8 pending_timestamp_chan_id;
106  	u64 offset;
107  	const unsigned char *buf;
108  	size_t buf_len, buf_used;
109  	/* Conversion between traceID and index in traceid_queues array */
110  	struct intlist *traceid_queues_list;
111  	struct cs_etm_traceid_queue **traceid_queues;
112  };
113  
114  /* RB tree for quick conversion between traceID and metadata pointers */
115  static struct intlist *traceid_list;
116  
117  static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm);
118  static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
119  					   pid_t tid);
120  static int cs_etm__get_data_block(struct cs_etm_queue *etmq);
121  static int cs_etm__decode_data_block(struct cs_etm_queue *etmq);
122  
123  /* PTMs ETMIDR [11:8] set to b0011 */
124  #define ETMIDR_PTM_VERSION 0x00000300
125  
126  /*
127   * A struct auxtrace_heap_item only has a queue_nr and a timestamp to
128   * work with.  One option is to modify to auxtrace_heap_XYZ() API or simply
129   * encode the etm queue number as the upper 16 bit and the channel as
130   * the lower 16 bit.
131   */
132  #define TO_CS_QUEUE_NR(queue_nr, trace_chan_id)	\
133  		      (queue_nr << 16 | trace_chan_id)
134  #define TO_QUEUE_NR(cs_queue_nr) (cs_queue_nr >> 16)
135  #define TO_TRACE_CHAN_ID(cs_queue_nr) (cs_queue_nr & 0x0000ffff)
136  
cs_etm__get_v7_protocol_version(u32 etmidr)137  static u32 cs_etm__get_v7_protocol_version(u32 etmidr)
138  {
139  	etmidr &= ETMIDR_PTM_VERSION;
140  
141  	if (etmidr == ETMIDR_PTM_VERSION)
142  		return CS_ETM_PROTO_PTM;
143  
144  	return CS_ETM_PROTO_ETMV3;
145  }
146  
cs_etm__get_magic(u8 trace_chan_id,u64 * magic)147  static int cs_etm__get_magic(u8 trace_chan_id, u64 *magic)
148  {
149  	struct int_node *inode;
150  	u64 *metadata;
151  
152  	inode = intlist__find(traceid_list, trace_chan_id);
153  	if (!inode)
154  		return -EINVAL;
155  
156  	metadata = inode->priv;
157  	*magic = metadata[CS_ETM_MAGIC];
158  	return 0;
159  }
160  
cs_etm__get_cpu(u8 trace_chan_id,int * cpu)161  int cs_etm__get_cpu(u8 trace_chan_id, int *cpu)
162  {
163  	struct int_node *inode;
164  	u64 *metadata;
165  
166  	inode = intlist__find(traceid_list, trace_chan_id);
167  	if (!inode)
168  		return -EINVAL;
169  
170  	metadata = inode->priv;
171  	*cpu = (int)metadata[CS_ETM_CPU];
172  	return 0;
173  }
174  
175  /*
176   * The returned PID format is presented as an enum:
177   *
178   *   CS_ETM_PIDFMT_CTXTID: CONTEXTIDR or CONTEXTIDR_EL1 is traced.
179   *   CS_ETM_PIDFMT_CTXTID2: CONTEXTIDR_EL2 is traced.
180   *   CS_ETM_PIDFMT_NONE: No context IDs
181   *
182   * It's possible that the two bits ETM_OPT_CTXTID and ETM_OPT_CTXTID2
183   * are enabled at the same time when the session runs on an EL2 kernel.
184   * This means the CONTEXTIDR_EL1 and CONTEXTIDR_EL2 both will be
185   * recorded in the trace data, the tool will selectively use
186   * CONTEXTIDR_EL2 as PID.
187   *
188   * The result is cached in etm->pid_fmt so this function only needs to be called
189   * when processing the aux info.
190   */
cs_etm__init_pid_fmt(u64 * metadata)191  static enum cs_etm_pid_fmt cs_etm__init_pid_fmt(u64 *metadata)
192  {
193  	u64 val;
194  
195  	if (metadata[CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
196  		val = metadata[CS_ETM_ETMCR];
197  		/* CONTEXTIDR is traced */
198  		if (val & BIT(ETM_OPT_CTXTID))
199  			return CS_ETM_PIDFMT_CTXTID;
200  	} else {
201  		val = metadata[CS_ETMV4_TRCCONFIGR];
202  		/* CONTEXTIDR_EL2 is traced */
203  		if (val & (BIT(ETM4_CFG_BIT_VMID) | BIT(ETM4_CFG_BIT_VMID_OPT)))
204  			return CS_ETM_PIDFMT_CTXTID2;
205  		/* CONTEXTIDR_EL1 is traced */
206  		else if (val & BIT(ETM4_CFG_BIT_CTXTID))
207  			return CS_ETM_PIDFMT_CTXTID;
208  	}
209  
210  	return CS_ETM_PIDFMT_NONE;
211  }
212  
cs_etm__get_pid_fmt(struct cs_etm_queue * etmq)213  enum cs_etm_pid_fmt cs_etm__get_pid_fmt(struct cs_etm_queue *etmq)
214  {
215  	return etmq->etm->pid_fmt;
216  }
217  
cs_etm__map_trace_id(u8 trace_chan_id,u64 * cpu_metadata)218  static int cs_etm__map_trace_id(u8 trace_chan_id, u64 *cpu_metadata)
219  {
220  	struct int_node *inode;
221  
222  	/* Get an RB node for this CPU */
223  	inode = intlist__findnew(traceid_list, trace_chan_id);
224  
225  	/* Something went wrong, no need to continue */
226  	if (!inode)
227  		return -ENOMEM;
228  
229  	/*
230  	 * The node for that CPU should not be taken.
231  	 * Back out if that's the case.
232  	 */
233  	if (inode->priv)
234  		return -EINVAL;
235  
236  	/* All good, associate the traceID with the metadata pointer */
237  	inode->priv = cpu_metadata;
238  
239  	return 0;
240  }
241  
cs_etm__metadata_get_trace_id(u8 * trace_chan_id,u64 * cpu_metadata)242  static int cs_etm__metadata_get_trace_id(u8 *trace_chan_id, u64 *cpu_metadata)
243  {
244  	u64 cs_etm_magic = cpu_metadata[CS_ETM_MAGIC];
245  
246  	switch (cs_etm_magic) {
247  	case __perf_cs_etmv3_magic:
248  		*trace_chan_id = (u8)(cpu_metadata[CS_ETM_ETMTRACEIDR] &
249  				      CORESIGHT_TRACE_ID_VAL_MASK);
250  		break;
251  	case __perf_cs_etmv4_magic:
252  	case __perf_cs_ete_magic:
253  		*trace_chan_id = (u8)(cpu_metadata[CS_ETMV4_TRCTRACEIDR] &
254  				      CORESIGHT_TRACE_ID_VAL_MASK);
255  		break;
256  	default:
257  		return -EINVAL;
258  	}
259  	return 0;
260  }
261  
262  /*
263   * update metadata trace ID from the value found in the AUX_HW_INFO packet.
264   * This will also clear the CORESIGHT_TRACE_ID_UNUSED_FLAG flag if present.
265   */
cs_etm__metadata_set_trace_id(u8 trace_chan_id,u64 * cpu_metadata)266  static int cs_etm__metadata_set_trace_id(u8 trace_chan_id, u64 *cpu_metadata)
267  {
268  	u64 cs_etm_magic = cpu_metadata[CS_ETM_MAGIC];
269  
270  	switch (cs_etm_magic) {
271  	case __perf_cs_etmv3_magic:
272  		 cpu_metadata[CS_ETM_ETMTRACEIDR] = trace_chan_id;
273  		break;
274  	case __perf_cs_etmv4_magic:
275  	case __perf_cs_ete_magic:
276  		cpu_metadata[CS_ETMV4_TRCTRACEIDR] = trace_chan_id;
277  		break;
278  
279  	default:
280  		return -EINVAL;
281  	}
282  	return 0;
283  }
284  
285  /*
286   * Get a metadata for a specific cpu from an array.
287   *
288   */
get_cpu_data(struct cs_etm_auxtrace * etm,int cpu)289  static u64 *get_cpu_data(struct cs_etm_auxtrace *etm, int cpu)
290  {
291  	int i;
292  	u64 *metadata = NULL;
293  
294  	for (i = 0; i < etm->num_cpu; i++) {
295  		if (etm->metadata[i][CS_ETM_CPU] == (u64)cpu) {
296  			metadata = etm->metadata[i];
297  			break;
298  		}
299  	}
300  
301  	return metadata;
302  }
303  
304  /*
305   * Handle the PERF_RECORD_AUX_OUTPUT_HW_ID event.
306   *
307   * The payload associates the Trace ID and the CPU.
308   * The routine is tolerant of seeing multiple packets with the same association,
309   * but a CPU / Trace ID association changing during a session is an error.
310   */
cs_etm__process_aux_output_hw_id(struct perf_session * session,union perf_event * event)311  static int cs_etm__process_aux_output_hw_id(struct perf_session *session,
312  					    union perf_event *event)
313  {
314  	struct cs_etm_auxtrace *etm;
315  	struct perf_sample sample;
316  	struct int_node *inode;
317  	struct evsel *evsel;
318  	u64 *cpu_data;
319  	u64 hw_id;
320  	int cpu, version, err;
321  	u8 trace_chan_id, curr_chan_id;
322  
323  	/* extract and parse the HW ID */
324  	hw_id = event->aux_output_hw_id.hw_id;
325  	version = FIELD_GET(CS_AUX_HW_ID_VERSION_MASK, hw_id);
326  	trace_chan_id = FIELD_GET(CS_AUX_HW_ID_TRACE_ID_MASK, hw_id);
327  
328  	/* check that we can handle this version */
329  	if (version > CS_AUX_HW_ID_CURR_VERSION)
330  		return -EINVAL;
331  
332  	/* get access to the etm metadata */
333  	etm = container_of(session->auxtrace, struct cs_etm_auxtrace, auxtrace);
334  	if (!etm || !etm->metadata)
335  		return -EINVAL;
336  
337  	/* parse the sample to get the CPU */
338  	evsel = evlist__event2evsel(session->evlist, event);
339  	if (!evsel)
340  		return -EINVAL;
341  	err = evsel__parse_sample(evsel, event, &sample);
342  	if (err)
343  		return err;
344  	cpu = sample.cpu;
345  	if (cpu == -1) {
346  		/* no CPU in the sample - possibly recorded with an old version of perf */
347  		pr_err("CS_ETM: no CPU AUX_OUTPUT_HW_ID sample. Use compatible perf to record.");
348  		return -EINVAL;
349  	}
350  
351  	/* See if the ID is mapped to a CPU, and it matches the current CPU */
352  	inode = intlist__find(traceid_list, trace_chan_id);
353  	if (inode) {
354  		cpu_data = inode->priv;
355  		if ((int)cpu_data[CS_ETM_CPU] != cpu) {
356  			pr_err("CS_ETM: map mismatch between HW_ID packet CPU and Trace ID\n");
357  			return -EINVAL;
358  		}
359  
360  		/* check that the mapped ID matches */
361  		err = cs_etm__metadata_get_trace_id(&curr_chan_id, cpu_data);
362  		if (err)
363  			return err;
364  		if (curr_chan_id != trace_chan_id) {
365  			pr_err("CS_ETM: mismatch between CPU trace ID and HW_ID packet ID\n");
366  			return -EINVAL;
367  		}
368  
369  		/* mapped and matched - return OK */
370  		return 0;
371  	}
372  
373  	cpu_data = get_cpu_data(etm, cpu);
374  	if (cpu_data == NULL)
375  		return err;
376  
377  	/* not one we've seen before - lets map it */
378  	err = cs_etm__map_trace_id(trace_chan_id, cpu_data);
379  	if (err)
380  		return err;
381  
382  	/*
383  	 * if we are picking up the association from the packet, need to plug
384  	 * the correct trace ID into the metadata for setting up decoders later.
385  	 */
386  	err = cs_etm__metadata_set_trace_id(trace_chan_id, cpu_data);
387  	return err;
388  }
389  
cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue * etmq,u8 trace_chan_id)390  void cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue *etmq,
391  					      u8 trace_chan_id)
392  {
393  	/*
394  	 * When a timestamp packet is encountered the backend code
395  	 * is stopped so that the front end has time to process packets
396  	 * that were accumulated in the traceID queue.  Since there can
397  	 * be more than one channel per cs_etm_queue, we need to specify
398  	 * what traceID queue needs servicing.
399  	 */
400  	etmq->pending_timestamp_chan_id = trace_chan_id;
401  }
402  
cs_etm__etmq_get_timestamp(struct cs_etm_queue * etmq,u8 * trace_chan_id)403  static u64 cs_etm__etmq_get_timestamp(struct cs_etm_queue *etmq,
404  				      u8 *trace_chan_id)
405  {
406  	struct cs_etm_packet_queue *packet_queue;
407  
408  	if (!etmq->pending_timestamp_chan_id)
409  		return 0;
410  
411  	if (trace_chan_id)
412  		*trace_chan_id = etmq->pending_timestamp_chan_id;
413  
414  	packet_queue = cs_etm__etmq_get_packet_queue(etmq,
415  						     etmq->pending_timestamp_chan_id);
416  	if (!packet_queue)
417  		return 0;
418  
419  	/* Acknowledge pending status */
420  	etmq->pending_timestamp_chan_id = 0;
421  
422  	/* See function cs_etm_decoder__do_{hard|soft}_timestamp() */
423  	return packet_queue->cs_timestamp;
424  }
425  
cs_etm__clear_packet_queue(struct cs_etm_packet_queue * queue)426  static void cs_etm__clear_packet_queue(struct cs_etm_packet_queue *queue)
427  {
428  	int i;
429  
430  	queue->head = 0;
431  	queue->tail = 0;
432  	queue->packet_count = 0;
433  	for (i = 0; i < CS_ETM_PACKET_MAX_BUFFER; i++) {
434  		queue->packet_buffer[i].isa = CS_ETM_ISA_UNKNOWN;
435  		queue->packet_buffer[i].start_addr = CS_ETM_INVAL_ADDR;
436  		queue->packet_buffer[i].end_addr = CS_ETM_INVAL_ADDR;
437  		queue->packet_buffer[i].instr_count = 0;
438  		queue->packet_buffer[i].last_instr_taken_branch = false;
439  		queue->packet_buffer[i].last_instr_size = 0;
440  		queue->packet_buffer[i].last_instr_type = 0;
441  		queue->packet_buffer[i].last_instr_subtype = 0;
442  		queue->packet_buffer[i].last_instr_cond = 0;
443  		queue->packet_buffer[i].flags = 0;
444  		queue->packet_buffer[i].exception_number = UINT32_MAX;
445  		queue->packet_buffer[i].trace_chan_id = UINT8_MAX;
446  		queue->packet_buffer[i].cpu = INT_MIN;
447  	}
448  }
449  
cs_etm__clear_all_packet_queues(struct cs_etm_queue * etmq)450  static void cs_etm__clear_all_packet_queues(struct cs_etm_queue *etmq)
451  {
452  	int idx;
453  	struct int_node *inode;
454  	struct cs_etm_traceid_queue *tidq;
455  	struct intlist *traceid_queues_list = etmq->traceid_queues_list;
456  
457  	intlist__for_each_entry(inode, traceid_queues_list) {
458  		idx = (int)(intptr_t)inode->priv;
459  		tidq = etmq->traceid_queues[idx];
460  		cs_etm__clear_packet_queue(&tidq->packet_queue);
461  	}
462  }
463  
cs_etm__init_traceid_queue(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq,u8 trace_chan_id)464  static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq,
465  				      struct cs_etm_traceid_queue *tidq,
466  				      u8 trace_chan_id)
467  {
468  	int rc = -ENOMEM;
469  	struct auxtrace_queue *queue;
470  	struct cs_etm_auxtrace *etm = etmq->etm;
471  
472  	cs_etm__clear_packet_queue(&tidq->packet_queue);
473  
474  	queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
475  	tidq->trace_chan_id = trace_chan_id;
476  	tidq->el = tidq->prev_packet_el = ocsd_EL_unknown;
477  	tidq->thread = machine__findnew_thread(&etm->session->machines.host, -1,
478  					       queue->tid);
479  	tidq->prev_packet_thread = machine__idle_thread(&etm->session->machines.host);
480  
481  	tidq->packet = zalloc(sizeof(struct cs_etm_packet));
482  	if (!tidq->packet)
483  		goto out;
484  
485  	tidq->prev_packet = zalloc(sizeof(struct cs_etm_packet));
486  	if (!tidq->prev_packet)
487  		goto out_free;
488  
489  	if (etm->synth_opts.last_branch) {
490  		size_t sz = sizeof(struct branch_stack);
491  
492  		sz += etm->synth_opts.last_branch_sz *
493  		      sizeof(struct branch_entry);
494  		tidq->last_branch = zalloc(sz);
495  		if (!tidq->last_branch)
496  			goto out_free;
497  		tidq->last_branch_rb = zalloc(sz);
498  		if (!tidq->last_branch_rb)
499  			goto out_free;
500  	}
501  
502  	tidq->event_buf = malloc(PERF_SAMPLE_MAX_SIZE);
503  	if (!tidq->event_buf)
504  		goto out_free;
505  
506  	return 0;
507  
508  out_free:
509  	zfree(&tidq->last_branch_rb);
510  	zfree(&tidq->last_branch);
511  	zfree(&tidq->prev_packet);
512  	zfree(&tidq->packet);
513  out:
514  	return rc;
515  }
516  
517  static struct cs_etm_traceid_queue
cs_etm__etmq_get_traceid_queue(struct cs_etm_queue * etmq,u8 trace_chan_id)518  *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
519  {
520  	int idx;
521  	struct int_node *inode;
522  	struct intlist *traceid_queues_list;
523  	struct cs_etm_traceid_queue *tidq, **traceid_queues;
524  	struct cs_etm_auxtrace *etm = etmq->etm;
525  
526  	if (etm->per_thread_decoding)
527  		trace_chan_id = CS_ETM_PER_THREAD_TRACEID;
528  
529  	traceid_queues_list = etmq->traceid_queues_list;
530  
531  	/*
532  	 * Check if the traceid_queue exist for this traceID by looking
533  	 * in the queue list.
534  	 */
535  	inode = intlist__find(traceid_queues_list, trace_chan_id);
536  	if (inode) {
537  		idx = (int)(intptr_t)inode->priv;
538  		return etmq->traceid_queues[idx];
539  	}
540  
541  	/* We couldn't find a traceid_queue for this traceID, allocate one */
542  	tidq = malloc(sizeof(*tidq));
543  	if (!tidq)
544  		return NULL;
545  
546  	memset(tidq, 0, sizeof(*tidq));
547  
548  	/* Get a valid index for the new traceid_queue */
549  	idx = intlist__nr_entries(traceid_queues_list);
550  	/* Memory for the inode is free'ed in cs_etm_free_traceid_queues () */
551  	inode = intlist__findnew(traceid_queues_list, trace_chan_id);
552  	if (!inode)
553  		goto out_free;
554  
555  	/* Associate this traceID with this index */
556  	inode->priv = (void *)(intptr_t)idx;
557  
558  	if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id))
559  		goto out_free;
560  
561  	/* Grow the traceid_queues array by one unit */
562  	traceid_queues = etmq->traceid_queues;
563  	traceid_queues = reallocarray(traceid_queues,
564  				      idx + 1,
565  				      sizeof(*traceid_queues));
566  
567  	/*
568  	 * On failure reallocarray() returns NULL and the original block of
569  	 * memory is left untouched.
570  	 */
571  	if (!traceid_queues)
572  		goto out_free;
573  
574  	traceid_queues[idx] = tidq;
575  	etmq->traceid_queues = traceid_queues;
576  
577  	return etmq->traceid_queues[idx];
578  
579  out_free:
580  	/*
581  	 * Function intlist__remove() removes the inode from the list
582  	 * and delete the memory associated to it.
583  	 */
584  	intlist__remove(traceid_queues_list, inode);
585  	free(tidq);
586  
587  	return NULL;
588  }
589  
590  struct cs_etm_packet_queue
cs_etm__etmq_get_packet_queue(struct cs_etm_queue * etmq,u8 trace_chan_id)591  *cs_etm__etmq_get_packet_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
592  {
593  	struct cs_etm_traceid_queue *tidq;
594  
595  	tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
596  	if (tidq)
597  		return &tidq->packet_queue;
598  
599  	return NULL;
600  }
601  
cs_etm__packet_swap(struct cs_etm_auxtrace * etm,struct cs_etm_traceid_queue * tidq)602  static void cs_etm__packet_swap(struct cs_etm_auxtrace *etm,
603  				struct cs_etm_traceid_queue *tidq)
604  {
605  	struct cs_etm_packet *tmp;
606  
607  	if (etm->synth_opts.branches || etm->synth_opts.last_branch ||
608  	    etm->synth_opts.instructions) {
609  		/*
610  		 * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
611  		 * the next incoming packet.
612  		 *
613  		 * Threads and exception levels are also tracked for both the
614  		 * previous and current packets. This is because the previous
615  		 * packet is used for the 'from' IP for branch samples, so the
616  		 * thread at that time must also be assigned to that sample.
617  		 * Across discontinuity packets the thread can change, so by
618  		 * tracking the thread for the previous packet the branch sample
619  		 * will have the correct info.
620  		 */
621  		tmp = tidq->packet;
622  		tidq->packet = tidq->prev_packet;
623  		tidq->prev_packet = tmp;
624  		tidq->prev_packet_el = tidq->el;
625  		thread__put(tidq->prev_packet_thread);
626  		tidq->prev_packet_thread = thread__get(tidq->thread);
627  	}
628  }
629  
cs_etm__packet_dump(const char * pkt_string)630  static void cs_etm__packet_dump(const char *pkt_string)
631  {
632  	const char *color = PERF_COLOR_BLUE;
633  	int len = strlen(pkt_string);
634  
635  	if (len && (pkt_string[len-1] == '\n'))
636  		color_fprintf(stdout, color, "	%s", pkt_string);
637  	else
638  		color_fprintf(stdout, color, "	%s\n", pkt_string);
639  
640  	fflush(stdout);
641  }
642  
cs_etm__set_trace_param_etmv3(struct cs_etm_trace_params * t_params,struct cs_etm_auxtrace * etm,int idx,u32 etmidr)643  static void cs_etm__set_trace_param_etmv3(struct cs_etm_trace_params *t_params,
644  					  struct cs_etm_auxtrace *etm, int idx,
645  					  u32 etmidr)
646  {
647  	u64 **metadata = etm->metadata;
648  
649  	t_params[idx].protocol = cs_etm__get_v7_protocol_version(etmidr);
650  	t_params[idx].etmv3.reg_ctrl = metadata[idx][CS_ETM_ETMCR];
651  	t_params[idx].etmv3.reg_trc_id = metadata[idx][CS_ETM_ETMTRACEIDR];
652  }
653  
cs_etm__set_trace_param_etmv4(struct cs_etm_trace_params * t_params,struct cs_etm_auxtrace * etm,int idx)654  static void cs_etm__set_trace_param_etmv4(struct cs_etm_trace_params *t_params,
655  					  struct cs_etm_auxtrace *etm, int idx)
656  {
657  	u64 **metadata = etm->metadata;
658  
659  	t_params[idx].protocol = CS_ETM_PROTO_ETMV4i;
660  	t_params[idx].etmv4.reg_idr0 = metadata[idx][CS_ETMV4_TRCIDR0];
661  	t_params[idx].etmv4.reg_idr1 = metadata[idx][CS_ETMV4_TRCIDR1];
662  	t_params[idx].etmv4.reg_idr2 = metadata[idx][CS_ETMV4_TRCIDR2];
663  	t_params[idx].etmv4.reg_idr8 = metadata[idx][CS_ETMV4_TRCIDR8];
664  	t_params[idx].etmv4.reg_configr = metadata[idx][CS_ETMV4_TRCCONFIGR];
665  	t_params[idx].etmv4.reg_traceidr = metadata[idx][CS_ETMV4_TRCTRACEIDR];
666  }
667  
cs_etm__set_trace_param_ete(struct cs_etm_trace_params * t_params,struct cs_etm_auxtrace * etm,int idx)668  static void cs_etm__set_trace_param_ete(struct cs_etm_trace_params *t_params,
669  					  struct cs_etm_auxtrace *etm, int idx)
670  {
671  	u64 **metadata = etm->metadata;
672  
673  	t_params[idx].protocol = CS_ETM_PROTO_ETE;
674  	t_params[idx].ete.reg_idr0 = metadata[idx][CS_ETE_TRCIDR0];
675  	t_params[idx].ete.reg_idr1 = metadata[idx][CS_ETE_TRCIDR1];
676  	t_params[idx].ete.reg_idr2 = metadata[idx][CS_ETE_TRCIDR2];
677  	t_params[idx].ete.reg_idr8 = metadata[idx][CS_ETE_TRCIDR8];
678  	t_params[idx].ete.reg_configr = metadata[idx][CS_ETE_TRCCONFIGR];
679  	t_params[idx].ete.reg_traceidr = metadata[idx][CS_ETE_TRCTRACEIDR];
680  	t_params[idx].ete.reg_devarch = metadata[idx][CS_ETE_TRCDEVARCH];
681  }
682  
cs_etm__init_trace_params(struct cs_etm_trace_params * t_params,struct cs_etm_auxtrace * etm,int decoders)683  static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params,
684  				     struct cs_etm_auxtrace *etm,
685  				     int decoders)
686  {
687  	int i;
688  	u32 etmidr;
689  	u64 architecture;
690  
691  	for (i = 0; i < decoders; i++) {
692  		architecture = etm->metadata[i][CS_ETM_MAGIC];
693  
694  		switch (architecture) {
695  		case __perf_cs_etmv3_magic:
696  			etmidr = etm->metadata[i][CS_ETM_ETMIDR];
697  			cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr);
698  			break;
699  		case __perf_cs_etmv4_magic:
700  			cs_etm__set_trace_param_etmv4(t_params, etm, i);
701  			break;
702  		case __perf_cs_ete_magic:
703  			cs_etm__set_trace_param_ete(t_params, etm, i);
704  			break;
705  		default:
706  			return -EINVAL;
707  		}
708  	}
709  
710  	return 0;
711  }
712  
cs_etm__init_decoder_params(struct cs_etm_decoder_params * d_params,struct cs_etm_queue * etmq,enum cs_etm_decoder_operation mode,bool formatted)713  static int cs_etm__init_decoder_params(struct cs_etm_decoder_params *d_params,
714  				       struct cs_etm_queue *etmq,
715  				       enum cs_etm_decoder_operation mode,
716  				       bool formatted)
717  {
718  	int ret = -EINVAL;
719  
720  	if (!(mode < CS_ETM_OPERATION_MAX))
721  		goto out;
722  
723  	d_params->packet_printer = cs_etm__packet_dump;
724  	d_params->operation = mode;
725  	d_params->data = etmq;
726  	d_params->formatted = formatted;
727  	d_params->fsyncs = false;
728  	d_params->hsyncs = false;
729  	d_params->frame_aligned = true;
730  
731  	ret = 0;
732  out:
733  	return ret;
734  }
735  
cs_etm__dump_event(struct cs_etm_queue * etmq,struct auxtrace_buffer * buffer)736  static void cs_etm__dump_event(struct cs_etm_queue *etmq,
737  			       struct auxtrace_buffer *buffer)
738  {
739  	int ret;
740  	const char *color = PERF_COLOR_BLUE;
741  	size_t buffer_used = 0;
742  
743  	fprintf(stdout, "\n");
744  	color_fprintf(stdout, color,
745  		     ". ... CoreSight %s Trace data: size %#zx bytes\n",
746  		     cs_etm_decoder__get_name(etmq->decoder), buffer->size);
747  
748  	do {
749  		size_t consumed;
750  
751  		ret = cs_etm_decoder__process_data_block(
752  				etmq->decoder, buffer->offset,
753  				&((u8 *)buffer->data)[buffer_used],
754  				buffer->size - buffer_used, &consumed);
755  		if (ret)
756  			break;
757  
758  		buffer_used += consumed;
759  	} while (buffer_used < buffer->size);
760  
761  	cs_etm_decoder__reset(etmq->decoder);
762  }
763  
cs_etm__flush_events(struct perf_session * session,struct perf_tool * tool)764  static int cs_etm__flush_events(struct perf_session *session,
765  				struct perf_tool *tool)
766  {
767  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
768  						   struct cs_etm_auxtrace,
769  						   auxtrace);
770  	if (dump_trace)
771  		return 0;
772  
773  	if (!tool->ordered_events)
774  		return -EINVAL;
775  
776  	if (etm->timeless_decoding) {
777  		/*
778  		 * Pass tid = -1 to process all queues. But likely they will have
779  		 * already been processed on PERF_RECORD_EXIT anyway.
780  		 */
781  		return cs_etm__process_timeless_queues(etm, -1);
782  	}
783  
784  	return cs_etm__process_timestamped_queues(etm);
785  }
786  
cs_etm__free_traceid_queues(struct cs_etm_queue * etmq)787  static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq)
788  {
789  	int idx;
790  	uintptr_t priv;
791  	struct int_node *inode, *tmp;
792  	struct cs_etm_traceid_queue *tidq;
793  	struct intlist *traceid_queues_list = etmq->traceid_queues_list;
794  
795  	intlist__for_each_entry_safe(inode, tmp, traceid_queues_list) {
796  		priv = (uintptr_t)inode->priv;
797  		idx = priv;
798  
799  		/* Free this traceid_queue from the array */
800  		tidq = etmq->traceid_queues[idx];
801  		thread__zput(tidq->thread);
802  		thread__zput(tidq->prev_packet_thread);
803  		zfree(&tidq->event_buf);
804  		zfree(&tidq->last_branch);
805  		zfree(&tidq->last_branch_rb);
806  		zfree(&tidq->prev_packet);
807  		zfree(&tidq->packet);
808  		zfree(&tidq);
809  
810  		/*
811  		 * Function intlist__remove() removes the inode from the list
812  		 * and delete the memory associated to it.
813  		 */
814  		intlist__remove(traceid_queues_list, inode);
815  	}
816  
817  	/* Then the RB tree itself */
818  	intlist__delete(traceid_queues_list);
819  	etmq->traceid_queues_list = NULL;
820  
821  	/* finally free the traceid_queues array */
822  	zfree(&etmq->traceid_queues);
823  }
824  
cs_etm__free_queue(void * priv)825  static void cs_etm__free_queue(void *priv)
826  {
827  	struct cs_etm_queue *etmq = priv;
828  
829  	if (!etmq)
830  		return;
831  
832  	cs_etm_decoder__free(etmq->decoder);
833  	cs_etm__free_traceid_queues(etmq);
834  	free(etmq);
835  }
836  
cs_etm__free_events(struct perf_session * session)837  static void cs_etm__free_events(struct perf_session *session)
838  {
839  	unsigned int i;
840  	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
841  						   struct cs_etm_auxtrace,
842  						   auxtrace);
843  	struct auxtrace_queues *queues = &aux->queues;
844  
845  	for (i = 0; i < queues->nr_queues; i++) {
846  		cs_etm__free_queue(queues->queue_array[i].priv);
847  		queues->queue_array[i].priv = NULL;
848  	}
849  
850  	auxtrace_queues__free(queues);
851  }
852  
cs_etm__free(struct perf_session * session)853  static void cs_etm__free(struct perf_session *session)
854  {
855  	int i;
856  	struct int_node *inode, *tmp;
857  	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
858  						   struct cs_etm_auxtrace,
859  						   auxtrace);
860  	cs_etm__free_events(session);
861  	session->auxtrace = NULL;
862  
863  	/* First remove all traceID/metadata nodes for the RB tree */
864  	intlist__for_each_entry_safe(inode, tmp, traceid_list)
865  		intlist__remove(traceid_list, inode);
866  	/* Then the RB tree itself */
867  	intlist__delete(traceid_list);
868  
869  	for (i = 0; i < aux->num_cpu; i++)
870  		zfree(&aux->metadata[i]);
871  
872  	zfree(&aux->metadata);
873  	zfree(&aux);
874  }
875  
cs_etm__evsel_is_auxtrace(struct perf_session * session,struct evsel * evsel)876  static bool cs_etm__evsel_is_auxtrace(struct perf_session *session,
877  				      struct evsel *evsel)
878  {
879  	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
880  						   struct cs_etm_auxtrace,
881  						   auxtrace);
882  
883  	return evsel->core.attr.type == aux->pmu_type;
884  }
885  
cs_etm__get_machine(struct cs_etm_queue * etmq,ocsd_ex_level el)886  static struct machine *cs_etm__get_machine(struct cs_etm_queue *etmq,
887  					   ocsd_ex_level el)
888  {
889  	enum cs_etm_pid_fmt pid_fmt = cs_etm__get_pid_fmt(etmq);
890  
891  	/*
892  	 * For any virtualisation based on nVHE (e.g. pKVM), or host kernels
893  	 * running at EL1 assume everything is the host.
894  	 */
895  	if (pid_fmt == CS_ETM_PIDFMT_CTXTID)
896  		return &etmq->etm->session->machines.host;
897  
898  	/*
899  	 * Not perfect, but otherwise assume anything in EL1 is the default
900  	 * guest, and everything else is the host. Distinguishing between guest
901  	 * and host userspaces isn't currently supported either. Neither is
902  	 * multiple guest support. All this does is reduce the likeliness of
903  	 * decode errors where we look into the host kernel maps when it should
904  	 * have been the guest maps.
905  	 */
906  	switch (el) {
907  	case ocsd_EL1:
908  		return machines__find_guest(&etmq->etm->session->machines,
909  					    DEFAULT_GUEST_KERNEL_ID);
910  	case ocsd_EL3:
911  	case ocsd_EL2:
912  	case ocsd_EL0:
913  	case ocsd_EL_unknown:
914  	default:
915  		return &etmq->etm->session->machines.host;
916  	}
917  }
918  
cs_etm__cpu_mode(struct cs_etm_queue * etmq,u64 address,ocsd_ex_level el)919  static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address,
920  			   ocsd_ex_level el)
921  {
922  	struct machine *machine = cs_etm__get_machine(etmq, el);
923  
924  	if (address >= machine__kernel_start(machine)) {
925  		if (machine__is_host(machine))
926  			return PERF_RECORD_MISC_KERNEL;
927  		else
928  			return PERF_RECORD_MISC_GUEST_KERNEL;
929  	} else {
930  		if (machine__is_host(machine))
931  			return PERF_RECORD_MISC_USER;
932  		else {
933  			/*
934  			 * Can't really happen at the moment because
935  			 * cs_etm__get_machine() will always return
936  			 * machines.host for any non EL1 trace.
937  			 */
938  			return PERF_RECORD_MISC_GUEST_USER;
939  		}
940  	}
941  }
942  
cs_etm__mem_access(struct cs_etm_queue * etmq,u8 trace_chan_id,u64 address,size_t size,u8 * buffer,const ocsd_mem_space_acc_t mem_space)943  static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
944  			      u64 address, size_t size, u8 *buffer,
945  			      const ocsd_mem_space_acc_t mem_space)
946  {
947  	u8  cpumode;
948  	u64 offset;
949  	int len;
950  	struct addr_location al;
951  	struct dso *dso;
952  	struct cs_etm_traceid_queue *tidq;
953  	int ret = 0;
954  
955  	if (!etmq)
956  		return 0;
957  
958  	addr_location__init(&al);
959  	tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
960  	if (!tidq)
961  		goto out;
962  
963  	/*
964  	 * We've already tracked EL along side the PID in cs_etm__set_thread()
965  	 * so double check that it matches what OpenCSD thinks as well. It
966  	 * doesn't distinguish between EL0 and EL1 for this mem access callback
967  	 * so we had to do the extra tracking. Skip validation if it's any of
968  	 * the 'any' values.
969  	 */
970  	if (!(mem_space == OCSD_MEM_SPACE_ANY ||
971  	      mem_space == OCSD_MEM_SPACE_N || mem_space == OCSD_MEM_SPACE_S)) {
972  		if (mem_space & OCSD_MEM_SPACE_EL1N) {
973  			/* Includes both non secure EL1 and EL0 */
974  			assert(tidq->el == ocsd_EL1 || tidq->el == ocsd_EL0);
975  		} else if (mem_space & OCSD_MEM_SPACE_EL2)
976  			assert(tidq->el == ocsd_EL2);
977  		else if (mem_space & OCSD_MEM_SPACE_EL3)
978  			assert(tidq->el == ocsd_EL3);
979  	}
980  
981  	cpumode = cs_etm__cpu_mode(etmq, address, tidq->el);
982  
983  	if (!thread__find_map(tidq->thread, cpumode, address, &al))
984  		goto out;
985  
986  	dso = map__dso(al.map);
987  	if (!dso)
988  		goto out;
989  
990  	if (dso->data.status == DSO_DATA_STATUS_ERROR &&
991  	    dso__data_status_seen(dso, DSO_DATA_STATUS_SEEN_ITRACE))
992  		goto out;
993  
994  	offset = map__map_ip(al.map, address);
995  
996  	map__load(al.map);
997  
998  	len = dso__data_read_offset(dso, maps__machine(thread__maps(tidq->thread)),
999  				    offset, buffer, size);
1000  
1001  	if (len <= 0) {
1002  		ui__warning_once("CS ETM Trace: Missing DSO. Use 'perf archive' or debuginfod to export data from the traced system.\n"
1003  				 "              Enable CONFIG_PROC_KCORE or use option '-k /path/to/vmlinux' for kernel symbols.\n");
1004  		if (!dso->auxtrace_warned) {
1005  			pr_err("CS ETM Trace: Debug data not found for address %#"PRIx64" in %s\n",
1006  				    address,
1007  				    dso->long_name ? dso->long_name : "Unknown");
1008  			dso->auxtrace_warned = true;
1009  		}
1010  		goto out;
1011  	}
1012  	ret = len;
1013  out:
1014  	addr_location__exit(&al);
1015  	return ret;
1016  }
1017  
cs_etm__alloc_queue(struct cs_etm_auxtrace * etm,bool formatted)1018  static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
1019  						bool formatted)
1020  {
1021  	struct cs_etm_decoder_params d_params;
1022  	struct cs_etm_trace_params  *t_params = NULL;
1023  	struct cs_etm_queue *etmq;
1024  	/*
1025  	 * Each queue can only contain data from one CPU when unformatted, so only one decoder is
1026  	 * needed.
1027  	 */
1028  	int decoders = formatted ? etm->num_cpu : 1;
1029  
1030  	etmq = zalloc(sizeof(*etmq));
1031  	if (!etmq)
1032  		return NULL;
1033  
1034  	etmq->traceid_queues_list = intlist__new(NULL);
1035  	if (!etmq->traceid_queues_list)
1036  		goto out_free;
1037  
1038  	/* Use metadata to fill in trace parameters for trace decoder */
1039  	t_params = zalloc(sizeof(*t_params) * decoders);
1040  
1041  	if (!t_params)
1042  		goto out_free;
1043  
1044  	if (cs_etm__init_trace_params(t_params, etm, decoders))
1045  		goto out_free;
1046  
1047  	/* Set decoder parameters to decode trace packets */
1048  	if (cs_etm__init_decoder_params(&d_params, etmq,
1049  					dump_trace ? CS_ETM_OPERATION_PRINT :
1050  						     CS_ETM_OPERATION_DECODE,
1051  					formatted))
1052  		goto out_free;
1053  
1054  	etmq->decoder = cs_etm_decoder__new(decoders, &d_params,
1055  					    t_params);
1056  
1057  	if (!etmq->decoder)
1058  		goto out_free;
1059  
1060  	/*
1061  	 * Register a function to handle all memory accesses required by
1062  	 * the trace decoder library.
1063  	 */
1064  	if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
1065  					      0x0L, ((u64) -1L),
1066  					      cs_etm__mem_access))
1067  		goto out_free_decoder;
1068  
1069  	zfree(&t_params);
1070  	return etmq;
1071  
1072  out_free_decoder:
1073  	cs_etm_decoder__free(etmq->decoder);
1074  out_free:
1075  	intlist__delete(etmq->traceid_queues_list);
1076  	free(etmq);
1077  
1078  	return NULL;
1079  }
1080  
cs_etm__setup_queue(struct cs_etm_auxtrace * etm,struct auxtrace_queue * queue,unsigned int queue_nr,bool formatted)1081  static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
1082  			       struct auxtrace_queue *queue,
1083  			       unsigned int queue_nr,
1084  			       bool formatted)
1085  {
1086  	struct cs_etm_queue *etmq = queue->priv;
1087  
1088  	if (list_empty(&queue->head) || etmq)
1089  		return 0;
1090  
1091  	etmq = cs_etm__alloc_queue(etm, formatted);
1092  
1093  	if (!etmq)
1094  		return -ENOMEM;
1095  
1096  	queue->priv = etmq;
1097  	etmq->etm = etm;
1098  	etmq->queue_nr = queue_nr;
1099  	etmq->offset = 0;
1100  
1101  	return 0;
1102  }
1103  
cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace * etm,struct cs_etm_queue * etmq,unsigned int queue_nr)1104  static int cs_etm__queue_first_cs_timestamp(struct cs_etm_auxtrace *etm,
1105  					    struct cs_etm_queue *etmq,
1106  					    unsigned int queue_nr)
1107  {
1108  	int ret = 0;
1109  	unsigned int cs_queue_nr;
1110  	u8 trace_chan_id;
1111  	u64 cs_timestamp;
1112  
1113  	/*
1114  	 * We are under a CPU-wide trace scenario.  As such we need to know
1115  	 * when the code that generated the traces started to execute so that
1116  	 * it can be correlated with execution on other CPUs.  So we get a
1117  	 * handle on the beginning of traces and decode until we find a
1118  	 * timestamp.  The timestamp is then added to the auxtrace min heap
1119  	 * in order to know what nibble (of all the etmqs) to decode first.
1120  	 */
1121  	while (1) {
1122  		/*
1123  		 * Fetch an aux_buffer from this etmq.  Bail if no more
1124  		 * blocks or an error has been encountered.
1125  		 */
1126  		ret = cs_etm__get_data_block(etmq);
1127  		if (ret <= 0)
1128  			goto out;
1129  
1130  		/*
1131  		 * Run decoder on the trace block.  The decoder will stop when
1132  		 * encountering a CS timestamp, a full packet queue or the end of
1133  		 * trace for that block.
1134  		 */
1135  		ret = cs_etm__decode_data_block(etmq);
1136  		if (ret)
1137  			goto out;
1138  
1139  		/*
1140  		 * Function cs_etm_decoder__do_{hard|soft}_timestamp() does all
1141  		 * the timestamp calculation for us.
1142  		 */
1143  		cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
1144  
1145  		/* We found a timestamp, no need to continue. */
1146  		if (cs_timestamp)
1147  			break;
1148  
1149  		/*
1150  		 * We didn't find a timestamp so empty all the traceid packet
1151  		 * queues before looking for another timestamp packet, either
1152  		 * in the current data block or a new one.  Packets that were
1153  		 * just decoded are useless since no timestamp has been
1154  		 * associated with them.  As such simply discard them.
1155  		 */
1156  		cs_etm__clear_all_packet_queues(etmq);
1157  	}
1158  
1159  	/*
1160  	 * We have a timestamp.  Add it to the min heap to reflect when
1161  	 * instructions conveyed by the range packets of this traceID queue
1162  	 * started to execute.  Once the same has been done for all the traceID
1163  	 * queues of each etmq, redenring and decoding can start in
1164  	 * chronological order.
1165  	 *
1166  	 * Note that packets decoded above are still in the traceID's packet
1167  	 * queue and will be processed in cs_etm__process_timestamped_queues().
1168  	 */
1169  	cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_chan_id);
1170  	ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp);
1171  out:
1172  	return ret;
1173  }
1174  
1175  static inline
cs_etm__copy_last_branch_rb(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1176  void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
1177  				 struct cs_etm_traceid_queue *tidq)
1178  {
1179  	struct branch_stack *bs_src = tidq->last_branch_rb;
1180  	struct branch_stack *bs_dst = tidq->last_branch;
1181  	size_t nr = 0;
1182  
1183  	/*
1184  	 * Set the number of records before early exit: ->nr is used to
1185  	 * determine how many branches to copy from ->entries.
1186  	 */
1187  	bs_dst->nr = bs_src->nr;
1188  
1189  	/*
1190  	 * Early exit when there is nothing to copy.
1191  	 */
1192  	if (!bs_src->nr)
1193  		return;
1194  
1195  	/*
1196  	 * As bs_src->entries is a circular buffer, we need to copy from it in
1197  	 * two steps.  First, copy the branches from the most recently inserted
1198  	 * branch ->last_branch_pos until the end of bs_src->entries buffer.
1199  	 */
1200  	nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
1201  	memcpy(&bs_dst->entries[0],
1202  	       &bs_src->entries[tidq->last_branch_pos],
1203  	       sizeof(struct branch_entry) * nr);
1204  
1205  	/*
1206  	 * If we wrapped around at least once, the branches from the beginning
1207  	 * of the bs_src->entries buffer and until the ->last_branch_pos element
1208  	 * are older valid branches: copy them over.  The total number of
1209  	 * branches copied over will be equal to the number of branches asked by
1210  	 * the user in last_branch_sz.
1211  	 */
1212  	if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
1213  		memcpy(&bs_dst->entries[nr],
1214  		       &bs_src->entries[0],
1215  		       sizeof(struct branch_entry) * tidq->last_branch_pos);
1216  	}
1217  }
1218  
1219  static inline
cs_etm__reset_last_branch_rb(struct cs_etm_traceid_queue * tidq)1220  void cs_etm__reset_last_branch_rb(struct cs_etm_traceid_queue *tidq)
1221  {
1222  	tidq->last_branch_pos = 0;
1223  	tidq->last_branch_rb->nr = 0;
1224  }
1225  
cs_etm__t32_instr_size(struct cs_etm_queue * etmq,u8 trace_chan_id,u64 addr)1226  static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq,
1227  					 u8 trace_chan_id, u64 addr)
1228  {
1229  	u8 instrBytes[2];
1230  
1231  	cs_etm__mem_access(etmq, trace_chan_id, addr, ARRAY_SIZE(instrBytes),
1232  			   instrBytes, 0);
1233  	/*
1234  	 * T32 instruction size is indicated by bits[15:11] of the first
1235  	 * 16-bit word of the instruction: 0b11101, 0b11110 and 0b11111
1236  	 * denote a 32-bit instruction.
1237  	 */
1238  	return ((instrBytes[1] & 0xF8) >= 0xE8) ? 4 : 2;
1239  }
1240  
cs_etm__first_executed_instr(struct cs_etm_packet * packet)1241  static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
1242  {
1243  	/* Returns 0 for the CS_ETM_DISCONTINUITY packet */
1244  	if (packet->sample_type == CS_ETM_DISCONTINUITY)
1245  		return 0;
1246  
1247  	return packet->start_addr;
1248  }
1249  
1250  static inline
cs_etm__last_executed_instr(const struct cs_etm_packet * packet)1251  u64 cs_etm__last_executed_instr(const struct cs_etm_packet *packet)
1252  {
1253  	/* Returns 0 for the CS_ETM_DISCONTINUITY packet */
1254  	if (packet->sample_type == CS_ETM_DISCONTINUITY)
1255  		return 0;
1256  
1257  	return packet->end_addr - packet->last_instr_size;
1258  }
1259  
cs_etm__instr_addr(struct cs_etm_queue * etmq,u64 trace_chan_id,const struct cs_etm_packet * packet,u64 offset)1260  static inline u64 cs_etm__instr_addr(struct cs_etm_queue *etmq,
1261  				     u64 trace_chan_id,
1262  				     const struct cs_etm_packet *packet,
1263  				     u64 offset)
1264  {
1265  	if (packet->isa == CS_ETM_ISA_T32) {
1266  		u64 addr = packet->start_addr;
1267  
1268  		while (offset) {
1269  			addr += cs_etm__t32_instr_size(etmq,
1270  						       trace_chan_id, addr);
1271  			offset--;
1272  		}
1273  		return addr;
1274  	}
1275  
1276  	/* Assume a 4 byte instruction size (A32/A64) */
1277  	return packet->start_addr + offset * 4;
1278  }
1279  
cs_etm__update_last_branch_rb(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1280  static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq,
1281  					  struct cs_etm_traceid_queue *tidq)
1282  {
1283  	struct branch_stack *bs = tidq->last_branch_rb;
1284  	struct branch_entry *be;
1285  
1286  	/*
1287  	 * The branches are recorded in a circular buffer in reverse
1288  	 * chronological order: we start recording from the last element of the
1289  	 * buffer down.  After writing the first element of the stack, move the
1290  	 * insert position back to the end of the buffer.
1291  	 */
1292  	if (!tidq->last_branch_pos)
1293  		tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
1294  
1295  	tidq->last_branch_pos -= 1;
1296  
1297  	be       = &bs->entries[tidq->last_branch_pos];
1298  	be->from = cs_etm__last_executed_instr(tidq->prev_packet);
1299  	be->to	 = cs_etm__first_executed_instr(tidq->packet);
1300  	/* No support for mispredict */
1301  	be->flags.mispred = 0;
1302  	be->flags.predicted = 1;
1303  
1304  	/*
1305  	 * Increment bs->nr until reaching the number of last branches asked by
1306  	 * the user on the command line.
1307  	 */
1308  	if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
1309  		bs->nr += 1;
1310  }
1311  
cs_etm__inject_event(union perf_event * event,struct perf_sample * sample,u64 type)1312  static int cs_etm__inject_event(union perf_event *event,
1313  			       struct perf_sample *sample, u64 type)
1314  {
1315  	event->header.size = perf_event__sample_event_size(sample, type, 0);
1316  	return perf_event__synthesize_sample(event, type, 0, sample);
1317  }
1318  
1319  
1320  static int
cs_etm__get_trace(struct cs_etm_queue * etmq)1321  cs_etm__get_trace(struct cs_etm_queue *etmq)
1322  {
1323  	struct auxtrace_buffer *aux_buffer = etmq->buffer;
1324  	struct auxtrace_buffer *old_buffer = aux_buffer;
1325  	struct auxtrace_queue *queue;
1326  
1327  	queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1328  
1329  	aux_buffer = auxtrace_buffer__next(queue, aux_buffer);
1330  
1331  	/* If no more data, drop the previous auxtrace_buffer and return */
1332  	if (!aux_buffer) {
1333  		if (old_buffer)
1334  			auxtrace_buffer__drop_data(old_buffer);
1335  		etmq->buf_len = 0;
1336  		return 0;
1337  	}
1338  
1339  	etmq->buffer = aux_buffer;
1340  
1341  	/* If the aux_buffer doesn't have data associated, try to load it */
1342  	if (!aux_buffer->data) {
1343  		/* get the file desc associated with the perf data file */
1344  		int fd = perf_data__fd(etmq->etm->session->data);
1345  
1346  		aux_buffer->data = auxtrace_buffer__get_data(aux_buffer, fd);
1347  		if (!aux_buffer->data)
1348  			return -ENOMEM;
1349  	}
1350  
1351  	/* If valid, drop the previous buffer */
1352  	if (old_buffer)
1353  		auxtrace_buffer__drop_data(old_buffer);
1354  
1355  	etmq->buf_used = 0;
1356  	etmq->buf_len = aux_buffer->size;
1357  	etmq->buf = aux_buffer->data;
1358  
1359  	return etmq->buf_len;
1360  }
1361  
cs_etm__set_thread(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq,pid_t tid,ocsd_ex_level el)1362  static void cs_etm__set_thread(struct cs_etm_queue *etmq,
1363  			       struct cs_etm_traceid_queue *tidq, pid_t tid,
1364  			       ocsd_ex_level el)
1365  {
1366  	struct machine *machine = cs_etm__get_machine(etmq, el);
1367  
1368  	if (tid != -1) {
1369  		thread__zput(tidq->thread);
1370  		tidq->thread = machine__find_thread(machine, -1, tid);
1371  	}
1372  
1373  	/* Couldn't find a known thread */
1374  	if (!tidq->thread)
1375  		tidq->thread = machine__idle_thread(machine);
1376  
1377  	tidq->el = el;
1378  }
1379  
cs_etm__etmq_set_tid_el(struct cs_etm_queue * etmq,pid_t tid,u8 trace_chan_id,ocsd_ex_level el)1380  int cs_etm__etmq_set_tid_el(struct cs_etm_queue *etmq, pid_t tid,
1381  			    u8 trace_chan_id, ocsd_ex_level el)
1382  {
1383  	struct cs_etm_traceid_queue *tidq;
1384  
1385  	tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
1386  	if (!tidq)
1387  		return -EINVAL;
1388  
1389  	cs_etm__set_thread(etmq, tidq, tid, el);
1390  	return 0;
1391  }
1392  
cs_etm__etmq_is_timeless(struct cs_etm_queue * etmq)1393  bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq)
1394  {
1395  	return !!etmq->etm->timeless_decoding;
1396  }
1397  
cs_etm__copy_insn(struct cs_etm_queue * etmq,u64 trace_chan_id,const struct cs_etm_packet * packet,struct perf_sample * sample)1398  static void cs_etm__copy_insn(struct cs_etm_queue *etmq,
1399  			      u64 trace_chan_id,
1400  			      const struct cs_etm_packet *packet,
1401  			      struct perf_sample *sample)
1402  {
1403  	/*
1404  	 * It's pointless to read instructions for the CS_ETM_DISCONTINUITY
1405  	 * packet, so directly bail out with 'insn_len' = 0.
1406  	 */
1407  	if (packet->sample_type == CS_ETM_DISCONTINUITY) {
1408  		sample->insn_len = 0;
1409  		return;
1410  	}
1411  
1412  	/*
1413  	 * T32 instruction size might be 32-bit or 16-bit, decide by calling
1414  	 * cs_etm__t32_instr_size().
1415  	 */
1416  	if (packet->isa == CS_ETM_ISA_T32)
1417  		sample->insn_len = cs_etm__t32_instr_size(etmq, trace_chan_id,
1418  							  sample->ip);
1419  	/* Otherwise, A64 and A32 instruction size are always 32-bit. */
1420  	else
1421  		sample->insn_len = 4;
1422  
1423  	cs_etm__mem_access(etmq, trace_chan_id, sample->ip, sample->insn_len,
1424  			   (void *)sample->insn, 0);
1425  }
1426  
cs_etm__convert_sample_time(struct cs_etm_queue * etmq,u64 cs_timestamp)1427  u64 cs_etm__convert_sample_time(struct cs_etm_queue *etmq, u64 cs_timestamp)
1428  {
1429  	struct cs_etm_auxtrace *etm = etmq->etm;
1430  
1431  	if (etm->has_virtual_ts)
1432  		return tsc_to_perf_time(cs_timestamp, &etm->tc);
1433  	else
1434  		return cs_timestamp;
1435  }
1436  
cs_etm__resolve_sample_time(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1437  static inline u64 cs_etm__resolve_sample_time(struct cs_etm_queue *etmq,
1438  					       struct cs_etm_traceid_queue *tidq)
1439  {
1440  	struct cs_etm_auxtrace *etm = etmq->etm;
1441  	struct cs_etm_packet_queue *packet_queue = &tidq->packet_queue;
1442  
1443  	if (!etm->timeless_decoding && etm->has_virtual_ts)
1444  		return packet_queue->cs_timestamp;
1445  	else
1446  		return etm->latest_kernel_timestamp;
1447  }
1448  
cs_etm__synth_instruction_sample(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq,u64 addr,u64 period)1449  static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq,
1450  					    struct cs_etm_traceid_queue *tidq,
1451  					    u64 addr, u64 period)
1452  {
1453  	int ret = 0;
1454  	struct cs_etm_auxtrace *etm = etmq->etm;
1455  	union perf_event *event = tidq->event_buf;
1456  	struct perf_sample sample = {.ip = 0,};
1457  
1458  	event->sample.header.type = PERF_RECORD_SAMPLE;
1459  	event->sample.header.misc = cs_etm__cpu_mode(etmq, addr, tidq->el);
1460  	event->sample.header.size = sizeof(struct perf_event_header);
1461  
1462  	/* Set time field based on etm auxtrace config. */
1463  	sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1464  
1465  	sample.ip = addr;
1466  	sample.pid = thread__pid(tidq->thread);
1467  	sample.tid = thread__tid(tidq->thread);
1468  	sample.id = etmq->etm->instructions_id;
1469  	sample.stream_id = etmq->etm->instructions_id;
1470  	sample.period = period;
1471  	sample.cpu = tidq->packet->cpu;
1472  	sample.flags = tidq->prev_packet->flags;
1473  	sample.cpumode = event->sample.header.misc;
1474  
1475  	cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample);
1476  
1477  	if (etm->synth_opts.last_branch)
1478  		sample.branch_stack = tidq->last_branch;
1479  
1480  	if (etm->synth_opts.inject) {
1481  		ret = cs_etm__inject_event(event, &sample,
1482  					   etm->instructions_sample_type);
1483  		if (ret)
1484  			return ret;
1485  	}
1486  
1487  	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1488  
1489  	if (ret)
1490  		pr_err(
1491  			"CS ETM Trace: failed to deliver instruction event, error %d\n",
1492  			ret);
1493  
1494  	return ret;
1495  }
1496  
1497  /*
1498   * The cs etm packet encodes an instruction range between a branch target
1499   * and the next taken branch. Generate sample accordingly.
1500   */
cs_etm__synth_branch_sample(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1501  static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
1502  				       struct cs_etm_traceid_queue *tidq)
1503  {
1504  	int ret = 0;
1505  	struct cs_etm_auxtrace *etm = etmq->etm;
1506  	struct perf_sample sample = {.ip = 0,};
1507  	union perf_event *event = tidq->event_buf;
1508  	struct dummy_branch_stack {
1509  		u64			nr;
1510  		u64			hw_idx;
1511  		struct branch_entry	entries;
1512  	} dummy_bs;
1513  	u64 ip;
1514  
1515  	ip = cs_etm__last_executed_instr(tidq->prev_packet);
1516  
1517  	event->sample.header.type = PERF_RECORD_SAMPLE;
1518  	event->sample.header.misc = cs_etm__cpu_mode(etmq, ip,
1519  						     tidq->prev_packet_el);
1520  	event->sample.header.size = sizeof(struct perf_event_header);
1521  
1522  	/* Set time field based on etm auxtrace config. */
1523  	sample.time = cs_etm__resolve_sample_time(etmq, tidq);
1524  
1525  	sample.ip = ip;
1526  	sample.pid = thread__pid(tidq->prev_packet_thread);
1527  	sample.tid = thread__tid(tidq->prev_packet_thread);
1528  	sample.addr = cs_etm__first_executed_instr(tidq->packet);
1529  	sample.id = etmq->etm->branches_id;
1530  	sample.stream_id = etmq->etm->branches_id;
1531  	sample.period = 1;
1532  	sample.cpu = tidq->packet->cpu;
1533  	sample.flags = tidq->prev_packet->flags;
1534  	sample.cpumode = event->sample.header.misc;
1535  
1536  	cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->prev_packet,
1537  			  &sample);
1538  
1539  	/*
1540  	 * perf report cannot handle events without a branch stack
1541  	 */
1542  	if (etm->synth_opts.last_branch) {
1543  		dummy_bs = (struct dummy_branch_stack){
1544  			.nr = 1,
1545  			.hw_idx = -1ULL,
1546  			.entries = {
1547  				.from = sample.ip,
1548  				.to = sample.addr,
1549  			},
1550  		};
1551  		sample.branch_stack = (struct branch_stack *)&dummy_bs;
1552  	}
1553  
1554  	if (etm->synth_opts.inject) {
1555  		ret = cs_etm__inject_event(event, &sample,
1556  					   etm->branches_sample_type);
1557  		if (ret)
1558  			return ret;
1559  	}
1560  
1561  	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1562  
1563  	if (ret)
1564  		pr_err(
1565  		"CS ETM Trace: failed to deliver instruction event, error %d\n",
1566  		ret);
1567  
1568  	return ret;
1569  }
1570  
1571  struct cs_etm_synth {
1572  	struct perf_tool dummy_tool;
1573  	struct perf_session *session;
1574  };
1575  
cs_etm__event_synth(struct perf_tool * tool,union perf_event * event,struct perf_sample * sample __maybe_unused,struct machine * machine __maybe_unused)1576  static int cs_etm__event_synth(struct perf_tool *tool,
1577  			       union perf_event *event,
1578  			       struct perf_sample *sample __maybe_unused,
1579  			       struct machine *machine __maybe_unused)
1580  {
1581  	struct cs_etm_synth *cs_etm_synth =
1582  		      container_of(tool, struct cs_etm_synth, dummy_tool);
1583  
1584  	return perf_session__deliver_synth_event(cs_etm_synth->session,
1585  						 event, NULL);
1586  }
1587  
cs_etm__synth_event(struct perf_session * session,struct perf_event_attr * attr,u64 id)1588  static int cs_etm__synth_event(struct perf_session *session,
1589  			       struct perf_event_attr *attr, u64 id)
1590  {
1591  	struct cs_etm_synth cs_etm_synth;
1592  
1593  	memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
1594  	cs_etm_synth.session = session;
1595  
1596  	return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
1597  					   &id, cs_etm__event_synth);
1598  }
1599  
cs_etm__synth_events(struct cs_etm_auxtrace * etm,struct perf_session * session)1600  static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
1601  				struct perf_session *session)
1602  {
1603  	struct evlist *evlist = session->evlist;
1604  	struct evsel *evsel;
1605  	struct perf_event_attr attr;
1606  	bool found = false;
1607  	u64 id;
1608  	int err;
1609  
1610  	evlist__for_each_entry(evlist, evsel) {
1611  		if (evsel->core.attr.type == etm->pmu_type) {
1612  			found = true;
1613  			break;
1614  		}
1615  	}
1616  
1617  	if (!found) {
1618  		pr_debug("No selected events with CoreSight Trace data\n");
1619  		return 0;
1620  	}
1621  
1622  	memset(&attr, 0, sizeof(struct perf_event_attr));
1623  	attr.size = sizeof(struct perf_event_attr);
1624  	attr.type = PERF_TYPE_HARDWARE;
1625  	attr.sample_type = evsel->core.attr.sample_type & PERF_SAMPLE_MASK;
1626  	attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID |
1627  			    PERF_SAMPLE_PERIOD;
1628  	if (etm->timeless_decoding)
1629  		attr.sample_type &= ~(u64)PERF_SAMPLE_TIME;
1630  	else
1631  		attr.sample_type |= PERF_SAMPLE_TIME;
1632  
1633  	attr.exclude_user = evsel->core.attr.exclude_user;
1634  	attr.exclude_kernel = evsel->core.attr.exclude_kernel;
1635  	attr.exclude_hv = evsel->core.attr.exclude_hv;
1636  	attr.exclude_host = evsel->core.attr.exclude_host;
1637  	attr.exclude_guest = evsel->core.attr.exclude_guest;
1638  	attr.sample_id_all = evsel->core.attr.sample_id_all;
1639  	attr.read_format = evsel->core.attr.read_format;
1640  
1641  	/* create new id val to be a fixed offset from evsel id */
1642  	id = evsel->core.id[0] + 1000000000;
1643  
1644  	if (!id)
1645  		id = 1;
1646  
1647  	if (etm->synth_opts.branches) {
1648  		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
1649  		attr.sample_period = 1;
1650  		attr.sample_type |= PERF_SAMPLE_ADDR;
1651  		err = cs_etm__synth_event(session, &attr, id);
1652  		if (err)
1653  			return err;
1654  		etm->branches_sample_type = attr.sample_type;
1655  		etm->branches_id = id;
1656  		id += 1;
1657  		attr.sample_type &= ~(u64)PERF_SAMPLE_ADDR;
1658  	}
1659  
1660  	if (etm->synth_opts.last_branch) {
1661  		attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
1662  		/*
1663  		 * We don't use the hardware index, but the sample generation
1664  		 * code uses the new format branch_stack with this field,
1665  		 * so the event attributes must indicate that it's present.
1666  		 */
1667  		attr.branch_sample_type |= PERF_SAMPLE_BRANCH_HW_INDEX;
1668  	}
1669  
1670  	if (etm->synth_opts.instructions) {
1671  		attr.config = PERF_COUNT_HW_INSTRUCTIONS;
1672  		attr.sample_period = etm->synth_opts.period;
1673  		etm->instructions_sample_period = attr.sample_period;
1674  		err = cs_etm__synth_event(session, &attr, id);
1675  		if (err)
1676  			return err;
1677  		etm->instructions_sample_type = attr.sample_type;
1678  		etm->instructions_id = id;
1679  		id += 1;
1680  	}
1681  
1682  	return 0;
1683  }
1684  
cs_etm__sample(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1685  static int cs_etm__sample(struct cs_etm_queue *etmq,
1686  			  struct cs_etm_traceid_queue *tidq)
1687  {
1688  	struct cs_etm_auxtrace *etm = etmq->etm;
1689  	int ret;
1690  	u8 trace_chan_id = tidq->trace_chan_id;
1691  	u64 instrs_prev;
1692  
1693  	/* Get instructions remainder from previous packet */
1694  	instrs_prev = tidq->period_instructions;
1695  
1696  	tidq->period_instructions += tidq->packet->instr_count;
1697  
1698  	/*
1699  	 * Record a branch when the last instruction in
1700  	 * PREV_PACKET is a branch.
1701  	 */
1702  	if (etm->synth_opts.last_branch &&
1703  	    tidq->prev_packet->sample_type == CS_ETM_RANGE &&
1704  	    tidq->prev_packet->last_instr_taken_branch)
1705  		cs_etm__update_last_branch_rb(etmq, tidq);
1706  
1707  	if (etm->synth_opts.instructions &&
1708  	    tidq->period_instructions >= etm->instructions_sample_period) {
1709  		/*
1710  		 * Emit instruction sample periodically
1711  		 * TODO: allow period to be defined in cycles and clock time
1712  		 */
1713  
1714  		/*
1715  		 * Below diagram demonstrates the instruction samples
1716  		 * generation flows:
1717  		 *
1718  		 *    Instrs     Instrs       Instrs       Instrs
1719  		 *   Sample(n)  Sample(n+1)  Sample(n+2)  Sample(n+3)
1720  		 *    |            |            |            |
1721  		 *    V            V            V            V
1722  		 *   --------------------------------------------------
1723  		 *            ^                                  ^
1724  		 *            |                                  |
1725  		 *         Period                             Period
1726  		 *    instructions(Pi)                   instructions(Pi')
1727  		 *
1728  		 *            |                                  |
1729  		 *            \---------------- -----------------/
1730  		 *                             V
1731  		 *                 tidq->packet->instr_count
1732  		 *
1733  		 * Instrs Sample(n...) are the synthesised samples occurring
1734  		 * every etm->instructions_sample_period instructions - as
1735  		 * defined on the perf command line.  Sample(n) is being the
1736  		 * last sample before the current etm packet, n+1 to n+3
1737  		 * samples are generated from the current etm packet.
1738  		 *
1739  		 * tidq->packet->instr_count represents the number of
1740  		 * instructions in the current etm packet.
1741  		 *
1742  		 * Period instructions (Pi) contains the number of
1743  		 * instructions executed after the sample point(n) from the
1744  		 * previous etm packet.  This will always be less than
1745  		 * etm->instructions_sample_period.
1746  		 *
1747  		 * When generate new samples, it combines with two parts
1748  		 * instructions, one is the tail of the old packet and another
1749  		 * is the head of the new coming packet, to generate
1750  		 * sample(n+1); sample(n+2) and sample(n+3) consume the
1751  		 * instructions with sample period.  After sample(n+3), the rest
1752  		 * instructions will be used by later packet and it is assigned
1753  		 * to tidq->period_instructions for next round calculation.
1754  		 */
1755  
1756  		/*
1757  		 * Get the initial offset into the current packet instructions;
1758  		 * entry conditions ensure that instrs_prev is less than
1759  		 * etm->instructions_sample_period.
1760  		 */
1761  		u64 offset = etm->instructions_sample_period - instrs_prev;
1762  		u64 addr;
1763  
1764  		/* Prepare last branches for instruction sample */
1765  		if (etm->synth_opts.last_branch)
1766  			cs_etm__copy_last_branch_rb(etmq, tidq);
1767  
1768  		while (tidq->period_instructions >=
1769  				etm->instructions_sample_period) {
1770  			/*
1771  			 * Calculate the address of the sampled instruction (-1
1772  			 * as sample is reported as though instruction has just
1773  			 * been executed, but PC has not advanced to next
1774  			 * instruction)
1775  			 */
1776  			addr = cs_etm__instr_addr(etmq, trace_chan_id,
1777  						  tidq->packet, offset - 1);
1778  			ret = cs_etm__synth_instruction_sample(
1779  				etmq, tidq, addr,
1780  				etm->instructions_sample_period);
1781  			if (ret)
1782  				return ret;
1783  
1784  			offset += etm->instructions_sample_period;
1785  			tidq->period_instructions -=
1786  				etm->instructions_sample_period;
1787  		}
1788  	}
1789  
1790  	if (etm->synth_opts.branches) {
1791  		bool generate_sample = false;
1792  
1793  		/* Generate sample for tracing on packet */
1794  		if (tidq->prev_packet->sample_type == CS_ETM_DISCONTINUITY)
1795  			generate_sample = true;
1796  
1797  		/* Generate sample for branch taken packet */
1798  		if (tidq->prev_packet->sample_type == CS_ETM_RANGE &&
1799  		    tidq->prev_packet->last_instr_taken_branch)
1800  			generate_sample = true;
1801  
1802  		if (generate_sample) {
1803  			ret = cs_etm__synth_branch_sample(etmq, tidq);
1804  			if (ret)
1805  				return ret;
1806  		}
1807  	}
1808  
1809  	cs_etm__packet_swap(etm, tidq);
1810  
1811  	return 0;
1812  }
1813  
cs_etm__exception(struct cs_etm_traceid_queue * tidq)1814  static int cs_etm__exception(struct cs_etm_traceid_queue *tidq)
1815  {
1816  	/*
1817  	 * When the exception packet is inserted, whether the last instruction
1818  	 * in previous range packet is taken branch or not, we need to force
1819  	 * to set 'prev_packet->last_instr_taken_branch' to true.  This ensures
1820  	 * to generate branch sample for the instruction range before the
1821  	 * exception is trapped to kernel or before the exception returning.
1822  	 *
1823  	 * The exception packet includes the dummy address values, so don't
1824  	 * swap PACKET with PREV_PACKET.  This keeps PREV_PACKET to be useful
1825  	 * for generating instruction and branch samples.
1826  	 */
1827  	if (tidq->prev_packet->sample_type == CS_ETM_RANGE)
1828  		tidq->prev_packet->last_instr_taken_branch = true;
1829  
1830  	return 0;
1831  }
1832  
cs_etm__flush(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1833  static int cs_etm__flush(struct cs_etm_queue *etmq,
1834  			 struct cs_etm_traceid_queue *tidq)
1835  {
1836  	int err = 0;
1837  	struct cs_etm_auxtrace *etm = etmq->etm;
1838  
1839  	/* Handle start tracing packet */
1840  	if (tidq->prev_packet->sample_type == CS_ETM_EMPTY)
1841  		goto swap_packet;
1842  
1843  	if (etmq->etm->synth_opts.last_branch &&
1844  	    etmq->etm->synth_opts.instructions &&
1845  	    tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1846  		u64 addr;
1847  
1848  		/* Prepare last branches for instruction sample */
1849  		cs_etm__copy_last_branch_rb(etmq, tidq);
1850  
1851  		/*
1852  		 * Generate a last branch event for the branches left in the
1853  		 * circular buffer at the end of the trace.
1854  		 *
1855  		 * Use the address of the end of the last reported execution
1856  		 * range
1857  		 */
1858  		addr = cs_etm__last_executed_instr(tidq->prev_packet);
1859  
1860  		err = cs_etm__synth_instruction_sample(
1861  			etmq, tidq, addr,
1862  			tidq->period_instructions);
1863  		if (err)
1864  			return err;
1865  
1866  		tidq->period_instructions = 0;
1867  
1868  	}
1869  
1870  	if (etm->synth_opts.branches &&
1871  	    tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1872  		err = cs_etm__synth_branch_sample(etmq, tidq);
1873  		if (err)
1874  			return err;
1875  	}
1876  
1877  swap_packet:
1878  	cs_etm__packet_swap(etm, tidq);
1879  
1880  	/* Reset last branches after flush the trace */
1881  	if (etm->synth_opts.last_branch)
1882  		cs_etm__reset_last_branch_rb(tidq);
1883  
1884  	return err;
1885  }
1886  
cs_etm__end_block(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)1887  static int cs_etm__end_block(struct cs_etm_queue *etmq,
1888  			     struct cs_etm_traceid_queue *tidq)
1889  {
1890  	int err;
1891  
1892  	/*
1893  	 * It has no new packet coming and 'etmq->packet' contains the stale
1894  	 * packet which was set at the previous time with packets swapping;
1895  	 * so skip to generate branch sample to avoid stale packet.
1896  	 *
1897  	 * For this case only flush branch stack and generate a last branch
1898  	 * event for the branches left in the circular buffer at the end of
1899  	 * the trace.
1900  	 */
1901  	if (etmq->etm->synth_opts.last_branch &&
1902  	    etmq->etm->synth_opts.instructions &&
1903  	    tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1904  		u64 addr;
1905  
1906  		/* Prepare last branches for instruction sample */
1907  		cs_etm__copy_last_branch_rb(etmq, tidq);
1908  
1909  		/*
1910  		 * Use the address of the end of the last reported execution
1911  		 * range.
1912  		 */
1913  		addr = cs_etm__last_executed_instr(tidq->prev_packet);
1914  
1915  		err = cs_etm__synth_instruction_sample(
1916  			etmq, tidq, addr,
1917  			tidq->period_instructions);
1918  		if (err)
1919  			return err;
1920  
1921  		tidq->period_instructions = 0;
1922  	}
1923  
1924  	return 0;
1925  }
1926  /*
1927   * cs_etm__get_data_block: Fetch a block from the auxtrace_buffer queue
1928   *			   if need be.
1929   * Returns:	< 0	if error
1930   *		= 0	if no more auxtrace_buffer to read
1931   *		> 0	if the current buffer isn't empty yet
1932   */
cs_etm__get_data_block(struct cs_etm_queue * etmq)1933  static int cs_etm__get_data_block(struct cs_etm_queue *etmq)
1934  {
1935  	int ret;
1936  
1937  	if (!etmq->buf_len) {
1938  		ret = cs_etm__get_trace(etmq);
1939  		if (ret <= 0)
1940  			return ret;
1941  		/*
1942  		 * We cannot assume consecutive blocks in the data file
1943  		 * are contiguous, reset the decoder to force re-sync.
1944  		 */
1945  		ret = cs_etm_decoder__reset(etmq->decoder);
1946  		if (ret)
1947  			return ret;
1948  	}
1949  
1950  	return etmq->buf_len;
1951  }
1952  
cs_etm__is_svc_instr(struct cs_etm_queue * etmq,u8 trace_chan_id,struct cs_etm_packet * packet,u64 end_addr)1953  static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id,
1954  				 struct cs_etm_packet *packet,
1955  				 u64 end_addr)
1956  {
1957  	/* Initialise to keep compiler happy */
1958  	u16 instr16 = 0;
1959  	u32 instr32 = 0;
1960  	u64 addr;
1961  
1962  	switch (packet->isa) {
1963  	case CS_ETM_ISA_T32:
1964  		/*
1965  		 * The SVC of T32 is defined in ARM DDI 0487D.a, F5.1.247:
1966  		 *
1967  		 *  b'15         b'8
1968  		 * +-----------------+--------+
1969  		 * | 1 1 0 1 1 1 1 1 |  imm8  |
1970  		 * +-----------------+--------+
1971  		 *
1972  		 * According to the specification, it only defines SVC for T32
1973  		 * with 16 bits instruction and has no definition for 32bits;
1974  		 * so below only read 2 bytes as instruction size for T32.
1975  		 */
1976  		addr = end_addr - 2;
1977  		cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr16),
1978  				   (u8 *)&instr16, 0);
1979  		if ((instr16 & 0xFF00) == 0xDF00)
1980  			return true;
1981  
1982  		break;
1983  	case CS_ETM_ISA_A32:
1984  		/*
1985  		 * The SVC of A32 is defined in ARM DDI 0487D.a, F5.1.247:
1986  		 *
1987  		 *  b'31 b'28 b'27 b'24
1988  		 * +---------+---------+-------------------------+
1989  		 * |  !1111  | 1 1 1 1 |        imm24            |
1990  		 * +---------+---------+-------------------------+
1991  		 */
1992  		addr = end_addr - 4;
1993  		cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
1994  				   (u8 *)&instr32, 0);
1995  		if ((instr32 & 0x0F000000) == 0x0F000000 &&
1996  		    (instr32 & 0xF0000000) != 0xF0000000)
1997  			return true;
1998  
1999  		break;
2000  	case CS_ETM_ISA_A64:
2001  		/*
2002  		 * The SVC of A64 is defined in ARM DDI 0487D.a, C6.2.294:
2003  		 *
2004  		 *  b'31               b'21           b'4     b'0
2005  		 * +-----------------------+---------+-----------+
2006  		 * | 1 1 0 1 0 1 0 0 0 0 0 |  imm16  | 0 0 0 0 1 |
2007  		 * +-----------------------+---------+-----------+
2008  		 */
2009  		addr = end_addr - 4;
2010  		cs_etm__mem_access(etmq, trace_chan_id, addr, sizeof(instr32),
2011  				   (u8 *)&instr32, 0);
2012  		if ((instr32 & 0xFFE0001F) == 0xd4000001)
2013  			return true;
2014  
2015  		break;
2016  	case CS_ETM_ISA_UNKNOWN:
2017  	default:
2018  		break;
2019  	}
2020  
2021  	return false;
2022  }
2023  
cs_etm__is_syscall(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq,u64 magic)2024  static bool cs_etm__is_syscall(struct cs_etm_queue *etmq,
2025  			       struct cs_etm_traceid_queue *tidq, u64 magic)
2026  {
2027  	u8 trace_chan_id = tidq->trace_chan_id;
2028  	struct cs_etm_packet *packet = tidq->packet;
2029  	struct cs_etm_packet *prev_packet = tidq->prev_packet;
2030  
2031  	if (magic == __perf_cs_etmv3_magic)
2032  		if (packet->exception_number == CS_ETMV3_EXC_SVC)
2033  			return true;
2034  
2035  	/*
2036  	 * ETMv4 exception type CS_ETMV4_EXC_CALL covers SVC, SMC and
2037  	 * HVC cases; need to check if it's SVC instruction based on
2038  	 * packet address.
2039  	 */
2040  	if (magic == __perf_cs_etmv4_magic) {
2041  		if (packet->exception_number == CS_ETMV4_EXC_CALL &&
2042  		    cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2043  					 prev_packet->end_addr))
2044  			return true;
2045  	}
2046  
2047  	return false;
2048  }
2049  
cs_etm__is_async_exception(struct cs_etm_traceid_queue * tidq,u64 magic)2050  static bool cs_etm__is_async_exception(struct cs_etm_traceid_queue *tidq,
2051  				       u64 magic)
2052  {
2053  	struct cs_etm_packet *packet = tidq->packet;
2054  
2055  	if (magic == __perf_cs_etmv3_magic)
2056  		if (packet->exception_number == CS_ETMV3_EXC_DEBUG_HALT ||
2057  		    packet->exception_number == CS_ETMV3_EXC_ASYNC_DATA_ABORT ||
2058  		    packet->exception_number == CS_ETMV3_EXC_PE_RESET ||
2059  		    packet->exception_number == CS_ETMV3_EXC_IRQ ||
2060  		    packet->exception_number == CS_ETMV3_EXC_FIQ)
2061  			return true;
2062  
2063  	if (magic == __perf_cs_etmv4_magic)
2064  		if (packet->exception_number == CS_ETMV4_EXC_RESET ||
2065  		    packet->exception_number == CS_ETMV4_EXC_DEBUG_HALT ||
2066  		    packet->exception_number == CS_ETMV4_EXC_SYSTEM_ERROR ||
2067  		    packet->exception_number == CS_ETMV4_EXC_INST_DEBUG ||
2068  		    packet->exception_number == CS_ETMV4_EXC_DATA_DEBUG ||
2069  		    packet->exception_number == CS_ETMV4_EXC_IRQ ||
2070  		    packet->exception_number == CS_ETMV4_EXC_FIQ)
2071  			return true;
2072  
2073  	return false;
2074  }
2075  
cs_etm__is_sync_exception(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq,u64 magic)2076  static bool cs_etm__is_sync_exception(struct cs_etm_queue *etmq,
2077  				      struct cs_etm_traceid_queue *tidq,
2078  				      u64 magic)
2079  {
2080  	u8 trace_chan_id = tidq->trace_chan_id;
2081  	struct cs_etm_packet *packet = tidq->packet;
2082  	struct cs_etm_packet *prev_packet = tidq->prev_packet;
2083  
2084  	if (magic == __perf_cs_etmv3_magic)
2085  		if (packet->exception_number == CS_ETMV3_EXC_SMC ||
2086  		    packet->exception_number == CS_ETMV3_EXC_HYP ||
2087  		    packet->exception_number == CS_ETMV3_EXC_JAZELLE_THUMBEE ||
2088  		    packet->exception_number == CS_ETMV3_EXC_UNDEFINED_INSTR ||
2089  		    packet->exception_number == CS_ETMV3_EXC_PREFETCH_ABORT ||
2090  		    packet->exception_number == CS_ETMV3_EXC_DATA_FAULT ||
2091  		    packet->exception_number == CS_ETMV3_EXC_GENERIC)
2092  			return true;
2093  
2094  	if (magic == __perf_cs_etmv4_magic) {
2095  		if (packet->exception_number == CS_ETMV4_EXC_TRAP ||
2096  		    packet->exception_number == CS_ETMV4_EXC_ALIGNMENT ||
2097  		    packet->exception_number == CS_ETMV4_EXC_INST_FAULT ||
2098  		    packet->exception_number == CS_ETMV4_EXC_DATA_FAULT)
2099  			return true;
2100  
2101  		/*
2102  		 * For CS_ETMV4_EXC_CALL, except SVC other instructions
2103  		 * (SMC, HVC) are taken as sync exceptions.
2104  		 */
2105  		if (packet->exception_number == CS_ETMV4_EXC_CALL &&
2106  		    !cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
2107  					  prev_packet->end_addr))
2108  			return true;
2109  
2110  		/*
2111  		 * ETMv4 has 5 bits for exception number; if the numbers
2112  		 * are in the range ( CS_ETMV4_EXC_FIQ, CS_ETMV4_EXC_END ]
2113  		 * they are implementation defined exceptions.
2114  		 *
2115  		 * For this case, simply take it as sync exception.
2116  		 */
2117  		if (packet->exception_number > CS_ETMV4_EXC_FIQ &&
2118  		    packet->exception_number <= CS_ETMV4_EXC_END)
2119  			return true;
2120  	}
2121  
2122  	return false;
2123  }
2124  
cs_etm__set_sample_flags(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)2125  static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq,
2126  				    struct cs_etm_traceid_queue *tidq)
2127  {
2128  	struct cs_etm_packet *packet = tidq->packet;
2129  	struct cs_etm_packet *prev_packet = tidq->prev_packet;
2130  	u8 trace_chan_id = tidq->trace_chan_id;
2131  	u64 magic;
2132  	int ret;
2133  
2134  	switch (packet->sample_type) {
2135  	case CS_ETM_RANGE:
2136  		/*
2137  		 * Immediate branch instruction without neither link nor
2138  		 * return flag, it's normal branch instruction within
2139  		 * the function.
2140  		 */
2141  		if (packet->last_instr_type == OCSD_INSTR_BR &&
2142  		    packet->last_instr_subtype == OCSD_S_INSTR_NONE) {
2143  			packet->flags = PERF_IP_FLAG_BRANCH;
2144  
2145  			if (packet->last_instr_cond)
2146  				packet->flags |= PERF_IP_FLAG_CONDITIONAL;
2147  		}
2148  
2149  		/*
2150  		 * Immediate branch instruction with link (e.g. BL), this is
2151  		 * branch instruction for function call.
2152  		 */
2153  		if (packet->last_instr_type == OCSD_INSTR_BR &&
2154  		    packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK)
2155  			packet->flags = PERF_IP_FLAG_BRANCH |
2156  					PERF_IP_FLAG_CALL;
2157  
2158  		/*
2159  		 * Indirect branch instruction with link (e.g. BLR), this is
2160  		 * branch instruction for function call.
2161  		 */
2162  		if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
2163  		    packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK)
2164  			packet->flags = PERF_IP_FLAG_BRANCH |
2165  					PERF_IP_FLAG_CALL;
2166  
2167  		/*
2168  		 * Indirect branch instruction with subtype of
2169  		 * OCSD_S_INSTR_V7_IMPLIED_RET, this is explicit hint for
2170  		 * function return for A32/T32.
2171  		 */
2172  		if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
2173  		    packet->last_instr_subtype == OCSD_S_INSTR_V7_IMPLIED_RET)
2174  			packet->flags = PERF_IP_FLAG_BRANCH |
2175  					PERF_IP_FLAG_RETURN;
2176  
2177  		/*
2178  		 * Indirect branch instruction without link (e.g. BR), usually
2179  		 * this is used for function return, especially for functions
2180  		 * within dynamic link lib.
2181  		 */
2182  		if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
2183  		    packet->last_instr_subtype == OCSD_S_INSTR_NONE)
2184  			packet->flags = PERF_IP_FLAG_BRANCH |
2185  					PERF_IP_FLAG_RETURN;
2186  
2187  		/* Return instruction for function return. */
2188  		if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
2189  		    packet->last_instr_subtype == OCSD_S_INSTR_V8_RET)
2190  			packet->flags = PERF_IP_FLAG_BRANCH |
2191  					PERF_IP_FLAG_RETURN;
2192  
2193  		/*
2194  		 * Decoder might insert a discontinuity in the middle of
2195  		 * instruction packets, fixup prev_packet with flag
2196  		 * PERF_IP_FLAG_TRACE_BEGIN to indicate restarting trace.
2197  		 */
2198  		if (prev_packet->sample_type == CS_ETM_DISCONTINUITY)
2199  			prev_packet->flags |= PERF_IP_FLAG_BRANCH |
2200  					      PERF_IP_FLAG_TRACE_BEGIN;
2201  
2202  		/*
2203  		 * If the previous packet is an exception return packet
2204  		 * and the return address just follows SVC instruction,
2205  		 * it needs to calibrate the previous packet sample flags
2206  		 * as PERF_IP_FLAG_SYSCALLRET.
2207  		 */
2208  		if (prev_packet->flags == (PERF_IP_FLAG_BRANCH |
2209  					   PERF_IP_FLAG_RETURN |
2210  					   PERF_IP_FLAG_INTERRUPT) &&
2211  		    cs_etm__is_svc_instr(etmq, trace_chan_id,
2212  					 packet, packet->start_addr))
2213  			prev_packet->flags = PERF_IP_FLAG_BRANCH |
2214  					     PERF_IP_FLAG_RETURN |
2215  					     PERF_IP_FLAG_SYSCALLRET;
2216  		break;
2217  	case CS_ETM_DISCONTINUITY:
2218  		/*
2219  		 * The trace is discontinuous, if the previous packet is
2220  		 * instruction packet, set flag PERF_IP_FLAG_TRACE_END
2221  		 * for previous packet.
2222  		 */
2223  		if (prev_packet->sample_type == CS_ETM_RANGE)
2224  			prev_packet->flags |= PERF_IP_FLAG_BRANCH |
2225  					      PERF_IP_FLAG_TRACE_END;
2226  		break;
2227  	case CS_ETM_EXCEPTION:
2228  		ret = cs_etm__get_magic(packet->trace_chan_id, &magic);
2229  		if (ret)
2230  			return ret;
2231  
2232  		/* The exception is for system call. */
2233  		if (cs_etm__is_syscall(etmq, tidq, magic))
2234  			packet->flags = PERF_IP_FLAG_BRANCH |
2235  					PERF_IP_FLAG_CALL |
2236  					PERF_IP_FLAG_SYSCALLRET;
2237  		/*
2238  		 * The exceptions are triggered by external signals from bus,
2239  		 * interrupt controller, debug module, PE reset or halt.
2240  		 */
2241  		else if (cs_etm__is_async_exception(tidq, magic))
2242  			packet->flags = PERF_IP_FLAG_BRANCH |
2243  					PERF_IP_FLAG_CALL |
2244  					PERF_IP_FLAG_ASYNC |
2245  					PERF_IP_FLAG_INTERRUPT;
2246  		/*
2247  		 * Otherwise, exception is caused by trap, instruction &
2248  		 * data fault, or alignment errors.
2249  		 */
2250  		else if (cs_etm__is_sync_exception(etmq, tidq, magic))
2251  			packet->flags = PERF_IP_FLAG_BRANCH |
2252  					PERF_IP_FLAG_CALL |
2253  					PERF_IP_FLAG_INTERRUPT;
2254  
2255  		/*
2256  		 * When the exception packet is inserted, since exception
2257  		 * packet is not used standalone for generating samples
2258  		 * and it's affiliation to the previous instruction range
2259  		 * packet; so set previous range packet flags to tell perf
2260  		 * it is an exception taken branch.
2261  		 */
2262  		if (prev_packet->sample_type == CS_ETM_RANGE)
2263  			prev_packet->flags = packet->flags;
2264  		break;
2265  	case CS_ETM_EXCEPTION_RET:
2266  		/*
2267  		 * When the exception return packet is inserted, since
2268  		 * exception return packet is not used standalone for
2269  		 * generating samples and it's affiliation to the previous
2270  		 * instruction range packet; so set previous range packet
2271  		 * flags to tell perf it is an exception return branch.
2272  		 *
2273  		 * The exception return can be for either system call or
2274  		 * other exception types; unfortunately the packet doesn't
2275  		 * contain exception type related info so we cannot decide
2276  		 * the exception type purely based on exception return packet.
2277  		 * If we record the exception number from exception packet and
2278  		 * reuse it for exception return packet, this is not reliable
2279  		 * due the trace can be discontinuity or the interrupt can
2280  		 * be nested, thus the recorded exception number cannot be
2281  		 * used for exception return packet for these two cases.
2282  		 *
2283  		 * For exception return packet, we only need to distinguish the
2284  		 * packet is for system call or for other types.  Thus the
2285  		 * decision can be deferred when receive the next packet which
2286  		 * contains the return address, based on the return address we
2287  		 * can read out the previous instruction and check if it's a
2288  		 * system call instruction and then calibrate the sample flag
2289  		 * as needed.
2290  		 */
2291  		if (prev_packet->sample_type == CS_ETM_RANGE)
2292  			prev_packet->flags = PERF_IP_FLAG_BRANCH |
2293  					     PERF_IP_FLAG_RETURN |
2294  					     PERF_IP_FLAG_INTERRUPT;
2295  		break;
2296  	case CS_ETM_EMPTY:
2297  	default:
2298  		break;
2299  	}
2300  
2301  	return 0;
2302  }
2303  
cs_etm__decode_data_block(struct cs_etm_queue * etmq)2304  static int cs_etm__decode_data_block(struct cs_etm_queue *etmq)
2305  {
2306  	int ret = 0;
2307  	size_t processed = 0;
2308  
2309  	/*
2310  	 * Packets are decoded and added to the decoder's packet queue
2311  	 * until the decoder packet processing callback has requested that
2312  	 * processing stops or there is nothing left in the buffer.  Normal
2313  	 * operations that stop processing are a timestamp packet or a full
2314  	 * decoder buffer queue.
2315  	 */
2316  	ret = cs_etm_decoder__process_data_block(etmq->decoder,
2317  						 etmq->offset,
2318  						 &etmq->buf[etmq->buf_used],
2319  						 etmq->buf_len,
2320  						 &processed);
2321  	if (ret)
2322  		goto out;
2323  
2324  	etmq->offset += processed;
2325  	etmq->buf_used += processed;
2326  	etmq->buf_len -= processed;
2327  
2328  out:
2329  	return ret;
2330  }
2331  
cs_etm__process_traceid_queue(struct cs_etm_queue * etmq,struct cs_etm_traceid_queue * tidq)2332  static int cs_etm__process_traceid_queue(struct cs_etm_queue *etmq,
2333  					 struct cs_etm_traceid_queue *tidq)
2334  {
2335  	int ret;
2336  	struct cs_etm_packet_queue *packet_queue;
2337  
2338  	packet_queue = &tidq->packet_queue;
2339  
2340  	/* Process each packet in this chunk */
2341  	while (1) {
2342  		ret = cs_etm_decoder__get_packet(packet_queue,
2343  						 tidq->packet);
2344  		if (ret <= 0)
2345  			/*
2346  			 * Stop processing this chunk on
2347  			 * end of data or error
2348  			 */
2349  			break;
2350  
2351  		/*
2352  		 * Since packet addresses are swapped in packet
2353  		 * handling within below switch() statements,
2354  		 * thus setting sample flags must be called
2355  		 * prior to switch() statement to use address
2356  		 * information before packets swapping.
2357  		 */
2358  		ret = cs_etm__set_sample_flags(etmq, tidq);
2359  		if (ret < 0)
2360  			break;
2361  
2362  		switch (tidq->packet->sample_type) {
2363  		case CS_ETM_RANGE:
2364  			/*
2365  			 * If the packet contains an instruction
2366  			 * range, generate instruction sequence
2367  			 * events.
2368  			 */
2369  			cs_etm__sample(etmq, tidq);
2370  			break;
2371  		case CS_ETM_EXCEPTION:
2372  		case CS_ETM_EXCEPTION_RET:
2373  			/*
2374  			 * If the exception packet is coming,
2375  			 * make sure the previous instruction
2376  			 * range packet to be handled properly.
2377  			 */
2378  			cs_etm__exception(tidq);
2379  			break;
2380  		case CS_ETM_DISCONTINUITY:
2381  			/*
2382  			 * Discontinuity in trace, flush
2383  			 * previous branch stack
2384  			 */
2385  			cs_etm__flush(etmq, tidq);
2386  			break;
2387  		case CS_ETM_EMPTY:
2388  			/*
2389  			 * Should not receive empty packet,
2390  			 * report error.
2391  			 */
2392  			pr_err("CS ETM Trace: empty packet\n");
2393  			return -EINVAL;
2394  		default:
2395  			break;
2396  		}
2397  	}
2398  
2399  	return ret;
2400  }
2401  
cs_etm__clear_all_traceid_queues(struct cs_etm_queue * etmq)2402  static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)
2403  {
2404  	int idx;
2405  	struct int_node *inode;
2406  	struct cs_etm_traceid_queue *tidq;
2407  	struct intlist *traceid_queues_list = etmq->traceid_queues_list;
2408  
2409  	intlist__for_each_entry(inode, traceid_queues_list) {
2410  		idx = (int)(intptr_t)inode->priv;
2411  		tidq = etmq->traceid_queues[idx];
2412  
2413  		/* Ignore return value */
2414  		cs_etm__process_traceid_queue(etmq, tidq);
2415  	}
2416  }
2417  
cs_etm__run_per_thread_timeless_decoder(struct cs_etm_queue * etmq)2418  static int cs_etm__run_per_thread_timeless_decoder(struct cs_etm_queue *etmq)
2419  {
2420  	int err = 0;
2421  	struct cs_etm_traceid_queue *tidq;
2422  
2423  	tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID);
2424  	if (!tidq)
2425  		return -EINVAL;
2426  
2427  	/* Go through each buffer in the queue and decode them one by one */
2428  	while (1) {
2429  		err = cs_etm__get_data_block(etmq);
2430  		if (err <= 0)
2431  			return err;
2432  
2433  		/* Run trace decoder until buffer consumed or end of trace */
2434  		do {
2435  			err = cs_etm__decode_data_block(etmq);
2436  			if (err)
2437  				return err;
2438  
2439  			/*
2440  			 * Process each packet in this chunk, nothing to do if
2441  			 * an error occurs other than hoping the next one will
2442  			 * be better.
2443  			 */
2444  			err = cs_etm__process_traceid_queue(etmq, tidq);
2445  
2446  		} while (etmq->buf_len);
2447  
2448  		if (err == 0)
2449  			/* Flush any remaining branch stack entries */
2450  			err = cs_etm__end_block(etmq, tidq);
2451  	}
2452  
2453  	return err;
2454  }
2455  
cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue * etmq)2456  static int cs_etm__run_per_cpu_timeless_decoder(struct cs_etm_queue *etmq)
2457  {
2458  	int idx, err = 0;
2459  	struct cs_etm_traceid_queue *tidq;
2460  	struct int_node *inode;
2461  
2462  	/* Go through each buffer in the queue and decode them one by one */
2463  	while (1) {
2464  		err = cs_etm__get_data_block(etmq);
2465  		if (err <= 0)
2466  			return err;
2467  
2468  		/* Run trace decoder until buffer consumed or end of trace */
2469  		do {
2470  			err = cs_etm__decode_data_block(etmq);
2471  			if (err)
2472  				return err;
2473  
2474  			/*
2475  			 * cs_etm__run_per_thread_timeless_decoder() runs on a
2476  			 * single traceID queue because each TID has a separate
2477  			 * buffer. But here in per-cpu mode we need to iterate
2478  			 * over each channel instead.
2479  			 */
2480  			intlist__for_each_entry(inode,
2481  						etmq->traceid_queues_list) {
2482  				idx = (int)(intptr_t)inode->priv;
2483  				tidq = etmq->traceid_queues[idx];
2484  				cs_etm__process_traceid_queue(etmq, tidq);
2485  			}
2486  		} while (etmq->buf_len);
2487  
2488  		intlist__for_each_entry(inode, etmq->traceid_queues_list) {
2489  			idx = (int)(intptr_t)inode->priv;
2490  			tidq = etmq->traceid_queues[idx];
2491  			/* Flush any remaining branch stack entries */
2492  			err = cs_etm__end_block(etmq, tidq);
2493  			if (err)
2494  				return err;
2495  		}
2496  	}
2497  
2498  	return err;
2499  }
2500  
cs_etm__process_timeless_queues(struct cs_etm_auxtrace * etm,pid_t tid)2501  static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
2502  					   pid_t tid)
2503  {
2504  	unsigned int i;
2505  	struct auxtrace_queues *queues = &etm->queues;
2506  
2507  	for (i = 0; i < queues->nr_queues; i++) {
2508  		struct auxtrace_queue *queue = &etm->queues.queue_array[i];
2509  		struct cs_etm_queue *etmq = queue->priv;
2510  		struct cs_etm_traceid_queue *tidq;
2511  
2512  		if (!etmq)
2513  			continue;
2514  
2515  		if (etm->per_thread_decoding) {
2516  			tidq = cs_etm__etmq_get_traceid_queue(
2517  				etmq, CS_ETM_PER_THREAD_TRACEID);
2518  
2519  			if (!tidq)
2520  				continue;
2521  
2522  			if (tid == -1 || thread__tid(tidq->thread) == tid)
2523  				cs_etm__run_per_thread_timeless_decoder(etmq);
2524  		} else
2525  			cs_etm__run_per_cpu_timeless_decoder(etmq);
2526  	}
2527  
2528  	return 0;
2529  }
2530  
cs_etm__process_timestamped_queues(struct cs_etm_auxtrace * etm)2531  static int cs_etm__process_timestamped_queues(struct cs_etm_auxtrace *etm)
2532  {
2533  	int ret = 0;
2534  	unsigned int cs_queue_nr, queue_nr, i;
2535  	u8 trace_chan_id;
2536  	u64 cs_timestamp;
2537  	struct auxtrace_queue *queue;
2538  	struct cs_etm_queue *etmq;
2539  	struct cs_etm_traceid_queue *tidq;
2540  
2541  	/*
2542  	 * Pre-populate the heap with one entry from each queue so that we can
2543  	 * start processing in time order across all queues.
2544  	 */
2545  	for (i = 0; i < etm->queues.nr_queues; i++) {
2546  		etmq = etm->queues.queue_array[i].priv;
2547  		if (!etmq)
2548  			continue;
2549  
2550  		ret = cs_etm__queue_first_cs_timestamp(etm, etmq, i);
2551  		if (ret)
2552  			return ret;
2553  	}
2554  
2555  	while (1) {
2556  		if (!etm->heap.heap_cnt)
2557  			break;
2558  
2559  		/* Take the entry at the top of the min heap */
2560  		cs_queue_nr = etm->heap.heap_array[0].queue_nr;
2561  		queue_nr = TO_QUEUE_NR(cs_queue_nr);
2562  		trace_chan_id = TO_TRACE_CHAN_ID(cs_queue_nr);
2563  		queue = &etm->queues.queue_array[queue_nr];
2564  		etmq = queue->priv;
2565  
2566  		/*
2567  		 * Remove the top entry from the heap since we are about
2568  		 * to process it.
2569  		 */
2570  		auxtrace_heap__pop(&etm->heap);
2571  
2572  		tidq  = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
2573  		if (!tidq) {
2574  			/*
2575  			 * No traceID queue has been allocated for this traceID,
2576  			 * which means something somewhere went very wrong.  No
2577  			 * other choice than simply exit.
2578  			 */
2579  			ret = -EINVAL;
2580  			goto out;
2581  		}
2582  
2583  		/*
2584  		 * Packets associated with this timestamp are already in
2585  		 * the etmq's traceID queue, so process them.
2586  		 */
2587  		ret = cs_etm__process_traceid_queue(etmq, tidq);
2588  		if (ret < 0)
2589  			goto out;
2590  
2591  		/*
2592  		 * Packets for this timestamp have been processed, time to
2593  		 * move on to the next timestamp, fetching a new auxtrace_buffer
2594  		 * if need be.
2595  		 */
2596  refetch:
2597  		ret = cs_etm__get_data_block(etmq);
2598  		if (ret < 0)
2599  			goto out;
2600  
2601  		/*
2602  		 * No more auxtrace_buffers to process in this etmq, simply
2603  		 * move on to another entry in the auxtrace_heap.
2604  		 */
2605  		if (!ret)
2606  			continue;
2607  
2608  		ret = cs_etm__decode_data_block(etmq);
2609  		if (ret)
2610  			goto out;
2611  
2612  		cs_timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
2613  
2614  		if (!cs_timestamp) {
2615  			/*
2616  			 * Function cs_etm__decode_data_block() returns when
2617  			 * there is no more traces to decode in the current
2618  			 * auxtrace_buffer OR when a timestamp has been
2619  			 * encountered on any of the traceID queues.  Since we
2620  			 * did not get a timestamp, there is no more traces to
2621  			 * process in this auxtrace_buffer.  As such empty and
2622  			 * flush all traceID queues.
2623  			 */
2624  			cs_etm__clear_all_traceid_queues(etmq);
2625  
2626  			/* Fetch another auxtrace_buffer for this etmq */
2627  			goto refetch;
2628  		}
2629  
2630  		/*
2631  		 * Add to the min heap the timestamp for packets that have
2632  		 * just been decoded.  They will be processed and synthesized
2633  		 * during the next call to cs_etm__process_traceid_queue() for
2634  		 * this queue/traceID.
2635  		 */
2636  		cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_chan_id);
2637  		ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, cs_timestamp);
2638  	}
2639  
2640  	for (i = 0; i < etm->queues.nr_queues; i++) {
2641  		struct int_node *inode;
2642  
2643  		etmq = etm->queues.queue_array[i].priv;
2644  		if (!etmq)
2645  			continue;
2646  
2647  		intlist__for_each_entry(inode, etmq->traceid_queues_list) {
2648  			int idx = (int)(intptr_t)inode->priv;
2649  
2650  			/* Flush any remaining branch stack entries */
2651  			tidq = etmq->traceid_queues[idx];
2652  			ret = cs_etm__end_block(etmq, tidq);
2653  			if (ret)
2654  				return ret;
2655  		}
2656  	}
2657  out:
2658  	return ret;
2659  }
2660  
cs_etm__process_itrace_start(struct cs_etm_auxtrace * etm,union perf_event * event)2661  static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm,
2662  					union perf_event *event)
2663  {
2664  	struct thread *th;
2665  
2666  	if (etm->timeless_decoding)
2667  		return 0;
2668  
2669  	/*
2670  	 * Add the tid/pid to the log so that we can get a match when we get a
2671  	 * contextID from the decoder. Only track for the host: only kernel
2672  	 * trace is supported for guests which wouldn't need pids so this should
2673  	 * be fine.
2674  	 */
2675  	th = machine__findnew_thread(&etm->session->machines.host,
2676  				     event->itrace_start.pid,
2677  				     event->itrace_start.tid);
2678  	if (!th)
2679  		return -ENOMEM;
2680  
2681  	thread__put(th);
2682  
2683  	return 0;
2684  }
2685  
cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace * etm,union perf_event * event)2686  static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm,
2687  					   union perf_event *event)
2688  {
2689  	struct thread *th;
2690  	bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
2691  
2692  	/*
2693  	 * Context switch in per-thread mode are irrelevant since perf
2694  	 * will start/stop tracing as the process is scheduled.
2695  	 */
2696  	if (etm->timeless_decoding)
2697  		return 0;
2698  
2699  	/*
2700  	 * SWITCH_IN events carry the next process to be switched out while
2701  	 * SWITCH_OUT events carry the process to be switched in.  As such
2702  	 * we don't care about IN events.
2703  	 */
2704  	if (!out)
2705  		return 0;
2706  
2707  	/*
2708  	 * Add the tid/pid to the log so that we can get a match when we get a
2709  	 * contextID from the decoder. Only track for the host: only kernel
2710  	 * trace is supported for guests which wouldn't need pids so this should
2711  	 * be fine.
2712  	 */
2713  	th = machine__findnew_thread(&etm->session->machines.host,
2714  				     event->context_switch.next_prev_pid,
2715  				     event->context_switch.next_prev_tid);
2716  	if (!th)
2717  		return -ENOMEM;
2718  
2719  	thread__put(th);
2720  
2721  	return 0;
2722  }
2723  
cs_etm__process_event(struct perf_session * session,union perf_event * event,struct perf_sample * sample,struct perf_tool * tool)2724  static int cs_etm__process_event(struct perf_session *session,
2725  				 union perf_event *event,
2726  				 struct perf_sample *sample,
2727  				 struct perf_tool *tool)
2728  {
2729  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2730  						   struct cs_etm_auxtrace,
2731  						   auxtrace);
2732  
2733  	if (dump_trace)
2734  		return 0;
2735  
2736  	if (!tool->ordered_events) {
2737  		pr_err("CoreSight ETM Trace requires ordered events\n");
2738  		return -EINVAL;
2739  	}
2740  
2741  	switch (event->header.type) {
2742  	case PERF_RECORD_EXIT:
2743  		/*
2744  		 * Don't need to wait for cs_etm__flush_events() in per-thread mode to
2745  		 * start the decode because we know there will be no more trace from
2746  		 * this thread. All this does is emit samples earlier than waiting for
2747  		 * the flush in other modes, but with timestamps it makes sense to wait
2748  		 * for flush so that events from different threads are interleaved
2749  		 * properly.
2750  		 */
2751  		if (etm->per_thread_decoding && etm->timeless_decoding)
2752  			return cs_etm__process_timeless_queues(etm,
2753  							       event->fork.tid);
2754  		break;
2755  
2756  	case PERF_RECORD_ITRACE_START:
2757  		return cs_etm__process_itrace_start(etm, event);
2758  
2759  	case PERF_RECORD_SWITCH_CPU_WIDE:
2760  		return cs_etm__process_switch_cpu_wide(etm, event);
2761  
2762  	case PERF_RECORD_AUX:
2763  		/*
2764  		 * Record the latest kernel timestamp available in the header
2765  		 * for samples so that synthesised samples occur from this point
2766  		 * onwards.
2767  		 */
2768  		if (sample->time && (sample->time != (u64)-1))
2769  			etm->latest_kernel_timestamp = sample->time;
2770  		break;
2771  
2772  	default:
2773  		break;
2774  	}
2775  
2776  	return 0;
2777  }
2778  
dump_queued_data(struct cs_etm_auxtrace * etm,struct perf_record_auxtrace * event)2779  static void dump_queued_data(struct cs_etm_auxtrace *etm,
2780  			     struct perf_record_auxtrace *event)
2781  {
2782  	struct auxtrace_buffer *buf;
2783  	unsigned int i;
2784  	/*
2785  	 * Find all buffers with same reference in the queues and dump them.
2786  	 * This is because the queues can contain multiple entries of the same
2787  	 * buffer that were split on aux records.
2788  	 */
2789  	for (i = 0; i < etm->queues.nr_queues; ++i)
2790  		list_for_each_entry(buf, &etm->queues.queue_array[i].head, list)
2791  			if (buf->reference == event->reference)
2792  				cs_etm__dump_event(etm->queues.queue_array[i].priv, buf);
2793  }
2794  
cs_etm__process_auxtrace_event(struct perf_session * session,union perf_event * event,struct perf_tool * tool __maybe_unused)2795  static int cs_etm__process_auxtrace_event(struct perf_session *session,
2796  					  union perf_event *event,
2797  					  struct perf_tool *tool __maybe_unused)
2798  {
2799  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2800  						   struct cs_etm_auxtrace,
2801  						   auxtrace);
2802  	if (!etm->data_queued) {
2803  		struct auxtrace_buffer *buffer;
2804  		off_t  data_offset;
2805  		int fd = perf_data__fd(session->data);
2806  		bool is_pipe = perf_data__is_pipe(session->data);
2807  		int err;
2808  		int idx = event->auxtrace.idx;
2809  
2810  		if (is_pipe)
2811  			data_offset = 0;
2812  		else {
2813  			data_offset = lseek(fd, 0, SEEK_CUR);
2814  			if (data_offset == -1)
2815  				return -errno;
2816  		}
2817  
2818  		err = auxtrace_queues__add_event(&etm->queues, session,
2819  						 event, data_offset, &buffer);
2820  		if (err)
2821  			return err;
2822  
2823  		/*
2824  		 * Knowing if the trace is formatted or not requires a lookup of
2825  		 * the aux record so only works in non-piped mode where data is
2826  		 * queued in cs_etm__queue_aux_records(). Always assume
2827  		 * formatted in piped mode (true).
2828  		 */
2829  		err = cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
2830  					  idx, true);
2831  		if (err)
2832  			return err;
2833  
2834  		if (dump_trace)
2835  			if (auxtrace_buffer__get_data(buffer, fd)) {
2836  				cs_etm__dump_event(etm->queues.queue_array[idx].priv, buffer);
2837  				auxtrace_buffer__put_data(buffer);
2838  			}
2839  	} else if (dump_trace)
2840  		dump_queued_data(etm, &event->auxtrace);
2841  
2842  	return 0;
2843  }
2844  
cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace * etm)2845  static int cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace *etm)
2846  {
2847  	struct evsel *evsel;
2848  	struct evlist *evlist = etm->session->evlist;
2849  
2850  	/* Override timeless mode with user input from --itrace=Z */
2851  	if (etm->synth_opts.timeless_decoding) {
2852  		etm->timeless_decoding = true;
2853  		return 0;
2854  	}
2855  
2856  	/*
2857  	 * Find the cs_etm evsel and look at what its timestamp setting was
2858  	 */
2859  	evlist__for_each_entry(evlist, evsel)
2860  		if (cs_etm__evsel_is_auxtrace(etm->session, evsel)) {
2861  			etm->timeless_decoding =
2862  				!(evsel->core.attr.config & BIT(ETM_OPT_TS));
2863  			return 0;
2864  		}
2865  
2866  	pr_err("CS ETM: Couldn't find ETM evsel\n");
2867  	return -EINVAL;
2868  }
2869  
2870  /*
2871   * Read a single cpu parameter block from the auxtrace_info priv block.
2872   *
2873   * For version 1 there is a per cpu nr_params entry. If we are handling
2874   * version 1 file, then there may be less, the same, or more params
2875   * indicated by this value than the compile time number we understand.
2876   *
2877   * For a version 0 info block, there are a fixed number, and we need to
2878   * fill out the nr_param value in the metadata we create.
2879   */
cs_etm__create_meta_blk(u64 * buff_in,int * buff_in_offset,int out_blk_size,int nr_params_v0)2880  static u64 *cs_etm__create_meta_blk(u64 *buff_in, int *buff_in_offset,
2881  				    int out_blk_size, int nr_params_v0)
2882  {
2883  	u64 *metadata = NULL;
2884  	int hdr_version;
2885  	int nr_in_params, nr_out_params, nr_cmn_params;
2886  	int i, k;
2887  
2888  	metadata = zalloc(sizeof(*metadata) * out_blk_size);
2889  	if (!metadata)
2890  		return NULL;
2891  
2892  	/* read block current index & version */
2893  	i = *buff_in_offset;
2894  	hdr_version = buff_in[CS_HEADER_VERSION];
2895  
2896  	if (!hdr_version) {
2897  	/* read version 0 info block into a version 1 metadata block  */
2898  		nr_in_params = nr_params_v0;
2899  		metadata[CS_ETM_MAGIC] = buff_in[i + CS_ETM_MAGIC];
2900  		metadata[CS_ETM_CPU] = buff_in[i + CS_ETM_CPU];
2901  		metadata[CS_ETM_NR_TRC_PARAMS] = nr_in_params;
2902  		/* remaining block params at offset +1 from source */
2903  		for (k = CS_ETM_COMMON_BLK_MAX_V1 - 1; k < nr_in_params; k++)
2904  			metadata[k + 1] = buff_in[i + k];
2905  		/* version 0 has 2 common params */
2906  		nr_cmn_params = 2;
2907  	} else {
2908  	/* read version 1 info block - input and output nr_params may differ */
2909  		/* version 1 has 3 common params */
2910  		nr_cmn_params = 3;
2911  		nr_in_params = buff_in[i + CS_ETM_NR_TRC_PARAMS];
2912  
2913  		/* if input has more params than output - skip excess */
2914  		nr_out_params = nr_in_params + nr_cmn_params;
2915  		if (nr_out_params > out_blk_size)
2916  			nr_out_params = out_blk_size;
2917  
2918  		for (k = CS_ETM_MAGIC; k < nr_out_params; k++)
2919  			metadata[k] = buff_in[i + k];
2920  
2921  		/* record the actual nr params we copied */
2922  		metadata[CS_ETM_NR_TRC_PARAMS] = nr_out_params - nr_cmn_params;
2923  	}
2924  
2925  	/* adjust in offset by number of in params used */
2926  	i += nr_in_params + nr_cmn_params;
2927  	*buff_in_offset = i;
2928  	return metadata;
2929  }
2930  
2931  /**
2932   * Puts a fragment of an auxtrace buffer into the auxtrace queues based
2933   * on the bounds of aux_event, if it matches with the buffer that's at
2934   * file_offset.
2935   *
2936   * Normally, whole auxtrace buffers would be added to the queue. But we
2937   * want to reset the decoder for every PERF_RECORD_AUX event, and the decoder
2938   * is reset across each buffer, so splitting the buffers up in advance has
2939   * the same effect.
2940   */
cs_etm__queue_aux_fragment(struct perf_session * session,off_t file_offset,size_t sz,struct perf_record_aux * aux_event,struct perf_sample * sample)2941  static int cs_etm__queue_aux_fragment(struct perf_session *session, off_t file_offset, size_t sz,
2942  				      struct perf_record_aux *aux_event, struct perf_sample *sample)
2943  {
2944  	int err;
2945  	char buf[PERF_SAMPLE_MAX_SIZE];
2946  	union perf_event *auxtrace_event_union;
2947  	struct perf_record_auxtrace *auxtrace_event;
2948  	union perf_event auxtrace_fragment;
2949  	__u64 aux_offset, aux_size;
2950  	__u32 idx;
2951  	bool formatted;
2952  
2953  	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2954  						   struct cs_etm_auxtrace,
2955  						   auxtrace);
2956  
2957  	/*
2958  	 * There should be a PERF_RECORD_AUXTRACE event at the file_offset that we got
2959  	 * from looping through the auxtrace index.
2960  	 */
2961  	err = perf_session__peek_event(session, file_offset, buf,
2962  				       PERF_SAMPLE_MAX_SIZE, &auxtrace_event_union, NULL);
2963  	if (err)
2964  		return err;
2965  	auxtrace_event = &auxtrace_event_union->auxtrace;
2966  	if (auxtrace_event->header.type != PERF_RECORD_AUXTRACE)
2967  		return -EINVAL;
2968  
2969  	if (auxtrace_event->header.size < sizeof(struct perf_record_auxtrace) ||
2970  		auxtrace_event->header.size != sz) {
2971  		return -EINVAL;
2972  	}
2973  
2974  	/*
2975  	 * In per-thread mode, auxtrace CPU is set to -1, but TID will be set instead. See
2976  	 * auxtrace_mmap_params__set_idx(). However, the sample AUX event will contain a
2977  	 * CPU as we set this always for the AUX_OUTPUT_HW_ID event.
2978  	 * So now compare only TIDs if auxtrace CPU is -1, and CPUs if auxtrace CPU is not -1.
2979  	 * Return 'not found' if mismatch.
2980  	 */
2981  	if (auxtrace_event->cpu == (__u32) -1) {
2982  		etm->per_thread_decoding = true;
2983  		if (auxtrace_event->tid != sample->tid)
2984  			return 1;
2985  	} else if (auxtrace_event->cpu != sample->cpu) {
2986  		if (etm->per_thread_decoding) {
2987  			/*
2988  			 * Found a per-cpu buffer after a per-thread one was
2989  			 * already found
2990  			 */
2991  			pr_err("CS ETM: Inconsistent per-thread/per-cpu mode.\n");
2992  			return -EINVAL;
2993  		}
2994  		return 1;
2995  	}
2996  
2997  	if (aux_event->flags & PERF_AUX_FLAG_OVERWRITE) {
2998  		/*
2999  		 * Clamp size in snapshot mode. The buffer size is clamped in
3000  		 * __auxtrace_mmap__read() for snapshots, so the aux record size doesn't reflect
3001  		 * the buffer size.
3002  		 */
3003  		aux_size = min(aux_event->aux_size, auxtrace_event->size);
3004  
3005  		/*
3006  		 * In this mode, the head also points to the end of the buffer so aux_offset
3007  		 * needs to have the size subtracted so it points to the beginning as in normal mode
3008  		 */
3009  		aux_offset = aux_event->aux_offset - aux_size;
3010  	} else {
3011  		aux_size = aux_event->aux_size;
3012  		aux_offset = aux_event->aux_offset;
3013  	}
3014  
3015  	if (aux_offset >= auxtrace_event->offset &&
3016  	    aux_offset + aux_size <= auxtrace_event->offset + auxtrace_event->size) {
3017  		/*
3018  		 * If this AUX event was inside this buffer somewhere, create a new auxtrace event
3019  		 * based on the sizes of the aux event, and queue that fragment.
3020  		 */
3021  		auxtrace_fragment.auxtrace = *auxtrace_event;
3022  		auxtrace_fragment.auxtrace.size = aux_size;
3023  		auxtrace_fragment.auxtrace.offset = aux_offset;
3024  		file_offset += aux_offset - auxtrace_event->offset + auxtrace_event->header.size;
3025  
3026  		pr_debug3("CS ETM: Queue buffer size: %#"PRI_lx64" offset: %#"PRI_lx64
3027  			  " tid: %d cpu: %d\n", aux_size, aux_offset, sample->tid, sample->cpu);
3028  		err = auxtrace_queues__add_event(&etm->queues, session, &auxtrace_fragment,
3029  						 file_offset, NULL);
3030  		if (err)
3031  			return err;
3032  
3033  		idx = auxtrace_event->idx;
3034  		formatted = !(aux_event->flags & PERF_AUX_FLAG_CORESIGHT_FORMAT_RAW);
3035  		return cs_etm__setup_queue(etm, &etm->queues.queue_array[idx],
3036  					   idx, formatted);
3037  	}
3038  
3039  	/* Wasn't inside this buffer, but there were no parse errors. 1 == 'not found' */
3040  	return 1;
3041  }
3042  
cs_etm__process_aux_hw_id_cb(struct perf_session * session,union perf_event * event,u64 offset __maybe_unused,void * data __maybe_unused)3043  static int cs_etm__process_aux_hw_id_cb(struct perf_session *session, union perf_event *event,
3044  					u64 offset __maybe_unused, void *data __maybe_unused)
3045  {
3046  	/* look to handle PERF_RECORD_AUX_OUTPUT_HW_ID early to ensure decoders can be set up */
3047  	if (event->header.type == PERF_RECORD_AUX_OUTPUT_HW_ID) {
3048  		(*(int *)data)++; /* increment found count */
3049  		return cs_etm__process_aux_output_hw_id(session, event);
3050  	}
3051  	return 0;
3052  }
3053  
cs_etm__queue_aux_records_cb(struct perf_session * session,union perf_event * event,u64 offset __maybe_unused,void * data __maybe_unused)3054  static int cs_etm__queue_aux_records_cb(struct perf_session *session, union perf_event *event,
3055  					u64 offset __maybe_unused, void *data __maybe_unused)
3056  {
3057  	struct perf_sample sample;
3058  	int ret;
3059  	struct auxtrace_index_entry *ent;
3060  	struct auxtrace_index *auxtrace_index;
3061  	struct evsel *evsel;
3062  	size_t i;
3063  
3064  	/* Don't care about any other events, we're only queuing buffers for AUX events */
3065  	if (event->header.type != PERF_RECORD_AUX)
3066  		return 0;
3067  
3068  	if (event->header.size < sizeof(struct perf_record_aux))
3069  		return -EINVAL;
3070  
3071  	/* Truncated Aux records can have 0 size and shouldn't result in anything being queued. */
3072  	if (!event->aux.aux_size)
3073  		return 0;
3074  
3075  	/*
3076  	 * Parse the sample, we need the sample_id_all data that comes after the event so that the
3077  	 * CPU or PID can be matched to an AUXTRACE buffer's CPU or PID.
3078  	 */
3079  	evsel = evlist__event2evsel(session->evlist, event);
3080  	if (!evsel)
3081  		return -EINVAL;
3082  	ret = evsel__parse_sample(evsel, event, &sample);
3083  	if (ret)
3084  		return ret;
3085  
3086  	/*
3087  	 * Loop through the auxtrace index to find the buffer that matches up with this aux event.
3088  	 */
3089  	list_for_each_entry(auxtrace_index, &session->auxtrace_index, list) {
3090  		for (i = 0; i < auxtrace_index->nr; i++) {
3091  			ent = &auxtrace_index->entries[i];
3092  			ret = cs_etm__queue_aux_fragment(session, ent->file_offset,
3093  							 ent->sz, &event->aux, &sample);
3094  			/*
3095  			 * Stop search on error or successful values. Continue search on
3096  			 * 1 ('not found')
3097  			 */
3098  			if (ret != 1)
3099  				return ret;
3100  		}
3101  	}
3102  
3103  	/*
3104  	 * Couldn't find the buffer corresponding to this aux record, something went wrong. Warn but
3105  	 * don't exit with an error because it will still be possible to decode other aux records.
3106  	 */
3107  	pr_err("CS ETM: Couldn't find auxtrace buffer for aux_offset: %#"PRI_lx64
3108  	       " tid: %d cpu: %d\n", event->aux.aux_offset, sample.tid, sample.cpu);
3109  	return 0;
3110  }
3111  
cs_etm__queue_aux_records(struct perf_session * session)3112  static int cs_etm__queue_aux_records(struct perf_session *session)
3113  {
3114  	struct auxtrace_index *index = list_first_entry_or_null(&session->auxtrace_index,
3115  								struct auxtrace_index, list);
3116  	if (index && index->nr > 0)
3117  		return perf_session__peek_events(session, session->header.data_offset,
3118  						 session->header.data_size,
3119  						 cs_etm__queue_aux_records_cb, NULL);
3120  
3121  	/*
3122  	 * We would get here if there are no entries in the index (either no auxtrace
3123  	 * buffers or no index at all). Fail silently as there is the possibility of
3124  	 * queueing them in cs_etm__process_auxtrace_event() if etm->data_queued is still
3125  	 * false.
3126  	 *
3127  	 * In that scenario, buffers will not be split by AUX records.
3128  	 */
3129  	return 0;
3130  }
3131  
3132  #define HAS_PARAM(j, type, param) (metadata[(j)][CS_ETM_NR_TRC_PARAMS] <= \
3133  				  (CS_##type##_##param - CS_ETM_COMMON_BLK_MAX_V1))
3134  
3135  /*
3136   * Loop through the ETMs and complain if we find at least one where ts_source != 1 (virtual
3137   * timestamps).
3138   */
cs_etm__has_virtual_ts(u64 ** metadata,int num_cpu)3139  static bool cs_etm__has_virtual_ts(u64 **metadata, int num_cpu)
3140  {
3141  	int j;
3142  
3143  	for (j = 0; j < num_cpu; j++) {
3144  		switch (metadata[j][CS_ETM_MAGIC]) {
3145  		case __perf_cs_etmv4_magic:
3146  			if (HAS_PARAM(j, ETMV4, TS_SOURCE) || metadata[j][CS_ETMV4_TS_SOURCE] != 1)
3147  				return false;
3148  			break;
3149  		case __perf_cs_ete_magic:
3150  			if (HAS_PARAM(j, ETE, TS_SOURCE) || metadata[j][CS_ETE_TS_SOURCE] != 1)
3151  				return false;
3152  			break;
3153  		default:
3154  			/* Unknown / unsupported magic number. */
3155  			return false;
3156  		}
3157  	}
3158  	return true;
3159  }
3160  
3161  /* map trace ids to correct metadata block, from information in metadata */
cs_etm__map_trace_ids_metadata(int num_cpu,u64 ** metadata)3162  static int cs_etm__map_trace_ids_metadata(int num_cpu, u64 **metadata)
3163  {
3164  	u64 cs_etm_magic;
3165  	u8 trace_chan_id;
3166  	int i, err;
3167  
3168  	for (i = 0; i < num_cpu; i++) {
3169  		cs_etm_magic = metadata[i][CS_ETM_MAGIC];
3170  		switch (cs_etm_magic) {
3171  		case __perf_cs_etmv3_magic:
3172  			metadata[i][CS_ETM_ETMTRACEIDR] &= CORESIGHT_TRACE_ID_VAL_MASK;
3173  			trace_chan_id = (u8)(metadata[i][CS_ETM_ETMTRACEIDR]);
3174  			break;
3175  		case __perf_cs_etmv4_magic:
3176  		case __perf_cs_ete_magic:
3177  			metadata[i][CS_ETMV4_TRCTRACEIDR] &= CORESIGHT_TRACE_ID_VAL_MASK;
3178  			trace_chan_id = (u8)(metadata[i][CS_ETMV4_TRCTRACEIDR]);
3179  			break;
3180  		default:
3181  			/* unknown magic number */
3182  			return -EINVAL;
3183  		}
3184  		err = cs_etm__map_trace_id(trace_chan_id, metadata[i]);
3185  		if (err)
3186  			return err;
3187  	}
3188  	return 0;
3189  }
3190  
3191  /*
3192   * If we found AUX_HW_ID packets, then set any metadata marked as unused to the
3193   * unused value to reduce the number of unneeded decoders created.
3194   */
cs_etm__clear_unused_trace_ids_metadata(int num_cpu,u64 ** metadata)3195  static int cs_etm__clear_unused_trace_ids_metadata(int num_cpu, u64 **metadata)
3196  {
3197  	u64 cs_etm_magic;
3198  	int i;
3199  
3200  	for (i = 0; i < num_cpu; i++) {
3201  		cs_etm_magic = metadata[i][CS_ETM_MAGIC];
3202  		switch (cs_etm_magic) {
3203  		case __perf_cs_etmv3_magic:
3204  			if (metadata[i][CS_ETM_ETMTRACEIDR] & CORESIGHT_TRACE_ID_UNUSED_FLAG)
3205  				metadata[i][CS_ETM_ETMTRACEIDR] = CORESIGHT_TRACE_ID_UNUSED_VAL;
3206  			break;
3207  		case __perf_cs_etmv4_magic:
3208  		case __perf_cs_ete_magic:
3209  			if (metadata[i][CS_ETMV4_TRCTRACEIDR] & CORESIGHT_TRACE_ID_UNUSED_FLAG)
3210  				metadata[i][CS_ETMV4_TRCTRACEIDR] = CORESIGHT_TRACE_ID_UNUSED_VAL;
3211  			break;
3212  		default:
3213  			/* unknown magic number */
3214  			return -EINVAL;
3215  		}
3216  	}
3217  	return 0;
3218  }
3219  
cs_etm__process_auxtrace_info_full(union perf_event * event,struct perf_session * session)3220  int cs_etm__process_auxtrace_info_full(union perf_event *event,
3221  				       struct perf_session *session)
3222  {
3223  	struct perf_record_auxtrace_info *auxtrace_info = &event->auxtrace_info;
3224  	struct cs_etm_auxtrace *etm = NULL;
3225  	struct perf_record_time_conv *tc = &session->time_conv;
3226  	int event_header_size = sizeof(struct perf_event_header);
3227  	int total_size = auxtrace_info->header.size;
3228  	int priv_size = 0;
3229  	int num_cpu;
3230  	int err = 0;
3231  	int aux_hw_id_found;
3232  	int i, j;
3233  	u64 *ptr = NULL;
3234  	u64 **metadata = NULL;
3235  
3236  	/*
3237  	 * Create an RB tree for traceID-metadata tuple.  Since the conversion
3238  	 * has to be made for each packet that gets decoded, optimizing access
3239  	 * in anything other than a sequential array is worth doing.
3240  	 */
3241  	traceid_list = intlist__new(NULL);
3242  	if (!traceid_list)
3243  		return -ENOMEM;
3244  
3245  	/* First the global part */
3246  	ptr = (u64 *) auxtrace_info->priv;
3247  	num_cpu = ptr[CS_PMU_TYPE_CPUS] & 0xffffffff;
3248  	metadata = zalloc(sizeof(*metadata) * num_cpu);
3249  	if (!metadata) {
3250  		err = -ENOMEM;
3251  		goto err_free_traceid_list;
3252  	}
3253  
3254  	/* Start parsing after the common part of the header */
3255  	i = CS_HEADER_VERSION_MAX;
3256  
3257  	/*
3258  	 * The metadata is stored in the auxtrace_info section and encodes
3259  	 * the configuration of the ARM embedded trace macrocell which is
3260  	 * required by the trace decoder to properly decode the trace due
3261  	 * to its highly compressed nature.
3262  	 */
3263  	for (j = 0; j < num_cpu; j++) {
3264  		if (ptr[i] == __perf_cs_etmv3_magic) {
3265  			metadata[j] =
3266  				cs_etm__create_meta_blk(ptr, &i,
3267  							CS_ETM_PRIV_MAX,
3268  							CS_ETM_NR_TRC_PARAMS_V0);
3269  		} else if (ptr[i] == __perf_cs_etmv4_magic) {
3270  			metadata[j] =
3271  				cs_etm__create_meta_blk(ptr, &i,
3272  							CS_ETMV4_PRIV_MAX,
3273  							CS_ETMV4_NR_TRC_PARAMS_V0);
3274  		} else if (ptr[i] == __perf_cs_ete_magic) {
3275  			metadata[j] = cs_etm__create_meta_blk(ptr, &i, CS_ETE_PRIV_MAX, -1);
3276  		} else {
3277  			ui__error("CS ETM Trace: Unrecognised magic number %#"PRIx64". File could be from a newer version of perf.\n",
3278  				  ptr[i]);
3279  			err = -EINVAL;
3280  			goto err_free_metadata;
3281  		}
3282  
3283  		if (!metadata[j]) {
3284  			err = -ENOMEM;
3285  			goto err_free_metadata;
3286  		}
3287  	}
3288  
3289  	/*
3290  	 * Each of CS_HEADER_VERSION_MAX, CS_ETM_PRIV_MAX and
3291  	 * CS_ETMV4_PRIV_MAX mark how many double words are in the
3292  	 * global metadata, and each cpu's metadata respectively.
3293  	 * The following tests if the correct number of double words was
3294  	 * present in the auxtrace info section.
3295  	 */
3296  	priv_size = total_size - event_header_size - INFO_HEADER_SIZE;
3297  	if (i * 8 != priv_size) {
3298  		err = -EINVAL;
3299  		goto err_free_metadata;
3300  	}
3301  
3302  	etm = zalloc(sizeof(*etm));
3303  
3304  	if (!etm) {
3305  		err = -ENOMEM;
3306  		goto err_free_metadata;
3307  	}
3308  
3309  	/*
3310  	 * As all the ETMs run at the same exception level, the system should
3311  	 * have the same PID format crossing CPUs.  So cache the PID format
3312  	 * and reuse it for sequential decoding.
3313  	 */
3314  	etm->pid_fmt = cs_etm__init_pid_fmt(metadata[0]);
3315  
3316  	err = auxtrace_queues__init(&etm->queues);
3317  	if (err)
3318  		goto err_free_etm;
3319  
3320  	if (session->itrace_synth_opts->set) {
3321  		etm->synth_opts = *session->itrace_synth_opts;
3322  	} else {
3323  		itrace_synth_opts__set_default(&etm->synth_opts,
3324  				session->itrace_synth_opts->default_no_sample);
3325  		etm->synth_opts.callchain = false;
3326  	}
3327  
3328  	etm->session = session;
3329  
3330  	etm->num_cpu = num_cpu;
3331  	etm->pmu_type = (unsigned int) ((ptr[CS_PMU_TYPE_CPUS] >> 32) & 0xffffffff);
3332  	etm->snapshot_mode = (ptr[CS_ETM_SNAPSHOT] != 0);
3333  	etm->metadata = metadata;
3334  	etm->auxtrace_type = auxtrace_info->type;
3335  
3336  	/* Use virtual timestamps if all ETMs report ts_source = 1 */
3337  	etm->has_virtual_ts = cs_etm__has_virtual_ts(metadata, num_cpu);
3338  
3339  	if (!etm->has_virtual_ts)
3340  		ui__warning("Virtual timestamps are not enabled, or not supported by the traced system.\n"
3341  			    "The time field of the samples will not be set accurately.\n\n");
3342  
3343  	etm->auxtrace.process_event = cs_etm__process_event;
3344  	etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
3345  	etm->auxtrace.flush_events = cs_etm__flush_events;
3346  	etm->auxtrace.free_events = cs_etm__free_events;
3347  	etm->auxtrace.free = cs_etm__free;
3348  	etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace;
3349  	session->auxtrace = &etm->auxtrace;
3350  
3351  	err = cs_etm__setup_timeless_decoding(etm);
3352  	if (err)
3353  		return err;
3354  
3355  	etm->tc.time_shift = tc->time_shift;
3356  	etm->tc.time_mult = tc->time_mult;
3357  	etm->tc.time_zero = tc->time_zero;
3358  	if (event_contains(*tc, time_cycles)) {
3359  		etm->tc.time_cycles = tc->time_cycles;
3360  		etm->tc.time_mask = tc->time_mask;
3361  		etm->tc.cap_user_time_zero = tc->cap_user_time_zero;
3362  		etm->tc.cap_user_time_short = tc->cap_user_time_short;
3363  	}
3364  	err = cs_etm__synth_events(etm, session);
3365  	if (err)
3366  		goto err_free_queues;
3367  
3368  	/*
3369  	 * Map Trace ID values to CPU metadata.
3370  	 *
3371  	 * Trace metadata will always contain Trace ID values from the legacy algorithm. If the
3372  	 * files has been recorded by a "new" perf updated to handle AUX_HW_ID then the metadata
3373  	 * ID value will also have the CORESIGHT_TRACE_ID_UNUSED_FLAG set.
3374  	 *
3375  	 * The updated kernel drivers that use AUX_HW_ID to sent Trace IDs will attempt to use
3376  	 * the same IDs as the old algorithm as far as is possible, unless there are clashes
3377  	 * in which case a different value will be used. This means an older perf may still
3378  	 * be able to record and read files generate on a newer system.
3379  	 *
3380  	 * For a perf able to interpret AUX_HW_ID packets we first check for the presence of
3381  	 * those packets. If they are there then the values will be mapped and plugged into
3382  	 * the metadata. We then set any remaining metadata values with the used flag to a
3383  	 * value CORESIGHT_TRACE_ID_UNUSED_VAL - which indicates no decoder is required.
3384  	 *
3385  	 * If no AUX_HW_ID packets are present - which means a file recorded on an old kernel
3386  	 * then we map Trace ID values to CPU directly from the metadata - clearing any unused
3387  	 * flags if present.
3388  	 */
3389  
3390  	/* first scan for AUX_OUTPUT_HW_ID records to map trace ID values to CPU metadata */
3391  	aux_hw_id_found = 0;
3392  	err = perf_session__peek_events(session, session->header.data_offset,
3393  					session->header.data_size,
3394  					cs_etm__process_aux_hw_id_cb, &aux_hw_id_found);
3395  	if (err)
3396  		goto err_free_queues;
3397  
3398  	/* if HW ID found then clear any unused metadata ID values */
3399  	if (aux_hw_id_found)
3400  		err = cs_etm__clear_unused_trace_ids_metadata(num_cpu, metadata);
3401  	/* otherwise, this is a file with metadata values only, map from metadata */
3402  	else
3403  		err = cs_etm__map_trace_ids_metadata(num_cpu, metadata);
3404  
3405  	if (err)
3406  		goto err_free_queues;
3407  
3408  	err = cs_etm__queue_aux_records(session);
3409  	if (err)
3410  		goto err_free_queues;
3411  
3412  	etm->data_queued = etm->queues.populated;
3413  	return 0;
3414  
3415  err_free_queues:
3416  	auxtrace_queues__free(&etm->queues);
3417  	session->auxtrace = NULL;
3418  err_free_etm:
3419  	zfree(&etm);
3420  err_free_metadata:
3421  	/* No need to check @metadata[j], free(NULL) is supported */
3422  	for (j = 0; j < num_cpu; j++)
3423  		zfree(&metadata[j]);
3424  	zfree(&metadata);
3425  err_free_traceid_list:
3426  	intlist__delete(traceid_list);
3427  	return err;
3428  }
3429