1 /* Linux-dependent part of branch trace support for GDB, and GDBserver. 2 3 Copyright (C) 2013-2024 Free Software Foundation, Inc. 4 5 Contributed by Intel Corp. <markus.t.metzger@intel.com> 6 7 This file is part of GDB. 8 9 This program is free software; you can redistribute it and/or modify 10 it under the terms of the GNU General Public License as published by 11 the Free Software Foundation; either version 3 of the License, or 12 (at your option) any later version. 13 14 This program is distributed in the hope that it will be useful, 15 but WITHOUT ANY WARRANTY; without even the implied warranty of 16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 17 GNU General Public License for more details. 18 19 You should have received a copy of the GNU General Public License 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 21 22 #include "linux-btrace.h" 23 #include "gdbsupport/common-regcache.h" 24 #include "gdbsupport/gdb_wait.h" 25 #include "x86-cpuid.h" 26 #include "gdbsupport/filestuff.h" 27 #include "gdbsupport/scoped_fd.h" 28 #include "gdbsupport/scoped_mmap.h" 29 30 #include <inttypes.h> 31 32 #include <sys/syscall.h> 33 34 #if HAVE_LINUX_PERF_EVENT_H && defined(SYS_perf_event_open) 35 #include <unistd.h> 36 #include <sys/mman.h> 37 #include <sys/user.h> 38 #include "nat/gdb_ptrace.h" 39 #include <sys/types.h> 40 #include <signal.h> 41 42 /* A branch trace record in perf_event. */ 43 struct perf_event_bts 44 { 45 /* The linear address of the branch source. */ 46 uint64_t from; 47 48 /* The linear address of the branch destination. */ 49 uint64_t to; 50 }; 51 52 /* A perf_event branch trace sample. */ 53 struct perf_event_sample 54 { 55 /* The perf_event sample header. */ 56 struct perf_event_header header; 57 58 /* The perf_event branch tracing payload. */ 59 struct perf_event_bts bts; 60 }; 61 62 /* Identify the cpu we're running on. */ 63 static struct btrace_cpu 64 btrace_this_cpu (void) 65 { 66 struct btrace_cpu cpu; 67 unsigned int eax, ebx, ecx, edx; 68 int ok; 69 70 memset (&cpu, 0, sizeof (cpu)); 71 72 ok = x86_cpuid (0, &eax, &ebx, &ecx, &edx); 73 if (ok != 0) 74 { 75 if (ebx == signature_INTEL_ebx && ecx == signature_INTEL_ecx 76 && edx == signature_INTEL_edx) 77 { 78 unsigned int cpuid, ignore; 79 80 ok = x86_cpuid (1, &cpuid, &ignore, &ignore, &ignore); 81 if (ok != 0) 82 { 83 cpu.vendor = CV_INTEL; 84 85 cpu.family = (cpuid >> 8) & 0xf; 86 if (cpu.family == 0xf) 87 cpu.family += (cpuid >> 20) & 0xff; 88 89 cpu.model = (cpuid >> 4) & 0xf; 90 if ((cpu.family == 0x6) || ((cpu.family & 0xf) == 0xf)) 91 cpu.model += (cpuid >> 12) & 0xf0; 92 } 93 } 94 else if (ebx == signature_AMD_ebx && ecx == signature_AMD_ecx 95 && edx == signature_AMD_edx) 96 cpu.vendor = CV_AMD; 97 } 98 99 return cpu; 100 } 101 102 /* Return non-zero if there is new data in PEVENT; zero otherwise. */ 103 104 static int 105 perf_event_new_data (const struct perf_event_buffer *pev) 106 { 107 return *pev->data_head != pev->last_head; 108 } 109 110 /* Copy the last SIZE bytes from PEV ending at DATA_HEAD and return a pointer 111 to the memory holding the copy. 112 The caller is responsible for freeing the memory. */ 113 114 static gdb_byte * 115 perf_event_read (const struct perf_event_buffer *pev, __u64 data_head, 116 size_t size) 117 { 118 const gdb_byte *begin, *end, *start, *stop; 119 gdb_byte *buffer; 120 size_t buffer_size; 121 __u64 data_tail; 122 123 if (size == 0) 124 return NULL; 125 126 /* We should never ask for more data than the buffer can hold. */ 127 buffer_size = pev->size; 128 gdb_assert (size <= buffer_size); 129 130 /* If we ask for more data than we seem to have, we wrap around and read 131 data from the end of the buffer. This is already handled by the % 132 BUFFER_SIZE operation, below. Here, we just need to make sure that we 133 don't underflow. 134 135 Note that this is perfectly OK for perf event buffers where data_head 136 doesn'grow indefinitely and instead wraps around to remain within the 137 buffer's boundaries. */ 138 if (data_head < size) 139 data_head += buffer_size; 140 141 gdb_assert (size <= data_head); 142 data_tail = data_head - size; 143 144 begin = pev->mem; 145 start = begin + data_tail % buffer_size; 146 stop = begin + data_head % buffer_size; 147 148 buffer = (gdb_byte *) xmalloc (size); 149 150 if (start < stop) 151 memcpy (buffer, start, stop - start); 152 else 153 { 154 end = begin + buffer_size; 155 156 memcpy (buffer, start, end - start); 157 memcpy (buffer + (end - start), begin, stop - begin); 158 } 159 160 return buffer; 161 } 162 163 /* Copy the perf event buffer data from PEV. 164 Store a pointer to the copy into DATA and its size in SIZE. */ 165 166 static void 167 perf_event_read_all (struct perf_event_buffer *pev, gdb_byte **data, 168 size_t *psize) 169 { 170 size_t size; 171 __u64 data_head; 172 173 data_head = *pev->data_head; 174 size = pev->size; 175 176 *data = perf_event_read (pev, data_head, size); 177 *psize = size; 178 179 pev->last_head = data_head; 180 } 181 182 /* Try to determine the start address of the Linux kernel. */ 183 184 static uint64_t 185 linux_determine_kernel_start (void) 186 { 187 static uint64_t kernel_start; 188 static int cached; 189 190 if (cached != 0) 191 return kernel_start; 192 193 cached = 1; 194 195 gdb_file_up file = gdb_fopen_cloexec ("/proc/kallsyms", "r"); 196 if (file == NULL) 197 return kernel_start; 198 199 while (!feof (file.get ())) 200 { 201 char buffer[1024], symbol[8], *line; 202 uint64_t addr; 203 int match; 204 205 line = fgets (buffer, sizeof (buffer), file.get ()); 206 if (line == NULL) 207 break; 208 209 match = sscanf (line, "%" SCNx64 " %*[tT] %7s", &addr, symbol); 210 if (match != 2) 211 continue; 212 213 if (strcmp (symbol, "_text") == 0) 214 { 215 kernel_start = addr; 216 break; 217 } 218 } 219 220 return kernel_start; 221 } 222 223 /* Check whether an address is in the kernel. */ 224 225 static inline int 226 perf_event_is_kernel_addr (uint64_t addr) 227 { 228 uint64_t kernel_start; 229 230 kernel_start = linux_determine_kernel_start (); 231 if (kernel_start != 0ull) 232 return (addr >= kernel_start); 233 234 /* If we don't know the kernel's start address, let's check the most 235 significant bit. This will work at least for 64-bit kernels. */ 236 return ((addr & (1ull << 63)) != 0); 237 } 238 239 /* Check whether a perf event record should be skipped. */ 240 241 static inline int 242 perf_event_skip_bts_record (const struct perf_event_bts *bts) 243 { 244 /* The hardware may report branches from kernel into user space. Branches 245 from user into kernel space will be suppressed. We filter the former to 246 provide a consistent branch trace excluding kernel. */ 247 return perf_event_is_kernel_addr (bts->from); 248 } 249 250 /* Perform a few consistency checks on a perf event sample record. This is 251 meant to catch cases when we get out of sync with the perf event stream. */ 252 253 static inline int 254 perf_event_sample_ok (const struct perf_event_sample *sample) 255 { 256 if (sample->header.type != PERF_RECORD_SAMPLE) 257 return 0; 258 259 if (sample->header.size != sizeof (*sample)) 260 return 0; 261 262 return 1; 263 } 264 265 /* Branch trace is collected in a circular buffer [begin; end) as pairs of from 266 and to addresses (plus a header). 267 268 Start points into that buffer at the next sample position. 269 We read the collected samples backwards from start. 270 271 While reading the samples, we convert the information into a list of blocks. 272 For two adjacent samples s1 and s2, we form a block b such that b.begin = 273 s1.to and b.end = s2.from. 274 275 In case the buffer overflows during sampling, one sample may have its lower 276 part at the end and its upper part at the beginning of the buffer. */ 277 278 static std::vector<btrace_block> * 279 perf_event_read_bts (btrace_target_info *tinfo, const uint8_t *begin, 280 const uint8_t *end, const uint8_t *start, size_t size) 281 { 282 std::vector<btrace_block> *btrace = new std::vector<btrace_block>; 283 struct perf_event_sample sample; 284 size_t read = 0; 285 struct btrace_block block = { 0, 0 }; 286 287 gdb_assert (begin <= start); 288 gdb_assert (start <= end); 289 290 /* The first block ends at the current pc. */ 291 reg_buffer_common *regcache = get_thread_regcache_for_ptid (tinfo->ptid); 292 block.end = regcache_read_pc (regcache); 293 294 /* The buffer may contain a partial record as its last entry (i.e. when the 295 buffer size is not a multiple of the sample size). */ 296 read = sizeof (sample) - 1; 297 298 for (; read < size; read += sizeof (sample)) 299 { 300 const struct perf_event_sample *psample; 301 302 /* Find the next perf_event sample in a backwards traversal. */ 303 start -= sizeof (sample); 304 305 /* If we're still inside the buffer, we're done. */ 306 if (begin <= start) 307 psample = (const struct perf_event_sample *) start; 308 else 309 { 310 int missing; 311 312 /* We're to the left of the ring buffer, we will wrap around and 313 reappear at the very right of the ring buffer. */ 314 315 missing = (begin - start); 316 start = (end - missing); 317 318 /* If the entire sample is missing, we're done. */ 319 if (missing == sizeof (sample)) 320 psample = (const struct perf_event_sample *) start; 321 else 322 { 323 uint8_t *stack; 324 325 /* The sample wrapped around. The lower part is at the end and 326 the upper part is at the beginning of the buffer. */ 327 stack = (uint8_t *) &sample; 328 329 /* Copy the two parts so we have a contiguous sample. */ 330 memcpy (stack, start, missing); 331 memcpy (stack + missing, begin, sizeof (sample) - missing); 332 333 psample = &sample; 334 } 335 } 336 337 if (!perf_event_sample_ok (psample)) 338 { 339 warning (_("Branch trace may be incomplete.")); 340 break; 341 } 342 343 if (perf_event_skip_bts_record (&psample->bts)) 344 continue; 345 346 /* We found a valid sample, so we can complete the current block. */ 347 block.begin = psample->bts.to; 348 349 btrace->push_back (block); 350 351 /* Start the next block. */ 352 block.end = psample->bts.from; 353 } 354 355 /* Push the last block (i.e. the first one of inferior execution), as well. 356 We don't know where it ends, but we know where it starts. If we're 357 reading delta trace, we can fill in the start address later on. 358 Otherwise we will prune it. */ 359 block.begin = 0; 360 btrace->push_back (block); 361 362 return btrace; 363 } 364 365 /* Check whether an Intel cpu supports BTS. */ 366 367 static int 368 intel_supports_bts (const struct btrace_cpu *cpu) 369 { 370 switch (cpu->family) 371 { 372 case 0x6: 373 switch (cpu->model) 374 { 375 case 0x1a: /* Nehalem */ 376 case 0x1f: 377 case 0x1e: 378 case 0x2e: 379 case 0x25: /* Westmere */ 380 case 0x2c: 381 case 0x2f: 382 case 0x2a: /* Sandy Bridge */ 383 case 0x2d: 384 case 0x3a: /* Ivy Bridge */ 385 386 /* AAJ122: LBR, BTM, or BTS records may have incorrect branch 387 "from" information afer an EIST transition, T-states, C1E, or 388 Adaptive Thermal Throttling. */ 389 return 0; 390 } 391 } 392 393 return 1; 394 } 395 396 /* Check whether the cpu supports BTS. */ 397 398 static int 399 cpu_supports_bts (void) 400 { 401 struct btrace_cpu cpu; 402 403 cpu = btrace_this_cpu (); 404 switch (cpu.vendor) 405 { 406 default: 407 /* Don't know about others. Let's assume they do. */ 408 return 1; 409 410 case CV_INTEL: 411 return intel_supports_bts (&cpu); 412 413 case CV_AMD: 414 return 0; 415 } 416 } 417 418 /* The perf_event_open syscall failed. Try to print a helpful error 419 message. */ 420 421 static void 422 diagnose_perf_event_open_fail () 423 { 424 int orig_errno = errno; 425 switch (orig_errno) 426 { 427 case EPERM: 428 case EACCES: 429 { 430 static const char filename[] = "/proc/sys/kernel/perf_event_paranoid"; 431 errno = 0; 432 gdb_file_up file = gdb_fopen_cloexec (filename, "r"); 433 if (file.get () == nullptr) 434 error (_("Failed to open %s (%s). Your system does not support " 435 "process recording."), filename, safe_strerror (errno)); 436 437 int level, found = fscanf (file.get (), "%d", &level); 438 if (found == 1 && level > 2) 439 error (_("You do not have permission to record the process. " 440 "Try setting %s to 2 or less."), filename); 441 } 442 443 break; 444 } 445 446 error (_("Failed to start recording: %s"), safe_strerror (orig_errno)); 447 } 448 449 /* Get the linux version of a btrace_target_info. */ 450 451 static linux_btrace_target_info * 452 get_linux_btrace_target_info (btrace_target_info *gtinfo) 453 { 454 return gdb::checked_static_cast<linux_btrace_target_info *> (gtinfo); 455 } 456 457 /* Enable branch tracing in BTS format. */ 458 459 static struct btrace_target_info * 460 linux_enable_bts (ptid_t ptid, const struct btrace_config_bts *conf) 461 { 462 size_t size, pages; 463 __u64 data_offset; 464 int pid, pg; 465 466 if (!cpu_supports_bts ()) 467 error (_("BTS support has been disabled for the target cpu.")); 468 469 std::unique_ptr<linux_btrace_target_info> tinfo 470 { std::make_unique<linux_btrace_target_info> (ptid) }; 471 472 tinfo->conf.format = BTRACE_FORMAT_BTS; 473 474 tinfo->attr.size = sizeof (tinfo->attr); 475 tinfo->attr.type = PERF_TYPE_HARDWARE; 476 tinfo->attr.config = PERF_COUNT_HW_BRANCH_INSTRUCTIONS; 477 tinfo->attr.sample_period = 1; 478 479 /* We sample from and to address. */ 480 tinfo->attr.sample_type = PERF_SAMPLE_IP | PERF_SAMPLE_ADDR; 481 482 tinfo->attr.exclude_kernel = 1; 483 tinfo->attr.exclude_hv = 1; 484 tinfo->attr.exclude_idle = 1; 485 486 pid = ptid.lwp (); 487 if (pid == 0) 488 pid = ptid.pid (); 489 490 errno = 0; 491 scoped_fd fd (syscall (SYS_perf_event_open, &tinfo->attr, pid, -1, -1, 0)); 492 if (fd.get () < 0) 493 diagnose_perf_event_open_fail (); 494 495 /* Convert the requested size in bytes to pages (rounding up). */ 496 pages = ((size_t) conf->size / PAGE_SIZE 497 + ((conf->size % PAGE_SIZE) == 0 ? 0 : 1)); 498 /* We need at least one page. */ 499 if (pages == 0) 500 pages = 1; 501 502 /* The buffer size can be requested in powers of two pages. Adjust PAGES 503 to the next power of two. */ 504 for (pg = 0; pages != ((size_t) 1 << pg); ++pg) 505 if ((pages & ((size_t) 1 << pg)) != 0) 506 pages += ((size_t) 1 << pg); 507 508 /* We try to allocate the requested size. 509 If that fails, try to get as much as we can. */ 510 scoped_mmap data; 511 for (; pages > 0; pages >>= 1) 512 { 513 size_t length; 514 __u64 data_size; 515 516 data_size = (__u64) pages * PAGE_SIZE; 517 518 /* Don't ask for more than we can represent in the configuration. */ 519 if ((__u64) UINT_MAX < data_size) 520 continue; 521 522 size = (size_t) data_size; 523 length = size + PAGE_SIZE; 524 525 /* Check for overflows. */ 526 if ((__u64) length != data_size + PAGE_SIZE) 527 continue; 528 529 errno = 0; 530 /* The number of pages we request needs to be a power of two. */ 531 data.reset (nullptr, length, PROT_READ, MAP_SHARED, fd.get (), 0); 532 if (data.get () != MAP_FAILED) 533 break; 534 } 535 536 if (pages == 0) 537 error (_("Failed to map trace buffer: %s."), safe_strerror (errno)); 538 539 struct perf_event_mmap_page *header = (struct perf_event_mmap_page *) 540 data.get (); 541 data_offset = PAGE_SIZE; 542 543 #if defined (PERF_ATTR_SIZE_VER5) 544 if (offsetof (struct perf_event_mmap_page, data_size) <= header->size) 545 { 546 __u64 data_size; 547 548 data_offset = header->data_offset; 549 data_size = header->data_size; 550 551 size = (unsigned int) data_size; 552 553 /* Check for overflows. */ 554 if ((__u64) size != data_size) 555 error (_("Failed to determine trace buffer size.")); 556 } 557 #endif /* defined (PERF_ATTR_SIZE_VER5) */ 558 559 tinfo->pev.size = size; 560 tinfo->pev.data_head = &header->data_head; 561 tinfo->pev.mem = (const uint8_t *) data.release () + data_offset; 562 tinfo->pev.last_head = 0ull; 563 tinfo->header = header; 564 tinfo->file = fd.release (); 565 566 tinfo->conf.bts.size = (unsigned int) size; 567 return tinfo.release (); 568 } 569 570 #if defined (PERF_ATTR_SIZE_VER5) 571 572 /* Determine the event type. */ 573 574 static int 575 perf_event_pt_event_type () 576 { 577 static const char filename[] = "/sys/bus/event_source/devices/intel_pt/type"; 578 579 errno = 0; 580 gdb_file_up file = gdb_fopen_cloexec (filename, "r"); 581 if (file.get () == nullptr) 582 switch (errno) 583 { 584 case EACCES: 585 case EFAULT: 586 case EPERM: 587 error (_("Failed to open %s (%s). You do not have permission " 588 "to use Intel PT."), filename, safe_strerror (errno)); 589 590 case ENOTDIR: 591 case ENOENT: 592 error (_("Failed to open %s (%s). Your system does not support " 593 "Intel PT."), filename, safe_strerror (errno)); 594 595 default: 596 error (_("Failed to open %s: %s."), filename, safe_strerror (errno)); 597 } 598 599 int type, found = fscanf (file.get (), "%d", &type); 600 if (found != 1) 601 error (_("Failed to read the PT event type from %s."), filename); 602 603 return type; 604 } 605 606 /* Enable branch tracing in Intel Processor Trace format. */ 607 608 static struct btrace_target_info * 609 linux_enable_pt (ptid_t ptid, const struct btrace_config_pt *conf) 610 { 611 size_t pages; 612 int pid, pg; 613 614 pid = ptid.lwp (); 615 if (pid == 0) 616 pid = ptid.pid (); 617 618 std::unique_ptr<linux_btrace_target_info> tinfo 619 { std::make_unique<linux_btrace_target_info> (ptid) }; 620 621 tinfo->conf.format = BTRACE_FORMAT_PT; 622 623 tinfo->attr.size = sizeof (tinfo->attr); 624 tinfo->attr.type = perf_event_pt_event_type (); 625 626 tinfo->attr.exclude_kernel = 1; 627 tinfo->attr.exclude_hv = 1; 628 tinfo->attr.exclude_idle = 1; 629 630 errno = 0; 631 scoped_fd fd (syscall (SYS_perf_event_open, &tinfo->attr, pid, -1, -1, 0)); 632 if (fd.get () < 0) 633 diagnose_perf_event_open_fail (); 634 635 /* Allocate the configuration page. */ 636 scoped_mmap data (nullptr, PAGE_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED, 637 fd.get (), 0); 638 if (data.get () == MAP_FAILED) 639 error (_("Failed to map trace user page: %s."), safe_strerror (errno)); 640 641 struct perf_event_mmap_page *header = (struct perf_event_mmap_page *) 642 data.get (); 643 644 header->aux_offset = header->data_offset + header->data_size; 645 646 /* Convert the requested size in bytes to pages (rounding up). */ 647 pages = ((size_t) conf->size / PAGE_SIZE 648 + ((conf->size % PAGE_SIZE) == 0 ? 0 : 1)); 649 /* We need at least one page. */ 650 if (pages == 0) 651 pages = 1; 652 653 /* The buffer size can be requested in powers of two pages. Adjust PAGES 654 to the next power of two. */ 655 for (pg = 0; pages != ((size_t) 1 << pg); ++pg) 656 if ((pages & ((size_t) 1 << pg)) != 0) 657 pages += ((size_t) 1 << pg); 658 659 /* We try to allocate the requested size. 660 If that fails, try to get as much as we can. */ 661 scoped_mmap aux; 662 for (; pages > 0; pages >>= 1) 663 { 664 size_t length; 665 __u64 data_size; 666 667 data_size = (__u64) pages * PAGE_SIZE; 668 669 /* Don't ask for more than we can represent in the configuration. */ 670 if ((__u64) UINT_MAX < data_size) 671 continue; 672 673 length = (size_t) data_size; 674 675 /* Check for overflows. */ 676 if ((__u64) length != data_size) 677 continue; 678 679 header->aux_size = data_size; 680 681 errno = 0; 682 aux.reset (nullptr, length, PROT_READ, MAP_SHARED, fd.get (), 683 header->aux_offset); 684 if (aux.get () != MAP_FAILED) 685 break; 686 } 687 688 if (pages == 0) 689 error (_("Failed to map trace buffer: %s."), safe_strerror (errno)); 690 691 tinfo->pev.size = aux.size (); 692 tinfo->pev.mem = (const uint8_t *) aux.release (); 693 tinfo->pev.data_head = &header->aux_head; 694 tinfo->header = (struct perf_event_mmap_page *) data.release (); 695 gdb_assert (tinfo->header == header); 696 tinfo->file = fd.release (); 697 698 tinfo->conf.pt.size = (unsigned int) tinfo->pev.size; 699 return tinfo.release (); 700 } 701 702 #else /* !defined (PERF_ATTR_SIZE_VER5) */ 703 704 static struct btrace_target_info * 705 linux_enable_pt (ptid_t ptid, const struct btrace_config_pt *conf) 706 { 707 error (_("Intel Processor Trace support was disabled at compile time.")); 708 } 709 710 #endif /* !defined (PERF_ATTR_SIZE_VER5) */ 711 712 /* See linux-btrace.h. */ 713 714 struct btrace_target_info * 715 linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf) 716 { 717 switch (conf->format) 718 { 719 case BTRACE_FORMAT_NONE: 720 error (_("Bad branch trace format.")); 721 722 default: 723 error (_("Unknown branch trace format.")); 724 725 case BTRACE_FORMAT_BTS: 726 return linux_enable_bts (ptid, &conf->bts); 727 728 case BTRACE_FORMAT_PT: 729 return linux_enable_pt (ptid, &conf->pt); 730 } 731 } 732 733 /* Disable BTS tracing. */ 734 735 static void 736 linux_disable_bts (struct linux_btrace_target_info *tinfo) 737 { 738 munmap ((void *) tinfo->header, tinfo->pev.size + PAGE_SIZE); 739 close (tinfo->file); 740 } 741 742 /* Disable Intel Processor Trace tracing. */ 743 744 static void 745 linux_disable_pt (struct linux_btrace_target_info *tinfo) 746 { 747 munmap ((void *) tinfo->pev.mem, tinfo->pev.size); 748 munmap ((void *) tinfo->header, PAGE_SIZE); 749 close (tinfo->file); 750 } 751 752 /* See linux-btrace.h. */ 753 754 enum btrace_error 755 linux_disable_btrace (struct btrace_target_info *gtinfo) 756 { 757 linux_btrace_target_info *tinfo 758 = get_linux_btrace_target_info (gtinfo); 759 760 switch (tinfo->conf.format) 761 { 762 case BTRACE_FORMAT_NONE: 763 return BTRACE_ERR_NOT_SUPPORTED; 764 765 case BTRACE_FORMAT_BTS: 766 linux_disable_bts (tinfo); 767 delete tinfo; 768 return BTRACE_ERR_NONE; 769 770 case BTRACE_FORMAT_PT: 771 linux_disable_pt (tinfo); 772 delete tinfo; 773 return BTRACE_ERR_NONE; 774 } 775 776 return BTRACE_ERR_NOT_SUPPORTED; 777 } 778 779 /* Read branch trace data in BTS format for the thread given by TINFO into 780 BTRACE using the TYPE reading method. */ 781 782 static enum btrace_error 783 linux_read_bts (btrace_data_bts *btrace, linux_btrace_target_info *tinfo, 784 enum btrace_read_type type) 785 { 786 const uint8_t *begin, *end, *start; 787 size_t buffer_size, size; 788 __u64 data_head = 0, data_tail; 789 unsigned int retries = 5; 790 791 /* For delta reads, we return at least the partial last block containing 792 the current PC. */ 793 if (type == BTRACE_READ_NEW && !perf_event_new_data (&tinfo->pev)) 794 return BTRACE_ERR_NONE; 795 796 buffer_size = tinfo->pev.size; 797 data_tail = tinfo->pev.last_head; 798 799 /* We may need to retry reading the trace. See below. */ 800 while (retries--) 801 { 802 data_head = *tinfo->pev.data_head; 803 804 /* Delete any leftover trace from the previous iteration. */ 805 delete btrace->blocks; 806 btrace->blocks = nullptr; 807 808 if (type == BTRACE_READ_DELTA) 809 { 810 __u64 data_size; 811 812 /* Determine the number of bytes to read and check for buffer 813 overflows. */ 814 815 /* Check for data head overflows. We might be able to recover from 816 those but they are very unlikely and it's not really worth the 817 effort, I think. */ 818 if (data_head < data_tail) 819 return BTRACE_ERR_OVERFLOW; 820 821 /* If the buffer is smaller than the trace delta, we overflowed. */ 822 data_size = data_head - data_tail; 823 if (buffer_size < data_size) 824 return BTRACE_ERR_OVERFLOW; 825 826 /* DATA_SIZE <= BUFFER_SIZE and therefore fits into a size_t. */ 827 size = (size_t) data_size; 828 } 829 else 830 { 831 /* Read the entire buffer. */ 832 size = buffer_size; 833 834 /* Adjust the size if the buffer has not overflowed, yet. */ 835 if (data_head < size) 836 size = (size_t) data_head; 837 } 838 839 /* Data_head keeps growing; the buffer itself is circular. */ 840 begin = tinfo->pev.mem; 841 start = begin + data_head % buffer_size; 842 843 if (data_head <= buffer_size) 844 end = start; 845 else 846 end = begin + tinfo->pev.size; 847 848 btrace->blocks = perf_event_read_bts (tinfo, begin, end, start, size); 849 850 /* The stopping thread notifies its ptracer before it is scheduled out. 851 On multi-core systems, the debugger might therefore run while the 852 kernel might be writing the last branch trace records. 853 854 Let's check whether the data head moved while we read the trace. */ 855 if (data_head == *tinfo->pev.data_head) 856 break; 857 } 858 859 tinfo->pev.last_head = data_head; 860 861 /* Prune the incomplete last block (i.e. the first one of inferior execution) 862 if we're not doing a delta read. There is no way of filling in its zeroed 863 BEGIN element. */ 864 if (!btrace->blocks->empty () && type != BTRACE_READ_DELTA) 865 btrace->blocks->pop_back (); 866 867 return BTRACE_ERR_NONE; 868 } 869 870 /* Fill in the Intel Processor Trace configuration information. */ 871 872 static void 873 linux_fill_btrace_pt_config (struct btrace_data_pt_config *conf) 874 { 875 conf->cpu = btrace_this_cpu (); 876 } 877 878 /* Read branch trace data in Intel Processor Trace format for the thread 879 given by TINFO into BTRACE using the TYPE reading method. */ 880 881 static enum btrace_error 882 linux_read_pt (btrace_data_pt *btrace, linux_btrace_target_info *tinfo, 883 enum btrace_read_type type) 884 { 885 linux_fill_btrace_pt_config (&btrace->config); 886 887 switch (type) 888 { 889 case BTRACE_READ_DELTA: 890 /* We don't support delta reads. The data head (i.e. aux_head) wraps 891 around to stay inside the aux buffer. */ 892 return BTRACE_ERR_NOT_SUPPORTED; 893 894 case BTRACE_READ_NEW: 895 if (!perf_event_new_data (&tinfo->pev)) 896 return BTRACE_ERR_NONE; 897 [[fallthrough]]; 898 case BTRACE_READ_ALL: 899 perf_event_read_all (&tinfo->pev, &btrace->data, &btrace->size); 900 return BTRACE_ERR_NONE; 901 } 902 903 internal_error (_("Unknown btrace read type.")); 904 } 905 906 /* See linux-btrace.h. */ 907 908 enum btrace_error 909 linux_read_btrace (struct btrace_data *btrace, 910 struct btrace_target_info *gtinfo, 911 enum btrace_read_type type) 912 { 913 linux_btrace_target_info *tinfo 914 = get_linux_btrace_target_info (gtinfo); 915 916 switch (tinfo->conf.format) 917 { 918 case BTRACE_FORMAT_NONE: 919 return BTRACE_ERR_NOT_SUPPORTED; 920 921 case BTRACE_FORMAT_BTS: 922 /* We read btrace in BTS format. */ 923 btrace->format = BTRACE_FORMAT_BTS; 924 btrace->variant.bts.blocks = NULL; 925 926 return linux_read_bts (&btrace->variant.bts, tinfo, type); 927 928 case BTRACE_FORMAT_PT: 929 /* We read btrace in Intel Processor Trace format. */ 930 btrace->format = BTRACE_FORMAT_PT; 931 btrace->variant.pt.data = NULL; 932 btrace->variant.pt.size = 0; 933 934 return linux_read_pt (&btrace->variant.pt, tinfo, type); 935 } 936 937 internal_error (_("Unkown branch trace format.")); 938 } 939 940 /* See linux-btrace.h. */ 941 942 const struct btrace_config * 943 linux_btrace_conf (const struct btrace_target_info *tinfo) 944 { 945 return &tinfo->conf; 946 } 947 948 #else /* !HAVE_LINUX_PERF_EVENT_H */ 949 950 /* See linux-btrace.h. */ 951 952 struct btrace_target_info * 953 linux_enable_btrace (ptid_t ptid, const struct btrace_config *conf) 954 { 955 return NULL; 956 } 957 958 /* See linux-btrace.h. */ 959 960 enum btrace_error 961 linux_disable_btrace (struct btrace_target_info *tinfo) 962 { 963 return BTRACE_ERR_NOT_SUPPORTED; 964 } 965 966 /* See linux-btrace.h. */ 967 968 enum btrace_error 969 linux_read_btrace (struct btrace_data *btrace, 970 struct btrace_target_info *tinfo, 971 enum btrace_read_type type) 972 { 973 return BTRACE_ERR_NOT_SUPPORTED; 974 } 975 976 /* See linux-btrace.h. */ 977 978 const struct btrace_config * 979 linux_btrace_conf (const struct btrace_target_info *tinfo) 980 { 981 return NULL; 982 } 983 984 #endif /* !HAVE_LINUX_PERF_EVENT_H */ 985