linux-btrace.c revision 1.1.1.8 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 (at) 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