linux/tools/perf/util/cs-etm.c
<<
>>
Prefs
   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
  42struct 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
  69struct 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
  83struct 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
  97static int cs_etm__update_queues(struct cs_etm_auxtrace *etm);
  98static int cs_etm__process_queues(struct cs_etm_auxtrace *etm);
  99static int cs_etm__process_timeless_queues(struct cs_etm_auxtrace *etm,
 100                                           pid_t tid);
 101static int cs_etm__get_data_block(struct cs_etm_queue *etmq);
 102static 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_id_chan) \
 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
 118static 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
 128static 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
 142int 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
 156void 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
 169static 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
 192static 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
 216static 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
 230static 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
 272out_free:
 273        zfree(&tidq->last_branch_rb);
 274        zfree(&tidq->last_branch);
 275        zfree(&tidq->prev_packet);
 276        zfree(&tidq->packet);
 277out:
 278        return rc;
 279}
 280
 281static 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
 343out_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
 354struct 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
 366static 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
 379static 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
 390static 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
 404static 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
 430static 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;
 448out:
 449        return ret;
 450}
 451
 452static 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
 500out_free:
 501        zfree(&t_params);
 502}
 503
 504static 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
 528static 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
 565static 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
 577static 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
 593static 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
 617static 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
 638static 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
 684static 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
 729out_free_decoder:
 730        cs_etm_decoder__free(etmq->decoder);
 731out_free:
 732        intlist__delete(etmq->traceid_queues_list);
 733        free(etmq);
 734
 735        return NULL;
 736}
 737
 738static 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_id_chan);
 823        ret = auxtrace_heap__add(&etm->heap, cs_queue_nr, timestamp);
 824out:
 825        return ret;
 826}
 827
 828static 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
 845static 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
 855static inline
 856void 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
 899static inline
 900void 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
 906static 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
 921static 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
 930static inline
 931u64 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
 940static 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
 960static 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
 992static 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
1000static int
1001cs_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
1042static 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
1053int 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
1078bool cs_etm__etmq_is_timeless(struct cs_etm_queue *etmq)
1079{
1080        return !!etmq->etm->timeless_decoding;
1081}
1082
1083static 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
1112static 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 */
1166static 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
1230struct cs_etm_synth {
1231        struct perf_tool dummy_tool;
1232        struct perf_session *session;
1233};
1234
1235static 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
1247static 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
1259static 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
1339static 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
1420static 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
1439static 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
1478swap_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
1492static 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 */
1532static 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
1552static 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
1623static 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
1649static 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
1675static 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
1724static 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
1903static 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
1927out:
1928        return ret;
1929}
1930
1931static 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
2001static 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
2023static 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
2061static 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
2090static 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                 */
2141refetch:
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
2185out:
2186        return ret;
2187}
2188
2189static 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
2212static 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
2248static 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
2295static 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
2332static 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
2350static 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
2356static 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
2365static 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
2377static 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
2397int 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
2602err_delete_thread:
2603        thread__zput(etm->unknown_thread);
2604err_free_queues:
2605        auxtrace_queues__free(&etm->queues);
2606        session->auxtrace = NULL;
2607err_free_etm:
2608        zfree(&etm);
2609err_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);
2614err_free_traceid_list:
2615        intlist__delete(traceid_list);
2616err_free_hdr:
2617        zfree(&hdr);
2618
2619        return err;
2620}
2621