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