Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 34745aed authored by Yonghong Song's avatar Yonghong Song Committed by Alexei Starovoitov
Browse files

samples/bpf: fix kprobe attachment issue on x64



Commit d5a00528 ("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: d5a00528 ("syscalls/core, syscalls/x86: Rename struct pt_regs-based sys_*() to __x64_sys_*()")
Signed-off-by: default avatarYonghong Song <yhs@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent 7ef37712
Loading
Loading
Loading
Loading
+26 −8
Original line number Diff line number Diff line
@@ -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,6 +161,19 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
		if (isdigit(*event))
			return populate_prog_array(event, fd);

#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);
@@ -167,9 +183,11 @@ static int load_and_attach(const char *event, struct bpf_insn *prog, int size)
				       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) {