0001
0002
0003
0004 #include <stddef.h>
0005 #include <linux/ptrace.h>
0006 #include <linux/bpf.h>
0007 #include <bpf/bpf_helpers.h>
0008 #include <bpf/bpf_tracing.h>
0009
0010 int valid = 0;
0011 int required_size_out = 0;
0012 int written_stack_out = 0;
0013 int written_global_out = 0;
0014
0015 struct {
0016 __u64 _a;
0017 __u64 _b;
0018 __u64 _c;
0019 } fpbe[30] = {0};
0020
0021 SEC("perf_event")
0022 int perf_branches(void *ctx)
0023 {
0024 __u64 entries[4 * 3] = {0};
0025 int required_size, written_stack, written_global;
0026
0027
0028 written_stack = bpf_read_branch_records(ctx, entries, sizeof(entries), 0);
0029
0030 if (!written_stack)
0031 return 1;
0032
0033
0034 required_size = bpf_read_branch_records(ctx, NULL, 0,
0035 BPF_F_GET_BRANCH_RECORDS_SIZE);
0036
0037 written_global = bpf_read_branch_records(ctx, fpbe, sizeof(fpbe), 0);
0038
0039 if (!written_global)
0040 return 1;
0041
0042 required_size_out = required_size;
0043 written_stack_out = written_stack;
0044 written_global_out = written_global;
0045 valid = 1;
0046
0047 return 0;
0048 }
0049
0050 char _license[] SEC("license") = "GPL";