diff options
author | Sergei Trofimovich <slyich@gmail.com> | 2022-08-14 09:12:16 +0100 |
---|---|---|
committer | Sergei Trofimovich <slyich@gmail.com> | 2022-08-14 09:17:48 +0100 |
commit | 8940dd0559f0f6a14b4ef174f0a3c7538bbed69e (patch) | |
tree | 3e05b4d6107bd85fb5cf9aa85a116d419508824f /pkgs/os-specific/linux/kernel/perf | |
parent | b20fe0805d898eacea5a6e263a795fec845ba077 (diff) | |
download | nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar.gz nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar.bz2 nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar.lz nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar.xz nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.tar.zst nixpkgs-8940dd0559f0f6a14b4ef174f0a3c7538bbed69e.zip |
linuxPackages.perf: move from perf.nix to perf/ directory
While at it dropped top-level 'with lib;'.
Diffstat (limited to 'pkgs/os-specific/linux/kernel/perf')
-rw-r--r-- | pkgs/os-specific/linux/kernel/perf/5.19-binutils-2.39-support.patch | 352 | ||||
-rw-r--r-- | pkgs/os-specific/linux/kernel/perf/default.nix | 85 |
2 files changed, 437 insertions, 0 deletions
diff --git a/pkgs/os-specific/linux/kernel/perf/5.19-binutils-2.39-support.patch b/pkgs/os-specific/linux/kernel/perf/5.19-binutils-2.39-support.patch new file mode 100644 index 00000000000..5f4f2fc0b4a --- /dev/null +++ b/pkgs/os-specific/linux/kernel/perf/5.19-binutils-2.39-support.patch @@ -0,0 +1,352 @@ +Fetched as: + $ wget 'https://github.com/torvalds/linux/compare/00b32625982e0c796f0abb8effcac9c05ef55bd3...600b7b26c07a070d0153daa76b3806c1e52c9e00.patch' + +Adds support for binutils-2.39 API change around init_disassemble_info(). +--- a/tools/build/Makefile.feature ++++ b/tools/build/Makefile.feature +@@ -70,6 +70,7 @@ FEATURE_TESTS_BASIC := \ + libaio \ + libzstd \ + disassembler-four-args \ ++ disassembler-init-styled \ + file-handle + + # FEATURE_TESTS_BASIC + FEATURE_TESTS_EXTRA is the complete list +--- a/tools/build/feature/Makefile ++++ b/tools/build/feature/Makefile +@@ -18,6 +18,7 @@ FILES= \ + test-libbfd.bin \ + test-libbfd-buildid.bin \ + test-disassembler-four-args.bin \ ++ test-disassembler-init-styled.bin \ + test-reallocarray.bin \ + test-libbfd-liberty.bin \ + test-libbfd-liberty-z.bin \ +@@ -248,6 +249,9 @@ $(OUTPUT)test-libbfd-buildid.bin: + $(OUTPUT)test-disassembler-four-args.bin: + $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes + ++$(OUTPUT)test-disassembler-init-styled.bin: ++ $(BUILD) -DPACKAGE='"perf"' -lbfd -lopcodes ++ + $(OUTPUT)test-reallocarray.bin: + $(BUILD) + +--- a/tools/build/feature/test-all.c ++++ b/tools/build/feature/test-all.c +@@ -166,6 +166,10 @@ + # include "test-disassembler-four-args.c" + #undef main + ++#define main main_test_disassembler_init_styled ++# include "test-disassembler-init-styled.c" ++#undef main ++ + #define main main_test_libzstd + # include "test-libzstd.c" + #undef main +--- /dev/null ++++ b/tools/build/feature/test-disassembler-init-styled.c +@@ -0,0 +1,13 @@ ++// SPDX-License-Identifier: GPL-2.0 ++#include <stdio.h> ++#include <dis-asm.h> ++ ++int main(void) ++{ ++ struct disassemble_info info; ++ ++ init_disassemble_info(&info, stdout, ++ NULL, NULL); ++ ++ return 0; ++} + +--- a/tools/build/Makefile.feature ++++ b/tools/build/Makefile.feature +@@ -135,8 +135,7 @@ FEATURE_DISPLAY ?= \ + get_cpuid \ + bpf \ + libaio \ +- libzstd \ +- disassembler-four-args ++ libzstd + + # Set FEATURE_CHECK_(C|LD)FLAGS-all for all FEATURE_TESTS features. + # If in the future we need per-feature checks/flags for features not + +--- /dev/null ++++ b/tools/include/tools/dis-asm-compat.h +@@ -0,0 +1,55 @@ ++/* SPDX-License-Identifier: GPL-2.0-only OR BSD-2-Clause */ ++#ifndef _TOOLS_DIS_ASM_COMPAT_H ++#define _TOOLS_DIS_ASM_COMPAT_H ++ ++#include <stdio.h> ++#include <dis-asm.h> ++ ++/* define types for older binutils version, to centralize ifdef'ery a bit */ ++#ifndef DISASM_INIT_STYLED ++enum disassembler_style {DISASSEMBLER_STYLE_NOT_EMPTY}; ++typedef int (*fprintf_styled_ftype) (void *, enum disassembler_style, const char*, ...); ++#endif ++ ++/* ++ * Trivial fprintf wrapper to be used as the fprintf_styled_func argument to ++ * init_disassemble_info_compat() when normal fprintf suffices. ++ */ ++static inline int fprintf_styled(void *out, ++ enum disassembler_style style, ++ const char *fmt, ...) ++{ ++ va_list args; ++ int r; ++ ++ (void)style; ++ ++ va_start(args, fmt); ++ r = vfprintf(out, fmt, args); ++ va_end(args); ++ ++ return r; ++} ++ ++/* ++ * Wrapper for init_disassemble_info() that hides version ++ * differences. Depending on binutils version and architecture either ++ * fprintf_func or fprintf_styled_func will be called. ++ */ ++static inline void init_disassemble_info_compat(struct disassemble_info *info, ++ void *stream, ++ fprintf_ftype unstyled_func, ++ fprintf_styled_ftype styled_func) ++{ ++#ifdef DISASM_INIT_STYLED ++ init_disassemble_info(info, stream, ++ unstyled_func, ++ styled_func); ++#else ++ (void)styled_func; ++ init_disassemble_info(info, stream, ++ unstyled_func); ++#endif ++} ++ ++#endif /* _TOOLS_DIS_ASM_COMPAT_H */ + +--- a/tools/perf/Makefile.config ++++ b/tools/perf/Makefile.config +@@ -298,6 +298,7 @@ FEATURE_CHECK_LDFLAGS-libpython := $(PYTHON_EMBED_LDOPTS) + FEATURE_CHECK_LDFLAGS-libaio = -lrt + + FEATURE_CHECK_LDFLAGS-disassembler-four-args = -lbfd -lopcodes -ldl ++FEATURE_CHECK_LDFLAGS-disassembler-init-styled = -lbfd -lopcodes -ldl + + CORE_CFLAGS += -fno-omit-frame-pointer + CORE_CFLAGS += -ggdb3 +@@ -924,13 +925,16 @@ ifndef NO_LIBBFD + ifeq ($(feature-libbfd-liberty), 1) + EXTLIBS += -lbfd -lopcodes -liberty + FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -ldl ++ FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -ldl + else + ifeq ($(feature-libbfd-liberty-z), 1) + EXTLIBS += -lbfd -lopcodes -liberty -lz + FEATURE_CHECK_LDFLAGS-disassembler-four-args += -liberty -lz -ldl ++ FEATURE_CHECK_LDFLAGS-disassembler-init-styled += -liberty -lz -ldl + endif + endif + $(call feature_check,disassembler-four-args) ++ $(call feature_check,disassembler-init-styled) + endif + + ifeq ($(feature-libbfd-buildid), 1) +@@ -1044,6 +1048,10 @@ ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif + ++ifeq ($(feature-disassembler-init-styled), 1) ++ CFLAGS += -DDISASM_INIT_STYLED ++endif ++ + ifeq (${IS_64_BIT}, 1) + ifndef NO_PERF_READ_VDSO32 + $(call feature_check,compile-32) +--- a/tools/perf/util/annotate.c ++++ b/tools/perf/util/annotate.c +@@ -1720,6 +1720,7 @@ static int dso__disassemble_filename(struct dso *dso, char *filename, size_t fil + #include <bpf/btf.h> + #include <bpf/libbpf.h> + #include <linux/btf.h> ++#include <tools/dis-asm-compat.h> + + static int symbol__disassemble_bpf(struct symbol *sym, + struct annotate_args *args) +@@ -1762,9 +1763,9 @@ static int symbol__disassemble_bpf(struct symbol *sym, + ret = errno; + goto out; + } +- init_disassemble_info(&info, s, +- (fprintf_ftype) fprintf); +- ++ init_disassemble_info_compat(&info, s, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + info.arch = bfd_get_arch(bfdf); + info.mach = bfd_get_mach(bfdf); + + +--- a/tools/bpf/Makefile ++++ b/tools/bpf/Makefile +@@ -34,7 +34,7 @@ else + endif + + FEATURE_USER = .bpf +-FEATURE_TESTS = libbfd disassembler-four-args ++FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled + FEATURE_DISPLAY = libbfd disassembler-four-args + + check_feat := 1 +@@ -56,6 +56,9 @@ endif + ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif ++ifeq ($(feature-disassembler-init-styled), 1) ++CFLAGS += -DDISASM_INIT_STYLED ++endif + + $(OUTPUT)%.yacc.c: $(srctree)/tools/bpf/%.y + $(QUIET_BISON)$(YACC) -o $@ -d $< +--- a/tools/bpf/bpf_jit_disasm.c ++++ b/tools/bpf/bpf_jit_disasm.c +@@ -28,6 +28,7 @@ + #include <sys/types.h> + #include <sys/stat.h> + #include <limits.h> ++#include <tools/dis-asm-compat.h> + + #define CMD_ACTION_SIZE_BUFFER 10 + #define CMD_ACTION_READ_ALL 3 +@@ -64,7 +65,9 @@ static void get_asm_insns(uint8_t *image, size_t len, int opcodes) + assert(bfdf); + assert(bfd_check_format(bfdf, bfd_object)); + +- init_disassemble_info(&info, stdout, (fprintf_ftype) fprintf); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + info.arch = bfd_get_arch(bfdf); + info.mach = bfd_get_mach(bfdf); + info.buffer = image; + +--- a/tools/bpf/Makefile ++++ b/tools/bpf/Makefile +@@ -35,7 +35,7 @@ endif + + FEATURE_USER = .bpf + FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled +-FEATURE_DISPLAY = libbfd disassembler-four-args ++FEATURE_DISPLAY = libbfd + + check_feat := 1 + NON_CHECK_FEAT_TARGETS := clean bpftool_clean runqslower_clean resolve_btfids_clean + +--- a/tools/bpf/bpftool/Makefile ++++ b/tools/bpf/bpftool/Makefile +@@ -93,7 +93,7 @@ INSTALL ?= install + RM ?= rm -f + + FEATURE_USER = .bpftool +-FEATURE_TESTS = libbfd disassembler-four-args zlib libcap \ ++FEATURE_TESTS = libbfd disassembler-four-args disassembler-init-styled zlib libcap \ + clang-bpf-co-re + FEATURE_DISPLAY = libbfd disassembler-four-args zlib libcap \ + clang-bpf-co-re +@@ -117,6 +117,9 @@ endif + ifeq ($(feature-disassembler-four-args), 1) + CFLAGS += -DDISASM_FOUR_ARGS_SIGNATURE + endif ++ifeq ($(feature-disassembler-init-styled), 1) ++ CFLAGS += -DDISASM_INIT_STYLED ++endif + + LIBS = $(LIBBPF) -lelf -lz + LIBS_BOOTSTRAP = $(LIBBPF_BOOTSTRAP) -lelf -lz +--- a/tools/bpf/bpftool/jit_disasm.c ++++ b/tools/bpf/bpftool/jit_disasm.c +@@ -24,6 +24,7 @@ + #include <sys/stat.h> + #include <limits.h> + #include <bpf/libbpf.h> ++#include <tools/dis-asm-compat.h> + + #include "json_writer.h" + #include "main.h" +@@ -39,15 +40,12 @@ static void get_exec_path(char *tpath, size_t size) + } + + static int oper_count; +-static int fprintf_json(void *out, const char *fmt, ...) ++static int printf_json(void *out, const char *fmt, va_list ap) + { +- va_list ap; + char *s; + int err; + +- va_start(ap, fmt); + err = vasprintf(&s, fmt, ap); +- va_end(ap); + if (err < 0) + return -1; + +@@ -73,6 +71,32 @@ static int fprintf_json(void *out, const char *fmt, ...) + return 0; + } + ++static int fprintf_json(void *out, const char *fmt, ...) ++{ ++ va_list ap; ++ int r; ++ ++ va_start(ap, fmt); ++ r = printf_json(out, fmt, ap); ++ va_end(ap); ++ ++ return r; ++} ++ ++static int fprintf_json_styled(void *out, ++ enum disassembler_style style __maybe_unused, ++ const char *fmt, ...) ++{ ++ va_list ap; ++ int r; ++ ++ va_start(ap, fmt); ++ r = printf_json(out, fmt, ap); ++ va_end(ap); ++ ++ return r; ++} ++ + void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + const char *arch, const char *disassembler_options, + const struct btf *btf, +@@ -99,11 +123,13 @@ void disasm_print_insn(unsigned char *image, ssize_t len, int opcodes, + assert(bfd_check_format(bfdf, bfd_object)); + + if (json_output) +- init_disassemble_info(&info, stdout, +- (fprintf_ftype) fprintf_json); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf_json, ++ fprintf_json_styled); + else +- init_disassemble_info(&info, stdout, +- (fprintf_ftype) fprintf); ++ init_disassemble_info_compat(&info, stdout, ++ (fprintf_ftype) fprintf, ++ fprintf_styled); + + /* Update architecture info for offload. */ + if (arch) { diff --git a/pkgs/os-specific/linux/kernel/perf/default.nix b/pkgs/os-specific/linux/kernel/perf/default.nix new file mode 100644 index 00000000000..d481eea7e75 --- /dev/null +++ b/pkgs/os-specific/linux/kernel/perf/default.nix @@ -0,0 +1,85 @@ +{ lib, stdenv, fetchpatch, kernel, elfutils, python2, python3, perl, newt, slang, asciidoc, xmlto, makeWrapper +, docbook_xsl, docbook_xml_dtd_45, libxslt, flex, bison, pkg-config, libunwind, binutils-unwrapped +, libiberty, audit, libbfd, libopcodes, openssl, systemtap, numactl +, zlib +, withGtk ? false, gtk2 +, withZstd ? true, zstd +, withLibcap ? true, libcap +}: + +stdenv.mkDerivation { + pname = "perf-linux"; + version = kernel.version; + + inherit (kernel) src; + + patches = lib.optionals (lib.versionAtLeast kernel.version "5.19" && lib.versionOlder kernel.version "5.20") [ + # binutils-2.39 support around init_disassemble_info() + # API change. + # Will be included in 5.20. + ./5.19-binutils-2.39-support.patch + ]; + + preConfigure = '' + cd tools/perf + + substituteInPlace Makefile \ + --replace /usr/include/elfutils $elfutils/include/elfutils + + for x in util/build-id.c util/dso.c; do + substituteInPlace $x --replace /usr/lib/debug /run/current-system/sw/lib/debug + done + + if [ -f bash_completion ]; then + sed -i 's,^have perf,_have perf,' bash_completion + fi + ''; + + makeFlags = ["prefix=$(out)" "WERROR=0"] ++ kernel.makeFlags; + + hardeningDisable = [ "format" ]; + + # perf refers both to newt and slang + nativeBuildInputs = [ + asciidoc xmlto docbook_xsl docbook_xml_dtd_45 libxslt + flex bison libiberty audit makeWrapper pkg-config python3 + ]; + buildInputs = [ + elfutils newt slang libunwind libbfd zlib openssl systemtap.stapBuild numactl + libopcodes python3 perl + ] ++ lib.optional withGtk gtk2 + ++ (if (lib.versionAtLeast kernel.version "4.19") then [ python3 ] else [ python2 ]) + ++ lib.optional withZstd zstd + ++ lib.optional withLibcap libcap; + + NIX_CFLAGS_COMPILE = toString [ + "-Wno-error=cpp" + "-Wno-error=bool-compare" + "-Wno-error=deprecated-declarations" + "-Wno-error=stringop-truncation" + ]; + + postPatch = '' + patchShebangs scripts + ''; + + doCheck = false; # requires "sparse" + doInstallCheck = false; # same + + separateDebugInfo = true; + installFlags = [ "install" "install-man" "ASCIIDOC8=1" "prefix=$(out)" ]; + + preFixup = '' + # pull in 'objdump' into PATH to make annotations work + wrapProgram $out/bin/perf \ + --prefix PATH : "${binutils-unwrapped}/bin" + ''; + + meta = with lib; { + homepage = "https://perf.wiki.kernel.org/"; + description = "Linux tools to profile with performance counters"; + maintainers = with maintainers; [ viric ]; + platforms = platforms.linux; + broken = kernel.kernelOlder "5"; + }; +} |