hc
2023-12-09 b22da3d8526a935aa31e086e63f60ff3246cb61c
kernel/tools/perf/include/bpf/bpf.h
....@@ -18,6 +18,35 @@
1818 unsigned int numa_node;
1919 };
2020
21
+#define bpf_map(name, _type, type_key, type_val, _max_entries) \
22
+struct bpf_map SEC("maps") name = { \
23
+ .type = BPF_MAP_TYPE_##_type, \
24
+ .key_size = sizeof(type_key), \
25
+ .value_size = sizeof(type_val), \
26
+ .max_entries = _max_entries, \
27
+}; \
28
+struct ____btf_map_##name { \
29
+ type_key key; \
30
+ type_val value; \
31
+}; \
32
+struct ____btf_map_##name __attribute__((section(".maps." #name), used)) \
33
+ ____btf_map_##name = { }
34
+
35
+/*
36
+ * FIXME: this should receive .max_entries as a parameter, as careful
37
+ * tuning of these limits is needed to avoid hitting limits that
38
+ * prevents other BPF constructs, such as tracepoint handlers,
39
+ * to get installed, with cryptic messages from libbpf, etc.
40
+ * For the current need, 'perf trace --filter-pids', 64 should
41
+ * be good enough, but this surely needs to be revisited.
42
+ */
43
+#define pid_map(name, value_type) bpf_map(name, HASH, pid_t, value_type, 64)
44
+
45
+static int (*bpf_map_update_elem)(struct bpf_map *map, void *key, void *value, u64 flags) = (void *)BPF_FUNC_map_update_elem;
46
+static void *(*bpf_map_lookup_elem)(struct bpf_map *map, void *key) = (void *)BPF_FUNC_map_lookup_elem;
47
+
48
+static void (*bpf_tail_call)(void *ctx, void *map, int index) = (void *)BPF_FUNC_tail_call;
49
+
2150 #define SEC(NAME) __attribute__((section(NAME), used))
2251
2352 #define probe(function, vars) \
....@@ -26,6 +55,9 @@
2655 #define syscall_enter(name) \
2756 SEC("syscalls:sys_enter_" #name) syscall_enter_ ## name
2857
58
+#define syscall_exit(name) \
59
+ SEC("syscalls:sys_exit_" #name) syscall_exit_ ## name
60
+
2961 #define license(name) \
3062 char _license[] SEC("license") = #name; \
3163 int _version SEC("version") = LINUX_VERSION_CODE;
....@@ -33,4 +65,6 @@
3365 static int (*probe_read)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read;
3466 static int (*probe_read_str)(void *dst, int size, const void *unsafe_addr) = (void *)BPF_FUNC_probe_read_str;
3567
68
+static int (*perf_event_output)(void *, struct bpf_map *, int, void *, unsigned long) = (void *)BPF_FUNC_perf_event_output;
69
+
3670 #endif /* _PERF_BPF_H */