summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'dev-util')
-rw-r--r--dev-util/perf/files/perf-6.10-bpf-capstone.patch456
-rw-r--r--dev-util/perf/files/perf-6.10-expr.patch22
-rw-r--r--dev-util/perf/files/perf-6.10.3-bpf-capstone.patch455
-rw-r--r--dev-util/perf/files/perf-6.11-bpf-capstone.patch469
4 files changed, 0 insertions, 1402 deletions
diff --git a/dev-util/perf/files/perf-6.10-bpf-capstone.patch b/dev-util/perf/files/perf-6.10-bpf-capstone.patch
deleted file mode 100644
index ebae9a3ad080..000000000000
--- a/dev-util/perf/files/perf-6.10-bpf-capstone.patch
+++ /dev/null
@@ -1,456 +0,0 @@
-From a7728af2f25fe99ee72d211bb4ddec17a8601f5f Mon Sep 17 00:00:00 2001
-From: Guilherme Amadio <amadio@gentoo.org>
-Date: Tue, 6 Aug 2024 11:34:05 +0200
-Subject: [PATCH] Fix bug #936439. Replay of upstream commit onto v6.10.
-
-Signed-off-by: Guilherme Amadio <amadio@gentoo.org>
----
- tools/perf/util/Build | 1 +
- tools/perf/util/disasm.c | 187 +--------------------------------
- tools/perf/util/disasm_bpf.c | 197 +++++++++++++++++++++++++++++++++++
- tools/perf/util/disasm_bpf.h | 12 +++
- 4 files changed, 211 insertions(+), 186 deletions(-)
- create mode 100644 tools/perf/util/disasm_bpf.c
- create mode 100644 tools/perf/util/disasm_bpf.h
-
-diff --git a/tools/perf/util/Build b/tools/perf/util/Build
-index da64efd8718f..384c4e06b838 100644
---- a/tools/perf/util/Build
-+++ b/tools/perf/util/Build
-@@ -13,6 +13,7 @@ perf-y += copyfile.o
- perf-y += ctype.o
- perf-y += db-export.o
- perf-y += disasm.o
-+perf-y += disasm_bpf.o
- perf-y += env.o
- perf-y += event.o
- perf-y += evlist.o
-diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
-index 72aec8f61b94..766cbd005f32 100644
---- a/tools/perf/util/disasm.c
-+++ b/tools/perf/util/disasm.c
-@@ -15,6 +15,7 @@
- #include "build-id.h"
- #include "debug.h"
- #include "disasm.h"
-+#include "disasm_bpf.h"
- #include "dso.h"
- #include "env.h"
- #include "evsel.h"
-@@ -1164,192 +1165,6 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
- return 0;
- }
-
--#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--#define PACKAGE "perf"
--#include <bfd.h>
--#include <dis-asm.h>
--#include <bpf/bpf.h>
--#include <bpf/btf.h>
--#include <bpf/libbpf.h>
--#include <linux/btf.h>
--#include <tools/dis-asm-compat.h>
--
--#include "bpf-event.h"
--#include "bpf-utils.h"
--
--static int symbol__disassemble_bpf(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct bpf_prog_linfo *prog_linfo = NULL;
-- struct bpf_prog_info_node *info_node;
-- int len = sym->end - sym->start;
-- disassembler_ftype disassemble;
-- struct map *map = args->ms.map;
-- struct perf_bpil *info_linear;
-- struct disassemble_info info;
-- struct dso *dso = map__dso(map);
-- int pc = 0, count, sub_id;
-- struct btf *btf = NULL;
-- char tpath[PATH_MAX];
-- size_t buf_size;
-- int nr_skip = 0;
-- char *buf;
-- bfd *bfdf;
-- int ret;
-- FILE *s;
--
-- if (dso->binary_type != DSO_BINARY_TYPE__BPF_PROG_INFO)
-- return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
--
-- pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-- sym->name, sym->start, sym->end - sym->start);
--
-- memset(tpath, 0, sizeof(tpath));
-- perf_exe(tpath, sizeof(tpath));
--
-- bfdf = bfd_openr(tpath, NULL);
-- if (bfdf == NULL)
-- abort();
--
-- if (!bfd_check_format(bfdf, bfd_object))
-- abort();
--
-- s = open_memstream(&buf, &buf_size);
-- if (!s) {
-- ret = errno;
-- goto out;
-- }
-- init_disassemble_info_compat(&info, s,
-- (fprintf_ftype) fprintf,
-- fprintf_styled);
-- info.arch = bfd_get_arch(bfdf);
-- info.mach = bfd_get_mach(bfdf);
--
-- info_node = perf_env__find_bpf_prog_info(dso->bpf_prog.env,
-- dso->bpf_prog.id);
-- if (!info_node) {
-- ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-- goto out;
-- }
-- info_linear = info_node->info_linear;
-- sub_id = dso->bpf_prog.sub_id;
--
-- info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-- info.buffer_length = info_linear->info.jited_prog_len;
--
-- if (info_linear->info.nr_line_info)
-- prog_linfo = bpf_prog_linfo__new(&info_linear->info);
--
-- if (info_linear->info.btf_id) {
-- struct btf_node *node;
--
-- node = perf_env__find_btf(dso->bpf_prog.env,
-- info_linear->info.btf_id);
-- if (node)
-- btf = btf__new((__u8 *)(node->data),
-- node->data_size);
-- }
--
-- disassemble_init_for_target(&info);
--
--#ifdef DISASM_FOUR_ARGS_SIGNATURE
-- disassemble = disassembler(info.arch,
-- bfd_big_endian(bfdf),
-- info.mach,
-- bfdf);
--#else
-- disassemble = disassembler(bfdf);
--#endif
-- if (disassemble == NULL)
-- abort();
--
-- fflush(s);
-- do {
-- const struct bpf_line_info *linfo = NULL;
-- struct disasm_line *dl;
-- size_t prev_buf_size;
-- const char *srcline;
-- u64 addr;
--
-- addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-- count = disassemble(pc, &info);
--
-- if (prog_linfo)
-- linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-- addr, sub_id,
-- nr_skip);
--
-- if (linfo && btf) {
-- srcline = btf__name_by_offset(btf, linfo->line_off);
-- nr_skip++;
-- } else
-- srcline = NULL;
--
-- fprintf(s, "\n");
-- prev_buf_size = buf_size;
-- fflush(s);
--
-- if (!annotate_opts.hide_src_code && srcline) {
-- args->offset = -1;
-- args->line = strdup(srcline);
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl) {
-- annotation_line__add(&dl->al,
-- &notes->src->source);
-- }
-- }
--
-- args->offset = pc;
-- args->line = buf + prev_buf_size;
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- pc += count;
-- } while (count > 0 && pc < len);
--
-- ret = 0;
--out:
-- free(prog_linfo);
-- btf__free(btf);
-- fclose(s);
-- bfd_close(bfdf);
-- return ret;
--}
--#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
-- struct annotate_args *args __maybe_unused)
--{
-- return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
--}
--#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--
--static int
--symbol__disassemble_bpf_image(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct disasm_line *dl;
--
-- args->offset = -1;
-- args->line = strdup("to be implemented");
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- zfree(&args->line);
-- return 0;
--}
--
- #ifdef HAVE_LIBCAPSTONE_SUPPORT
- #include <capstone/capstone.h>
-
-diff --git a/tools/perf/util/disasm_bpf.c b/tools/perf/util/disasm_bpf.c
-new file mode 100644
-index 000000000000..010b961c4ae9
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.c
-@@ -0,0 +1,197 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#include "util/annotate.h"
-+#include "util/disasm_bpf.h"
-+#include "util/symbol.h"
-+#include <linux/zalloc.h>
-+#include <string.h>
-+
-+#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+#define PACKAGE "perf"
-+#include <bfd.h>
-+#include <bpf/bpf.h>
-+#include <bpf/btf.h>
-+#include <bpf/libbpf.h>
-+#include <dis-asm.h>
-+#include <errno.h>
-+#include <linux/btf.h>
-+#include <tools/dis-asm-compat.h>
-+
-+#include "util/bpf-event.h"
-+#include "util/bpf-utils.h"
-+#include "util/debug.h"
-+#include "util/dso.h"
-+#include "util/map.h"
-+#include "util/env.h"
-+#include "util/util.h"
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct bpf_prog_linfo *prog_linfo = NULL;
-+ struct bpf_prog_info_node *info_node;
-+ int len = sym->end - sym->start;
-+ disassembler_ftype disassemble;
-+ struct map *map = args->ms.map;
-+ struct perf_bpil *info_linear;
-+ struct disassemble_info info;
-+ struct dso *dso = map__dso(map);
-+ int pc = 0, count, sub_id;
-+ struct btf *btf = NULL;
-+ char tpath[PATH_MAX];
-+ size_t buf_size;
-+ int nr_skip = 0;
-+ char *buf;
-+ bfd *bfdf;
-+ int ret;
-+ FILE *s;
-+
-+ if (dso->binary_type != DSO_BINARY_TYPE__BPF_PROG_INFO)
-+ return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
-+
-+ pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-+ sym->name, sym->start, sym->end - sym->start);
-+
-+ memset(tpath, 0, sizeof(tpath));
-+ perf_exe(tpath, sizeof(tpath));
-+
-+ bfdf = bfd_openr(tpath, NULL);
-+ if (bfdf == NULL)
-+ abort();
-+
-+ if (!bfd_check_format(bfdf, bfd_object))
-+ abort();
-+
-+ s = open_memstream(&buf, &buf_size);
-+ if (!s) {
-+ ret = errno;
-+ goto out;
-+ }
-+ init_disassemble_info_compat(&info, s,
-+ (fprintf_ftype) fprintf,
-+ fprintf_styled);
-+ info.arch = bfd_get_arch(bfdf);
-+ info.mach = bfd_get_mach(bfdf);
-+
-+ info_node = perf_env__find_bpf_prog_info(dso->bpf_prog.env,
-+ dso->bpf_prog.id);
-+ if (!info_node) {
-+ ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-+ goto out;
-+ }
-+ info_linear = info_node->info_linear;
-+ sub_id = dso->bpf_prog.sub_id;
-+
-+ info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-+ info.buffer_length = info_linear->info.jited_prog_len;
-+
-+ if (info_linear->info.nr_line_info)
-+ prog_linfo = bpf_prog_linfo__new(&info_linear->info);
-+
-+ if (info_linear->info.btf_id) {
-+ struct btf_node *node;
-+
-+ node = perf_env__find_btf(dso->bpf_prog.env,
-+ info_linear->info.btf_id);
-+ if (node)
-+ btf = btf__new((__u8 *)(node->data),
-+ node->data_size);
-+ }
-+
-+ disassemble_init_for_target(&info);
-+
-+#ifdef DISASM_FOUR_ARGS_SIGNATURE
-+ disassemble = disassembler(info.arch,
-+ bfd_big_endian(bfdf),
-+ info.mach,
-+ bfdf);
-+#else
-+ disassemble = disassembler(bfdf);
-+#endif
-+ if (disassemble == NULL)
-+ abort();
-+
-+ fflush(s);
-+ do {
-+ const struct bpf_line_info *linfo = NULL;
-+ struct disasm_line *dl;
-+ size_t prev_buf_size;
-+ const char *srcline;
-+ u64 addr;
-+
-+ addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-+ count = disassemble(pc, &info);
-+
-+ if (prog_linfo)
-+ linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-+ addr, sub_id,
-+ nr_skip);
-+
-+ if (linfo && btf) {
-+ srcline = btf__name_by_offset(btf, linfo->line_off);
-+ nr_skip++;
-+ } else
-+ srcline = NULL;
-+
-+ fprintf(s, "\n");
-+ prev_buf_size = buf_size;
-+ fflush(s);
-+
-+ if (!annotate_opts.hide_src_code && srcline) {
-+ args->offset = -1;
-+ args->line = strdup(srcline);
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl) {
-+ annotation_line__add(&dl->al,
-+ &notes->src->source);
-+ }
-+ }
-+
-+ args->offset = pc;
-+ args->line = buf + prev_buf_size;
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ pc += count;
-+ } while (count > 0 && pc < len);
-+
-+ ret = 0;
-+out:
-+ free(prog_linfo);
-+ btf__free(btf);
-+ fclose(s);
-+ bfd_close(bfdf);
-+ return ret;
-+}
-+#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
-+ struct annotate_args *args __maybe_unused)
-+{
-+ return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
-+}
-+#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+
-+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct disasm_line *dl;
-+
-+ args->offset = -1;
-+ args->line = strdup("to be implemented");
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ zfree(&args->line);
-+ return 0;
-+}
-+
-diff --git a/tools/perf/util/disasm_bpf.h b/tools/perf/util/disasm_bpf.h
-new file mode 100644
-index 000000000000..2ecb19545388
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.h
-@@ -0,0 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#ifndef __PERF_DISASM_BPF_H
-+#define __PERF_DISASM_BPF_H
-+
-+struct symbol;
-+struct annotate_args;
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args);
-+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args);
-+
-+#endif /* __PERF_DISASM_BPF_H */
---
-2.45.2
-
diff --git a/dev-util/perf/files/perf-6.10-expr.patch b/dev-util/perf/files/perf-6.10-expr.patch
deleted file mode 100644
index b4220a062f61..000000000000
--- a/dev-util/perf/files/perf-6.10-expr.patch
+++ /dev/null
@@ -1,22 +0,0 @@
-diff --git a/tools/perf/Makefile.config b/tools/perf/Makefile.config
-index bc980fd..a7f1e1e 100644
---- a/tools/perf/Makefile.config
-+++ b/tools/perf/Makefile.config
-@@ -1184,7 +1184,7 @@ ifneq ($(NO_LIBTRACEEVENT),1)
- CFLAGS += -DHAVE_LIBTRACEEVENT $(LIBTRACEEVENT_CFLAGS)
- LDFLAGS += $(LIBTRACEEVENT_LDFLAGS)
- EXTLIBS += ${TRACEEVENTLIBS}
-- LIBTRACEEVENT_VERSION := $(shell PKG_CONFIG_PATH=$(LIBTRACEEVENT_DIR) $(PKG_CONFIG) --modversion libtraceevent)
-+ LIBTRACEEVENT_VERSION := $(shell PKG_CONFIG_PATH=$(LIBTRACEEVENT_DIR) $(PKG_CONFIG) --modversion libtraceevent).0
- LIBTRACEEVENT_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
- LIBTRACEEVENT_VERSION_2 := $(word 2, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
- LIBTRACEEVENT_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEEVENT_VERSION)))
-@@ -1198,7 +1198,7 @@ ifneq ($(NO_LIBTRACEEVENT),1)
- $(call feature_check,libtracefs)
- ifeq ($(feature-libtracefs), 1)
- EXTLIBS += -ltracefs
-- LIBTRACEFS_VERSION := $(shell $(PKG_CONFIG) --modversion libtracefs)
-+ LIBTRACEFS_VERSION := $(shell $(PKG_CONFIG) --modversion libtracefs).0
- LIBTRACEFS_VERSION_1 := $(word 1, $(subst ., ,$(LIBTRACEFS_VERSION)))
- LIBTRACEFS_VERSION_2 := $(word 2, $(subst ., ,$(LIBTRACEFS_VERSION)))
- LIBTRACEFS_VERSION_3 := $(word 3, $(subst ., ,$(LIBTRACEFS_VERSION)))
diff --git a/dev-util/perf/files/perf-6.10.3-bpf-capstone.patch b/dev-util/perf/files/perf-6.10.3-bpf-capstone.patch
deleted file mode 100644
index 57b298d8ccd7..000000000000
--- a/dev-util/perf/files/perf-6.10.3-bpf-capstone.patch
+++ /dev/null
@@ -1,455 +0,0 @@
-From b382a433e0178d3840a8fb4b05ba3dbecba075fa Mon Sep 17 00:00:00 2001
-From: Guilherme Amadio <amadio@gentoo.org>
-Date: Tue, 6 Aug 2024 11:34:05 +0200
-Subject: [PATCH] Fix bug #936439. Replay of upstream commit onto v6.10.3.
-
-Signed-off-by: Guilherme Amadio <amadio@gentoo.org>
----
- tools/perf/util/Build | 1 +
- tools/perf/util/disasm.c | 187 +--------------------------------
- tools/perf/util/disasm_bpf.c | 196 +++++++++++++++++++++++++++++++++++
- tools/perf/util/disasm_bpf.h | 12 +++
- 4 files changed, 210 insertions(+), 186 deletions(-)
- create mode 100644 tools/perf/util/disasm_bpf.c
- create mode 100644 tools/perf/util/disasm_bpf.h
-
-diff --git a/tools/perf/util/Build b/tools/perf/util/Build
-index da64efd8718f..384c4e06b838 100644
---- a/tools/perf/util/Build
-+++ b/tools/perf/util/Build
-@@ -13,6 +13,7 @@ perf-y += copyfile.o
- perf-y += ctype.o
- perf-y += db-export.o
- perf-y += disasm.o
-+perf-y += disasm_bpf.o
- perf-y += env.o
- perf-y += event.o
- perf-y += evlist.o
-diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
-index e10558b79504..766cbd005f32 100644
---- a/tools/perf/util/disasm.c
-+++ b/tools/perf/util/disasm.c
-@@ -15,6 +15,7 @@
- #include "build-id.h"
- #include "debug.h"
- #include "disasm.h"
-+#include "disasm_bpf.h"
- #include "dso.h"
- #include "env.h"
- #include "evsel.h"
-@@ -1164,192 +1165,6 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
- return 0;
- }
-
--#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--#define PACKAGE "perf"
--#include <bfd.h>
--#include <dis-asm.h>
--#include <bpf/bpf.h>
--#include <bpf/btf.h>
--#include <bpf/libbpf.h>
--#include <linux/btf.h>
--#include <tools/dis-asm-compat.h>
--
--#include "bpf-event.h"
--#include "bpf-utils.h"
--
--static int symbol__disassemble_bpf(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct bpf_prog_linfo *prog_linfo = NULL;
-- struct bpf_prog_info_node *info_node;
-- int len = sym->end - sym->start;
-- disassembler_ftype disassemble;
-- struct map *map = args->ms.map;
-- struct perf_bpil *info_linear;
-- struct disassemble_info info;
-- struct dso *dso = map__dso(map);
-- int pc = 0, count, sub_id;
-- struct btf *btf = NULL;
-- char tpath[PATH_MAX];
-- size_t buf_size;
-- int nr_skip = 0;
-- char *buf;
-- bfd *bfdf;
-- int ret;
-- FILE *s;
--
-- if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
-- return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
--
-- pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-- sym->name, sym->start, sym->end - sym->start);
--
-- memset(tpath, 0, sizeof(tpath));
-- perf_exe(tpath, sizeof(tpath));
--
-- bfdf = bfd_openr(tpath, NULL);
-- if (bfdf == NULL)
-- abort();
--
-- if (!bfd_check_format(bfdf, bfd_object))
-- abort();
--
-- s = open_memstream(&buf, &buf_size);
-- if (!s) {
-- ret = errno;
-- goto out;
-- }
-- init_disassemble_info_compat(&info, s,
-- (fprintf_ftype) fprintf,
-- fprintf_styled);
-- info.arch = bfd_get_arch(bfdf);
-- info.mach = bfd_get_mach(bfdf);
--
-- info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
-- dso__bpf_prog(dso)->id);
-- if (!info_node) {
-- ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-- goto out;
-- }
-- info_linear = info_node->info_linear;
-- sub_id = dso__bpf_prog(dso)->sub_id;
--
-- info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-- info.buffer_length = info_linear->info.jited_prog_len;
--
-- if (info_linear->info.nr_line_info)
-- prog_linfo = bpf_prog_linfo__new(&info_linear->info);
--
-- if (info_linear->info.btf_id) {
-- struct btf_node *node;
--
-- node = perf_env__find_btf(dso__bpf_prog(dso)->env,
-- info_linear->info.btf_id);
-- if (node)
-- btf = btf__new((__u8 *)(node->data),
-- node->data_size);
-- }
--
-- disassemble_init_for_target(&info);
--
--#ifdef DISASM_FOUR_ARGS_SIGNATURE
-- disassemble = disassembler(info.arch,
-- bfd_big_endian(bfdf),
-- info.mach,
-- bfdf);
--#else
-- disassemble = disassembler(bfdf);
--#endif
-- if (disassemble == NULL)
-- abort();
--
-- fflush(s);
-- do {
-- const struct bpf_line_info *linfo = NULL;
-- struct disasm_line *dl;
-- size_t prev_buf_size;
-- const char *srcline;
-- u64 addr;
--
-- addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-- count = disassemble(pc, &info);
--
-- if (prog_linfo)
-- linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-- addr, sub_id,
-- nr_skip);
--
-- if (linfo && btf) {
-- srcline = btf__name_by_offset(btf, linfo->line_off);
-- nr_skip++;
-- } else
-- srcline = NULL;
--
-- fprintf(s, "\n");
-- prev_buf_size = buf_size;
-- fflush(s);
--
-- if (!annotate_opts.hide_src_code && srcline) {
-- args->offset = -1;
-- args->line = strdup(srcline);
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl) {
-- annotation_line__add(&dl->al,
-- &notes->src->source);
-- }
-- }
--
-- args->offset = pc;
-- args->line = buf + prev_buf_size;
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- pc += count;
-- } while (count > 0 && pc < len);
--
-- ret = 0;
--out:
-- free(prog_linfo);
-- btf__free(btf);
-- fclose(s);
-- bfd_close(bfdf);
-- return ret;
--}
--#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
-- struct annotate_args *args __maybe_unused)
--{
-- return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
--}
--#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--
--static int
--symbol__disassemble_bpf_image(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct disasm_line *dl;
--
-- args->offset = -1;
-- args->line = strdup("to be implemented");
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- zfree(&args->line);
-- return 0;
--}
--
- #ifdef HAVE_LIBCAPSTONE_SUPPORT
- #include <capstone/capstone.h>
-
-diff --git a/tools/perf/util/disasm_bpf.c b/tools/perf/util/disasm_bpf.c
-new file mode 100644
-index 000000000000..c76a7d2be1a7
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.c
-@@ -0,0 +1,196 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#include "util/annotate.h"
-+#include "util/disasm_bpf.h"
-+#include "util/symbol.h"
-+#include <linux/zalloc.h>
-+#include <string.h>
-+
-+#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+#define PACKAGE "perf"
-+#include <bfd.h>
-+#include <bpf/bpf.h>
-+#include <bpf/btf.h>
-+#include <bpf/libbpf.h>
-+#include <dis-asm.h>
-+#include <errno.h>
-+#include <linux/btf.h>
-+#include <tools/dis-asm-compat.h>
-+
-+#include "util/bpf-event.h"
-+#include "util/bpf-utils.h"
-+#include "util/debug.h"
-+#include "util/dso.h"
-+#include "util/map.h"
-+#include "util/env.h"
-+#include "util/util.h"
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct bpf_prog_linfo *prog_linfo = NULL;
-+ struct bpf_prog_info_node *info_node;
-+ int len = sym->end - sym->start;
-+ disassembler_ftype disassemble;
-+ struct map *map = args->ms.map;
-+ struct perf_bpil *info_linear;
-+ struct disassemble_info info;
-+ struct dso *dso = map__dso(map);
-+ int pc = 0, count, sub_id;
-+ struct btf *btf = NULL;
-+ char tpath[PATH_MAX];
-+ size_t buf_size;
-+ int nr_skip = 0;
-+ char *buf;
-+ bfd *bfdf;
-+ int ret;
-+ FILE *s;
-+
-+ if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
-+ return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
-+
-+ pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-+ sym->name, sym->start, sym->end - sym->start);
-+
-+ memset(tpath, 0, sizeof(tpath));
-+ perf_exe(tpath, sizeof(tpath));
-+
-+ bfdf = bfd_openr(tpath, NULL);
-+ if (bfdf == NULL)
-+ abort();
-+
-+ if (!bfd_check_format(bfdf, bfd_object))
-+ abort();
-+
-+ s = open_memstream(&buf, &buf_size);
-+ if (!s) {
-+ ret = errno;
-+ goto out;
-+ }
-+ init_disassemble_info_compat(&info, s,
-+ (fprintf_ftype) fprintf,
-+ fprintf_styled);
-+ info.arch = bfd_get_arch(bfdf);
-+ info.mach = bfd_get_mach(bfdf);
-+
-+ info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
-+ dso__bpf_prog(dso)->id);
-+ if (!info_node) {
-+ ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-+ goto out;
-+ }
-+ info_linear = info_node->info_linear;
-+ sub_id = dso__bpf_prog(dso)->sub_id;
-+
-+ info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-+ info.buffer_length = info_linear->info.jited_prog_len;
-+
-+ if (info_linear->info.nr_line_info)
-+ prog_linfo = bpf_prog_linfo__new(&info_linear->info);
-+
-+ if (info_linear->info.btf_id) {
-+ struct btf_node *node;
-+
-+ node = perf_env__find_btf(dso__bpf_prog(dso)->env,
-+ info_linear->info.btf_id);
-+ if (node)
-+ btf = btf__new((__u8 *)(node->data),
-+ node->data_size);
-+ }
-+
-+ disassemble_init_for_target(&info);
-+
-+#ifdef DISASM_FOUR_ARGS_SIGNATURE
-+ disassemble = disassembler(info.arch,
-+ bfd_big_endian(bfdf),
-+ info.mach,
-+ bfdf);
-+#else
-+ disassemble = disassembler(bfdf);
-+#endif
-+ if (disassemble == NULL)
-+ abort();
-+
-+ fflush(s);
-+ do {
-+ const struct bpf_line_info *linfo = NULL;
-+ struct disasm_line *dl;
-+ size_t prev_buf_size;
-+ const char *srcline;
-+ u64 addr;
-+
-+ addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-+ count = disassemble(pc, &info);
-+
-+ if (prog_linfo)
-+ linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-+ addr, sub_id,
-+ nr_skip);
-+
-+ if (linfo && btf) {
-+ srcline = btf__name_by_offset(btf, linfo->line_off);
-+ nr_skip++;
-+ } else
-+ srcline = NULL;
-+
-+ fprintf(s, "\n");
-+ prev_buf_size = buf_size;
-+ fflush(s);
-+
-+ if (!annotate_opts.hide_src_code && srcline) {
-+ args->offset = -1;
-+ args->line = strdup(srcline);
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl) {
-+ annotation_line__add(&dl->al,
-+ &notes->src->source);
-+ }
-+ }
-+
-+ args->offset = pc;
-+ args->line = buf + prev_buf_size;
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ pc += count;
-+ } while (count > 0 && pc < len);
-+
-+ ret = 0;
-+out:
-+ free(prog_linfo);
-+ btf__free(btf);
-+ fclose(s);
-+ bfd_close(bfdf);
-+ return ret;
-+}
-+#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+int symbol__disassemble_bpf(struct symbol *sym __maybe_unused, struct annotate_args *args __maybe_unused)
-+{
-+ return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
-+}
-+#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+
-+int
-+symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct disasm_line *dl;
-+
-+ args->offset = -1;
-+ args->line = strdup("to be implemented");
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ zfree(&args->line);
-+ return 0;
-+}
-diff --git a/tools/perf/util/disasm_bpf.h b/tools/perf/util/disasm_bpf.h
-new file mode 100644
-index 000000000000..2ecb19545388
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.h
-@@ -0,0 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#ifndef __PERF_DISASM_BPF_H
-+#define __PERF_DISASM_BPF_H
-+
-+struct symbol;
-+struct annotate_args;
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args);
-+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args);
-+
-+#endif /* __PERF_DISASM_BPF_H */
---
-2.45.2
-
diff --git a/dev-util/perf/files/perf-6.11-bpf-capstone.patch b/dev-util/perf/files/perf-6.11-bpf-capstone.patch
deleted file mode 100644
index 7d8b376869f3..000000000000
--- a/dev-util/perf/files/perf-6.11-bpf-capstone.patch
+++ /dev/null
@@ -1,469 +0,0 @@
-commit ea59b70a8418a313d6f2ab48a957de015fc33018
-Author: Arnaldo Carvalho de Melo <acme@redhat.com>
-Date: Wed Jul 31 11:58:56 2024 -0300
-
- perf bpf: Move BPF disassembly routines to separate file to avoid clash with capstone bpf headers
-
- There is a clash of the libbpf and capstone libraries, that ends up
- with:
-
- In file included from /usr/include/capstone/capstone.h:325,
- from util/disasm.c:1513:
- /usr/include/capstone/bpf.h:94:14: error: ‘bpf_insn’ defined as wrong kind of tag
- 94 | typedef enum bpf_insn {
-
- So far we're just trying to avoid this by not having both headers
- included in the same .c or .h file, do it one more time by moving the
- BPF diassembly routines from util/disasm.c to util/disasm_bpf.c.
-
- This is only being hit when building with BUILD_NONDISTRO=1, i.e.
- building with binutils-devel, that isn't the in the default build due to
- a licencing clash. We need to reimplement what is now isolated in
- util/disasm_bpf.c using some other library to have BPF annotation
- feature that now only is available with BUILD_NONDISTRO=1.
-
- Fixes: 6d17edc113de1e21 ("perf annotate: Use libcapstone to disassemble")
- Cc: Adrian Hunter <adrian.hunter@intel.com>
- Cc: Ian Rogers <irogers@google.com>
- Cc: Jiri Olsa <jolsa@kernel.org>
- Cc: Kan Liang <kan.liang@linux.intel.com>
- Cc: Namhyung Kim <namhyung@kernel.org>
- Link: https://lore.kernel.org/lkml/ZqpUSKPxMwaQKORr@x1
- Signed-off-by: Arnaldo Carvalho de Melo <acme@redhat.com>
-
-diff --git a/tools/perf/util/Build b/tools/perf/util/Build
-index 0f18fe81ef0b..b24360c04aae 100644
---- a/tools/perf/util/Build
-+++ b/tools/perf/util/Build
-@@ -13,6 +13,7 @@ perf-util-y += copyfile.o
- perf-util-y += ctype.o
- perf-util-y += db-export.o
- perf-util-y += disasm.o
-+perf-util-y += disasm_bpf.o
- perf-util-y += env.o
- perf-util-y += event.o
- perf-util-y += evlist.o
-diff --git a/tools/perf/util/disasm.c b/tools/perf/util/disasm.c
-index 410e52cd9cfd..85fb0cfedf94 100644
---- a/tools/perf/util/disasm.c
-+++ b/tools/perf/util/disasm.c
-@@ -16,6 +16,7 @@
- #include "build-id.h"
- #include "debug.h"
- #include "disasm.h"
-+#include "disasm_bpf.h"
- #include "dso.h"
- #include "env.h"
- #include "evsel.h"
-@@ -1323,192 +1324,6 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil
- return 0;
- }
-
--#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--#define PACKAGE "perf"
--#include <bfd.h>
--#include <dis-asm.h>
--#include <bpf/bpf.h>
--#include <bpf/btf.h>
--#include <bpf/libbpf.h>
--#include <linux/btf.h>
--#include <tools/dis-asm-compat.h>
--
--#include "bpf-event.h"
--#include "bpf-utils.h"
--
--static int symbol__disassemble_bpf(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct bpf_prog_linfo *prog_linfo = NULL;
-- struct bpf_prog_info_node *info_node;
-- int len = sym->end - sym->start;
-- disassembler_ftype disassemble;
-- struct map *map = args->ms.map;
-- struct perf_bpil *info_linear;
-- struct disassemble_info info;
-- struct dso *dso = map__dso(map);
-- int pc = 0, count, sub_id;
-- struct btf *btf = NULL;
-- char tpath[PATH_MAX];
-- size_t buf_size;
-- int nr_skip = 0;
-- char *buf;
-- bfd *bfdf;
-- int ret;
-- FILE *s;
--
-- if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
-- return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
--
-- pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-- sym->name, sym->start, sym->end - sym->start);
--
-- memset(tpath, 0, sizeof(tpath));
-- perf_exe(tpath, sizeof(tpath));
--
-- bfdf = bfd_openr(tpath, NULL);
-- if (bfdf == NULL)
-- abort();
--
-- if (!bfd_check_format(bfdf, bfd_object))
-- abort();
--
-- s = open_memstream(&buf, &buf_size);
-- if (!s) {
-- ret = errno;
-- goto out;
-- }
-- init_disassemble_info_compat(&info, s,
-- (fprintf_ftype) fprintf,
-- fprintf_styled);
-- info.arch = bfd_get_arch(bfdf);
-- info.mach = bfd_get_mach(bfdf);
--
-- info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
-- dso__bpf_prog(dso)->id);
-- if (!info_node) {
-- ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-- goto out;
-- }
-- info_linear = info_node->info_linear;
-- sub_id = dso__bpf_prog(dso)->sub_id;
--
-- info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-- info.buffer_length = info_linear->info.jited_prog_len;
--
-- if (info_linear->info.nr_line_info)
-- prog_linfo = bpf_prog_linfo__new(&info_linear->info);
--
-- if (info_linear->info.btf_id) {
-- struct btf_node *node;
--
-- node = perf_env__find_btf(dso__bpf_prog(dso)->env,
-- info_linear->info.btf_id);
-- if (node)
-- btf = btf__new((__u8 *)(node->data),
-- node->data_size);
-- }
--
-- disassemble_init_for_target(&info);
--
--#ifdef DISASM_FOUR_ARGS_SIGNATURE
-- disassemble = disassembler(info.arch,
-- bfd_big_endian(bfdf),
-- info.mach,
-- bfdf);
--#else
-- disassemble = disassembler(bfdf);
--#endif
-- if (disassemble == NULL)
-- abort();
--
-- fflush(s);
-- do {
-- const struct bpf_line_info *linfo = NULL;
-- struct disasm_line *dl;
-- size_t prev_buf_size;
-- const char *srcline;
-- u64 addr;
--
-- addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-- count = disassemble(pc, &info);
--
-- if (prog_linfo)
-- linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-- addr, sub_id,
-- nr_skip);
--
-- if (linfo && btf) {
-- srcline = btf__name_by_offset(btf, linfo->line_off);
-- nr_skip++;
-- } else
-- srcline = NULL;
--
-- fprintf(s, "\n");
-- prev_buf_size = buf_size;
-- fflush(s);
--
-- if (!annotate_opts.hide_src_code && srcline) {
-- args->offset = -1;
-- args->line = strdup(srcline);
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl) {
-- annotation_line__add(&dl->al,
-- &notes->src->source);
-- }
-- }
--
-- args->offset = pc;
-- args->line = buf + prev_buf_size;
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- args->ms.sym = sym;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- pc += count;
-- } while (count > 0 && pc < len);
--
-- ret = 0;
--out:
-- free(prog_linfo);
-- btf__free(btf);
-- fclose(s);
-- bfd_close(bfdf);
-- return ret;
--}
--#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--static int symbol__disassemble_bpf(struct symbol *sym __maybe_unused,
-- struct annotate_args *args __maybe_unused)
--{
-- return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
--}
--#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
--
--static int
--symbol__disassemble_bpf_image(struct symbol *sym,
-- struct annotate_args *args)
--{
-- struct annotation *notes = symbol__annotation(sym);
-- struct disasm_line *dl;
--
-- args->offset = -1;
-- args->line = strdup("to be implemented");
-- args->line_nr = 0;
-- args->fileloc = NULL;
-- dl = disasm_line__new(args);
-- if (dl)
-- annotation_line__add(&dl->al, &notes->src->source);
--
-- zfree(&args->line);
-- return 0;
--}
--
- #ifdef HAVE_LIBCAPSTONE_SUPPORT
- #include <capstone/capstone.h>
-
-diff --git a/tools/perf/util/disasm_bpf.c b/tools/perf/util/disasm_bpf.c
-new file mode 100644
-index 000000000000..1fee71c79b62
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.c
-@@ -0,0 +1,195 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#include "util/annotate.h"
-+#include "util/disasm_bpf.h"
-+#include "util/symbol.h"
-+#include <linux/zalloc.h>
-+#include <string.h>
-+
-+#if defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+#define PACKAGE "perf"
-+#include <bfd.h>
-+#include <bpf/bpf.h>
-+#include <bpf/btf.h>
-+#include <bpf/libbpf.h>
-+#include <dis-asm.h>
-+#include <errno.h>
-+#include <linux/btf.h>
-+#include <tools/dis-asm-compat.h>
-+
-+#include "util/bpf-event.h"
-+#include "util/bpf-utils.h"
-+#include "util/debug.h"
-+#include "util/dso.h"
-+#include "util/map.h"
-+#include "util/env.h"
-+#include "util/util.h"
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct bpf_prog_linfo *prog_linfo = NULL;
-+ struct bpf_prog_info_node *info_node;
-+ int len = sym->end - sym->start;
-+ disassembler_ftype disassemble;
-+ struct map *map = args->ms.map;
-+ struct perf_bpil *info_linear;
-+ struct disassemble_info info;
-+ struct dso *dso = map__dso(map);
-+ int pc = 0, count, sub_id;
-+ struct btf *btf = NULL;
-+ char tpath[PATH_MAX];
-+ size_t buf_size;
-+ int nr_skip = 0;
-+ char *buf;
-+ bfd *bfdf;
-+ int ret;
-+ FILE *s;
-+
-+ if (dso__binary_type(dso) != DSO_BINARY_TYPE__BPF_PROG_INFO)
-+ return SYMBOL_ANNOTATE_ERRNO__BPF_INVALID_FILE;
-+
-+ pr_debug("%s: handling sym %s addr %" PRIx64 " len %" PRIx64 "\n", __func__,
-+ sym->name, sym->start, sym->end - sym->start);
-+
-+ memset(tpath, 0, sizeof(tpath));
-+ perf_exe(tpath, sizeof(tpath));
-+
-+ bfdf = bfd_openr(tpath, NULL);
-+ if (bfdf == NULL)
-+ abort();
-+
-+ if (!bfd_check_format(bfdf, bfd_object))
-+ abort();
-+
-+ s = open_memstream(&buf, &buf_size);
-+ if (!s) {
-+ ret = errno;
-+ goto out;
-+ }
-+ init_disassemble_info_compat(&info, s,
-+ (fprintf_ftype) fprintf,
-+ fprintf_styled);
-+ info.arch = bfd_get_arch(bfdf);
-+ info.mach = bfd_get_mach(bfdf);
-+
-+ info_node = perf_env__find_bpf_prog_info(dso__bpf_prog(dso)->env,
-+ dso__bpf_prog(dso)->id);
-+ if (!info_node) {
-+ ret = SYMBOL_ANNOTATE_ERRNO__BPF_MISSING_BTF;
-+ goto out;
-+ }
-+ info_linear = info_node->info_linear;
-+ sub_id = dso__bpf_prog(dso)->sub_id;
-+
-+ info.buffer = (void *)(uintptr_t)(info_linear->info.jited_prog_insns);
-+ info.buffer_length = info_linear->info.jited_prog_len;
-+
-+ if (info_linear->info.nr_line_info)
-+ prog_linfo = bpf_prog_linfo__new(&info_linear->info);
-+
-+ if (info_linear->info.btf_id) {
-+ struct btf_node *node;
-+
-+ node = perf_env__find_btf(dso__bpf_prog(dso)->env,
-+ info_linear->info.btf_id);
-+ if (node)
-+ btf = btf__new((__u8 *)(node->data),
-+ node->data_size);
-+ }
-+
-+ disassemble_init_for_target(&info);
-+
-+#ifdef DISASM_FOUR_ARGS_SIGNATURE
-+ disassemble = disassembler(info.arch,
-+ bfd_big_endian(bfdf),
-+ info.mach,
-+ bfdf);
-+#else
-+ disassemble = disassembler(bfdf);
-+#endif
-+ if (disassemble == NULL)
-+ abort();
-+
-+ fflush(s);
-+ do {
-+ const struct bpf_line_info *linfo = NULL;
-+ struct disasm_line *dl;
-+ size_t prev_buf_size;
-+ const char *srcline;
-+ u64 addr;
-+
-+ addr = pc + ((u64 *)(uintptr_t)(info_linear->info.jited_ksyms))[sub_id];
-+ count = disassemble(pc, &info);
-+
-+ if (prog_linfo)
-+ linfo = bpf_prog_linfo__lfind_addr_func(prog_linfo,
-+ addr, sub_id,
-+ nr_skip);
-+
-+ if (linfo && btf) {
-+ srcline = btf__name_by_offset(btf, linfo->line_off);
-+ nr_skip++;
-+ } else
-+ srcline = NULL;
-+
-+ fprintf(s, "\n");
-+ prev_buf_size = buf_size;
-+ fflush(s);
-+
-+ if (!annotate_opts.hide_src_code && srcline) {
-+ args->offset = -1;
-+ args->line = strdup(srcline);
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl) {
-+ annotation_line__add(&dl->al,
-+ &notes->src->source);
-+ }
-+ }
-+
-+ args->offset = pc;
-+ args->line = buf + prev_buf_size;
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ args->ms.sym = sym;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ pc += count;
-+ } while (count > 0 && pc < len);
-+
-+ ret = 0;
-+out:
-+ free(prog_linfo);
-+ btf__free(btf);
-+ fclose(s);
-+ bfd_close(bfdf);
-+ return ret;
-+}
-+#else // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+int symbol__disassemble_bpf(struct symbol *sym __maybe_unused, struct annotate_args *args __maybe_unused)
-+{
-+ return SYMBOL_ANNOTATE_ERRNO__NO_LIBOPCODES_FOR_BPF;
-+}
-+#endif // defined(HAVE_LIBBFD_SUPPORT) && defined(HAVE_LIBBPF_SUPPORT)
-+
-+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args)
-+{
-+ struct annotation *notes = symbol__annotation(sym);
-+ struct disasm_line *dl;
-+
-+ args->offset = -1;
-+ args->line = strdup("to be implemented");
-+ args->line_nr = 0;
-+ args->fileloc = NULL;
-+ dl = disasm_line__new(args);
-+ if (dl)
-+ annotation_line__add(&dl->al, &notes->src->source);
-+
-+ zfree(&args->line);
-+ return 0;
-+}
-diff --git a/tools/perf/util/disasm_bpf.h b/tools/perf/util/disasm_bpf.h
-new file mode 100644
-index 000000000000..2ecb19545388
---- /dev/null
-+++ b/tools/perf/util/disasm_bpf.h
-@@ -0,0 +1,12 @@
-+// SPDX-License-Identifier: GPL-2.0-only
-+
-+#ifndef __PERF_DISASM_BPF_H
-+#define __PERF_DISASM_BPF_H
-+
-+struct symbol;
-+struct annotate_args;
-+
-+int symbol__disassemble_bpf(struct symbol *sym, struct annotate_args *args);
-+int symbol__disassemble_bpf_image(struct symbol *sym, struct annotate_args *args);
-+
-+#endif /* __PERF_DISASM_BPF_H */