From f11ff90d616bfdbe4de3bf0670890d86cf84b694 Mon Sep 17 00:00:00 2001 From: Jesper Dangaard Brouer Date: Mon, 31 May 2021 18:57:50 +0200 Subject: [PATCH] ktrace-CO-RE: Add trivial BPF-prog Signed-off-by: Jesper Dangaard Brouer --- ktrace-CO-RE/ktrace01.c | 80 ++++++++++++++++++++++++++++++++++++ ktrace-CO-RE/ktrace01_kern.c | 24 +++++++++++ 2 files changed, 104 insertions(+) create mode 100644 ktrace-CO-RE/ktrace01.c create mode 100644 ktrace-CO-RE/ktrace01_kern.c diff --git a/ktrace-CO-RE/ktrace01.c b/ktrace-CO-RE/ktrace01.c new file mode 100644 index 0000000..ad455e9 --- /dev/null +++ b/ktrace-CO-RE/ktrace01.c @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0+ +// static const char *__doc__ = " Trivial ktrace example"; + +#include +#include +#include + +#include + +#define pr_err(fmt, ...) \ + fprintf(stderr, "%s:%d - " fmt, __FILE__, __LINE__, ##__VA_ARGS__) + +int main(int argc, char **argv) +{ + struct bpf_object *obj = NULL; + struct bpf_link *link = NULL; + struct bpf_program *prog; + char filename[256]; + //char pin_file[256]; + // char *pin_file; + char buf[100]; + int err; + int c; + + snprintf(filename, sizeof(filename), "%s_kern.o", argv[0]); + + obj = bpf_object__open_file(filename, NULL); + err = libbpf_get_error(obj); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + pr_err("Error(%d) opening file: %s\n", err, buf); + goto out; + } + + err = bpf_object__load(obj); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + pr_err("Error(%d) loading: %s\n", err, buf); + goto out; + } + + prog = bpf_program__next(NULL, obj); + if (!prog) { + pr_err("No program!\n"); + err = -ENOENT; + goto out; + } + + link = bpf_program__attach(prog); + err = libbpf_get_error(link); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + pr_err("Error(%d) attaching: %s\n", err, buf); + goto out; + } + + printf("Loaded BPF file %s\n", filename); + printf( "Press any key + enter to unload program again [Y/y]:"); + c = getchar(); + putchar(c); + + // snprintf(pin_file, sizeof(pin_file), "/sys/fs/bpf/%s", argv[0]); + /* + pin_file = "/sys/fs/bpf/ktrace01"; + err = bpf_link__pin(link, pin_file); + printf("pin_file %s\n", pin_file); + if (err) { + libbpf_strerror(err, buf, sizeof(buf)); + pr_err("Error(%d) pinning: %s\n", err, buf); + goto out; + } + printf("Loaded BPF file %s (pinned at %s)\n", filename, pin_file); + */ +out: + bpf_link__destroy(link); + bpf_object__close(obj); + if (err) + return EXIT_FAILURE; + return EXIT_SUCCESS; +} diff --git a/ktrace-CO-RE/ktrace01_kern.c b/ktrace-CO-RE/ktrace01_kern.c new file mode 100644 index 0000000..4ddaf70 --- /dev/null +++ b/ktrace-CO-RE/ktrace01_kern.c @@ -0,0 +1,24 @@ +/* SPDX-License-Identifier: GPL-2.0+ */ +#include +#include + +char _license[] SEC("license") = "GPL"; + +struct my_struct { + int v; + __u64 m2; +}; + +SEC("kprobe/open_ctree") +int bpf_prog1(struct pt_regs *ctx) +{ + unsigned long rc = 0; + struct my_struct a; + + //a.v = 42; + + // bpf_override_return(ctx, rc); + if (a.v == 43) + return 0; + return a.v; +}