summaryrefslogtreecommitdiffstats
path: root/tools/perf/examples
diff options
context:
space:
mode:
Diffstat (limited to 'tools/perf/examples')
-rw-r--r--tools/perf/examples/bpf/augmented_syscalls.c34
1 files changed, 33 insertions, 1 deletions
diff --git a/tools/perf/examples/bpf/augmented_syscalls.c b/tools/perf/examples/bpf/augmented_syscalls.c
index a9695c7f7aab..6dfead0be74e 100644
--- a/tools/perf/examples/bpf/augmented_syscalls.c
+++ b/tools/perf/examples/bpf/augmented_syscalls.c
@@ -19,6 +19,7 @@
*/
#include <stdio.h>
+#include <linux/socket.h>
struct bpf_map SEC("maps") __augmented_syscalls__ = {
.type = BPF_MAP_TYPE_PERF_EVENT_ARRAY,
@@ -33,7 +34,7 @@ struct augmented_filename {
char value[256];
};
-#define augmented_filename_syscall_enter(syscall) \
+#define augmented_filename_syscall_enter(syscall) \
struct augmented_enter_##syscall##_args { \
struct syscall_enter_##syscall##_args args; \
struct augmented_filename filename; \
@@ -94,4 +95,35 @@ struct syscall_enter_newstat_args {
augmented_filename_syscall_enter(newstat);
+struct sockaddr;
+
+struct syscall_enter_connect_args {
+ unsigned long long common_tp_fields;
+ long syscall_nr;
+ long fd;
+ struct sockaddr *addr_ptr;
+ unsigned long addrlen;
+};
+
+struct augmented_enter_connect_args {
+ struct syscall_enter_connect_args args;
+ struct sockaddr_storage addr;
+};
+
+int syscall_enter(connect)(struct syscall_enter_connect_args *args)
+{
+ struct augmented_enter_connect_args augmented_args;
+ unsigned long addrlen = sizeof(augmented_args.addr);
+
+ probe_read(&augmented_args.args, sizeof(augmented_args.args), args);
+#ifdef FIXME_CLANG_OPTIMIZATION_THAT_ACCESSES_USER_CONTROLLED_ADDRLEN_DESPITE_THIS_CHECK
+ if (addrlen > augmented_args.args.addrlen)
+ addrlen = augmented_args.args.addrlen;
+#endif
+ probe_read(&augmented_args.addr, addrlen, args->addr_ptr);
+ perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, &augmented_args,
+ sizeof(augmented_args) - sizeof(augmented_args.addr) + addrlen);
+ return 0;
+}
+
license(GPL);