xref: /openbmc/linux/tools/perf/util/cs-etm.c (revision e3d786a3)
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/bitops.h>
10 #include <linux/err.h>
11 #include <linux/kernel.h>
12 #include <linux/log2.h>
13 #include <linux/types.h>
14 
15 #include <stdlib.h>
16 
17 #include "auxtrace.h"
18 #include "color.h"
19 #include "cs-etm.h"
20 #include "cs-etm-decoder/cs-etm-decoder.h"
21 #include "debug.h"
22 #include "evlist.h"
23 #include "intlist.h"
24 #include "machine.h"
25 #include "map.h"
26 #include "perf.h"
27 #include "thread.h"
28 #include "thread_map.h"
29 #include "thread-stack.h"
30 #include "util.h"
31 
32 #define MAX_TIMESTAMP (~0ULL)
33 
34 /*
35  * A64 instructions are always 4 bytes
36  *
37  * Only A64 is supported, so can use this constant for converting between
38  * addresses and instruction counts, calculting offsets etc
39  */
40 #define A64_INSTR_SIZE 4
41 
42 struct cs_etm_auxtrace {
43 	struct auxtrace auxtrace;
44 	struct auxtrace_queues queues;
45 	struct auxtrace_heap heap;
46 	struct itrace_synth_opts synth_opts;
47 	struct perf_session *session;
48 	struct machine *machine;
49 	struct thread *unknown_thread;
50 
51 	u8 timeless_decoding;
52 	u8 snapshot_mode;
53 	u8 data_queued;
54 	u8 sample_branches;
55 	u8 sample_instructions;
56 
57 	int num_cpu;
58 	u32 auxtrace_type;
59 	u64 branches_sample_type;
60 	u64 branches_id;
61 	u64 instructions_sample_type;
62 	u64 instructions_sample_period;
63 	u64 instructions_id;
64 	u64 **metadata;
65 	u64 kernel_start;
66 	unsigned int pmu_type;
67 };
68 
69 struct cs_etm_queue {
70 	struct cs_etm_auxtrace *etm;
71 	struct thread *thread;
72 	struct cs_etm_decoder *decoder;
73 	struct auxtrace_buffer *buffer;
74 	const struct cs_etm_state *state;
75 	union perf_event *event_buf;
76 	unsigned int queue_nr;
77 	pid_t pid, tid;
78 	int cpu;
79 	u64 time;
80 	u64 timestamp;
81 	u64 offset;
82 	u64 period_instructions;
83 	struct branch_stack *last_branch;
84 	struct branch_stack *last_branch_rb;
85 	size_t last_branch_pos;
86 	struct cs_etm_packet *prev_packet;
87 	struct cs_etm_packet *packet;
88 };
89 
90 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
91 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
92 					   pid_t tid, u64 time_);
93 
94 static void cs_etm__packet_dump(const char *pkt_string)
95 {
96 	const char *color = PERF_COLOR_BLUE;
97 	int len = strlen(pkt_string);
98 
99 	if (len && (pkt_string[len-1] == '\n'))
100 		color_fprintf(stdout, color, "	%s", pkt_string);
101 	else
102 		color_fprintf(stdout, color, "	%s\n", pkt_string);
103 
104 	fflush(stdout);
105 }
106 
107 static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
108 			       struct auxtrace_buffer *buffer)
109 {
110 	int i, ret;
111 	const char *color = PERF_COLOR_BLUE;
112 	struct cs_etm_decoder_params d_params;
113 	struct cs_etm_trace_params *t_params;
114 	struct cs_etm_decoder *decoder;
115 	size_t buffer_used = 0;
116 
117 	fprintf(stdout, "\n");
118 	color_fprintf(stdout, color,
119 		     ". ... CoreSight ETM Trace data: size %zu bytes\n",
120 		     buffer->size);
121 
122 	/* Use metadata to fill in trace parameters for trace decoder */
123 	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
124 	for (i = 0; i < etm->num_cpu; i++) {
125 		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
126 		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
127 		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
128 		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
129 		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
130 		t_params[i].etmv4.reg_configr =
131 					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
132 		t_params[i].etmv4.reg_traceidr =
133 					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
134 	}
135 
136 	/* Set decoder parameters to simply print the trace packets */
137 	d_params.packet_printer = cs_etm__packet_dump;
138 	d_params.operation = CS_ETM_OPERATION_PRINT;
139 	d_params.formatted = true;
140 	d_params.fsyncs = false;
141 	d_params.hsyncs = false;
142 	d_params.frame_aligned = true;
143 
144 	decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
145 
146 	zfree(&t_params);
147 
148 	if (!decoder)
149 		return;
150 	do {
151 		size_t consumed;
152 
153 		ret = cs_etm_decoder__process_data_block(
154 				decoder, buffer->offset,
155 				&((u8 *)buffer->data)[buffer_used],
156 				buffer->size - buffer_used, &consumed);
157 		if (ret)
158 			break;
159 
160 		buffer_used += consumed;
161 	} while (buffer_used < buffer->size);
162 
163 	cs_etm_decoder__free(decoder);
164 }
165 
166 static int cs_etm__flush_events(struct perf_session *session,
167 				struct perf_tool *tool)
168 {
169 	int ret;
170 	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
171 						   struct cs_etm_auxtrace,
172 						   auxtrace);
173 	if (dump_trace)
174 		return 0;
175 
176 	if (!tool->ordered_events)
177 		return -EINVAL;
178 
179 	if (!etm->timeless_decoding)
180 		return -EINVAL;
181 
182 	ret = cs_etm__update_queues(etm);
183 
184 	if (ret < 0)
185 		return ret;
186 
187 	return cs_etm__process_timeless_queues(etm, -1, MAX_TIMESTAMP - 1);
188 }
189 
190 static void cs_etm__free_queue(void *priv)
191 {
192 	struct cs_etm_queue *etmq = priv;
193 
194 	if (!etmq)
195 		return;
196 
197 	thread__zput(etmq->thread);
198 	cs_etm_decoder__free(etmq->decoder);
199 	zfree(&etmq->event_buf);
200 	zfree(&etmq->last_branch);
201 	zfree(&etmq->last_branch_rb);
202 	zfree(&etmq->prev_packet);
203 	zfree(&etmq->packet);
204 	free(etmq);
205 }
206 
207 static void cs_etm__free_events(struct perf_session *session)
208 {
209 	unsigned int i;
210 	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
211 						   struct cs_etm_auxtrace,
212 						   auxtrace);
213 	struct auxtrace_queues *queues = &aux->queues;
214 
215 	for (i = 0; i < queues->nr_queues; i++) {
216 		cs_etm__free_queue(queues->queue_array[i].priv);
217 		queues->queue_array[i].priv = NULL;
218 	}
219 
220 	auxtrace_queues__free(queues);
221 }
222 
223 static void cs_etm__free(struct perf_session *session)
224 {
225 	int i;
226 	struct int_node *inode, *tmp;
227 	struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
228 						   struct cs_etm_auxtrace,
229 						   auxtrace);
230 	cs_etm__free_events(session);
231 	session->auxtrace = NULL;
232 
233 	/* First remove all traceID/CPU# nodes for the RB tree */
234 	intlist__for_each_entry_safe(inode, tmp, traceid_list)
235 		intlist__remove(traceid_list, inode);
236 	/* Then the RB tree itself */
237 	intlist__delete(traceid_list);
238 
239 	for (i = 0; i < aux->num_cpu; i++)
240 		zfree(&aux->metadata[i]);
241 
242 	thread__zput(aux->unknown_thread);
243 	zfree(&aux->metadata);
244 	zfree(&aux);
245 }
246 
247 static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address)
248 {
249 	struct machine *machine;
250 
251 	machine = etmq->etm->machine;
252 
253 	if (address >= etmq->etm->kernel_start) {
254 		if (machine__is_host(machine))
255 			return PERF_RECORD_MISC_KERNEL;
256 		else
257 			return PERF_RECORD_MISC_GUEST_KERNEL;
258 	} else {
259 		if (machine__is_host(machine))
260 			return PERF_RECORD_MISC_USER;
261 		else if (perf_guest)
262 			return PERF_RECORD_MISC_GUEST_USER;
263 		else
264 			return PERF_RECORD_MISC_HYPERVISOR;
265 	}
266 }
267 
268 static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u64 address,
269 			      size_t size, u8 *buffer)
270 {
271 	u8  cpumode;
272 	u64 offset;
273 	int len;
274 	struct	 thread *thread;
275 	struct	 machine *machine;
276 	struct	 addr_location al;
277 
278 	if (!etmq)
279 		return -1;
280 
281 	machine = etmq->etm->machine;
282 	cpumode = cs_etm__cpu_mode(etmq, address);
283 
284 	thread = etmq->thread;
285 	if (!thread) {
286 		if (cpumode != PERF_RECORD_MISC_KERNEL)
287 			return -EINVAL;
288 		thread = etmq->etm->unknown_thread;
289 	}
290 
291 	if (!thread__find_map(thread, cpumode, address, &al) || !al.map->dso)
292 		return 0;
293 
294 	if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR &&
295 	    dso__data_status_seen(al.map->dso, DSO_DATA_STATUS_SEEN_ITRACE))
296 		return 0;
297 
298 	offset = al.map->map_ip(al.map, address);
299 
300 	map__load(al.map);
301 
302 	len = dso__data_read_offset(al.map->dso, machine, offset, buffer, size);
303 
304 	if (len <= 0)
305 		return 0;
306 
307 	return len;
308 }
309 
310 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm,
311 						unsigned int queue_nr)
312 {
313 	int i;
314 	struct cs_etm_decoder_params d_params;
315 	struct cs_etm_trace_params  *t_params;
316 	struct cs_etm_queue *etmq;
317 	size_t szp = sizeof(struct cs_etm_packet);
318 
319 	etmq = zalloc(sizeof(*etmq));
320 	if (!etmq)
321 		return NULL;
322 
323 	etmq->packet = zalloc(szp);
324 	if (!etmq->packet)
325 		goto out_free;
326 
327 	if (etm->synth_opts.last_branch || etm->sample_branches) {
328 		etmq->prev_packet = zalloc(szp);
329 		if (!etmq->prev_packet)
330 			goto out_free;
331 	}
332 
333 	if (etm->synth_opts.last_branch) {
334 		size_t sz = sizeof(struct branch_stack);
335 
336 		sz += etm->synth_opts.last_branch_sz *
337 		      sizeof(struct branch_entry);
338 		etmq->last_branch = zalloc(sz);
339 		if (!etmq->last_branch)
340 			goto out_free;
341 		etmq->last_branch_rb = zalloc(sz);
342 		if (!etmq->last_branch_rb)
343 			goto out_free;
344 	}
345 
346 	etmq->event_buf = malloc(PERF_SAMPLE_MAX_SIZE);
347 	if (!etmq->event_buf)
348 		goto out_free;
349 
350 	etmq->etm = etm;
351 	etmq->queue_nr = queue_nr;
352 	etmq->pid = -1;
353 	etmq->tid = -1;
354 	etmq->cpu = -1;
355 
356 	/* Use metadata to fill in trace parameters for trace decoder */
357 	t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
358 
359 	if (!t_params)
360 		goto out_free;
361 
362 	for (i = 0; i < etm->num_cpu; i++) {
363 		t_params[i].protocol = CS_ETM_PROTO_ETMV4i;
364 		t_params[i].etmv4.reg_idr0 = etm->metadata[i][CS_ETMV4_TRCIDR0];
365 		t_params[i].etmv4.reg_idr1 = etm->metadata[i][CS_ETMV4_TRCIDR1];
366 		t_params[i].etmv4.reg_idr2 = etm->metadata[i][CS_ETMV4_TRCIDR2];
367 		t_params[i].etmv4.reg_idr8 = etm->metadata[i][CS_ETMV4_TRCIDR8];
368 		t_params[i].etmv4.reg_configr =
369 					etm->metadata[i][CS_ETMV4_TRCCONFIGR];
370 		t_params[i].etmv4.reg_traceidr =
371 					etm->metadata[i][CS_ETMV4_TRCTRACEIDR];
372 	}
373 
374 	/* Set decoder parameters to simply print the trace packets */
375 	d_params.packet_printer = cs_etm__packet_dump;
376 	d_params.operation = CS_ETM_OPERATION_DECODE;
377 	d_params.formatted = true;
378 	d_params.fsyncs = false;
379 	d_params.hsyncs = false;
380 	d_params.frame_aligned = true;
381 	d_params.data = etmq;
382 
383 	etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
384 
385 	zfree(&t_params);
386 
387 	if (!etmq->decoder)
388 		goto out_free;
389 
390 	/*
391 	 * Register a function to handle all memory accesses required by
392 	 * the trace decoder library.
393 	 */
394 	if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
395 					      0x0L, ((u64) -1L),
396 					      cs_etm__mem_access))
397 		goto out_free_decoder;
398 
399 	etmq->offset = 0;
400 	etmq->period_instructions = 0;
401 
402 	return etmq;
403 
404 out_free_decoder:
405 	cs_etm_decoder__free(etmq->decoder);
406 out_free:
407 	zfree(&etmq->event_buf);
408 	zfree(&etmq->last_branch);
409 	zfree(&etmq->last_branch_rb);
410 	zfree(&etmq->prev_packet);
411 	zfree(&etmq->packet);
412 	free(etmq);
413 
414 	return NULL;
415 }
416 
417 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
418 			       struct auxtrace_queue *queue,
419 			       unsigned int queue_nr)
420 {
421 	struct cs_etm_queue *etmq = queue->priv;
422 
423 	if (list_empty(&queue->head) || etmq)
424 		return 0;
425 
426 	etmq = cs_etm__alloc_queue(etm, queue_nr);
427 
428 	if (!etmq)
429 		return -ENOMEM;
430 
431 	queue->priv = etmq;
432 
433 	if (queue->cpu != -1)
434 		etmq->cpu = queue->cpu;
435 
436 	etmq->tid = queue->tid;
437 
438 	return 0;
439 }
440 
441 static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
442 {
443 	unsigned int i;
444 	int ret;
445 
446 	for (i = 0; i < etm->queues.nr_queues; i++) {
447 		ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
448 		if (ret)
449 			return ret;
450 	}
451 
452 	return 0;
453 }
454 
455 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
456 {
457 	if (etm->queues.new_data) {
458 		etm->queues.new_data = false;
459 		return cs_etm__setup_queues(etm);
460 	}
461 
462 	return 0;
463 }
464 
465 static inline void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq)
466 {
467 	struct branch_stack *bs_src = etmq->last_branch_rb;
468 	struct branch_stack *bs_dst = etmq->last_branch;
469 	size_t nr = 0;
470 
471 	/*
472 	 * Set the number of records before early exit: ->nr is used to
473 	 * determine how many branches to copy from ->entries.
474 	 */
475 	bs_dst->nr = bs_src->nr;
476 
477 	/*
478 	 * Early exit when there is nothing to copy.
479 	 */
480 	if (!bs_src->nr)
481 		return;
482 
483 	/*
484 	 * As bs_src->entries is a circular buffer, we need to copy from it in
485 	 * two steps.  First, copy the branches from the most recently inserted
486 	 * branch ->last_branch_pos until the end of bs_src->entries buffer.
487 	 */
488 	nr = etmq->etm->synth_opts.last_branch_sz - etmq->last_branch_pos;
489 	memcpy(&bs_dst->entries[0],
490 	       &bs_src->entries[etmq->last_branch_pos],
491 	       sizeof(struct branch_entry) * nr);
492 
493 	/*
494 	 * If we wrapped around at least once, the branches from the beginning
495 	 * of the bs_src->entries buffer and until the ->last_branch_pos element
496 	 * are older valid branches: copy them over.  The total number of
497 	 * branches copied over will be equal to the number of branches asked by
498 	 * the user in last_branch_sz.
499 	 */
500 	if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
501 		memcpy(&bs_dst->entries[nr],
502 		       &bs_src->entries[0],
503 		       sizeof(struct branch_entry) * etmq->last_branch_pos);
504 	}
505 }
506 
507 static inline void cs_etm__reset_last_branch_rb(struct cs_etm_queue *etmq)
508 {
509 	etmq->last_branch_pos = 0;
510 	etmq->last_branch_rb->nr = 0;
511 }
512 
513 static inline u64 cs_etm__last_executed_instr(struct cs_etm_packet *packet)
514 {
515 	/* Returns 0 for the CS_ETM_TRACE_ON packet */
516 	if (packet->sample_type == CS_ETM_TRACE_ON)
517 		return 0;
518 
519 	/*
520 	 * The packet records the execution range with an exclusive end address
521 	 *
522 	 * A64 instructions are constant size, so the last executed
523 	 * instruction is A64_INSTR_SIZE before the end address
524 	 * Will need to do instruction level decode for T32 instructions as
525 	 * they can be variable size (not yet supported).
526 	 */
527 	return packet->end_addr - A64_INSTR_SIZE;
528 }
529 
530 static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
531 {
532 	/* Returns 0 for the CS_ETM_TRACE_ON packet */
533 	if (packet->sample_type == CS_ETM_TRACE_ON)
534 		return 0;
535 
536 	return packet->start_addr;
537 }
538 
539 static inline u64 cs_etm__instr_count(const struct cs_etm_packet *packet)
540 {
541 	/*
542 	 * Only A64 instructions are currently supported, so can get
543 	 * instruction count by dividing.
544 	 * Will need to do instruction level decode for T32 instructions as
545 	 * they can be variable size (not yet supported).
546 	 */
547 	return (packet->end_addr - packet->start_addr) / A64_INSTR_SIZE;
548 }
549 
550 static inline u64 cs_etm__instr_addr(const struct cs_etm_packet *packet,
551 				     u64 offset)
552 {
553 	/*
554 	 * Only A64 instructions are currently supported, so can get
555 	 * instruction address by muliplying.
556 	 * Will need to do instruction level decode for T32 instructions as
557 	 * they can be variable size (not yet supported).
558 	 */
559 	return packet->start_addr + offset * A64_INSTR_SIZE;
560 }
561 
562 static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq)
563 {
564 	struct branch_stack *bs = etmq->last_branch_rb;
565 	struct branch_entry *be;
566 
567 	/*
568 	 * The branches are recorded in a circular buffer in reverse
569 	 * chronological order: we start recording from the last element of the
570 	 * buffer down.  After writing the first element of the stack, move the
571 	 * insert position back to the end of the buffer.
572 	 */
573 	if (!etmq->last_branch_pos)
574 		etmq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
575 
576 	etmq->last_branch_pos -= 1;
577 
578 	be       = &bs->entries[etmq->last_branch_pos];
579 	be->from = cs_etm__last_executed_instr(etmq->prev_packet);
580 	be->to	 = cs_etm__first_executed_instr(etmq->packet);
581 	/* No support for mispredict */
582 	be->flags.mispred = 0;
583 	be->flags.predicted = 1;
584 
585 	/*
586 	 * Increment bs->nr until reaching the number of last branches asked by
587 	 * the user on the command line.
588 	 */
589 	if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
590 		bs->nr += 1;
591 }
592 
593 static int cs_etm__inject_event(union perf_event *event,
594 			       struct perf_sample *sample, u64 type)
595 {
596 	event->header.size = perf_event__sample_event_size(sample, type, 0);
597 	return perf_event__synthesize_sample(event, type, 0, sample);
598 }
599 
600 
601 static int
602 cs_etm__get_trace(struct cs_etm_buffer *buff, struct cs_etm_queue *etmq)
603 {
604 	struct auxtrace_buffer *aux_buffer = etmq->buffer;
605 	struct auxtrace_buffer *old_buffer = aux_buffer;
606 	struct auxtrace_queue *queue;
607 
608 	queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
609 
610 	aux_buffer = auxtrace_buffer__next(queue, aux_buffer);
611 
612 	/* If no more data, drop the previous auxtrace_buffer and return */
613 	if (!aux_buffer) {
614 		if (old_buffer)
615 			auxtrace_buffer__drop_data(old_buffer);
616 		buff->len = 0;
617 		return 0;
618 	}
619 
620 	etmq->buffer = aux_buffer;
621 
622 	/* If the aux_buffer doesn't have data associated, try to load it */
623 	if (!aux_buffer->data) {
624 		/* get the file desc associated with the perf data file */
625 		int fd = perf_data__fd(etmq->etm->session->data);
626 
627 		aux_buffer->data = auxtrace_buffer__get_data(aux_buffer, fd);
628 		if (!aux_buffer->data)
629 			return -ENOMEM;
630 	}
631 
632 	/* If valid, drop the previous buffer */
633 	if (old_buffer)
634 		auxtrace_buffer__drop_data(old_buffer);
635 
636 	buff->offset = aux_buffer->offset;
637 	buff->len = aux_buffer->size;
638 	buff->buf = aux_buffer->data;
639 
640 	buff->ref_timestamp = aux_buffer->reference;
641 
642 	return buff->len;
643 }
644 
645 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
646 				    struct auxtrace_queue *queue)
647 {
648 	struct cs_etm_queue *etmq = queue->priv;
649 
650 	/* CPU-wide tracing isn't supported yet */
651 	if (queue->tid == -1)
652 		return;
653 
654 	if ((!etmq->thread) && (etmq->tid != -1))
655 		etmq->thread = machine__find_thread(etm->machine, -1,
656 						    etmq->tid);
657 
658 	if (etmq->thread) {
659 		etmq->pid = etmq->thread->pid_;
660 		if (queue->cpu == -1)
661 			etmq->cpu = etmq->thread->cpu;
662 	}
663 }
664 
665 static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq,
666 					    u64 addr, u64 period)
667 {
668 	int ret = 0;
669 	struct cs_etm_auxtrace *etm = etmq->etm;
670 	union perf_event *event = etmq->event_buf;
671 	struct perf_sample sample = {.ip = 0,};
672 
673 	event->sample.header.type = PERF_RECORD_SAMPLE;
674 	event->sample.header.misc = cs_etm__cpu_mode(etmq, addr);
675 	event->sample.header.size = sizeof(struct perf_event_header);
676 
677 	sample.ip = addr;
678 	sample.pid = etmq->pid;
679 	sample.tid = etmq->tid;
680 	sample.id = etmq->etm->instructions_id;
681 	sample.stream_id = etmq->etm->instructions_id;
682 	sample.period = period;
683 	sample.cpu = etmq->packet->cpu;
684 	sample.flags = 0;
685 	sample.insn_len = 1;
686 	sample.cpumode = event->sample.header.misc;
687 
688 	if (etm->synth_opts.last_branch) {
689 		cs_etm__copy_last_branch_rb(etmq);
690 		sample.branch_stack = etmq->last_branch;
691 	}
692 
693 	if (etm->synth_opts.inject) {
694 		ret = cs_etm__inject_event(event, &sample,
695 					   etm->instructions_sample_type);
696 		if (ret)
697 			return ret;
698 	}
699 
700 	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
701 
702 	if (ret)
703 		pr_err(
704 			"CS ETM Trace: failed to deliver instruction event, error %d\n",
705 			ret);
706 
707 	if (etm->synth_opts.last_branch)
708 		cs_etm__reset_last_branch_rb(etmq);
709 
710 	return ret;
711 }
712 
713 /*
714  * The cs etm packet encodes an instruction range between a branch target
715  * and the next taken branch. Generate sample accordingly.
716  */
717 static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq)
718 {
719 	int ret = 0;
720 	struct cs_etm_auxtrace *etm = etmq->etm;
721 	struct perf_sample sample = {.ip = 0,};
722 	union perf_event *event = etmq->event_buf;
723 	struct dummy_branch_stack {
724 		u64			nr;
725 		struct branch_entry	entries;
726 	} dummy_bs;
727 	u64 ip;
728 
729 	ip = cs_etm__last_executed_instr(etmq->prev_packet);
730 
731 	event->sample.header.type = PERF_RECORD_SAMPLE;
732 	event->sample.header.misc = cs_etm__cpu_mode(etmq, ip);
733 	event->sample.header.size = sizeof(struct perf_event_header);
734 
735 	sample.ip = ip;
736 	sample.pid = etmq->pid;
737 	sample.tid = etmq->tid;
738 	sample.addr = cs_etm__first_executed_instr(etmq->packet);
739 	sample.id = etmq->etm->branches_id;
740 	sample.stream_id = etmq->etm->branches_id;
741 	sample.period = 1;
742 	sample.cpu = etmq->packet->cpu;
743 	sample.flags = 0;
744 	sample.cpumode = event->sample.header.misc;
745 
746 	/*
747 	 * perf report cannot handle events without a branch stack
748 	 */
749 	if (etm->synth_opts.last_branch) {
750 		dummy_bs = (struct dummy_branch_stack){
751 			.nr = 1,
752 			.entries = {
753 				.from = sample.ip,
754 				.to = sample.addr,
755 			},
756 		};
757 		sample.branch_stack = (struct branch_stack *)&dummy_bs;
758 	}
759 
760 	if (etm->synth_opts.inject) {
761 		ret = cs_etm__inject_event(event, &sample,
762 					   etm->branches_sample_type);
763 		if (ret)
764 			return ret;
765 	}
766 
767 	ret = perf_session__deliver_synth_event(etm->session, event, &sample);
768 
769 	if (ret)
770 		pr_err(
771 		"CS ETM Trace: failed to deliver instruction event, error %d\n",
772 		ret);
773 
774 	return ret;
775 }
776 
777 struct cs_etm_synth {
778 	struct perf_tool dummy_tool;
779 	struct perf_session *session;
780 };
781 
782 static int cs_etm__event_synth(struct perf_tool *tool,
783 			       union perf_event *event,
784 			       struct perf_sample *sample __maybe_unused,
785 			       struct machine *machine __maybe_unused)
786 {
787 	struct cs_etm_synth *cs_etm_synth =
788 		      container_of(tool, struct cs_etm_synth, dummy_tool);
789 
790 	return perf_session__deliver_synth_event(cs_etm_synth->session,
791 						 event, NULL);
792 }
793 
794 static int cs_etm__synth_event(struct perf_session *session,
795 			       struct perf_event_attr *attr, u64 id)
796 {
797 	struct cs_etm_synth cs_etm_synth;
798 
799 	memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
800 	cs_etm_synth.session = session;
801 
802 	return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
803 					   &id, cs_etm__event_synth);
804 }
805 
806 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
807 				struct perf_session *session)
808 {
809 	struct perf_evlist *evlist = session->evlist;
810 	struct perf_evsel *evsel;
811 	struct perf_event_attr attr;
812 	bool found = false;
813 	u64 id;
814 	int err;
815 
816 	evlist__for_each_entry(evlist, evsel) {
817 		if (evsel->attr.type == etm->pmu_type) {
818 			found = true;
819 			break;
820 		}
821 	}
822 
823 	if (!found) {
824 		pr_debug("No selected events with CoreSight Trace data\n");
825 		return 0;
826 	}
827 
828 	memset(&attr, 0, sizeof(struct perf_event_attr));
829 	attr.size = sizeof(struct perf_event_attr);
830 	attr.type = PERF_TYPE_HARDWARE;
831 	attr.sample_type = evsel->attr.sample_type & PERF_SAMPLE_MASK;
832 	attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID |
833 			    PERF_SAMPLE_PERIOD;
834 	if (etm->timeless_decoding)
835 		attr.sample_type &= ~(u64)PERF_SAMPLE_TIME;
836 	else
837 		attr.sample_type |= PERF_SAMPLE_TIME;
838 
839 	attr.exclude_user = evsel->attr.exclude_user;
840 	attr.exclude_kernel = evsel->attr.exclude_kernel;
841 	attr.exclude_hv = evsel->attr.exclude_hv;
842 	attr.exclude_host = evsel->attr.exclude_host;
843 	attr.exclude_guest = evsel->attr.exclude_guest;
844 	attr.sample_id_all = evsel->attr.sample_id_all;
845 	attr.read_format = evsel->attr.read_format;
846 
847 	/* create new id val to be a fixed offset from evsel id */
848 	id = evsel->id[0] + 1000000000;
849 
850 	if (!id)
851 		id = 1;
852 
853 	if (etm->synth_opts.branches) {
854 		attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
855 		attr.sample_period = 1;
856 		attr.sample_type |= PERF_SAMPLE_ADDR;
857 		err = cs_etm__synth_event(session, &attr, id);
858 		if (err)
859 			return err;
860 		etm->sample_branches = true;
861 		etm->branches_sample_type = attr.sample_type;
862 		etm->branches_id = id;
863 		id += 1;
864 		attr.sample_type &= ~(u64)PERF_SAMPLE_ADDR;
865 	}
866 
867 	if (etm->synth_opts.last_branch)
868 		attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
869 
870 	if (etm->synth_opts.instructions) {
871 		attr.config = PERF_COUNT_HW_INSTRUCTIONS;
872 		attr.sample_period = etm->synth_opts.period;
873 		etm->instructions_sample_period = attr.sample_period;
874 		err = cs_etm__synth_event(session, &attr, id);
875 		if (err)
876 			return err;
877 		etm->sample_instructions = true;
878 		etm->instructions_sample_type = attr.sample_type;
879 		etm->instructions_id = id;
880 		id += 1;
881 	}
882 
883 	return 0;
884 }
885 
886 static int cs_etm__sample(struct cs_etm_queue *etmq)
887 {
888 	struct cs_etm_auxtrace *etm = etmq->etm;
889 	struct cs_etm_packet *tmp;
890 	int ret;
891 	u64 instrs_executed;
892 
893 	instrs_executed = cs_etm__instr_count(etmq->packet);
894 	etmq->period_instructions += instrs_executed;
895 
896 	/*
897 	 * Record a branch when the last instruction in
898 	 * PREV_PACKET is a branch.
899 	 */
900 	if (etm->synth_opts.last_branch &&
901 	    etmq->prev_packet &&
902 	    etmq->prev_packet->sample_type == CS_ETM_RANGE &&
903 	    etmq->prev_packet->last_instr_taken_branch)
904 		cs_etm__update_last_branch_rb(etmq);
905 
906 	if (etm->sample_instructions &&
907 	    etmq->period_instructions >= etm->instructions_sample_period) {
908 		/*
909 		 * Emit instruction sample periodically
910 		 * TODO: allow period to be defined in cycles and clock time
911 		 */
912 
913 		/* Get number of instructions executed after the sample point */
914 		u64 instrs_over = etmq->period_instructions -
915 			etm->instructions_sample_period;
916 
917 		/*
918 		 * Calculate the address of the sampled instruction (-1 as
919 		 * sample is reported as though instruction has just been
920 		 * executed, but PC has not advanced to next instruction)
921 		 */
922 		u64 offset = (instrs_executed - instrs_over - 1);
923 		u64 addr = cs_etm__instr_addr(etmq->packet, offset);
924 
925 		ret = cs_etm__synth_instruction_sample(
926 			etmq, addr, etm->instructions_sample_period);
927 		if (ret)
928 			return ret;
929 
930 		/* Carry remaining instructions into next sample period */
931 		etmq->period_instructions = instrs_over;
932 	}
933 
934 	if (etm->sample_branches && etmq->prev_packet) {
935 		bool generate_sample = false;
936 
937 		/* Generate sample for tracing on packet */
938 		if (etmq->prev_packet->sample_type == CS_ETM_TRACE_ON)
939 			generate_sample = true;
940 
941 		/* Generate sample for branch taken packet */
942 		if (etmq->prev_packet->sample_type == CS_ETM_RANGE &&
943 		    etmq->prev_packet->last_instr_taken_branch)
944 			generate_sample = true;
945 
946 		if (generate_sample) {
947 			ret = cs_etm__synth_branch_sample(etmq);
948 			if (ret)
949 				return ret;
950 		}
951 	}
952 
953 	if (etm->sample_branches || etm->synth_opts.last_branch) {
954 		/*
955 		 * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
956 		 * the next incoming packet.
957 		 */
958 		tmp = etmq->packet;
959 		etmq->packet = etmq->prev_packet;
960 		etmq->prev_packet = tmp;
961 	}
962 
963 	return 0;
964 }
965 
966 static int cs_etm__flush(struct cs_etm_queue *etmq)
967 {
968 	int err = 0;
969 	struct cs_etm_auxtrace *etm = etmq->etm;
970 	struct cs_etm_packet *tmp;
971 
972 	if (!etmq->prev_packet)
973 		return 0;
974 
975 	/* Handle start tracing packet */
976 	if (etmq->prev_packet->sample_type == CS_ETM_EMPTY)
977 		goto swap_packet;
978 
979 	if (etmq->etm->synth_opts.last_branch &&
980 	    etmq->prev_packet->sample_type == CS_ETM_RANGE) {
981 		/*
982 		 * Generate a last branch event for the branches left in the
983 		 * circular buffer at the end of the trace.
984 		 *
985 		 * Use the address of the end of the last reported execution
986 		 * range
987 		 */
988 		u64 addr = cs_etm__last_executed_instr(etmq->prev_packet);
989 
990 		err = cs_etm__synth_instruction_sample(
991 			etmq, addr,
992 			etmq->period_instructions);
993 		if (err)
994 			return err;
995 
996 		etmq->period_instructions = 0;
997 
998 	}
999 
1000 	if (etm->sample_branches &&
1001 	    etmq->prev_packet->sample_type == CS_ETM_RANGE) {
1002 		err = cs_etm__synth_branch_sample(etmq);
1003 		if (err)
1004 			return err;
1005 	}
1006 
1007 swap_packet:
1008 	if (etmq->etm->synth_opts.last_branch) {
1009 		/*
1010 		 * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
1011 		 * the next incoming packet.
1012 		 */
1013 		tmp = etmq->packet;
1014 		etmq->packet = etmq->prev_packet;
1015 		etmq->prev_packet = tmp;
1016 	}
1017 
1018 	return err;
1019 }
1020 
1021 static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
1022 {
1023 	struct cs_etm_auxtrace *etm = etmq->etm;
1024 	struct cs_etm_buffer buffer;
1025 	size_t buffer_used, processed;
1026 	int err = 0;
1027 
1028 	if (!etm->kernel_start)
1029 		etm->kernel_start = machine__kernel_start(etm->machine);
1030 
1031 	/* Go through each buffer in the queue and decode them one by one */
1032 	while (1) {
1033 		buffer_used = 0;
1034 		memset(&buffer, 0, sizeof(buffer));
1035 		err = cs_etm__get_trace(&buffer, etmq);
1036 		if (err <= 0)
1037 			return err;
1038 		/*
1039 		 * We cannot assume consecutive blocks in the data file are
1040 		 * contiguous, reset the decoder to force re-sync.
1041 		 */
1042 		err = cs_etm_decoder__reset(etmq->decoder);
1043 		if (err != 0)
1044 			return err;
1045 
1046 		/* Run trace decoder until buffer consumed or end of trace */
1047 		do {
1048 			processed = 0;
1049 			err = cs_etm_decoder__process_data_block(
1050 				etmq->decoder,
1051 				etmq->offset,
1052 				&buffer.buf[buffer_used],
1053 				buffer.len - buffer_used,
1054 				&processed);
1055 			if (err)
1056 				return err;
1057 
1058 			etmq->offset += processed;
1059 			buffer_used += processed;
1060 
1061 			/* Process each packet in this chunk */
1062 			while (1) {
1063 				err = cs_etm_decoder__get_packet(etmq->decoder,
1064 								 etmq->packet);
1065 				if (err <= 0)
1066 					/*
1067 					 * Stop processing this chunk on
1068 					 * end of data or error
1069 					 */
1070 					break;
1071 
1072 				switch (etmq->packet->sample_type) {
1073 				case CS_ETM_RANGE:
1074 					/*
1075 					 * If the packet contains an instruction
1076 					 * range, generate instruction sequence
1077 					 * events.
1078 					 */
1079 					cs_etm__sample(etmq);
1080 					break;
1081 				case CS_ETM_TRACE_ON:
1082 					/*
1083 					 * Discontinuity in trace, flush
1084 					 * previous branch stack
1085 					 */
1086 					cs_etm__flush(etmq);
1087 					break;
1088 				case CS_ETM_EMPTY:
1089 					/*
1090 					 * Should not receive empty packet,
1091 					 * report error.
1092 					 */
1093 					pr_err("CS ETM Trace: empty packet\n");
1094 					return -EINVAL;
1095 				default:
1096 					break;
1097 				}
1098 			}
1099 		} while (buffer.len > buffer_used);
1100 
1101 		if (err == 0)
1102 			/* Flush any remaining branch stack entries */
1103 			err = cs_etm__flush(etmq);
1104 	}
1105 
1106 	return err;
1107 }
1108 
1109 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
1110 					   pid_t tid, u64 time_)
1111 {
1112 	unsigned int i;
1113 	struct auxtrace_queues *queues = &etm->queues;
1114 
1115 	for (i = 0; i < queues->nr_queues; i++) {
1116 		struct auxtrace_queue *queue = &etm->queues.queue_array[i];
1117 		struct cs_etm_queue *etmq = queue->priv;
1118 
1119 		if (etmq && ((tid == -1) || (etmq->tid == tid))) {
1120 			etmq->time = time_;
1121 			cs_etm__set_pid_tid_cpu(etm, queue);
1122 			cs_etm__run_decoder(etmq);
1123 		}
1124 	}
1125 
1126 	return 0;
1127 }
1128 
1129 static int cs_etm__process_event(struct perf_session *session,
1130 				 union perf_event *event,
1131 				 struct perf_sample *sample,
1132 				 struct perf_tool *tool)
1133 {
1134 	int err = 0;
1135 	u64 timestamp;
1136 	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
1137 						   struct cs_etm_auxtrace,
1138 						   auxtrace);
1139 
1140 	if (dump_trace)
1141 		return 0;
1142 
1143 	if (!tool->ordered_events) {
1144 		pr_err("CoreSight ETM Trace requires ordered events\n");
1145 		return -EINVAL;
1146 	}
1147 
1148 	if (!etm->timeless_decoding)
1149 		return -EINVAL;
1150 
1151 	if (sample->time && (sample->time != (u64) -1))
1152 		timestamp = sample->time;
1153 	else
1154 		timestamp = 0;
1155 
1156 	if (timestamp || etm->timeless_decoding) {
1157 		err = cs_etm__update_queues(etm);
1158 		if (err)
1159 			return err;
1160 	}
1161 
1162 	if (event->header.type == PERF_RECORD_EXIT)
1163 		return cs_etm__process_timeless_queues(etm,
1164 						       event->fork.tid,
1165 						       sample->time);
1166 
1167 	return 0;
1168 }
1169 
1170 static int cs_etm__process_auxtrace_event(struct perf_session *session,
1171 					  union perf_event *event,
1172 					  struct perf_tool *tool __maybe_unused)
1173 {
1174 	struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
1175 						   struct cs_etm_auxtrace,
1176 						   auxtrace);
1177 	if (!etm->data_queued) {
1178 		struct auxtrace_buffer *buffer;
1179 		off_t  data_offset;
1180 		int fd = perf_data__fd(session->data);
1181 		bool is_pipe = perf_data__is_pipe(session->data);
1182 		int err;
1183 
1184 		if (is_pipe)
1185 			data_offset = 0;
1186 		else {
1187 			data_offset = lseek(fd, 0, SEEK_CUR);
1188 			if (data_offset == -1)
1189 				return -errno;
1190 		}
1191 
1192 		err = auxtrace_queues__add_event(&etm->queues, session,
1193 						 event, data_offset, &buffer);
1194 		if (err)
1195 			return err;
1196 
1197 		if (dump_trace)
1198 			if (auxtrace_buffer__get_data(buffer, fd)) {
1199 				cs_etm__dump_event(etm, buffer);
1200 				auxtrace_buffer__put_data(buffer);
1201 			}
1202 	}
1203 
1204 	return 0;
1205 }
1206 
1207 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
1208 {
1209 	struct perf_evsel *evsel;
1210 	struct perf_evlist *evlist = etm->session->evlist;
1211 	bool timeless_decoding = true;
1212 
1213 	/*
1214 	 * Circle through the list of event and complain if we find one
1215 	 * with the time bit set.
1216 	 */
1217 	evlist__for_each_entry(evlist, evsel) {
1218 		if ((evsel->attr.sample_type & PERF_SAMPLE_TIME))
1219 			timeless_decoding = false;
1220 	}
1221 
1222 	return timeless_decoding;
1223 }
1224 
1225 static const char * const cs_etm_global_header_fmts[] = {
1226 	[CS_HEADER_VERSION_0]	= "	Header version		       %llx\n",
1227 	[CS_PMU_TYPE_CPUS]	= "	PMU type/num cpus	       %llx\n",
1228 	[CS_ETM_SNAPSHOT]	= "	Snapshot		       %llx\n",
1229 };
1230 
1231 static const char * const cs_etm_priv_fmts[] = {
1232 	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
1233 	[CS_ETM_CPU]		= "	CPU			       %lld\n",
1234 	[CS_ETM_ETMCR]		= "	ETMCR			       %llx\n",
1235 	[CS_ETM_ETMTRACEIDR]	= "	ETMTRACEIDR		       %llx\n",
1236 	[CS_ETM_ETMCCER]	= "	ETMCCER			       %llx\n",
1237 	[CS_ETM_ETMIDR]		= "	ETMIDR			       %llx\n",
1238 };
1239 
1240 static const char * const cs_etmv4_priv_fmts[] = {
1241 	[CS_ETM_MAGIC]		= "	Magic number		       %llx\n",
1242 	[CS_ETM_CPU]		= "	CPU			       %lld\n",
1243 	[CS_ETMV4_TRCCONFIGR]	= "	TRCCONFIGR		       %llx\n",
1244 	[CS_ETMV4_TRCTRACEIDR]	= "	TRCTRACEIDR		       %llx\n",
1245 	[CS_ETMV4_TRCIDR0]	= "	TRCIDR0			       %llx\n",
1246 	[CS_ETMV4_TRCIDR1]	= "	TRCIDR1			       %llx\n",
1247 	[CS_ETMV4_TRCIDR2]	= "	TRCIDR2			       %llx\n",
1248 	[CS_ETMV4_TRCIDR8]	= "	TRCIDR8			       %llx\n",
1249 	[CS_ETMV4_TRCAUTHSTATUS] = "	TRCAUTHSTATUS		       %llx\n",
1250 };
1251 
1252 static void cs_etm__print_auxtrace_info(u64 *val, int num)
1253 {
1254 	int i, j, cpu = 0;
1255 
1256 	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
1257 		fprintf(stdout, cs_etm_global_header_fmts[i], val[i]);
1258 
1259 	for (i = CS_HEADER_VERSION_0_MAX; cpu < num; cpu++) {
1260 		if (val[i] == __perf_cs_etmv3_magic)
1261 			for (j = 0; j < CS_ETM_PRIV_MAX; j++, i++)
1262 				fprintf(stdout, cs_etm_priv_fmts[j], val[i]);
1263 		else if (val[i] == __perf_cs_etmv4_magic)
1264 			for (j = 0; j < CS_ETMV4_PRIV_MAX; j++, i++)
1265 				fprintf(stdout, cs_etmv4_priv_fmts[j], val[i]);
1266 		else
1267 			/* failure.. return */
1268 			return;
1269 	}
1270 }
1271 
1272 int cs_etm__process_auxtrace_info(union perf_event *event,
1273 				  struct perf_session *session)
1274 {
1275 	struct auxtrace_info_event *auxtrace_info = &event->auxtrace_info;
1276 	struct cs_etm_auxtrace *etm = NULL;
1277 	struct int_node *inode;
1278 	unsigned int pmu_type;
1279 	int event_header_size = sizeof(struct perf_event_header);
1280 	int info_header_size;
1281 	int total_size = auxtrace_info->header.size;
1282 	int priv_size = 0;
1283 	int num_cpu;
1284 	int err = 0, idx = -1;
1285 	int i, j, k;
1286 	u64 *ptr, *hdr = NULL;
1287 	u64 **metadata = NULL;
1288 
1289 	/*
1290 	 * sizeof(auxtrace_info_event::type) +
1291 	 * sizeof(auxtrace_info_event::reserved) == 8
1292 	 */
1293 	info_header_size = 8;
1294 
1295 	if (total_size < (event_header_size + info_header_size))
1296 		return -EINVAL;
1297 
1298 	priv_size = total_size - event_header_size - info_header_size;
1299 
1300 	/* First the global part */
1301 	ptr = (u64 *) auxtrace_info->priv;
1302 
1303 	/* Look for version '0' of the header */
1304 	if (ptr[0] != 0)
1305 		return -EINVAL;
1306 
1307 	hdr = zalloc(sizeof(*hdr) * CS_HEADER_VERSION_0_MAX);
1308 	if (!hdr)
1309 		return -ENOMEM;
1310 
1311 	/* Extract header information - see cs-etm.h for format */
1312 	for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
1313 		hdr[i] = ptr[i];
1314 	num_cpu = hdr[CS_PMU_TYPE_CPUS] & 0xffffffff;
1315 	pmu_type = (unsigned int) ((hdr[CS_PMU_TYPE_CPUS] >> 32) &
1316 				    0xffffffff);
1317 
1318 	/*
1319 	 * Create an RB tree for traceID-CPU# tuple. Since the conversion has
1320 	 * to be made for each packet that gets decoded, optimizing access in
1321 	 * anything other than a sequential array is worth doing.
1322 	 */
1323 	traceid_list = intlist__new(NULL);
1324 	if (!traceid_list) {
1325 		err = -ENOMEM;
1326 		goto err_free_hdr;
1327 	}
1328 
1329 	metadata = zalloc(sizeof(*metadata) * num_cpu);
1330 	if (!metadata) {
1331 		err = -ENOMEM;
1332 		goto err_free_traceid_list;
1333 	}
1334 
1335 	/*
1336 	 * The metadata is stored in the auxtrace_info section and encodes
1337 	 * the configuration of the ARM embedded trace macrocell which is
1338 	 * required by the trace decoder to properly decode the trace due
1339 	 * to its highly compressed nature.
1340 	 */
1341 	for (j = 0; j < num_cpu; j++) {
1342 		if (ptr[i] == __perf_cs_etmv3_magic) {
1343 			metadata[j] = zalloc(sizeof(*metadata[j]) *
1344 					     CS_ETM_PRIV_MAX);
1345 			if (!metadata[j]) {
1346 				err = -ENOMEM;
1347 				goto err_free_metadata;
1348 			}
1349 			for (k = 0; k < CS_ETM_PRIV_MAX; k++)
1350 				metadata[j][k] = ptr[i + k];
1351 
1352 			/* The traceID is our handle */
1353 			idx = metadata[j][CS_ETM_ETMTRACEIDR];
1354 			i += CS_ETM_PRIV_MAX;
1355 		} else if (ptr[i] == __perf_cs_etmv4_magic) {
1356 			metadata[j] = zalloc(sizeof(*metadata[j]) *
1357 					     CS_ETMV4_PRIV_MAX);
1358 			if (!metadata[j]) {
1359 				err = -ENOMEM;
1360 				goto err_free_metadata;
1361 			}
1362 			for (k = 0; k < CS_ETMV4_PRIV_MAX; k++)
1363 				metadata[j][k] = ptr[i + k];
1364 
1365 			/* The traceID is our handle */
1366 			idx = metadata[j][CS_ETMV4_TRCTRACEIDR];
1367 			i += CS_ETMV4_PRIV_MAX;
1368 		}
1369 
1370 		/* Get an RB node for this CPU */
1371 		inode = intlist__findnew(traceid_list, idx);
1372 
1373 		/* Something went wrong, no need to continue */
1374 		if (!inode) {
1375 			err = PTR_ERR(inode);
1376 			goto err_free_metadata;
1377 		}
1378 
1379 		/*
1380 		 * The node for that CPU should not be taken.
1381 		 * Back out if that's the case.
1382 		 */
1383 		if (inode->priv) {
1384 			err = -EINVAL;
1385 			goto err_free_metadata;
1386 		}
1387 		/* All good, associate the traceID with the CPU# */
1388 		inode->priv = &metadata[j][CS_ETM_CPU];
1389 	}
1390 
1391 	/*
1392 	 * Each of CS_HEADER_VERSION_0_MAX, CS_ETM_PRIV_MAX and
1393 	 * CS_ETMV4_PRIV_MAX mark how many double words are in the
1394 	 * global metadata, and each cpu's metadata respectively.
1395 	 * The following tests if the correct number of double words was
1396 	 * present in the auxtrace info section.
1397 	 */
1398 	if (i * 8 != priv_size) {
1399 		err = -EINVAL;
1400 		goto err_free_metadata;
1401 	}
1402 
1403 	etm = zalloc(sizeof(*etm));
1404 
1405 	if (!etm) {
1406 		err = -ENOMEM;
1407 		goto err_free_metadata;
1408 	}
1409 
1410 	err = auxtrace_queues__init(&etm->queues);
1411 	if (err)
1412 		goto err_free_etm;
1413 
1414 	etm->session = session;
1415 	etm->machine = &session->machines.host;
1416 
1417 	etm->num_cpu = num_cpu;
1418 	etm->pmu_type = pmu_type;
1419 	etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0);
1420 	etm->metadata = metadata;
1421 	etm->auxtrace_type = auxtrace_info->type;
1422 	etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
1423 
1424 	etm->auxtrace.process_event = cs_etm__process_event;
1425 	etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
1426 	etm->auxtrace.flush_events = cs_etm__flush_events;
1427 	etm->auxtrace.free_events = cs_etm__free_events;
1428 	etm->auxtrace.free = cs_etm__free;
1429 	session->auxtrace = &etm->auxtrace;
1430 
1431 	etm->unknown_thread = thread__new(999999999, 999999999);
1432 	if (!etm->unknown_thread)
1433 		goto err_free_queues;
1434 
1435 	/*
1436 	 * Initialize list node so that at thread__zput() we can avoid
1437 	 * segmentation fault at list_del_init().
1438 	 */
1439 	INIT_LIST_HEAD(&etm->unknown_thread->node);
1440 
1441 	err = thread__set_comm(etm->unknown_thread, "unknown", 0);
1442 	if (err)
1443 		goto err_delete_thread;
1444 
1445 	if (thread__init_map_groups(etm->unknown_thread, etm->machine))
1446 		goto err_delete_thread;
1447 
1448 	if (dump_trace) {
1449 		cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
1450 		return 0;
1451 	}
1452 
1453 	if (session->itrace_synth_opts && session->itrace_synth_opts->set) {
1454 		etm->synth_opts = *session->itrace_synth_opts;
1455 	} else {
1456 		itrace_synth_opts__set_default(&etm->synth_opts,
1457 				session->itrace_synth_opts->default_no_sample);
1458 		etm->synth_opts.callchain = false;
1459 	}
1460 
1461 	err = cs_etm__synth_events(etm, session);
1462 	if (err)
1463 		goto err_delete_thread;
1464 
1465 	err = auxtrace_queues__process_index(&etm->queues, session);
1466 	if (err)
1467 		goto err_delete_thread;
1468 
1469 	etm->data_queued = etm->queues.populated;
1470 
1471 	return 0;
1472 
1473 err_delete_thread:
1474 	thread__zput(etm->unknown_thread);
1475 err_free_queues:
1476 	auxtrace_queues__free(&etm->queues);
1477 	session->auxtrace = NULL;
1478 err_free_etm:
1479 	zfree(&etm);
1480 err_free_metadata:
1481 	/* No need to check @metadata[j], free(NULL) is supported */
1482 	for (j = 0; j < num_cpu; j++)
1483 		free(metadata[j]);
1484 	zfree(&metadata);
1485 err_free_traceid_list:
1486 	intlist__delete(traceid_list);
1487 err_free_hdr:
1488 	zfree(&hdr);
1489 
1490 	return -EINVAL;
1491 }
1492