public inbox for gentoo-commits@lists.gentoo.org
 help / color / mirror / Atom feed
From: "Guilherme Amadio" <amadio@gentoo.org>
To: gentoo-commits@lists.gentoo.org
Subject: [gentoo-commits] repo/gentoo:master commit in: dev-util/perf/, dev-util/perf/files/
Date: Tue,  6 Aug 2024 12:08:20 +0000 (UTC)	[thread overview]
Message-ID: <1722945367.c9e99b12374290bce0b623136ea017c694ee1b31.amadio@gentoo> (raw)

commit:     c9e99b12374290bce0b623136ea017c694ee1b31
Author:     Guilherme Amadio <amadio <AT> gentoo <DOT> org>
AuthorDate: Tue Aug  6 11:56:07 2024 +0000
Commit:     Guilherme Amadio <amadio <AT> gentoo <DOT> org>
CommitDate: Tue Aug  6 11:56:07 2024 +0000
URL:        https://gitweb.gentoo.org/repo/gentoo.git/commit/?id=c9e99b12

dev-util/perf: fix bug #936439

Closes: https://bugs.gentoo.org/936439
Link: https://lore.kernel.org/linux-kernel/ZqpUSKPxMwaQKORr@x1/

Signed-off-by: Guilherme Amadio <amadio <AT> gentoo.org>

 dev-util/perf/files/perf-6.10.3-bpf-capstone.patch | 455 +++++++++++++++++++++
 dev-util/perf/perf-6.10.3.ebuild                   |   1 +
 2 files changed, 456 insertions(+)

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
new file mode 100644
index 000000000000..57b298d8ccd7
--- /dev/null
+++ b/dev-util/perf/files/perf-6.10.3-bpf-capstone.patch
@@ -0,0 +1,455 @@
+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/perf-6.10.3.ebuild b/dev-util/perf/perf-6.10.3.ebuild
index 0f0e90117809..4c50de412173 100644
--- a/dev-util/perf/perf-6.10.3.ebuild
+++ b/dev-util/perf/perf-6.10.3.ebuild
@@ -180,6 +180,7 @@ src_prepare() {
 	pushd "${S_K}" >/dev/null || die
 	eapply "${FILESDIR}"/perf-6.4-libtracefs.patch
 	eapply "${FILESDIR}"/perf-6.10-expr.patch
+	eapply "${FILESDIR}"/perf-6.10.3-bpf-capstone.patch
 	popd || die
 
 	# Drop some upstream too-developer-oriented flags and fix the


             reply	other threads:[~2024-08-06 12:08 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-08-06 12:08 Guilherme Amadio [this message]
  -- strict thread matches above, loose matches on Subject: below --
2024-10-04 15:07 [gentoo-commits] repo/gentoo:master commit in: dev-util/perf/, dev-util/perf/files/ Guilherme Amadio
2024-07-19 12:37 Yixun Lan
2024-02-22  0:38 Yixun Lan
2024-01-30 15:25 Guilherme Amadio
2022-10-20  8:44 Guilherme Amadio
2022-05-23 15:21 Guilherme Amadio
2022-04-07 10:14 Guilherme Amadio
2019-12-27  2:56 Naohiro Aota
2019-07-02 21:26 Naohiro Aota
2015-08-16 13:25 Naohiro Aota

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1722945367.c9e99b12374290bce0b623136ea017c694ee1b31.amadio@gentoo \
    --to=amadio@gentoo.org \
    --cc=gentoo-commits@lists.gentoo.org \
    --cc=gentoo-dev@lists.gentoo.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox