root/tools/perf/util/cs-etm.c

/* [<][>][^][v][top][bottom][index][help] */

DEFINITIONS

This source file includes following definitions.
  1. cs_etm__get_v7_protocol_version
  2. cs_etm__get_magic
  3. cs_etm__get_cpu
  4. cs_etm__etmq_set_traceid_queue_timestamp
  5. cs_etm__etmq_get_timestamp
  6. cs_etm__clear_packet_queue
  7. cs_etm__clear_all_packet_queues
  8. cs_etm__init_traceid_queue
  9. cs_etm__etmq_get_traceid_queue
  10. cs_etm__etmq_get_packet_queue
  11. cs_etm__packet_dump
  12. cs_etm__set_trace_param_etmv3
  13. cs_etm__set_trace_param_etmv4
  14. cs_etm__init_trace_params
  15. cs_etm__init_decoder_params
  16. cs_etm__dump_event
  17. cs_etm__flush_events
  18. cs_etm__free_traceid_queues
  19. cs_etm__free_queue
  20. cs_etm__free_events
  21. cs_etm__free
  22. cs_etm__cpu_mode
  23. cs_etm__mem_access
  24. cs_etm__alloc_queue
  25. cs_etm__setup_queue
  26. cs_etm__setup_queues
  27. cs_etm__update_queues
  28. cs_etm__copy_last_branch_rb
  29. cs_etm__reset_last_branch_rb
  30. cs_etm__t32_instr_size
  31. cs_etm__first_executed_instr
  32. cs_etm__last_executed_instr
  33. cs_etm__instr_addr
  34. cs_etm__update_last_branch_rb
  35. cs_etm__inject_event
  36. cs_etm__get_trace
  37. cs_etm__set_pid_tid_cpu
  38. cs_etm__etmq_set_tid
  39. cs_etm__etmq_is_timeless
  40. cs_etm__copy_insn
  41. cs_etm__synth_instruction_sample
  42. cs_etm__synth_branch_sample
  43. cs_etm__event_synth
  44. cs_etm__synth_event
  45. cs_etm__synth_events
  46. cs_etm__sample
  47. cs_etm__exception
  48. cs_etm__flush
  49. cs_etm__end_block
  50. cs_etm__get_data_block
  51. cs_etm__is_svc_instr
  52. cs_etm__is_syscall
  53. cs_etm__is_async_exception
  54. cs_etm__is_sync_exception
  55. cs_etm__set_sample_flags
  56. cs_etm__decode_data_block
  57. cs_etm__process_traceid_queue
  58. cs_etm__clear_all_traceid_queues
  59. cs_etm__run_decoder
  60. cs_etm__process_timeless_queues
  61. cs_etm__process_queues
  62. cs_etm__process_itrace_start
  63. cs_etm__process_switch_cpu_wide
  64. cs_etm__process_event
  65. cs_etm__process_auxtrace_event
  66. cs_etm__is_timeless_decoding
  67. cs_etm__print_auxtrace_info
  68. cs_etm__process_auxtrace_info

   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 #include <linux/zalloc.h>
  15 
  16 #include <opencsd/ocsd_if_types.h>
  17 #include <stdlib.h>
  18 
  19 #include "auxtrace.h"
  20 #include "color.h"
  21 #include "cs-etm.h"
  22 #include "cs-etm-decoder/cs-etm-decoder.h"
  23 #include "debug.h"
  24 #include "dso.h"
  25 #include "evlist.h"
  26 #include "intlist.h"
  27 #include "machine.h"
  28 #include "map.h"
  29 #include "perf.h"
  30 #include "session.h"
  31 #include "map_symbol.h"
  32 #include "branch.h"
  33 #include "symbol.h"
  34 #include "tool.h"
  35 #include "thread.h"
  36 #include "thread-stack.h"
  37 #include <tools/libc_compat.h>
  38 #include "util/synthetic-events.h"
  39 
  40 #define MAX_TIMESTAMP (~0ULL)
  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_traceid_queue {
  70         u8 trace_chan_id;
  71         pid_t pid, tid;
  72         u64 period_instructions;
  73         size_t last_branch_pos;
  74         union perf_event *event_buf;
  75         struct thread *thread;
  76         struct branch_stack *last_branch;
  77         struct branch_stack *last_branch_rb;
  78         struct cs_etm_packet *prev_packet;
  79         struct cs_etm_packet *packet;
  80         struct cs_etm_packet_queue packet_queue;
  81 };
  82 
  83 struct cs_etm_queue {
  84         struct cs_etm_auxtrace *etm;
  85         struct cs_etm_decoder *decoder;
  86         struct auxtrace_buffer *buffer;
  87         unsigned int queue_nr;
  88         u8 pending_timestamp;
  89         u64 offset;
  90         const unsigned char *buf;
  91         size_t buf_len, buf_used;
  92         /* Conversion between traceID and index in traceid_queues array */
  93         struct intlist *traceid_queues_list;
  94         struct cs_etm_traceid_queue **traceid_queues;
  95 };
  96 
  97 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
  98 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
  99 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
 100                                            pid_t tid);
 101 static int cs_etm__get_data_block(struct cs_etm_queue *etmq);
 102 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq);
 103 
 104 /* PTMs ETMIDR [11:8] set to b0011 */
 105 #define ETMIDR_PTM_VERSION 0x00000300
 106 
 107 /*
 108  * A struct auxtrace_heap_item only has a queue_nr and a timestamp to
 109  * work with.  One option is to modify to auxtrace_heap_XYZ() API or simply
 110  * encode the etm queue number as the upper 16 bit and the channel as
 111  * the lower 16 bit.
 112  */
 113 #define TO_CS_QUEUE_NR(queue_nr, trace_chan_id) \
 114                       (queue_nr << 16 | trace_chan_id)
 115 #define TO_QUEUE_NR(cs_queue_nr) (cs_queue_nr >> 16)
 116 #define TO_TRACE_CHAN_ID(cs_queue_nr) (cs_queue_nr & 0x0000ffff)
 117 
 118 static u32 cs_etm__get_v7_protocol_version(u32 etmidr)
 119 {
 120         etmidr &= ETMIDR_PTM_VERSION;
 121 
 122         if (etmidr == ETMIDR_PTM_VERSION)
 123                 return CS_ETM_PROTO_PTM;
 124 
 125         return CS_ETM_PROTO_ETMV3;
 126 }
 127 
 128 static int cs_etm__get_magic(u8 trace_chan_id, u64 *magic)
 129 {
 130         struct int_node *inode;
 131         u64 *metadata;
 132 
 133         inode = intlist__find(traceid_list, trace_chan_id);
 134         if (!inode)
 135                 return -EINVAL;
 136 
 137         metadata = inode->priv;
 138         *magic = metadata[CS_ETM_MAGIC];
 139         return 0;
 140 }
 141 
 142 int cs_etm__get_cpu(u8 trace_chan_id, int *cpu)
 143 {
 144         struct int_node *inode;
 145         u64 *metadata;
 146 
 147         inode = intlist__find(traceid_list, trace_chan_id);
 148         if (!inode)
 149                 return -EINVAL;
 150 
 151         metadata = inode->priv;
 152         *cpu = (int)metadata[CS_ETM_CPU];
 153         return 0;
 154 }
 155 
 156 void cs_etm__etmq_set_traceid_queue_timestamp(struct cs_etm_queue *etmq,
 157                                               u8 trace_chan_id)
 158 {
 159         /*
 160          * Wnen a timestamp packet is encountered the backend code
 161          * is stopped so that the front end has time to process packets
 162          * that were accumulated in the traceID queue.  Since there can
 163          * be more than one channel per cs_etm_queue, we need to specify
 164          * what traceID queue needs servicing.
 165          */
 166         etmq->pending_timestamp = trace_chan_id;
 167 }
 168 
 169 static u64 cs_etm__etmq_get_timestamp(struct cs_etm_queue *etmq,
 170                                       u8 *trace_chan_id)
 171 {
 172         struct cs_etm_packet_queue *packet_queue;
 173 
 174         if (!etmq->pending_timestamp)
 175                 return 0;
 176 
 177         if (trace_chan_id)
 178                 *trace_chan_id = etmq->pending_timestamp;
 179 
 180         packet_queue = cs_etm__etmq_get_packet_queue(etmq,
 181                                                      etmq->pending_timestamp);
 182         if (!packet_queue)
 183                 return 0;
 184 
 185         /* Acknowledge pending status */
 186         etmq->pending_timestamp = 0;
 187 
 188         /* See function cs_etm_decoder__do_{hard|soft}_timestamp() */
 189         return packet_queue->timestamp;
 190 }
 191 
 192 static void cs_etm__clear_packet_queue(struct cs_etm_packet_queue *queue)
 193 {
 194         int i;
 195 
 196         queue->head = 0;
 197         queue->tail = 0;
 198         queue->packet_count = 0;
 199         for (i = 0; i < CS_ETM_PACKET_MAX_BUFFER; i++) {
 200                 queue->packet_buffer[i].isa = CS_ETM_ISA_UNKNOWN;
 201                 queue->packet_buffer[i].start_addr = CS_ETM_INVAL_ADDR;
 202                 queue->packet_buffer[i].end_addr = CS_ETM_INVAL_ADDR;
 203                 queue->packet_buffer[i].instr_count = 0;
 204                 queue->packet_buffer[i].last_instr_taken_branch = false;
 205                 queue->packet_buffer[i].last_instr_size = 0;
 206                 queue->packet_buffer[i].last_instr_type = 0;
 207                 queue->packet_buffer[i].last_instr_subtype = 0;
 208                 queue->packet_buffer[i].last_instr_cond = 0;
 209                 queue->packet_buffer[i].flags = 0;
 210                 queue->packet_buffer[i].exception_number = UINT32_MAX;
 211                 queue->packet_buffer[i].trace_chan_id = UINT8_MAX;
 212                 queue->packet_buffer[i].cpu = INT_MIN;
 213         }
 214 }
 215 
 216 static void cs_etm__clear_all_packet_queues(struct cs_etm_queue *etmq)
 217 {
 218         int idx;
 219         struct int_node *inode;
 220         struct cs_etm_traceid_queue *tidq;
 221         struct intlist *traceid_queues_list = etmq->traceid_queues_list;
 222 
 223         intlist__for_each_entry(inode, traceid_queues_list) {
 224                 idx = (int)(intptr_t)inode->priv;
 225                 tidq = etmq->traceid_queues[idx];
 226                 cs_etm__clear_packet_queue(&tidq->packet_queue);
 227         }
 228 }
 229 
 230 static int cs_etm__init_traceid_queue(struct cs_etm_queue *etmq,
 231                                       struct cs_etm_traceid_queue *tidq,
 232                                       u8 trace_chan_id)
 233 {
 234         int rc = -ENOMEM;
 235         struct auxtrace_queue *queue;
 236         struct cs_etm_auxtrace *etm = etmq->etm;
 237 
 238         cs_etm__clear_packet_queue(&tidq->packet_queue);
 239 
 240         queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
 241         tidq->tid = queue->tid;
 242         tidq->pid = -1;
 243         tidq->trace_chan_id = trace_chan_id;
 244 
 245         tidq->packet = zalloc(sizeof(struct cs_etm_packet));
 246         if (!tidq->packet)
 247                 goto out;
 248 
 249         tidq->prev_packet = zalloc(sizeof(struct cs_etm_packet));
 250         if (!tidq->prev_packet)
 251                 goto out_free;
 252 
 253         if (etm->synth_opts.last_branch) {
 254                 size_t sz = sizeof(struct branch_stack);
 255 
 256                 sz += etm->synth_opts.last_branch_sz *
 257                       sizeof(struct branch_entry);
 258                 tidq->last_branch = zalloc(sz);
 259                 if (!tidq->last_branch)
 260                         goto out_free;
 261                 tidq->last_branch_rb = zalloc(sz);
 262                 if (!tidq->last_branch_rb)
 263                         goto out_free;
 264         }
 265 
 266         tidq->event_buf = malloc(PERF_SAMPLE_MAX_SIZE);
 267         if (!tidq->event_buf)
 268                 goto out_free;
 269 
 270         return 0;
 271 
 272 out_free:
 273         zfree(&tidq->last_branch_rb);
 274         zfree(&tidq->last_branch);
 275         zfree(&tidq->prev_packet);
 276         zfree(&tidq->packet);
 277 out:
 278         return rc;
 279 }
 280 
 281 static struct cs_etm_traceid_queue
 282 *cs_etm__etmq_get_traceid_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
 283 {
 284         int idx;
 285         struct int_node *inode;
 286         struct intlist *traceid_queues_list;
 287         struct cs_etm_traceid_queue *tidq, **traceid_queues;
 288         struct cs_etm_auxtrace *etm = etmq->etm;
 289 
 290         if (etm->timeless_decoding)
 291                 trace_chan_id = CS_ETM_PER_THREAD_TRACEID;
 292 
 293         traceid_queues_list = etmq->traceid_queues_list;
 294 
 295         /*
 296          * Check if the traceid_queue exist for this traceID by looking
 297          * in the queue list.
 298          */
 299         inode = intlist__find(traceid_queues_list, trace_chan_id);
 300         if (inode) {
 301                 idx = (int)(intptr_t)inode->priv;
 302                 return etmq->traceid_queues[idx];
 303         }
 304 
 305         /* We couldn't find a traceid_queue for this traceID, allocate one */
 306         tidq = malloc(sizeof(*tidq));
 307         if (!tidq)
 308                 return NULL;
 309 
 310         memset(tidq, 0, sizeof(*tidq));
 311 
 312         /* Get a valid index for the new traceid_queue */
 313         idx = intlist__nr_entries(traceid_queues_list);
 314         /* Memory for the inode is free'ed in cs_etm_free_traceid_queues () */
 315         inode = intlist__findnew(traceid_queues_list, trace_chan_id);
 316         if (!inode)
 317                 goto out_free;
 318 
 319         /* Associate this traceID with this index */
 320         inode->priv = (void *)(intptr_t)idx;
 321 
 322         if (cs_etm__init_traceid_queue(etmq, tidq, trace_chan_id))
 323                 goto out_free;
 324 
 325         /* Grow the traceid_queues array by one unit */
 326         traceid_queues = etmq->traceid_queues;
 327         traceid_queues = reallocarray(traceid_queues,
 328                                       idx + 1,
 329                                       sizeof(*traceid_queues));
 330 
 331         /*
 332          * On failure reallocarray() returns NULL and the original block of
 333          * memory is left untouched.
 334          */
 335         if (!traceid_queues)
 336                 goto out_free;
 337 
 338         traceid_queues[idx] = tidq;
 339         etmq->traceid_queues = traceid_queues;
 340 
 341         return etmq->traceid_queues[idx];
 342 
 343 out_free:
 344         /*
 345          * Function intlist__remove() removes the inode from the list
 346          * and delete the memory associated to it.
 347          */
 348         intlist__remove(traceid_queues_list, inode);
 349         free(tidq);
 350 
 351         return NULL;
 352 }
 353 
 354 struct cs_etm_packet_queue
 355 *cs_etm__etmq_get_packet_queue(struct cs_etm_queue *etmq, u8 trace_chan_id)
 356 {
 357         struct cs_etm_traceid_queue *tidq;
 358 
 359         tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
 360         if (tidq)
 361                 return &tidq->packet_queue;
 362 
 363         return NULL;
 364 }
 365 
 366 static void cs_etm__packet_dump(const char *pkt_string)
 367 {
 368         const char *color = PERF_COLOR_BLUE;
 369         int len = strlen(pkt_string);
 370 
 371         if (len && (pkt_string[len-1] == '\n'))
 372                 color_fprintf(stdout, color, "  %s", pkt_string);
 373         else
 374                 color_fprintf(stdout, color, "  %s\n", pkt_string);
 375 
 376         fflush(stdout);
 377 }
 378 
 379 static void cs_etm__set_trace_param_etmv3(struct cs_etm_trace_params *t_params,
 380                                           struct cs_etm_auxtrace *etm, int idx,
 381                                           u32 etmidr)
 382 {
 383         u64 **metadata = etm->metadata;
 384 
 385         t_params[idx].protocol = cs_etm__get_v7_protocol_version(etmidr);
 386         t_params[idx].etmv3.reg_ctrl = metadata[idx][CS_ETM_ETMCR];
 387         t_params[idx].etmv3.reg_trc_id = metadata[idx][CS_ETM_ETMTRACEIDR];
 388 }
 389 
 390 static void cs_etm__set_trace_param_etmv4(struct cs_etm_trace_params *t_params,
 391                                           struct cs_etm_auxtrace *etm, int idx)
 392 {
 393         u64 **metadata = etm->metadata;
 394 
 395         t_params[idx].protocol = CS_ETM_PROTO_ETMV4i;
 396         t_params[idx].etmv4.reg_idr0 = metadata[idx][CS_ETMV4_TRCIDR0];
 397         t_params[idx].etmv4.reg_idr1 = metadata[idx][CS_ETMV4_TRCIDR1];
 398         t_params[idx].etmv4.reg_idr2 = metadata[idx][CS_ETMV4_TRCIDR2];
 399         t_params[idx].etmv4.reg_idr8 = metadata[idx][CS_ETMV4_TRCIDR8];
 400         t_params[idx].etmv4.reg_configr = metadata[idx][CS_ETMV4_TRCCONFIGR];
 401         t_params[idx].etmv4.reg_traceidr = metadata[idx][CS_ETMV4_TRCTRACEIDR];
 402 }
 403 
 404 static int cs_etm__init_trace_params(struct cs_etm_trace_params *t_params,
 405                                      struct cs_etm_auxtrace *etm)
 406 {
 407         int i;
 408         u32 etmidr;
 409         u64 architecture;
 410 
 411         for (i = 0; i < etm->num_cpu; i++) {
 412                 architecture = etm->metadata[i][CS_ETM_MAGIC];
 413 
 414                 switch (architecture) {
 415                 case __perf_cs_etmv3_magic:
 416                         etmidr = etm->metadata[i][CS_ETM_ETMIDR];
 417                         cs_etm__set_trace_param_etmv3(t_params, etm, i, etmidr);
 418                         break;
 419                 case __perf_cs_etmv4_magic:
 420                         cs_etm__set_trace_param_etmv4(t_params, etm, i);
 421                         break;
 422                 default:
 423                         return -EINVAL;
 424                 }
 425         }
 426 
 427         return 0;
 428 }
 429 
 430 static int cs_etm__init_decoder_params(struct cs_etm_decoder_params *d_params,
 431                                        struct cs_etm_queue *etmq,
 432                                        enum cs_etm_decoder_operation mode)
 433 {
 434         int ret = -EINVAL;
 435 
 436         if (!(mode < CS_ETM_OPERATION_MAX))
 437                 goto out;
 438 
 439         d_params->packet_printer = cs_etm__packet_dump;
 440         d_params->operation = mode;
 441         d_params->data = etmq;
 442         d_params->formatted = true;
 443         d_params->fsyncs = false;
 444         d_params->hsyncs = false;
 445         d_params->frame_aligned = true;
 446 
 447         ret = 0;
 448 out:
 449         return ret;
 450 }
 451 
 452 static void cs_etm__dump_event(struct cs_etm_auxtrace *etm,
 453                                struct auxtrace_buffer *buffer)
 454 {
 455         int ret;
 456         const char *color = PERF_COLOR_BLUE;
 457         struct cs_etm_decoder_params d_params;
 458         struct cs_etm_trace_params *t_params;
 459         struct cs_etm_decoder *decoder;
 460         size_t buffer_used = 0;
 461 
 462         fprintf(stdout, "\n");
 463         color_fprintf(stdout, color,
 464                      ". ... CoreSight ETM Trace data: size %zu bytes\n",
 465                      buffer->size);
 466 
 467         /* Use metadata to fill in trace parameters for trace decoder */
 468         t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
 469 
 470         if (!t_params)
 471                 return;
 472 
 473         if (cs_etm__init_trace_params(t_params, etm))
 474                 goto out_free;
 475 
 476         /* Set decoder parameters to simply print the trace packets */
 477         if (cs_etm__init_decoder_params(&d_params, NULL,
 478                                         CS_ETM_OPERATION_PRINT))
 479                 goto out_free;
 480 
 481         decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
 482 
 483         if (!decoder)
 484                 goto out_free;
 485         do {
 486                 size_t consumed;
 487 
 488                 ret = cs_etm_decoder__process_data_block(
 489                                 decoder, buffer->offset,
 490                                 &((u8 *)buffer->data)[buffer_used],
 491                                 buffer->size - buffer_used, &consumed);
 492                 if (ret)
 493                         break;
 494 
 495                 buffer_used += consumed;
 496         } while (buffer_used < buffer->size);
 497 
 498         cs_etm_decoder__free(decoder);
 499 
 500 out_free:
 501         zfree(&t_params);
 502 }
 503 
 504 static int cs_etm__flush_events(struct perf_session *session,
 505                                 struct perf_tool *tool)
 506 {
 507         int ret;
 508         struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
 509                                                    struct cs_etm_auxtrace,
 510                                                    auxtrace);
 511         if (dump_trace)
 512                 return 0;
 513 
 514         if (!tool->ordered_events)
 515                 return -EINVAL;
 516 
 517         ret = cs_etm__update_queues(etm);
 518 
 519         if (ret < 0)
 520                 return ret;
 521 
 522         if (etm->timeless_decoding)
 523                 return cs_etm__process_timeless_queues(etm, -1);
 524 
 525         return cs_etm__process_queues(etm);
 526 }
 527 
 528 static void cs_etm__free_traceid_queues(struct cs_etm_queue *etmq)
 529 {
 530         int idx;
 531         uintptr_t priv;
 532         struct int_node *inode, *tmp;
 533         struct cs_etm_traceid_queue *tidq;
 534         struct intlist *traceid_queues_list = etmq->traceid_queues_list;
 535 
 536         intlist__for_each_entry_safe(inode, tmp, traceid_queues_list) {
 537                 priv = (uintptr_t)inode->priv;
 538                 idx = priv;
 539 
 540                 /* Free this traceid_queue from the array */
 541                 tidq = etmq->traceid_queues[idx];
 542                 thread__zput(tidq->thread);
 543                 zfree(&tidq->event_buf);
 544                 zfree(&tidq->last_branch);
 545                 zfree(&tidq->last_branch_rb);
 546                 zfree(&tidq->prev_packet);
 547                 zfree(&tidq->packet);
 548                 zfree(&tidq);
 549 
 550                 /*
 551                  * Function intlist__remove() removes the inode from the list
 552                  * and delete the memory associated to it.
 553                  */
 554                 intlist__remove(traceid_queues_list, inode);
 555         }
 556 
 557         /* Then the RB tree itself */
 558         intlist__delete(traceid_queues_list);
 559         etmq->traceid_queues_list = NULL;
 560 
 561         /* finally free the traceid_queues array */
 562         zfree(&etmq->traceid_queues);
 563 }
 564 
 565 static void cs_etm__free_queue(void *priv)
 566 {
 567         struct cs_etm_queue *etmq = priv;
 568 
 569         if (!etmq)
 570                 return;
 571 
 572         cs_etm_decoder__free(etmq->decoder);
 573         cs_etm__free_traceid_queues(etmq);
 574         free(etmq);
 575 }
 576 
 577 static void cs_etm__free_events(struct perf_session *session)
 578 {
 579         unsigned int i;
 580         struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
 581                                                    struct cs_etm_auxtrace,
 582                                                    auxtrace);
 583         struct auxtrace_queues *queues = &aux->queues;
 584 
 585         for (i = 0; i < queues->nr_queues; i++) {
 586                 cs_etm__free_queue(queues->queue_array[i].priv);
 587                 queues->queue_array[i].priv = NULL;
 588         }
 589 
 590         auxtrace_queues__free(queues);
 591 }
 592 
 593 static void cs_etm__free(struct perf_session *session)
 594 {
 595         int i;
 596         struct int_node *inode, *tmp;
 597         struct cs_etm_auxtrace *aux = container_of(session->auxtrace,
 598                                                    struct cs_etm_auxtrace,
 599                                                    auxtrace);
 600         cs_etm__free_events(session);
 601         session->auxtrace = NULL;
 602 
 603         /* First remove all traceID/metadata nodes for the RB tree */
 604         intlist__for_each_entry_safe(inode, tmp, traceid_list)
 605                 intlist__remove(traceid_list, inode);
 606         /* Then the RB tree itself */
 607         intlist__delete(traceid_list);
 608 
 609         for (i = 0; i < aux->num_cpu; i++)
 610                 zfree(&aux->metadata[i]);
 611 
 612         thread__zput(aux->unknown_thread);
 613         zfree(&aux->metadata);
 614         zfree(&aux);
 615 }
 616 
 617 static u8 cs_etm__cpu_mode(struct cs_etm_queue *etmq, u64 address)
 618 {
 619         struct machine *machine;
 620 
 621         machine = etmq->etm->machine;
 622 
 623         if (address >= etmq->etm->kernel_start) {
 624                 if (machine__is_host(machine))
 625                         return PERF_RECORD_MISC_KERNEL;
 626                 else
 627                         return PERF_RECORD_MISC_GUEST_KERNEL;
 628         } else {
 629                 if (machine__is_host(machine))
 630                         return PERF_RECORD_MISC_USER;
 631                 else if (perf_guest)
 632                         return PERF_RECORD_MISC_GUEST_USER;
 633                 else
 634                         return PERF_RECORD_MISC_HYPERVISOR;
 635         }
 636 }
 637 
 638 static u32 cs_etm__mem_access(struct cs_etm_queue *etmq, u8 trace_chan_id,
 639                               u64 address, size_t size, u8 *buffer)
 640 {
 641         u8  cpumode;
 642         u64 offset;
 643         int len;
 644         struct thread *thread;
 645         struct machine *machine;
 646         struct addr_location al;
 647         struct cs_etm_traceid_queue *tidq;
 648 
 649         if (!etmq)
 650                 return 0;
 651 
 652         machine = etmq->etm->machine;
 653         cpumode = cs_etm__cpu_mode(etmq, address);
 654         tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
 655         if (!tidq)
 656                 return 0;
 657 
 658         thread = tidq->thread;
 659         if (!thread) {
 660                 if (cpumode != PERF_RECORD_MISC_KERNEL)
 661                         return 0;
 662                 thread = etmq->etm->unknown_thread;
 663         }
 664 
 665         if (!thread__find_map(thread, cpumode, address, &al) || !al.map->dso)
 666                 return 0;
 667 
 668         if (al.map->dso->data.status == DSO_DATA_STATUS_ERROR &&
 669             dso__data_status_seen(al.map->dso, DSO_DATA_STATUS_SEEN_ITRACE))
 670                 return 0;
 671 
 672         offset = al.map->map_ip(al.map, address);
 673 
 674         map__load(al.map);
 675 
 676         len = dso__data_read_offset(al.map->dso, machine, offset, buffer, size);
 677 
 678         if (len <= 0)
 679                 return 0;
 680 
 681         return len;
 682 }
 683 
 684 static struct cs_etm_queue *cs_etm__alloc_queue(struct cs_etm_auxtrace *etm)
 685 {
 686         struct cs_etm_decoder_params d_params;
 687         struct cs_etm_trace_params  *t_params = NULL;
 688         struct cs_etm_queue *etmq;
 689 
 690         etmq = zalloc(sizeof(*etmq));
 691         if (!etmq)
 692                 return NULL;
 693 
 694         etmq->traceid_queues_list = intlist__new(NULL);
 695         if (!etmq->traceid_queues_list)
 696                 goto out_free;
 697 
 698         /* Use metadata to fill in trace parameters for trace decoder */
 699         t_params = zalloc(sizeof(*t_params) * etm->num_cpu);
 700 
 701         if (!t_params)
 702                 goto out_free;
 703 
 704         if (cs_etm__init_trace_params(t_params, etm))
 705                 goto out_free;
 706 
 707         /* Set decoder parameters to decode trace packets */
 708         if (cs_etm__init_decoder_params(&d_params, etmq,
 709                                         CS_ETM_OPERATION_DECODE))
 710                 goto out_free;
 711 
 712         etmq->decoder = cs_etm_decoder__new(etm->num_cpu, &d_params, t_params);
 713 
 714         if (!etmq->decoder)
 715                 goto out_free;
 716 
 717         /*
 718          * Register a function to handle all memory accesses required by
 719          * the trace decoder library.
 720          */
 721         if (cs_etm_decoder__add_mem_access_cb(etmq->decoder,
 722                                               0x0L, ((u64) -1L),
 723                                               cs_etm__mem_access))
 724                 goto out_free_decoder;
 725 
 726         zfree(&t_params);
 727         return etmq;
 728 
 729 out_free_decoder:
 730         cs_etm_decoder__free(etmq->decoder);
 731 out_free:
 732         intlist__delete(etmq->traceid_queues_list);
 733         free(etmq);
 734 
 735         return NULL;
 736 }
 737 
 738 static int cs_etm__setup_queue(struct cs_etm_auxtrace *etm,
 739                                struct auxtrace_queue *queue,
 740                                unsigned int queue_nr)
 741 {
 742         int ret = 0;
 743         unsigned int cs_queue_nr;
 744         u8 trace_chan_id;
 745         u64 timestamp;
 746         struct cs_etm_queue *etmq = queue->priv;
 747 
 748         if (list_empty(&queue->head) || etmq)
 749                 goto out;
 750 
 751         etmq = cs_etm__alloc_queue(etm);
 752 
 753         if (!etmq) {
 754                 ret = -ENOMEM;
 755                 goto out;
 756         }
 757 
 758         queue->priv = etmq;
 759         etmq->etm = etm;
 760         etmq->queue_nr = queue_nr;
 761         etmq->offset = 0;
 762 
 763         if (etm->timeless_decoding)
 764                 goto out;
 765 
 766         /*
 767          * We are under a CPU-wide trace scenario.  As such we need to know
 768          * when the code that generated the traces started to execute so that
 769          * it can be correlated with execution on other CPUs.  So we get a
 770          * handle on the beginning of traces and decode until we find a
 771          * timestamp.  The timestamp is then added to the auxtrace min heap
 772          * in order to know what nibble (of all the etmqs) to decode first.
 773          */
 774         while (1) {
 775                 /*
 776                  * Fetch an aux_buffer from this etmq.  Bail if no more
 777                  * blocks or an error has been encountered.
 778                  */
 779                 ret = cs_etm__get_data_block(etmq);
 780                 if (ret <= 0)
 781                         goto out;
 782 
 783                 /*
 784                  * Run decoder on the trace block.  The decoder will stop when
 785                  * encountering a timestamp, a full packet queue or the end of
 786                  * trace for that block.
 787                  */
 788                 ret = cs_etm__decode_data_block(etmq);
 789                 if (ret)
 790                         goto out;
 791 
 792                 /*
 793                  * Function cs_etm_decoder__do_{hard|soft}_timestamp() does all
 794                  * the timestamp calculation for us.
 795                  */
 796                 timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
 797 
 798                 /* We found a timestamp, no need to continue. */
 799                 if (timestamp)
 800                         break;
 801 
 802                 /*
 803                  * We didn't find a timestamp so empty all the traceid packet
 804                  * queues before looking for another timestamp packet, either
 805                  * in the current data block or a new one.  Packets that were
 806                  * just decoded are useless since no timestamp has been
 807                  * associated with them.  As such simply discard them.
 808                  */
 809                 cs_etm__clear_all_packet_queues(etmq);
 810         }
 811 
 812         /*
 813          * We have a timestamp.  Add it to the min heap to reflect when
 814          * instructions conveyed by the range packets of this traceID queue
 815          * started to execute.  Once the same has been done for all the traceID
 816          * queues of each etmq, redenring and decoding can start in
 817          * chronological order.
 818          *
 819          * Note that packets decoded above are still in the traceID's packet
 820          * queue and will be processed in cs_etm__process_queues().
 821          */
 822         cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_chan_id);
 823         ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp);
 824 out:
 825         return ret;
 826 }
 827 
 828 static int cs_etm__setup_queues(struct cs_etm_auxtrace *etm)
 829 {
 830         unsigned int i;
 831         int ret;
 832 
 833         if (!etm->kernel_start)
 834                 etm->kernel_start = machine__kernel_start(etm->machine);
 835 
 836         for (i = 0; i < etm->queues.nr_queues; i++) {
 837                 ret = cs_etm__setup_queue(etm, &etm->queues.queue_array[i], i);
 838                 if (ret)
 839                         return ret;
 840         }
 841 
 842         return 0;
 843 }
 844 
 845 static int cs_etm__update_queues(struct cs_etm_auxtrace *etm)
 846 {
 847         if (etm->queues.new_data) {
 848                 etm->queues.new_data = false;
 849                 return cs_etm__setup_queues(etm);
 850         }
 851 
 852         return 0;
 853 }
 854 
 855 static inline
 856 void cs_etm__copy_last_branch_rb(struct cs_etm_queue *etmq,
 857                                  struct cs_etm_traceid_queue *tidq)
 858 {
 859         struct branch_stack *bs_src = tidq->last_branch_rb;
 860         struct branch_stack *bs_dst = tidq->last_branch;
 861         size_t nr = 0;
 862 
 863         /*
 864          * Set the number of records before early exit: ->nr is used to
 865          * determine how many branches to copy from ->entries.
 866          */
 867         bs_dst->nr = bs_src->nr;
 868 
 869         /*
 870          * Early exit when there is nothing to copy.
 871          */
 872         if (!bs_src->nr)
 873                 return;
 874 
 875         /*
 876          * As bs_src->entries is a circular buffer, we need to copy from it in
 877          * two steps.  First, copy the branches from the most recently inserted
 878          * branch ->last_branch_pos until the end of bs_src->entries buffer.
 879          */
 880         nr = etmq->etm->synth_opts.last_branch_sz - tidq->last_branch_pos;
 881         memcpy(&bs_dst->entries[0],
 882                &bs_src->entries[tidq->last_branch_pos],
 883                sizeof(struct branch_entry) * nr);
 884 
 885         /*
 886          * If we wrapped around at least once, the branches from the beginning
 887          * of the bs_src->entries buffer and until the ->last_branch_pos element
 888          * are older valid branches: copy them over.  The total number of
 889          * branches copied over will be equal to the number of branches asked by
 890          * the user in last_branch_sz.
 891          */
 892         if (bs_src->nr >= etmq->etm->synth_opts.last_branch_sz) {
 893                 memcpy(&bs_dst->entries[nr],
 894                        &bs_src->entries[0],
 895                        sizeof(struct branch_entry) * tidq->last_branch_pos);
 896         }
 897 }
 898 
 899 static inline
 900 void cs_etm__reset_last_branch_rb(struct cs_etm_traceid_queue *tidq)
 901 {
 902         tidq->last_branch_pos = 0;
 903         tidq->last_branch_rb->nr = 0;
 904 }
 905 
 906 static inline int cs_etm__t32_instr_size(struct cs_etm_queue *etmq,
 907                                          u8 trace_chan_id, u64 addr)
 908 {
 909         u8 instrBytes[2];
 910 
 911         cs_etm__mem_access(etmq, trace_chan_id, addr,
 912                            ARRAY_SIZE(instrBytes), instrBytes);
 913         /*
 914          * T32 instruction size is indicated by bits[15:11] of the first
 915          * 16-bit word of the instruction: 0b11101, 0b11110 and 0b11111
 916          * denote a 32-bit instruction.
 917          */
 918         return ((instrBytes[1] & 0xF8) >= 0xE8) ? 4 : 2;
 919 }
 920 
 921 static inline u64 cs_etm__first_executed_instr(struct cs_etm_packet *packet)
 922 {
 923         /* Returns 0 for the CS_ETM_DISCONTINUITY packet */
 924         if (packet->sample_type == CS_ETM_DISCONTINUITY)
 925                 return 0;
 926 
 927         return packet->start_addr;
 928 }
 929 
 930 static inline
 931 u64 cs_etm__last_executed_instr(const struct cs_etm_packet *packet)
 932 {
 933         /* Returns 0 for the CS_ETM_DISCONTINUITY packet */
 934         if (packet->sample_type == CS_ETM_DISCONTINUITY)
 935                 return 0;
 936 
 937         return packet->end_addr - packet->last_instr_size;
 938 }
 939 
 940 static inline u64 cs_etm__instr_addr(struct cs_etm_queue *etmq,
 941                                      u64 trace_chan_id,
 942                                      const struct cs_etm_packet *packet,
 943                                      u64 offset)
 944 {
 945         if (packet->isa == CS_ETM_ISA_T32) {
 946                 u64 addr = packet->start_addr;
 947 
 948                 while (offset > 0) {
 949                         addr += cs_etm__t32_instr_size(etmq,
 950                                                        trace_chan_id, addr);
 951                         offset--;
 952                 }
 953                 return addr;
 954         }
 955 
 956         /* Assume a 4 byte instruction size (A32/A64) */
 957         return packet->start_addr + offset * 4;
 958 }
 959 
 960 static void cs_etm__update_last_branch_rb(struct cs_etm_queue *etmq,
 961                                           struct cs_etm_traceid_queue *tidq)
 962 {
 963         struct branch_stack *bs = tidq->last_branch_rb;
 964         struct branch_entry *be;
 965 
 966         /*
 967          * The branches are recorded in a circular buffer in reverse
 968          * chronological order: we start recording from the last element of the
 969          * buffer down.  After writing the first element of the stack, move the
 970          * insert position back to the end of the buffer.
 971          */
 972         if (!tidq->last_branch_pos)
 973                 tidq->last_branch_pos = etmq->etm->synth_opts.last_branch_sz;
 974 
 975         tidq->last_branch_pos -= 1;
 976 
 977         be       = &bs->entries[tidq->last_branch_pos];
 978         be->from = cs_etm__last_executed_instr(tidq->prev_packet);
 979         be->to   = cs_etm__first_executed_instr(tidq->packet);
 980         /* No support for mispredict */
 981         be->flags.mispred = 0;
 982         be->flags.predicted = 1;
 983 
 984         /*
 985          * Increment bs->nr until reaching the number of last branches asked by
 986          * the user on the command line.
 987          */
 988         if (bs->nr < etmq->etm->synth_opts.last_branch_sz)
 989                 bs->nr += 1;
 990 }
 991 
 992 static int cs_etm__inject_event(union perf_event *event,
 993                                struct perf_sample *sample, u64 type)
 994 {
 995         event->header.size = perf_event__sample_event_size(sample, type, 0);
 996         return perf_event__synthesize_sample(event, type, 0, sample);
 997 }
 998 
 999 
1000 static int
1001 cs_etm__get_trace(struct cs_etm_queue *etmq)
1002 {
1003         struct auxtrace_buffer *aux_buffer = etmq->buffer;
1004         struct auxtrace_buffer *old_buffer = aux_buffer;
1005         struct auxtrace_queue *queue;
1006 
1007         queue = &etmq->etm->queues.queue_array[etmq->queue_nr];
1008 
1009         aux_buffer = auxtrace_buffer__next(queue, aux_buffer);
1010 
1011         /* If no more data, drop the previous auxtrace_buffer and return */
1012         if (!aux_buffer) {
1013                 if (old_buffer)
1014                         auxtrace_buffer__drop_data(old_buffer);
1015                 etmq->buf_len = 0;
1016                 return 0;
1017         }
1018 
1019         etmq->buffer = aux_buffer;
1020 
1021         /* If the aux_buffer doesn't have data associated, try to load it */
1022         if (!aux_buffer->data) {
1023                 /* get the file desc associated with the perf data file */
1024                 int fd = perf_data__fd(etmq->etm->session->data);
1025 
1026                 aux_buffer->data = auxtrace_buffer__get_data(aux_buffer, fd);
1027                 if (!aux_buffer->data)
1028                         return -ENOMEM;
1029         }
1030 
1031         /* If valid, drop the previous buffer */
1032         if (old_buffer)
1033                 auxtrace_buffer__drop_data(old_buffer);
1034 
1035         etmq->buf_used = 0;
1036         etmq->buf_len = aux_buffer->size;
1037         etmq->buf = aux_buffer->data;
1038 
1039         return etmq->buf_len;
1040 }
1041 
1042 static void cs_etm__set_pid_tid_cpu(struct cs_etm_auxtrace *etm,
1043                                     struct cs_etm_traceid_queue *tidq)
1044 {
1045         if ((!tidq->thread) && (tidq->tid != -1))
1046                 tidq->thread = machine__find_thread(etm->machine, -1,
1047                                                     tidq->tid);
1048 
1049         if (tidq->thread)
1050                 tidq->pid = tidq->thread->pid_;
1051 }
1052 
1053 int cs_etm__etmq_set_tid(struct cs_etm_queue *etmq,
1054                          pid_t tid, u8 trace_chan_id)
1055 {
1056         int cpu, err = -EINVAL;
1057         struct cs_etm_auxtrace *etm = etmq->etm;
1058         struct cs_etm_traceid_queue *tidq;
1059 
1060         tidq = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
1061         if (!tidq)
1062                 return err;
1063 
1064         if (cs_etm__get_cpu(trace_chan_id, &cpu) < 0)
1065                 return err;
1066 
1067         err = machine__set_current_tid(etm->machine, cpu, tid, tid);
1068         if (err)
1069                 return err;
1070 
1071         tidq->tid = tid;
1072         thread__zput(tidq->thread);
1073 
1074         cs_etm__set_pid_tid_cpu(etm, tidq);
1075         return 0;
1076 }
1077 
1078 bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq)
1079 {
1080         return !!etmq->etm->timeless_decoding;
1081 }
1082 
1083 static void cs_etm__copy_insn(struct cs_etm_queue *etmq,
1084                               u64 trace_chan_id,
1085                               const struct cs_etm_packet *packet,
1086                               struct perf_sample *sample)
1087 {
1088         /*
1089          * It's pointless to read instructions for the CS_ETM_DISCONTINUITY
1090          * packet, so directly bail out with 'insn_len' = 0.
1091          */
1092         if (packet->sample_type == CS_ETM_DISCONTINUITY) {
1093                 sample->insn_len = 0;
1094                 return;
1095         }
1096 
1097         /*
1098          * T32 instruction size might be 32-bit or 16-bit, decide by calling
1099          * cs_etm__t32_instr_size().
1100          */
1101         if (packet->isa == CS_ETM_ISA_T32)
1102                 sample->insn_len = cs_etm__t32_instr_size(etmq, trace_chan_id,
1103                                                           sample->ip);
1104         /* Otherwise, A64 and A32 instruction size are always 32-bit. */
1105         else
1106                 sample->insn_len = 4;
1107 
1108         cs_etm__mem_access(etmq, trace_chan_id, sample->ip,
1109                            sample->insn_len, (void *)sample->insn);
1110 }
1111 
1112 static int cs_etm__synth_instruction_sample(struct cs_etm_queue *etmq,
1113                                             struct cs_etm_traceid_queue *tidq,
1114                                             u64 addr, u64 period)
1115 {
1116         int ret = 0;
1117         struct cs_etm_auxtrace *etm = etmq->etm;
1118         union perf_event *event = tidq->event_buf;
1119         struct perf_sample sample = {.ip = 0,};
1120 
1121         event->sample.header.type = PERF_RECORD_SAMPLE;
1122         event->sample.header.misc = cs_etm__cpu_mode(etmq, addr);
1123         event->sample.header.size = sizeof(struct perf_event_header);
1124 
1125         sample.ip = addr;
1126         sample.pid = tidq->pid;
1127         sample.tid = tidq->tid;
1128         sample.id = etmq->etm->instructions_id;
1129         sample.stream_id = etmq->etm->instructions_id;
1130         sample.period = period;
1131         sample.cpu = tidq->packet->cpu;
1132         sample.flags = tidq->prev_packet->flags;
1133         sample.cpumode = event->sample.header.misc;
1134 
1135         cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->packet, &sample);
1136 
1137         if (etm->synth_opts.last_branch) {
1138                 cs_etm__copy_last_branch_rb(etmq, tidq);
1139                 sample.branch_stack = tidq->last_branch;
1140         }
1141 
1142         if (etm->synth_opts.inject) {
1143                 ret = cs_etm__inject_event(event, &sample,
1144                                            etm->instructions_sample_type);
1145                 if (ret)
1146                         return ret;
1147         }
1148 
1149         ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1150 
1151         if (ret)
1152                 pr_err(
1153                         "CS ETM Trace: failed to deliver instruction event, error %d\n",
1154                         ret);
1155 
1156         if (etm->synth_opts.last_branch)
1157                 cs_etm__reset_last_branch_rb(tidq);
1158 
1159         return ret;
1160 }
1161 
1162 /*
1163  * The cs etm packet encodes an instruction range between a branch target
1164  * and the next taken branch. Generate sample accordingly.
1165  */
1166 static int cs_etm__synth_branch_sample(struct cs_etm_queue *etmq,
1167                                        struct cs_etm_traceid_queue *tidq)
1168 {
1169         int ret = 0;
1170         struct cs_etm_auxtrace *etm = etmq->etm;
1171         struct perf_sample sample = {.ip = 0,};
1172         union perf_event *event = tidq->event_buf;
1173         struct dummy_branch_stack {
1174                 u64                     nr;
1175                 struct branch_entry     entries;
1176         } dummy_bs;
1177         u64 ip;
1178 
1179         ip = cs_etm__last_executed_instr(tidq->prev_packet);
1180 
1181         event->sample.header.type = PERF_RECORD_SAMPLE;
1182         event->sample.header.misc = cs_etm__cpu_mode(etmq, ip);
1183         event->sample.header.size = sizeof(struct perf_event_header);
1184 
1185         sample.ip = ip;
1186         sample.pid = tidq->pid;
1187         sample.tid = tidq->tid;
1188         sample.addr = cs_etm__first_executed_instr(tidq->packet);
1189         sample.id = etmq->etm->branches_id;
1190         sample.stream_id = etmq->etm->branches_id;
1191         sample.period = 1;
1192         sample.cpu = tidq->packet->cpu;
1193         sample.flags = tidq->prev_packet->flags;
1194         sample.cpumode = event->sample.header.misc;
1195 
1196         cs_etm__copy_insn(etmq, tidq->trace_chan_id, tidq->prev_packet,
1197                           &sample);
1198 
1199         /*
1200          * perf report cannot handle events without a branch stack
1201          */
1202         if (etm->synth_opts.last_branch) {
1203                 dummy_bs = (struct dummy_branch_stack){
1204                         .nr = 1,
1205                         .entries = {
1206                                 .from = sample.ip,
1207                                 .to = sample.addr,
1208                         },
1209                 };
1210                 sample.branch_stack = (struct branch_stack *)&dummy_bs;
1211         }
1212 
1213         if (etm->synth_opts.inject) {
1214                 ret = cs_etm__inject_event(event, &sample,
1215                                            etm->branches_sample_type);
1216                 if (ret)
1217                         return ret;
1218         }
1219 
1220         ret = perf_session__deliver_synth_event(etm->session, event, &sample);
1221 
1222         if (ret)
1223                 pr_err(
1224                 "CS ETM Trace: failed to deliver instruction event, error %d\n",
1225                 ret);
1226 
1227         return ret;
1228 }
1229 
1230 struct cs_etm_synth {
1231         struct perf_tool dummy_tool;
1232         struct perf_session *session;
1233 };
1234 
1235 static int cs_etm__event_synth(struct perf_tool *tool,
1236                                union perf_event *event,
1237                                struct perf_sample *sample __maybe_unused,
1238                                struct machine *machine __maybe_unused)
1239 {
1240         struct cs_etm_synth *cs_etm_synth =
1241                       container_of(tool, struct cs_etm_synth, dummy_tool);
1242 
1243         return perf_session__deliver_synth_event(cs_etm_synth->session,
1244                                                  event, NULL);
1245 }
1246 
1247 static int cs_etm__synth_event(struct perf_session *session,
1248                                struct perf_event_attr *attr, u64 id)
1249 {
1250         struct cs_etm_synth cs_etm_synth;
1251 
1252         memset(&cs_etm_synth, 0, sizeof(struct cs_etm_synth));
1253         cs_etm_synth.session = session;
1254 
1255         return perf_event__synthesize_attr(&cs_etm_synth.dummy_tool, attr, 1,
1256                                            &id, cs_etm__event_synth);
1257 }
1258 
1259 static int cs_etm__synth_events(struct cs_etm_auxtrace *etm,
1260                                 struct perf_session *session)
1261 {
1262         struct evlist *evlist = session->evlist;
1263         struct evsel *evsel;
1264         struct perf_event_attr attr;
1265         bool found = false;
1266         u64 id;
1267         int err;
1268 
1269         evlist__for_each_entry(evlist, evsel) {
1270                 if (evsel->core.attr.type == etm->pmu_type) {
1271                         found = true;
1272                         break;
1273                 }
1274         }
1275 
1276         if (!found) {
1277                 pr_debug("No selected events with CoreSight Trace data\n");
1278                 return 0;
1279         }
1280 
1281         memset(&attr, 0, sizeof(struct perf_event_attr));
1282         attr.size = sizeof(struct perf_event_attr);
1283         attr.type = PERF_TYPE_HARDWARE;
1284         attr.sample_type = evsel->core.attr.sample_type & PERF_SAMPLE_MASK;
1285         attr.sample_type |= PERF_SAMPLE_IP | PERF_SAMPLE_TID |
1286                             PERF_SAMPLE_PERIOD;
1287         if (etm->timeless_decoding)
1288                 attr.sample_type &= ~(u64)PERF_SAMPLE_TIME;
1289         else
1290                 attr.sample_type |= PERF_SAMPLE_TIME;
1291 
1292         attr.exclude_user = evsel->core.attr.exclude_user;
1293         attr.exclude_kernel = evsel->core.attr.exclude_kernel;
1294         attr.exclude_hv = evsel->core.attr.exclude_hv;
1295         attr.exclude_host = evsel->core.attr.exclude_host;
1296         attr.exclude_guest = evsel->core.attr.exclude_guest;
1297         attr.sample_id_all = evsel->core.attr.sample_id_all;
1298         attr.read_format = evsel->core.attr.read_format;
1299 
1300         /* create new id val to be a fixed offset from evsel id */
1301         id = evsel->core.id[0] + 1000000000;
1302 
1303         if (!id)
1304                 id = 1;
1305 
1306         if (etm->synth_opts.branches) {
1307                 attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS;
1308                 attr.sample_period = 1;
1309                 attr.sample_type |= PERF_SAMPLE_ADDR;
1310                 err = cs_etm__synth_event(session, &attr, id);
1311                 if (err)
1312                         return err;
1313                 etm->sample_branches = true;
1314                 etm->branches_sample_type = attr.sample_type;
1315                 etm->branches_id = id;
1316                 id += 1;
1317                 attr.sample_type &= ~(u64)PERF_SAMPLE_ADDR;
1318         }
1319 
1320         if (etm->synth_opts.last_branch)
1321                 attr.sample_type |= PERF_SAMPLE_BRANCH_STACK;
1322 
1323         if (etm->synth_opts.instructions) {
1324                 attr.config = PERF_COUNT_HW_INSTRUCTIONS;
1325                 attr.sample_period = etm->synth_opts.period;
1326                 etm->instructions_sample_period = attr.sample_period;
1327                 err = cs_etm__synth_event(session, &attr, id);
1328                 if (err)
1329                         return err;
1330                 etm->sample_instructions = true;
1331                 etm->instructions_sample_type = attr.sample_type;
1332                 etm->instructions_id = id;
1333                 id += 1;
1334         }
1335 
1336         return 0;
1337 }
1338 
1339 static int cs_etm__sample(struct cs_etm_queue *etmq,
1340                           struct cs_etm_traceid_queue *tidq)
1341 {
1342         struct cs_etm_auxtrace *etm = etmq->etm;
1343         struct cs_etm_packet *tmp;
1344         int ret;
1345         u8 trace_chan_id = tidq->trace_chan_id;
1346         u64 instrs_executed = tidq->packet->instr_count;
1347 
1348         tidq->period_instructions += instrs_executed;
1349 
1350         /*
1351          * Record a branch when the last instruction in
1352          * PREV_PACKET is a branch.
1353          */
1354         if (etm->synth_opts.last_branch &&
1355             tidq->prev_packet->sample_type == CS_ETM_RANGE &&
1356             tidq->prev_packet->last_instr_taken_branch)
1357                 cs_etm__update_last_branch_rb(etmq, tidq);
1358 
1359         if (etm->sample_instructions &&
1360             tidq->period_instructions >= etm->instructions_sample_period) {
1361                 /*
1362                  * Emit instruction sample periodically
1363                  * TODO: allow period to be defined in cycles and clock time
1364                  */
1365 
1366                 /* Get number of instructions executed after the sample point */
1367                 u64 instrs_over = tidq->period_instructions -
1368                         etm->instructions_sample_period;
1369 
1370                 /*
1371                  * Calculate the address of the sampled instruction (-1 as
1372                  * sample is reported as though instruction has just been
1373                  * executed, but PC has not advanced to next instruction)
1374                  */
1375                 u64 offset = (instrs_executed - instrs_over - 1);
1376                 u64 addr = cs_etm__instr_addr(etmq, trace_chan_id,
1377                                               tidq->packet, offset);
1378 
1379                 ret = cs_etm__synth_instruction_sample(
1380                         etmq, tidq, addr, etm->instructions_sample_period);
1381                 if (ret)
1382                         return ret;
1383 
1384                 /* Carry remaining instructions into next sample period */
1385                 tidq->period_instructions = instrs_over;
1386         }
1387 
1388         if (etm->sample_branches) {
1389                 bool generate_sample = false;
1390 
1391                 /* Generate sample for tracing on packet */
1392                 if (tidq->prev_packet->sample_type == CS_ETM_DISCONTINUITY)
1393                         generate_sample = true;
1394 
1395                 /* Generate sample for branch taken packet */
1396                 if (tidq->prev_packet->sample_type == CS_ETM_RANGE &&
1397                     tidq->prev_packet->last_instr_taken_branch)
1398                         generate_sample = true;
1399 
1400                 if (generate_sample) {
1401                         ret = cs_etm__synth_branch_sample(etmq, tidq);
1402                         if (ret)
1403                                 return ret;
1404                 }
1405         }
1406 
1407         if (etm->sample_branches || etm->synth_opts.last_branch) {
1408                 /*
1409                  * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
1410                  * the next incoming packet.
1411                  */
1412                 tmp = tidq->packet;
1413                 tidq->packet = tidq->prev_packet;
1414                 tidq->prev_packet = tmp;
1415         }
1416 
1417         return 0;
1418 }
1419 
1420 static int cs_etm__exception(struct cs_etm_traceid_queue *tidq)
1421 {
1422         /*
1423          * When the exception packet is inserted, whether the last instruction
1424          * in previous range packet is taken branch or not, we need to force
1425          * to set 'prev_packet->last_instr_taken_branch' to true.  This ensures
1426          * to generate branch sample for the instruction range before the
1427          * exception is trapped to kernel or before the exception returning.
1428          *
1429          * The exception packet includes the dummy address values, so don't
1430          * swap PACKET with PREV_PACKET.  This keeps PREV_PACKET to be useful
1431          * for generating instruction and branch samples.
1432          */
1433         if (tidq->prev_packet->sample_type == CS_ETM_RANGE)
1434                 tidq->prev_packet->last_instr_taken_branch = true;
1435 
1436         return 0;
1437 }
1438 
1439 static int cs_etm__flush(struct cs_etm_queue *etmq,
1440                          struct cs_etm_traceid_queue *tidq)
1441 {
1442         int err = 0;
1443         struct cs_etm_auxtrace *etm = etmq->etm;
1444         struct cs_etm_packet *tmp;
1445 
1446         /* Handle start tracing packet */
1447         if (tidq->prev_packet->sample_type == CS_ETM_EMPTY)
1448                 goto swap_packet;
1449 
1450         if (etmq->etm->synth_opts.last_branch &&
1451             tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1452                 /*
1453                  * Generate a last branch event for the branches left in the
1454                  * circular buffer at the end of the trace.
1455                  *
1456                  * Use the address of the end of the last reported execution
1457                  * range
1458                  */
1459                 u64 addr = cs_etm__last_executed_instr(tidq->prev_packet);
1460 
1461                 err = cs_etm__synth_instruction_sample(
1462                         etmq, tidq, addr,
1463                         tidq->period_instructions);
1464                 if (err)
1465                         return err;
1466 
1467                 tidq->period_instructions = 0;
1468 
1469         }
1470 
1471         if (etm->sample_branches &&
1472             tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1473                 err = cs_etm__synth_branch_sample(etmq, tidq);
1474                 if (err)
1475                         return err;
1476         }
1477 
1478 swap_packet:
1479         if (etm->sample_branches || etm->synth_opts.last_branch) {
1480                 /*
1481                  * Swap PACKET with PREV_PACKET: PACKET becomes PREV_PACKET for
1482                  * the next incoming packet.
1483                  */
1484                 tmp = tidq->packet;
1485                 tidq->packet = tidq->prev_packet;
1486                 tidq->prev_packet = tmp;
1487         }
1488 
1489         return err;
1490 }
1491 
1492 static int cs_etm__end_block(struct cs_etm_queue *etmq,
1493                              struct cs_etm_traceid_queue *tidq)
1494 {
1495         int err;
1496 
1497         /*
1498          * It has no new packet coming and 'etmq->packet' contains the stale
1499          * packet which was set at the previous time with packets swapping;
1500          * so skip to generate branch sample to avoid stale packet.
1501          *
1502          * For this case only flush branch stack and generate a last branch
1503          * event for the branches left in the circular buffer at the end of
1504          * the trace.
1505          */
1506         if (etmq->etm->synth_opts.last_branch &&
1507             tidq->prev_packet->sample_type == CS_ETM_RANGE) {
1508                 /*
1509                  * Use the address of the end of the last reported execution
1510                  * range.
1511                  */
1512                 u64 addr = cs_etm__last_executed_instr(tidq->prev_packet);
1513 
1514                 err = cs_etm__synth_instruction_sample(
1515                         etmq, tidq, addr,
1516                         tidq->period_instructions);
1517                 if (err)
1518                         return err;
1519 
1520                 tidq->period_instructions = 0;
1521         }
1522 
1523         return 0;
1524 }
1525 /*
1526  * cs_etm__get_data_block: Fetch a block from the auxtrace_buffer queue
1527  *                         if need be.
1528  * Returns:     < 0     if error
1529  *              = 0     if no more auxtrace_buffer to read
1530  *              > 0     if the current buffer isn't empty yet
1531  */
1532 static int cs_etm__get_data_block(struct cs_etm_queue *etmq)
1533 {
1534         int ret;
1535 
1536         if (!etmq->buf_len) {
1537                 ret = cs_etm__get_trace(etmq);
1538                 if (ret <= 0)
1539                         return ret;
1540                 /*
1541                  * We cannot assume consecutive blocks in the data file
1542                  * are contiguous, reset the decoder to force re-sync.
1543                  */
1544                 ret = cs_etm_decoder__reset(etmq->decoder);
1545                 if (ret)
1546                         return ret;
1547         }
1548 
1549         return etmq->buf_len;
1550 }
1551 
1552 static bool cs_etm__is_svc_instr(struct cs_etm_queue *etmq, u8 trace_chan_id,
1553                                  struct cs_etm_packet *packet,
1554                                  u64 end_addr)
1555 {
1556         /* Initialise to keep compiler happy */
1557         u16 instr16 = 0;
1558         u32 instr32 = 0;
1559         u64 addr;
1560 
1561         switch (packet->isa) {
1562         case CS_ETM_ISA_T32:
1563                 /*
1564                  * The SVC of T32 is defined in ARM DDI 0487D.a, F5.1.247:
1565                  *
1566                  *  b'15         b'8
1567                  * +-----------------+--------+
1568                  * | 1 1 0 1 1 1 1 1 |  imm8  |
1569                  * +-----------------+--------+
1570                  *
1571                  * According to the specifiction, it only defines SVC for T32
1572                  * with 16 bits instruction and has no definition for 32bits;
1573                  * so below only read 2 bytes as instruction size for T32.
1574                  */
1575                 addr = end_addr - 2;
1576                 cs_etm__mem_access(etmq, trace_chan_id, addr,
1577                                    sizeof(instr16), (u8 *)&instr16);
1578                 if ((instr16 & 0xFF00) == 0xDF00)
1579                         return true;
1580 
1581                 break;
1582         case CS_ETM_ISA_A32:
1583                 /*
1584                  * The SVC of A32 is defined in ARM DDI 0487D.a, F5.1.247:
1585                  *
1586                  *  b'31 b'28 b'27 b'24
1587                  * +---------+---------+-------------------------+
1588                  * |  !1111  | 1 1 1 1 |        imm24            |
1589                  * +---------+---------+-------------------------+
1590                  */
1591                 addr = end_addr - 4;
1592                 cs_etm__mem_access(etmq, trace_chan_id, addr,
1593                                    sizeof(instr32), (u8 *)&instr32);
1594                 if ((instr32 & 0x0F000000) == 0x0F000000 &&
1595                     (instr32 & 0xF0000000) != 0xF0000000)
1596                         return true;
1597 
1598                 break;
1599         case CS_ETM_ISA_A64:
1600                 /*
1601                  * The SVC of A64 is defined in ARM DDI 0487D.a, C6.2.294:
1602                  *
1603                  *  b'31               b'21           b'4     b'0
1604                  * +-----------------------+---------+-----------+
1605                  * | 1 1 0 1 0 1 0 0 0 0 0 |  imm16  | 0 0 0 0 1 |
1606                  * +-----------------------+---------+-----------+
1607                  */
1608                 addr = end_addr - 4;
1609                 cs_etm__mem_access(etmq, trace_chan_id, addr,
1610                                    sizeof(instr32), (u8 *)&instr32);
1611                 if ((instr32 & 0xFFE0001F) == 0xd4000001)
1612                         return true;
1613 
1614                 break;
1615         case CS_ETM_ISA_UNKNOWN:
1616         default:
1617                 break;
1618         }
1619 
1620         return false;
1621 }
1622 
1623 static bool cs_etm__is_syscall(struct cs_etm_queue *etmq,
1624                                struct cs_etm_traceid_queue *tidq, u64 magic)
1625 {
1626         u8 trace_chan_id = tidq->trace_chan_id;
1627         struct cs_etm_packet *packet = tidq->packet;
1628         struct cs_etm_packet *prev_packet = tidq->prev_packet;
1629 
1630         if (magic == __perf_cs_etmv3_magic)
1631                 if (packet->exception_number == CS_ETMV3_EXC_SVC)
1632                         return true;
1633 
1634         /*
1635          * ETMv4 exception type CS_ETMV4_EXC_CALL covers SVC, SMC and
1636          * HVC cases; need to check if it's SVC instruction based on
1637          * packet address.
1638          */
1639         if (magic == __perf_cs_etmv4_magic) {
1640                 if (packet->exception_number == CS_ETMV4_EXC_CALL &&
1641                     cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
1642                                          prev_packet->end_addr))
1643                         return true;
1644         }
1645 
1646         return false;
1647 }
1648 
1649 static bool cs_etm__is_async_exception(struct cs_etm_traceid_queue *tidq,
1650                                        u64 magic)
1651 {
1652         struct cs_etm_packet *packet = tidq->packet;
1653 
1654         if (magic == __perf_cs_etmv3_magic)
1655                 if (packet->exception_number == CS_ETMV3_EXC_DEBUG_HALT ||
1656                     packet->exception_number == CS_ETMV3_EXC_ASYNC_DATA_ABORT ||
1657                     packet->exception_number == CS_ETMV3_EXC_PE_RESET ||
1658                     packet->exception_number == CS_ETMV3_EXC_IRQ ||
1659                     packet->exception_number == CS_ETMV3_EXC_FIQ)
1660                         return true;
1661 
1662         if (magic == __perf_cs_etmv4_magic)
1663                 if (packet->exception_number == CS_ETMV4_EXC_RESET ||
1664                     packet->exception_number == CS_ETMV4_EXC_DEBUG_HALT ||
1665                     packet->exception_number == CS_ETMV4_EXC_SYSTEM_ERROR ||
1666                     packet->exception_number == CS_ETMV4_EXC_INST_DEBUG ||
1667                     packet->exception_number == CS_ETMV4_EXC_DATA_DEBUG ||
1668                     packet->exception_number == CS_ETMV4_EXC_IRQ ||
1669                     packet->exception_number == CS_ETMV4_EXC_FIQ)
1670                         return true;
1671 
1672         return false;
1673 }
1674 
1675 static bool cs_etm__is_sync_exception(struct cs_etm_queue *etmq,
1676                                       struct cs_etm_traceid_queue *tidq,
1677                                       u64 magic)
1678 {
1679         u8 trace_chan_id = tidq->trace_chan_id;
1680         struct cs_etm_packet *packet = tidq->packet;
1681         struct cs_etm_packet *prev_packet = tidq->prev_packet;
1682 
1683         if (magic == __perf_cs_etmv3_magic)
1684                 if (packet->exception_number == CS_ETMV3_EXC_SMC ||
1685                     packet->exception_number == CS_ETMV3_EXC_HYP ||
1686                     packet->exception_number == CS_ETMV3_EXC_JAZELLE_THUMBEE ||
1687                     packet->exception_number == CS_ETMV3_EXC_UNDEFINED_INSTR ||
1688                     packet->exception_number == CS_ETMV3_EXC_PREFETCH_ABORT ||
1689                     packet->exception_number == CS_ETMV3_EXC_DATA_FAULT ||
1690                     packet->exception_number == CS_ETMV3_EXC_GENERIC)
1691                         return true;
1692 
1693         if (magic == __perf_cs_etmv4_magic) {
1694                 if (packet->exception_number == CS_ETMV4_EXC_TRAP ||
1695                     packet->exception_number == CS_ETMV4_EXC_ALIGNMENT ||
1696                     packet->exception_number == CS_ETMV4_EXC_INST_FAULT ||
1697                     packet->exception_number == CS_ETMV4_EXC_DATA_FAULT)
1698                         return true;
1699 
1700                 /*
1701                  * For CS_ETMV4_EXC_CALL, except SVC other instructions
1702                  * (SMC, HVC) are taken as sync exceptions.
1703                  */
1704                 if (packet->exception_number == CS_ETMV4_EXC_CALL &&
1705                     !cs_etm__is_svc_instr(etmq, trace_chan_id, prev_packet,
1706                                           prev_packet->end_addr))
1707                         return true;
1708 
1709                 /*
1710                  * ETMv4 has 5 bits for exception number; if the numbers
1711                  * are in the range ( CS_ETMV4_EXC_FIQ, CS_ETMV4_EXC_END ]
1712                  * they are implementation defined exceptions.
1713                  *
1714                  * For this case, simply take it as sync exception.
1715                  */
1716                 if (packet->exception_number > CS_ETMV4_EXC_FIQ &&
1717                     packet->exception_number <= CS_ETMV4_EXC_END)
1718                         return true;
1719         }
1720 
1721         return false;
1722 }
1723 
1724 static int cs_etm__set_sample_flags(struct cs_etm_queue *etmq,
1725                                     struct cs_etm_traceid_queue *tidq)
1726 {
1727         struct cs_etm_packet *packet = tidq->packet;
1728         struct cs_etm_packet *prev_packet = tidq->prev_packet;
1729         u8 trace_chan_id = tidq->trace_chan_id;
1730         u64 magic;
1731         int ret;
1732 
1733         switch (packet->sample_type) {
1734         case CS_ETM_RANGE:
1735                 /*
1736                  * Immediate branch instruction without neither link nor
1737                  * return flag, it's normal branch instruction within
1738                  * the function.
1739                  */
1740                 if (packet->last_instr_type == OCSD_INSTR_BR &&
1741                     packet->last_instr_subtype == OCSD_S_INSTR_NONE) {
1742                         packet->flags = PERF_IP_FLAG_BRANCH;
1743 
1744                         if (packet->last_instr_cond)
1745                                 packet->flags |= PERF_IP_FLAG_CONDITIONAL;
1746                 }
1747 
1748                 /*
1749                  * Immediate branch instruction with link (e.g. BL), this is
1750                  * branch instruction for function call.
1751                  */
1752                 if (packet->last_instr_type == OCSD_INSTR_BR &&
1753                     packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK)
1754                         packet->flags = PERF_IP_FLAG_BRANCH |
1755                                         PERF_IP_FLAG_CALL;
1756 
1757                 /*
1758                  * Indirect branch instruction with link (e.g. BLR), this is
1759                  * branch instruction for function call.
1760                  */
1761                 if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
1762                     packet->last_instr_subtype == OCSD_S_INSTR_BR_LINK)
1763                         packet->flags = PERF_IP_FLAG_BRANCH |
1764                                         PERF_IP_FLAG_CALL;
1765 
1766                 /*
1767                  * Indirect branch instruction with subtype of
1768                  * OCSD_S_INSTR_V7_IMPLIED_RET, this is explicit hint for
1769                  * function return for A32/T32.
1770                  */
1771                 if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
1772                     packet->last_instr_subtype == OCSD_S_INSTR_V7_IMPLIED_RET)
1773                         packet->flags = PERF_IP_FLAG_BRANCH |
1774                                         PERF_IP_FLAG_RETURN;
1775 
1776                 /*
1777                  * Indirect branch instruction without link (e.g. BR), usually
1778                  * this is used for function return, especially for functions
1779                  * within dynamic link lib.
1780                  */
1781                 if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
1782                     packet->last_instr_subtype == OCSD_S_INSTR_NONE)
1783                         packet->flags = PERF_IP_FLAG_BRANCH |
1784                                         PERF_IP_FLAG_RETURN;
1785 
1786                 /* Return instruction for function return. */
1787                 if (packet->last_instr_type == OCSD_INSTR_BR_INDIRECT &&
1788                     packet->last_instr_subtype == OCSD_S_INSTR_V8_RET)
1789                         packet->flags = PERF_IP_FLAG_BRANCH |
1790                                         PERF_IP_FLAG_RETURN;
1791 
1792                 /*
1793                  * Decoder might insert a discontinuity in the middle of
1794                  * instruction packets, fixup prev_packet with flag
1795                  * PERF_IP_FLAG_TRACE_BEGIN to indicate restarting trace.
1796                  */
1797                 if (prev_packet->sample_type == CS_ETM_DISCONTINUITY)
1798                         prev_packet->flags |= PERF_IP_FLAG_BRANCH |
1799                                               PERF_IP_FLAG_TRACE_BEGIN;
1800 
1801                 /*
1802                  * If the previous packet is an exception return packet
1803                  * and the return address just follows SVC instuction,
1804                  * it needs to calibrate the previous packet sample flags
1805                  * as PERF_IP_FLAG_SYSCALLRET.
1806                  */
1807                 if (prev_packet->flags == (PERF_IP_FLAG_BRANCH |
1808                                            PERF_IP_FLAG_RETURN |
1809                                            PERF_IP_FLAG_INTERRUPT) &&
1810                     cs_etm__is_svc_instr(etmq, trace_chan_id,
1811                                          packet, packet->start_addr))
1812                         prev_packet->flags = PERF_IP_FLAG_BRANCH |
1813                                              PERF_IP_FLAG_RETURN |
1814                                              PERF_IP_FLAG_SYSCALLRET;
1815                 break;
1816         case CS_ETM_DISCONTINUITY:
1817                 /*
1818                  * The trace is discontinuous, if the previous packet is
1819                  * instruction packet, set flag PERF_IP_FLAG_TRACE_END
1820                  * for previous packet.
1821                  */
1822                 if (prev_packet->sample_type == CS_ETM_RANGE)
1823                         prev_packet->flags |= PERF_IP_FLAG_BRANCH |
1824                                               PERF_IP_FLAG_TRACE_END;
1825                 break;
1826         case CS_ETM_EXCEPTION:
1827                 ret = cs_etm__get_magic(packet->trace_chan_id, &magic);
1828                 if (ret)
1829                         return ret;
1830 
1831                 /* The exception is for system call. */
1832                 if (cs_etm__is_syscall(etmq, tidq, magic))
1833                         packet->flags = PERF_IP_FLAG_BRANCH |
1834                                         PERF_IP_FLAG_CALL |
1835                                         PERF_IP_FLAG_SYSCALLRET;
1836                 /*
1837                  * The exceptions are triggered by external signals from bus,
1838                  * interrupt controller, debug module, PE reset or halt.
1839                  */
1840                 else if (cs_etm__is_async_exception(tidq, magic))
1841                         packet->flags = PERF_IP_FLAG_BRANCH |
1842                                         PERF_IP_FLAG_CALL |
1843                                         PERF_IP_FLAG_ASYNC |
1844                                         PERF_IP_FLAG_INTERRUPT;
1845                 /*
1846                  * Otherwise, exception is caused by trap, instruction &
1847                  * data fault, or alignment errors.
1848                  */
1849                 else if (cs_etm__is_sync_exception(etmq, tidq, magic))
1850                         packet->flags = PERF_IP_FLAG_BRANCH |
1851                                         PERF_IP_FLAG_CALL |
1852                                         PERF_IP_FLAG_INTERRUPT;
1853 
1854                 /*
1855                  * When the exception packet is inserted, since exception
1856                  * packet is not used standalone for generating samples
1857                  * and it's affiliation to the previous instruction range
1858                  * packet; so set previous range packet flags to tell perf
1859                  * it is an exception taken branch.
1860                  */
1861                 if (prev_packet->sample_type == CS_ETM_RANGE)
1862                         prev_packet->flags = packet->flags;
1863                 break;
1864         case CS_ETM_EXCEPTION_RET:
1865                 /*
1866                  * When the exception return packet is inserted, since
1867                  * exception return packet is not used standalone for
1868                  * generating samples and it's affiliation to the previous
1869                  * instruction range packet; so set previous range packet
1870                  * flags to tell perf it is an exception return branch.
1871                  *
1872                  * The exception return can be for either system call or
1873                  * other exception types; unfortunately the packet doesn't
1874                  * contain exception type related info so we cannot decide
1875                  * the exception type purely based on exception return packet.
1876                  * If we record the exception number from exception packet and
1877                  * reuse it for excpetion return packet, this is not reliable
1878                  * due the trace can be discontinuity or the interrupt can
1879                  * be nested, thus the recorded exception number cannot be
1880                  * used for exception return packet for these two cases.
1881                  *
1882                  * For exception return packet, we only need to distinguish the
1883                  * packet is for system call or for other types.  Thus the
1884                  * decision can be deferred when receive the next packet which
1885                  * contains the return address, based on the return address we
1886                  * can read out the previous instruction and check if it's a
1887                  * system call instruction and then calibrate the sample flag
1888                  * as needed.
1889                  */
1890                 if (prev_packet->sample_type == CS_ETM_RANGE)
1891                         prev_packet->flags = PERF_IP_FLAG_BRANCH |
1892                                              PERF_IP_FLAG_RETURN |
1893                                              PERF_IP_FLAG_INTERRUPT;
1894                 break;
1895         case CS_ETM_EMPTY:
1896         default:
1897                 break;
1898         }
1899 
1900         return 0;
1901 }
1902 
1903 static int cs_etm__decode_data_block(struct cs_etm_queue *etmq)
1904 {
1905         int ret = 0;
1906         size_t processed = 0;
1907 
1908         /*
1909          * Packets are decoded and added to the decoder's packet queue
1910          * until the decoder packet processing callback has requested that
1911          * processing stops or there is nothing left in the buffer.  Normal
1912          * operations that stop processing are a timestamp packet or a full
1913          * decoder buffer queue.
1914          */
1915         ret = cs_etm_decoder__process_data_block(etmq->decoder,
1916                                                  etmq->offset,
1917                                                  &etmq->buf[etmq->buf_used],
1918                                                  etmq->buf_len,
1919                                                  &processed);
1920         if (ret)
1921                 goto out;
1922 
1923         etmq->offset += processed;
1924         etmq->buf_used += processed;
1925         etmq->buf_len -= processed;
1926 
1927 out:
1928         return ret;
1929 }
1930 
1931 static int cs_etm__process_traceid_queue(struct cs_etm_queue *etmq,
1932                                          struct cs_etm_traceid_queue *tidq)
1933 {
1934         int ret;
1935         struct cs_etm_packet_queue *packet_queue;
1936 
1937         packet_queue = &tidq->packet_queue;
1938 
1939         /* Process each packet in this chunk */
1940         while (1) {
1941                 ret = cs_etm_decoder__get_packet(packet_queue,
1942                                                  tidq->packet);
1943                 if (ret <= 0)
1944                         /*
1945                          * Stop processing this chunk on
1946                          * end of data or error
1947                          */
1948                         break;
1949 
1950                 /*
1951                  * Since packet addresses are swapped in packet
1952                  * handling within below switch() statements,
1953                  * thus setting sample flags must be called
1954                  * prior to switch() statement to use address
1955                  * information before packets swapping.
1956                  */
1957                 ret = cs_etm__set_sample_flags(etmq, tidq);
1958                 if (ret < 0)
1959                         break;
1960 
1961                 switch (tidq->packet->sample_type) {
1962                 case CS_ETM_RANGE:
1963                         /*
1964                          * If the packet contains an instruction
1965                          * range, generate instruction sequence
1966                          * events.
1967                          */
1968                         cs_etm__sample(etmq, tidq);
1969                         break;
1970                 case CS_ETM_EXCEPTION:
1971                 case CS_ETM_EXCEPTION_RET:
1972                         /*
1973                          * If the exception packet is coming,
1974                          * make sure the previous instruction
1975                          * range packet to be handled properly.
1976                          */
1977                         cs_etm__exception(tidq);
1978                         break;
1979                 case CS_ETM_DISCONTINUITY:
1980                         /*
1981                          * Discontinuity in trace, flush
1982                          * previous branch stack
1983                          */
1984                         cs_etm__flush(etmq, tidq);
1985                         break;
1986                 case CS_ETM_EMPTY:
1987                         /*
1988                          * Should not receive empty packet,
1989                          * report error.
1990                          */
1991                         pr_err("CS ETM Trace: empty packet\n");
1992                         return -EINVAL;
1993                 default:
1994                         break;
1995                 }
1996         }
1997 
1998         return ret;
1999 }
2000 
2001 static void cs_etm__clear_all_traceid_queues(struct cs_etm_queue *etmq)
2002 {
2003         int idx;
2004         struct int_node *inode;
2005         struct cs_etm_traceid_queue *tidq;
2006         struct intlist *traceid_queues_list = etmq->traceid_queues_list;
2007 
2008         intlist__for_each_entry(inode, traceid_queues_list) {
2009                 idx = (int)(intptr_t)inode->priv;
2010                 tidq = etmq->traceid_queues[idx];
2011 
2012                 /* Ignore return value */
2013                 cs_etm__process_traceid_queue(etmq, tidq);
2014 
2015                 /*
2016                  * Generate an instruction sample with the remaining
2017                  * branchstack entries.
2018                  */
2019                 cs_etm__flush(etmq, tidq);
2020         }
2021 }
2022 
2023 static int cs_etm__run_decoder(struct cs_etm_queue *etmq)
2024 {
2025         int err = 0;
2026         struct cs_etm_traceid_queue *tidq;
2027 
2028         tidq = cs_etm__etmq_get_traceid_queue(etmq, CS_ETM_PER_THREAD_TRACEID);
2029         if (!tidq)
2030                 return -EINVAL;
2031 
2032         /* Go through each buffer in the queue and decode them one by one */
2033         while (1) {
2034                 err = cs_etm__get_data_block(etmq);
2035                 if (err <= 0)
2036                         return err;
2037 
2038                 /* Run trace decoder until buffer consumed or end of trace */
2039                 do {
2040                         err = cs_etm__decode_data_block(etmq);
2041                         if (err)
2042                                 return err;
2043 
2044                         /*
2045                          * Process each packet in this chunk, nothing to do if
2046                          * an error occurs other than hoping the next one will
2047                          * be better.
2048                          */
2049                         err = cs_etm__process_traceid_queue(etmq, tidq);
2050 
2051                 } while (etmq->buf_len);
2052 
2053                 if (err == 0)
2054                         /* Flush any remaining branch stack entries */
2055                         err = cs_etm__end_block(etmq, tidq);
2056         }
2057 
2058         return err;
2059 }
2060 
2061 static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
2062                                            pid_t tid)
2063 {
2064         unsigned int i;
2065         struct auxtrace_queues *queues = &etm->queues;
2066 
2067         for (i = 0; i < queues->nr_queues; i++) {
2068                 struct auxtrace_queue *queue = &etm->queues.queue_array[i];
2069                 struct cs_etm_queue *etmq = queue->priv;
2070                 struct cs_etm_traceid_queue *tidq;
2071 
2072                 if (!etmq)
2073                         continue;
2074 
2075                 tidq = cs_etm__etmq_get_traceid_queue(etmq,
2076                                                 CS_ETM_PER_THREAD_TRACEID);
2077 
2078                 if (!tidq)
2079                         continue;
2080 
2081                 if ((tid == -1) || (tidq->tid == tid)) {
2082                         cs_etm__set_pid_tid_cpu(etm, tidq);
2083                         cs_etm__run_decoder(etmq);
2084                 }
2085         }
2086 
2087         return 0;
2088 }
2089 
2090 static int cs_etm__process_queues(struct cs_etm_auxtrace *etm)
2091 {
2092         int ret = 0;
2093         unsigned int cs_queue_nr, queue_nr;
2094         u8 trace_chan_id;
2095         u64 timestamp;
2096         struct auxtrace_queue *queue;
2097         struct cs_etm_queue *etmq;
2098         struct cs_etm_traceid_queue *tidq;
2099 
2100         while (1) {
2101                 if (!etm->heap.heap_cnt)
2102                         goto out;
2103 
2104                 /* Take the entry at the top of the min heap */
2105                 cs_queue_nr = etm->heap.heap_array[0].queue_nr;
2106                 queue_nr = TO_QUEUE_NR(cs_queue_nr);
2107                 trace_chan_id = TO_TRACE_CHAN_ID(cs_queue_nr);
2108                 queue = &etm->queues.queue_array[queue_nr];
2109                 etmq = queue->priv;
2110 
2111                 /*
2112                  * Remove the top entry from the heap since we are about
2113                  * to process it.
2114                  */
2115                 auxtrace_heap__pop(&etm->heap);
2116 
2117                 tidq  = cs_etm__etmq_get_traceid_queue(etmq, trace_chan_id);
2118                 if (!tidq) {
2119                         /*
2120                          * No traceID queue has been allocated for this traceID,
2121                          * which means something somewhere went very wrong.  No
2122                          * other choice than simply exit.
2123                          */
2124                         ret = -EINVAL;
2125                         goto out;
2126                 }
2127 
2128                 /*
2129                  * Packets associated with this timestamp are already in
2130                  * the etmq's traceID queue, so process them.
2131                  */
2132                 ret = cs_etm__process_traceid_queue(etmq, tidq);
2133                 if (ret < 0)
2134                         goto out;
2135 
2136                 /*
2137                  * Packets for this timestamp have been processed, time to
2138                  * move on to the next timestamp, fetching a new auxtrace_buffer
2139                  * if need be.
2140                  */
2141 refetch:
2142                 ret = cs_etm__get_data_block(etmq);
2143                 if (ret < 0)
2144                         goto out;
2145 
2146                 /*
2147                  * No more auxtrace_buffers to process in this etmq, simply
2148                  * move on to another entry in the auxtrace_heap.
2149                  */
2150                 if (!ret)
2151                         continue;
2152 
2153                 ret = cs_etm__decode_data_block(etmq);
2154                 if (ret)
2155                         goto out;
2156 
2157                 timestamp = cs_etm__etmq_get_timestamp(etmq, &trace_chan_id);
2158 
2159                 if (!timestamp) {
2160                         /*
2161                          * Function cs_etm__decode_data_block() returns when
2162                          * there is no more traces to decode in the current
2163                          * auxtrace_buffer OR when a timestamp has been
2164                          * encountered on any of the traceID queues.  Since we
2165                          * did not get a timestamp, there is no more traces to
2166                          * process in this auxtrace_buffer.  As such empty and
2167                          * flush all traceID queues.
2168                          */
2169                         cs_etm__clear_all_traceid_queues(etmq);
2170 
2171                         /* Fetch another auxtrace_buffer for this etmq */
2172                         goto refetch;
2173                 }
2174 
2175                 /*
2176                  * Add to the min heap the timestamp for packets that have
2177                  * just been decoded.  They will be processed and synthesized
2178                  * during the next call to cs_etm__process_traceid_queue() for
2179                  * this queue/traceID.
2180                  */
2181                 cs_queue_nr = TO_CS_QUEUE_NR(queue_nr, trace_chan_id);
2182                 ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp);
2183         }
2184 
2185 out:
2186         return ret;
2187 }
2188 
2189 static int cs_etm__process_itrace_start(struct cs_etm_auxtrace *etm,
2190                                         union perf_event *event)
2191 {
2192         struct thread *th;
2193 
2194         if (etm->timeless_decoding)
2195                 return 0;
2196 
2197         /*
2198          * Add the tid/pid to the log so that we can get a match when
2199          * we get a contextID from the decoder.
2200          */
2201         th = machine__findnew_thread(etm->machine,
2202                                      event->itrace_start.pid,
2203                                      event->itrace_start.tid);
2204         if (!th)
2205                 return -ENOMEM;
2206 
2207         thread__put(th);
2208 
2209         return 0;
2210 }
2211 
2212 static int cs_etm__process_switch_cpu_wide(struct cs_etm_auxtrace *etm,
2213                                            union perf_event *event)
2214 {
2215         struct thread *th;
2216         bool out = event->header.misc & PERF_RECORD_MISC_SWITCH_OUT;
2217 
2218         /*
2219          * Context switch in per-thread mode are irrelevant since perf
2220          * will start/stop tracing as the process is scheduled.
2221          */
2222         if (etm->timeless_decoding)
2223                 return 0;
2224 
2225         /*
2226          * SWITCH_IN events carry the next process to be switched out while
2227          * SWITCH_OUT events carry the process to be switched in.  As such
2228          * we don't care about IN events.
2229          */
2230         if (!out)
2231                 return 0;
2232 
2233         /*
2234          * Add the tid/pid to the log so that we can get a match when
2235          * we get a contextID from the decoder.
2236          */
2237         th = machine__findnew_thread(etm->machine,
2238                                      event->context_switch.next_prev_pid,
2239                                      event->context_switch.next_prev_tid);
2240         if (!th)
2241                 return -ENOMEM;
2242 
2243         thread__put(th);
2244 
2245         return 0;
2246 }
2247 
2248 static int cs_etm__process_event(struct perf_session *session,
2249                                  union perf_event *event,
2250                                  struct perf_sample *sample,
2251                                  struct perf_tool *tool)
2252 {
2253         int err = 0;
2254         u64 timestamp;
2255         struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2256                                                    struct cs_etm_auxtrace,
2257                                                    auxtrace);
2258 
2259         if (dump_trace)
2260                 return 0;
2261 
2262         if (!tool->ordered_events) {
2263                 pr_err("CoreSight ETM Trace requires ordered events\n");
2264                 return -EINVAL;
2265         }
2266 
2267         if (sample->time && (sample->time != (u64) -1))
2268                 timestamp = sample->time;
2269         else
2270                 timestamp = 0;
2271 
2272         if (timestamp || etm->timeless_decoding) {
2273                 err = cs_etm__update_queues(etm);
2274                 if (err)
2275                         return err;
2276         }
2277 
2278         if (etm->timeless_decoding &&
2279             event->header.type == PERF_RECORD_EXIT)
2280                 return cs_etm__process_timeless_queues(etm,
2281                                                        event->fork.tid);
2282 
2283         if (event->header.type == PERF_RECORD_ITRACE_START)
2284                 return cs_etm__process_itrace_start(etm, event);
2285         else if (event->header.type == PERF_RECORD_SWITCH_CPU_WIDE)
2286                 return cs_etm__process_switch_cpu_wide(etm, event);
2287 
2288         if (!etm->timeless_decoding &&
2289             event->header.type == PERF_RECORD_AUX)
2290                 return cs_etm__process_queues(etm);
2291 
2292         return 0;
2293 }
2294 
2295 static int cs_etm__process_auxtrace_event(struct perf_session *session,
2296                                           union perf_event *event,
2297                                           struct perf_tool *tool __maybe_unused)
2298 {
2299         struct cs_etm_auxtrace *etm = container_of(session->auxtrace,
2300                                                    struct cs_etm_auxtrace,
2301                                                    auxtrace);
2302         if (!etm->data_queued) {
2303                 struct auxtrace_buffer *buffer;
2304                 off_t  data_offset;
2305                 int fd = perf_data__fd(session->data);
2306                 bool is_pipe = perf_data__is_pipe(session->data);
2307                 int err;
2308 
2309                 if (is_pipe)
2310                         data_offset = 0;
2311                 else {
2312                         data_offset = lseek(fd, 0, SEEK_CUR);
2313                         if (data_offset == -1)
2314                                 return -errno;
2315                 }
2316 
2317                 err = auxtrace_queues__add_event(&etm->queues, session,
2318                                                  event, data_offset, &buffer);
2319                 if (err)
2320                         return err;
2321 
2322                 if (dump_trace)
2323                         if (auxtrace_buffer__get_data(buffer, fd)) {
2324                                 cs_etm__dump_event(etm, buffer);
2325                                 auxtrace_buffer__put_data(buffer);
2326                         }
2327         }
2328 
2329         return 0;
2330 }
2331 
2332 static bool cs_etm__is_timeless_decoding(struct cs_etm_auxtrace *etm)
2333 {
2334         struct evsel *evsel;
2335         struct evlist *evlist = etm->session->evlist;
2336         bool timeless_decoding = true;
2337 
2338         /*
2339          * Circle through the list of event and complain if we find one
2340          * with the time bit set.
2341          */
2342         evlist__for_each_entry(evlist, evsel) {
2343                 if ((evsel->core.attr.sample_type & PERF_SAMPLE_TIME))
2344                         timeless_decoding = false;
2345         }
2346 
2347         return timeless_decoding;
2348 }
2349 
2350 static const char * const cs_etm_global_header_fmts[] = {
2351         [CS_HEADER_VERSION_0]   = "     Header version                 %llx\n",
2352         [CS_PMU_TYPE_CPUS]      = "     PMU type/num cpus              %llx\n",
2353         [CS_ETM_SNAPSHOT]       = "     Snapshot                       %llx\n",
2354 };
2355 
2356 static const char * const cs_etm_priv_fmts[] = {
2357         [CS_ETM_MAGIC]          = "     Magic number                   %llx\n",
2358         [CS_ETM_CPU]            = "     CPU                            %lld\n",
2359         [CS_ETM_ETMCR]          = "     ETMCR                          %llx\n",
2360         [CS_ETM_ETMTRACEIDR]    = "     ETMTRACEIDR                    %llx\n",
2361         [CS_ETM_ETMCCER]        = "     ETMCCER                        %llx\n",
2362         [CS_ETM_ETMIDR]         = "     ETMIDR                         %llx\n",
2363 };
2364 
2365 static const char * const cs_etmv4_priv_fmts[] = {
2366         [CS_ETM_MAGIC]          = "     Magic number                   %llx\n",
2367         [CS_ETM_CPU]            = "     CPU                            %lld\n",
2368         [CS_ETMV4_TRCCONFIGR]   = "     TRCCONFIGR                     %llx\n",
2369         [CS_ETMV4_TRCTRACEIDR]  = "     TRCTRACEIDR                    %llx\n",
2370         [CS_ETMV4_TRCIDR0]      = "     TRCIDR0                        %llx\n",
2371         [CS_ETMV4_TRCIDR1]      = "     TRCIDR1                        %llx\n",
2372         [CS_ETMV4_TRCIDR2]      = "     TRCIDR2                        %llx\n",
2373         [CS_ETMV4_TRCIDR8]      = "     TRCIDR8                        %llx\n",
2374         [CS_ETMV4_TRCAUTHSTATUS] = "    TRCAUTHSTATUS                  %llx\n",
2375 };
2376 
2377 static void cs_etm__print_auxtrace_info(__u64 *val, int num)
2378 {
2379         int i, j, cpu = 0;
2380 
2381         for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
2382                 fprintf(stdout, cs_etm_global_header_fmts[i], val[i]);
2383 
2384         for (i = CS_HEADER_VERSION_0_MAX; cpu < num; cpu++) {
2385                 if (val[i] == __perf_cs_etmv3_magic)
2386                         for (j = 0; j < CS_ETM_PRIV_MAX; j++, i++)
2387                                 fprintf(stdout, cs_etm_priv_fmts[j], val[i]);
2388                 else if (val[i] == __perf_cs_etmv4_magic)
2389                         for (j = 0; j < CS_ETMV4_PRIV_MAX; j++, i++)
2390                                 fprintf(stdout, cs_etmv4_priv_fmts[j], val[i]);
2391                 else
2392                         /* failure.. return */
2393                         return;
2394         }
2395 }
2396 
2397 int cs_etm__process_auxtrace_info(union perf_event *event,
2398                                   struct perf_session *session)
2399 {
2400         struct perf_record_auxtrace_info *auxtrace_info = &event->auxtrace_info;
2401         struct cs_etm_auxtrace *etm = NULL;
2402         struct int_node *inode;
2403         unsigned int pmu_type;
2404         int event_header_size = sizeof(struct perf_event_header);
2405         int info_header_size;
2406         int total_size = auxtrace_info->header.size;
2407         int priv_size = 0;
2408         int num_cpu;
2409         int err = 0, idx = -1;
2410         int i, j, k;
2411         u64 *ptr, *hdr = NULL;
2412         u64 **metadata = NULL;
2413 
2414         /*
2415          * sizeof(auxtrace_info_event::type) +
2416          * sizeof(auxtrace_info_event::reserved) == 8
2417          */
2418         info_header_size = 8;
2419 
2420         if (total_size < (event_header_size + info_header_size))
2421                 return -EINVAL;
2422 
2423         priv_size = total_size - event_header_size - info_header_size;
2424 
2425         /* First the global part */
2426         ptr = (u64 *) auxtrace_info->priv;
2427 
2428         /* Look for version '0' of the header */
2429         if (ptr[0] != 0)
2430                 return -EINVAL;
2431 
2432         hdr = zalloc(sizeof(*hdr) * CS_HEADER_VERSION_0_MAX);
2433         if (!hdr)
2434                 return -ENOMEM;
2435 
2436         /* Extract header information - see cs-etm.h for format */
2437         for (i = 0; i < CS_HEADER_VERSION_0_MAX; i++)
2438                 hdr[i] = ptr[i];
2439         num_cpu = hdr[CS_PMU_TYPE_CPUS] & 0xffffffff;
2440         pmu_type = (unsigned int) ((hdr[CS_PMU_TYPE_CPUS] >> 32) &
2441                                     0xffffffff);
2442 
2443         /*
2444          * Create an RB tree for traceID-metadata tuple.  Since the conversion
2445          * has to be made for each packet that gets decoded, optimizing access
2446          * in anything other than a sequential array is worth doing.
2447          */
2448         traceid_list = intlist__new(NULL);
2449         if (!traceid_list) {
2450                 err = -ENOMEM;
2451                 goto err_free_hdr;
2452         }
2453 
2454         metadata = zalloc(sizeof(*metadata) * num_cpu);
2455         if (!metadata) {
2456                 err = -ENOMEM;
2457                 goto err_free_traceid_list;
2458         }
2459 
2460         /*
2461          * The metadata is stored in the auxtrace_info section and encodes
2462          * the configuration of the ARM embedded trace macrocell which is
2463          * required by the trace decoder to properly decode the trace due
2464          * to its highly compressed nature.
2465          */
2466         for (j = 0; j < num_cpu; j++) {
2467                 if (ptr[i] == __perf_cs_etmv3_magic) {
2468                         metadata[j] = zalloc(sizeof(*metadata[j]) *
2469                                              CS_ETM_PRIV_MAX);
2470                         if (!metadata[j]) {
2471                                 err = -ENOMEM;
2472                                 goto err_free_metadata;
2473                         }
2474                         for (k = 0; k < CS_ETM_PRIV_MAX; k++)
2475                                 metadata[j][k] = ptr[i + k];
2476 
2477                         /* The traceID is our handle */
2478                         idx = metadata[j][CS_ETM_ETMTRACEIDR];
2479                         i += CS_ETM_PRIV_MAX;
2480                 } else if (ptr[i] == __perf_cs_etmv4_magic) {
2481                         metadata[j] = zalloc(sizeof(*metadata[j]) *
2482                                              CS_ETMV4_PRIV_MAX);
2483                         if (!metadata[j]) {
2484                                 err = -ENOMEM;
2485                                 goto err_free_metadata;
2486                         }
2487                         for (k = 0; k < CS_ETMV4_PRIV_MAX; k++)
2488                                 metadata[j][k] = ptr[i + k];
2489 
2490                         /* The traceID is our handle */
2491                         idx = metadata[j][CS_ETMV4_TRCTRACEIDR];
2492                         i += CS_ETMV4_PRIV_MAX;
2493                 }
2494 
2495                 /* Get an RB node for this CPU */
2496                 inode = intlist__findnew(traceid_list, idx);
2497 
2498                 /* Something went wrong, no need to continue */
2499                 if (!inode) {
2500                         err = -ENOMEM;
2501                         goto err_free_metadata;
2502                 }
2503 
2504                 /*
2505                  * The node for that CPU should not be taken.
2506                  * Back out if that's the case.
2507                  */
2508                 if (inode->priv) {
2509                         err = -EINVAL;
2510                         goto err_free_metadata;
2511                 }
2512                 /* All good, associate the traceID with the metadata pointer */
2513                 inode->priv = metadata[j];
2514         }
2515 
2516         /*
2517          * Each of CS_HEADER_VERSION_0_MAX, CS_ETM_PRIV_MAX and
2518          * CS_ETMV4_PRIV_MAX mark how many double words are in the
2519          * global metadata, and each cpu's metadata respectively.
2520          * The following tests if the correct number of double words was
2521          * present in the auxtrace info section.
2522          */
2523         if (i * 8 != priv_size) {
2524                 err = -EINVAL;
2525                 goto err_free_metadata;
2526         }
2527 
2528         etm = zalloc(sizeof(*etm));
2529 
2530         if (!etm) {
2531                 err = -ENOMEM;
2532                 goto err_free_metadata;
2533         }
2534 
2535         err = auxtrace_queues__init(&etm->queues);
2536         if (err)
2537                 goto err_free_etm;
2538 
2539         etm->session = session;
2540         etm->machine = &session->machines.host;
2541 
2542         etm->num_cpu = num_cpu;
2543         etm->pmu_type = pmu_type;
2544         etm->snapshot_mode = (hdr[CS_ETM_SNAPSHOT] != 0);
2545         etm->metadata = metadata;
2546         etm->auxtrace_type = auxtrace_info->type;
2547         etm->timeless_decoding = cs_etm__is_timeless_decoding(etm);
2548 
2549         etm->auxtrace.process_event = cs_etm__process_event;
2550         etm->auxtrace.process_auxtrace_event = cs_etm__process_auxtrace_event;
2551         etm->auxtrace.flush_events = cs_etm__flush_events;
2552         etm->auxtrace.free_events = cs_etm__free_events;
2553         etm->auxtrace.free = cs_etm__free;
2554         session->auxtrace = &etm->auxtrace;
2555 
2556         etm->unknown_thread = thread__new(999999999, 999999999);
2557         if (!etm->unknown_thread) {
2558                 err = -ENOMEM;
2559                 goto err_free_queues;
2560         }
2561 
2562         /*
2563          * Initialize list node so that at thread__zput() we can avoid
2564          * segmentation fault at list_del_init().
2565          */
2566         INIT_LIST_HEAD(&etm->unknown_thread->node);
2567 
2568         err = thread__set_comm(etm->unknown_thread, "unknown", 0);
2569         if (err)
2570                 goto err_delete_thread;
2571 
2572         if (thread__init_map_groups(etm->unknown_thread, etm->machine)) {
2573                 err = -ENOMEM;
2574                 goto err_delete_thread;
2575         }
2576 
2577         if (dump_trace) {
2578                 cs_etm__print_auxtrace_info(auxtrace_info->priv, num_cpu);
2579                 return 0;
2580         }
2581 
2582         if (session->itrace_synth_opts->set) {
2583                 etm->synth_opts = *session->itrace_synth_opts;
2584         } else {
2585                 itrace_synth_opts__set_default(&etm->synth_opts,
2586                                 session->itrace_synth_opts->default_no_sample);
2587                 etm->synth_opts.callchain = false;
2588         }
2589 
2590         err = cs_etm__synth_events(etm, session);
2591         if (err)
2592                 goto err_delete_thread;
2593 
2594         err = auxtrace_queues__process_index(&etm->queues, session);
2595         if (err)
2596                 goto err_delete_thread;
2597 
2598         etm->data_queued = etm->queues.populated;
2599 
2600         return 0;
2601 
2602 err_delete_thread:
2603         thread__zput(etm->unknown_thread);
2604 err_free_queues:
2605         auxtrace_queues__free(&etm->queues);
2606         session->auxtrace = NULL;
2607 err_free_etm:
2608         zfree(&etm);
2609 err_free_metadata:
2610         /* No need to check @metadata[j], free(NULL) is supported */
2611         for (j = 0; j < num_cpu; j++)
2612                 zfree(&metadata[j]);
2613         zfree(&metadata);
2614 err_free_traceid_list:
2615         intlist__delete(traceid_list);
2616 err_free_hdr:
2617         zfree(&hdr);
2618 
2619         return err;
2620 }

/* [<][>][^][v][top][bottom][index][help] */