Add bpf_object__run_(begin|end) functions to run
BEGIN/END code for specific object.

Link: http://lkml.kernel.org/n/tip-hj1hwb7fshdwco706j22e...@git.kernel.org
Signed-off-by: Jiri Olsa <jo...@kernel.org>
---
 tools/lib/bpf/libbpf.c | 30 ++++++++++++++++++++++++++++++
 tools/lib/bpf/libbpf.h |  4 ++++
 2 files changed, 34 insertions(+)

diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
index 26231e278bb8..f1f999d64d6a 100644
--- a/tools/lib/bpf/libbpf.c
+++ b/tools/lib/bpf/libbpf.c
@@ -45,6 +45,7 @@
 
 #include "libbpf.h"
 #include "bpf.h"
+#include "interp.h"
 
 #ifndef EM_BPF
 #define EM_BPF 247
@@ -2107,3 +2108,32 @@ int bpf_prog_load(const char *file, enum bpf_prog_type 
type,
        *prog_fd = bpf_program__fd(first_prog);
        return 0;
 }
+
+static u64 bpf_program__run(struct bpf_program *prog,
+                           struct bpf_insn *insn,
+                           struct bpf_interp *interp)
+{
+       interp->insns       = prog->insns;
+       interp->insns_cnt   = prog->insns_cnt;
+       interp->insns_start = insn - prog->insns;
+
+       return bpf_interp__run(interp);
+}
+
+u64 bpf_object__run_begin(struct bpf_object *obj, struct bpf_interp *interp)
+{
+       struct bpf_program *prog = obj->text;
+       struct bpf_insn *insn = obj->insn_begin;
+
+       pr_debug("running BEGIN(%p) for %s\n", insn, prog->name);
+       return insn && bpf_program__run(obj->text, insn, interp);
+}
+
+u64 bpf_object__run_end(struct bpf_object *obj, struct bpf_interp *interp)
+{
+       struct bpf_program *prog = obj->text;
+       struct bpf_insn *insn = obj->insn_end;
+
+       pr_debug("running END(%p) for %s\n", insn, prog->name);
+       return insn && bpf_program__run(obj->text, insn, interp);
+}
diff --git a/tools/lib/bpf/libbpf.h b/tools/lib/bpf/libbpf.h
index bfc4d0411ec5..8ac4d4efcc1b 100644
--- a/tools/lib/bpf/libbpf.h
+++ b/tools/lib/bpf/libbpf.h
@@ -96,6 +96,10 @@ struct bpf_program;
 struct bpf_program *bpf_program__next(struct bpf_program *prog,
                                      struct bpf_object *obj);
 
+struct bpf_interp;
+u64 bpf_object__run_begin(struct bpf_object *obj, struct bpf_interp *interp);
+u64 bpf_object__run_end(struct bpf_object *obj, struct bpf_interp *interp);
+
 #define bpf_object__for_each_program(pos, obj)         \
        for ((pos) = bpf_program__next(NULL, (obj));    \
             (pos) != NULL;                             \
-- 
2.13.6

Reply via email to