1 | // SPDX-License-Identifier: GPL-2.0 |
2 | // Copyright (c) 2019 Facebook |
3 | |
4 | #include <stddef.h> |
5 | #include <linux/ptrace.h> |
6 | #include <linux/bpf.h> |
7 | #include <bpf/bpf_helpers.h> |
8 | #include <bpf/bpf_tracing.h> |
9 | |
10 | int valid = 0; |
11 | int required_size_out = 0; |
12 | int written_stack_out = 0; |
13 | int written_global_out = 0; |
14 | |
15 | struct { |
16 | __u64 _a; |
17 | __u64 _b; |
18 | __u64 _c; |
19 | } fpbe[30] = {0}; |
20 | |
21 | SEC("perf_event" ) |
22 | int perf_branches(void *ctx) |
23 | { |
24 | __u64 entries[4 * 3] = {0}; |
25 | int required_size, written_stack, written_global; |
26 | |
27 | /* write to stack */ |
28 | written_stack = bpf_read_branch_records(ctx, entries, sizeof(entries), 0); |
29 | /* ignore spurious events */ |
30 | if (!written_stack) |
31 | return 1; |
32 | |
33 | /* get required size */ |
34 | required_size = bpf_read_branch_records(ctx, NULL, 0, |
35 | BPF_F_GET_BRANCH_RECORDS_SIZE); |
36 | |
37 | written_global = bpf_read_branch_records(ctx, fpbe, sizeof(fpbe), 0); |
38 | /* ignore spurious events */ |
39 | if (!written_global) |
40 | return 1; |
41 | |
42 | required_size_out = required_size; |
43 | written_stack_out = written_stack; |
44 | written_global_out = written_global; |
45 | valid = 1; |
46 | |
47 | return 0; |
48 | } |
49 | |
50 | char _license[] SEC("license" ) = "GPL" ; |
51 | |