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