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