samples/bpf: fix kprobe attachment issue on x64
authorYonghong Song <yhs@fb.com>
Mon, 30 Apr 2018 02:27:48 +0000 (19:27 -0700)
committerAlexei Starovoitov <ast@kernel.org>
Mon, 30 Apr 2018 03:36:53 +0000 (20:36 -0700)
Commit d5a00528b58c ("syscalls/core, syscalls/x86: Rename
struct pt_regs-based sys_*() to __x64_sys_*()") renamed a lot
of syscall function sys_*() to __x64_sys_*().
This caused several kprobe based samples/bpf tests failing.

This patch fixed the problem in bpf_load.c.
For x86_64 architecture, function name __x64_sys_*() will be
first used for kprobe event creation. If the creation is successful,
it will be used. Otherwise, function name sys_*() will be used
for kprobe event creation.

Fixes: d5a00528b58c ("syscalls/core, syscalls/x86: Rename struct pt_regs-based sys_*() to __x64_sys_*()")
Signed-off-by: Yonghong Song <yhs@fb.com>
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
samples/bpf/bpf_load.c

index a27ef3c..da9bccf 100644 (file)
@@ -145,6 +145,9 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
        }
 
        if (is_kprobe || is_kretprobe) {
+               bool need_normal_check = true;
+               const char *event_prefix = "";
+
                if (is_kprobe)
                        event += 7;
                else
@@ -158,18 +161,33 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
                if (isdigit(*event))
                        return populate_prog_array(event, fd);
 
-               snprintf(buf, sizeof(buf),
-                        "echo '%c:%s %s' >> /sys/kernel/debug/tracing/kprobe_events",
-                        is_kprobe ? 'p' : 'r', event, event);
-               err = system(buf);
-               if (err < 0) {
-                       printf("failed to create kprobe '%s' error '%s'\n",
-                              event, strerror(errno));
-                       return -1;
+#ifdef __x86_64__
+               if (strncmp(event, "sys_", 4) == 0) {
+                       snprintf(buf, sizeof(buf),
+                                "echo '%c:__x64_%s __x64_%s' >> /sys/kernel/debug/tracing/kprobe_events",
+                                is_kprobe ? 'p' : 'r', event, event);
+                       err = system(buf);
+                       if (err >= 0) {
+                               need_normal_check = false;
+                               event_prefix = "__x64_";
+                       }
+               }
+#endif
+               if (need_normal_check) {
+                       snprintf(buf, sizeof(buf),
+                                "echo '%c:%s %s' >> /sys/kernel/debug/tracing/kprobe_events",
+                                is_kprobe ? 'p' : 'r', event, event);
+                       err = system(buf);
+                       if (err < 0) {
+                               printf("failed to create kprobe '%s' error '%s'\n",
+                                      event, strerror(errno));
+                               return -1;
+                       }
                }
 
                strcpy(buf, DEBUGFS);
                strcat(buf, "events/kprobes/");
+               strcat(buf, event_prefix);
                strcat(buf, event);
                strcat(buf, "/id");
        } else if (is_tracepoint) {