Back to home page

OSCL-LXR

 
 

    


0001 // SPDX-License-Identifier: GPL-2.0
0002 // Copyright (c) 2019 Facebook
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     /* write to stack */
0028     written_stack = bpf_read_branch_records(ctx, entries, sizeof(entries), 0);
0029     /* ignore spurious events */
0030     if (!written_stack)
0031         return 1;
0032 
0033     /* get required size */
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     /* ignore spurious events */
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";