From b2397a823399be9ae901d02f0073df5001b75c55 Mon Sep 17 00:00:00 2001 From: Samuli Piippo Date: Thu, 12 Feb 2015 14:44:25 +0200 Subject: Performance analysis tools for Linux Build perf with DWARF unwinding support. Kernels older then 3.14 need to be patched to add ARM support. Kernels for tibidabo (3.0) and imx53 (2.6) are too old and would require more patches to be backported, so they are left without unwinding support. RPi needed extra layer to modify the kernel recipe, and linux-imx recipe was renamed so that it doesn't conflict with older tibidabo kernel recipe. Change-Id: Ic8331f8feeace67b32a5ce99ffd3fda517d595d1 Reviewed-by: Andy Nichols Reviewed-by: Ulf Hermann --- conf/bblayers.conf.rpi.sample | 1 + ...RM-perf-add-support-for-perf-registers-API.diff | 128 +++++++++++++++ ...re-up-perf_regs-and-unwind-support-for-AR.patch | 163 +++++++++++++++++++ .../recipes/linux/linux-mainline_3.8.bbappend | 3 + .../recipes/linux/linux-boundary_3.10.17.bbappend | 6 + .../recipes/linux/linux-imx_3.%.bbappend | 35 ----- .../recipes/linux/linux-imx_3.10.%.bbappend | 41 +++++ meta-raspberrypi-extras/conf/layer.conf | 33 ++++ ...re-up-perf_regs-and-unwind-support-for-AR.patch | 171 ++++++++++++++++++++ .../linux/linux-raspberrypi_3.12.26.bbappend | 27 ++++ .../recipes/linux/linux-toradex-fsl_git.bbappend | 6 + ...RM-perf-add-support-for-perf-registers-API.diff | 126 +++++++++++++++ ...re-up-perf_regs-and-unwind-support-for-AR.patch | 172 +++++++++++++++++++++ .../packagegroup-b2qt-embedded-tools.bb | 1 + recipes/perf/perf.bbappend | 2 + 15 files changed, 880 insertions(+), 35 deletions(-) create mode 100644 meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff create mode 100644 meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch delete mode 100644 meta-fsl-extras/recipes/linux/linux-imx_3.%.bbappend create mode 100644 meta-fsl-extras/recipes/linux/linux-imx_3.10.%.bbappend create mode 100644 meta-raspberrypi-extras/conf/layer.conf create mode 100644 meta-raspberrypi-extras/recipes/linux/linux-raspberrypi/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch create mode 100644 meta-raspberrypi-extras/recipes/linux/linux-raspberrypi_3.12.26.bbappend create mode 100644 recipes/linux/linux/ARM-perf-add-support-for-perf-registers-API.diff create mode 100644 recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch create mode 100644 recipes/perf/perf.bbappend diff --git a/conf/bblayers.conf.rpi.sample b/conf/bblayers.conf.rpi.sample index d6bda2e..adc0e68 100644 --- a/conf/bblayers.conf.rpi.sample +++ b/conf/bblayers.conf.rpi.sample @@ -34,6 +34,7 @@ BBLAYERS ?= " \ ${BSPDIR}/sources/meta-raspberrypi \ ${BSPDIR}/sources/meta-openembedded/meta-oe \ ${BSPDIR}/sources/meta-b2qt \ + ${BSPDIR}/sources/meta-b2qt/meta-raspberrypi-extras \ " BBLAYERS_NON_REMOVABLE ?= " \ ${BSPDIR}/sources/poky/meta \ diff --git a/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff new file mode 100644 index 0000000..13b251a --- /dev/null +++ b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-add-support-for-perf-registers-API.diff @@ -0,0 +1,128 @@ +From 8221f36672b7a1336c2bf245c394f0b5453784a1 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Thu, 26 Sep 2013 12:36:35 +0100 +Subject: [PATCH] ARM: perf: add support for perf registers API + +This patch implements the functions required for the perf registers API, +allowing the perf tool to interface kernel register dumps with libunwind +in order to provide userspace backtracing. + +B2Qt: Backported for 3.8 kernel + +Cc: Jean Pihet +Signed-off-by: Will Deacon +--- + arch/arm/Kconfig | 2 ++ + arch/arm/include/uapi/asm/Kbuild | 1 + + arch/arm/include/uapi/asm/perf_regs.h | 23 +++++++++++++++++++++++ + arch/arm/kernel/Makefile | 1 + + arch/arm/kernel/perf_regs.c | 30 ++++++++++++++++++++++++++++++ + 5 files changed, 57 insertions(+) + create mode 100644 arch/arm/include/uapi/asm/perf_regs.h + create mode 100644 arch/arm/kernel/perf_regs.c + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 67874b8..6f630be 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -46,6 +46,8 @@ config ARM + select HAVE_MEMBLOCK + select HAVE_OPROFILE if (HAVE_PERF_EVENTS) + select HAVE_PERF_EVENTS ++ select HAVE_PERF_REGS ++ select HAVE_PERF_USER_STACK_DUMP + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_SYSCALL_TRACEPOINTS + select HAVE_UID16 +diff --git a/arch/arm/include/uapi/asm/Kbuild b/arch/arm/include/uapi/asm/Kbuild +index 47bcb2d..570b82f 100644 +--- a/arch/arm/include/uapi/asm/Kbuild ++++ b/arch/arm/include/uapi/asm/Kbuild +@@ -8,6 +8,7 @@ header-y += hwcap.h + header-y += ioctls.h + header-y += kvm_para.h + header-y += mman.h ++header-y += perf_regs.h + header-y += posix_types.h + header-y += ptrace.h + header-y += setup.h +diff --git a/arch/arm/include/uapi/asm/perf_regs.h b/arch/arm/include/uapi/asm/perf_regs.h +new file mode 100644 +index 0000000..ce59448 +--- /dev/null ++++ b/arch/arm/include/uapi/asm/perf_regs.h +@@ -0,0 +1,23 @@ ++#ifndef _ASM_ARM_PERF_REGS_H ++#define _ASM_ARM_PERF_REGS_H ++ ++enum perf_event_arm_regs { ++ PERF_REG_ARM_R0, ++ PERF_REG_ARM_R1, ++ PERF_REG_ARM_R2, ++ PERF_REG_ARM_R3, ++ PERF_REG_ARM_R4, ++ PERF_REG_ARM_R5, ++ PERF_REG_ARM_R6, ++ PERF_REG_ARM_R7, ++ PERF_REG_ARM_R8, ++ PERF_REG_ARM_R9, ++ PERF_REG_ARM_R10, ++ PERF_REG_ARM_FP, ++ PERF_REG_ARM_IP, ++ PERF_REG_ARM_SP, ++ PERF_REG_ARM_LR, ++ PERF_REG_ARM_PC, ++ PERF_REG_ARM_MAX, ++}; ++#endif /* _ASM_ARM_PERF_REGS_H */ +diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile +index 5bbec7b..c6ab18f 100644 +--- a/arch/arm/kernel/Makefile ++++ b/arch/arm/kernel/Makefile +@@ -69,6 +69,7 @@ obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o + obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o + obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o + obj-$(CONFIG_IWMMXT) += iwmmxt.o ++obj-$(CONFIG_PERF_EVENTS) += perf_regs.o + obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o + AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt + obj-$(CONFIG_ARM_CPU_TOPOLOGY) += topology.o +diff --git a/arch/arm/kernel/perf_regs.c b/arch/arm/kernel/perf_regs.c +new file mode 100644 +index 0000000..6e4379c +--- /dev/null ++++ b/arch/arm/kernel/perf_regs.c +@@ -0,0 +1,30 @@ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++u64 perf_reg_value(struct pt_regs *regs, int idx) ++{ ++ if (WARN_ON_ONCE((u32)idx >= PERF_REG_ARM_MAX)) ++ return 0; ++ ++ return regs->uregs[idx]; ++} ++ ++#define REG_RESERVED (~((1ULL << PERF_REG_ARM_MAX) - 1)) ++ ++int perf_reg_validate(u64 mask) ++{ ++ if (!mask || mask & REG_RESERVED) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++u64 perf_reg_abi(struct task_struct *task) ++{ ++ return PERF_SAMPLE_REGS_ABI_32; ++} +-- +1.9.1 + diff --git a/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch new file mode 100644 index 0000000..e3e8d21 --- /dev/null +++ b/meta-beagleboard-extras/recipes/linux/linux-mainline/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch @@ -0,0 +1,163 @@ +From 26f603c457e0af9f5f6a0ddda66e69978c7f43b4 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Thu, 26 Sep 2013 12:36:36 +0100 +Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM + +This patch hooks in the perf_regs and libunwind code for ARM. + +B2Qt: Backported for 3.8 kernel + +Cc: Jean Pihet +Signed-off-by: Will Deacon +--- + tools/perf/Makefile | 4 +++ + tools/perf/arch/arm/Makefile | 3 ++ + tools/perf/arch/arm/include/perf_regs.h | 54 +++++++++++++++++++++++++++++++++ + tools/perf/arch/arm/util/unwind.c | 48 +++++++++++++++++++++++++++++ + 4 files changed, 109 insertions(+) + create mode 100644 tools/perf/arch/arm/include/perf_regs.h + create mode 100644 tools/perf/arch/arm/util/unwind.c + +diff --git a/tools/perf/Makefile b/tools/perf/Makefile +index fb1b1c4..316c575 100644 +--- a/tools/perf/Makefile ++++ b/tools/perf/Makefile +@@ -84,6 +84,10 @@ ifeq ($(ARCH),x86_64) + NO_PERF_REGS := 0 + LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 + endif ++ifeq ($(ARCH),arm) ++ NO_PERF_REGS := 0 ++ LIBUNWIND_LIBS = -lunwind -lunwind-arm ++endif + + # Treat warnings as errors unless directed not to + ifneq ($(WERROR),0) +diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile +index 15130b5..fe9b61e 100644 +--- a/tools/perf/arch/arm/Makefile ++++ b/tools/perf/arch/arm/Makefile +@@ -2,3 +2,6 @@ ifndef NO_DWARF + PERF_HAVE_DWARF_REGS := 1 + LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o + endif ++ifndef NO_LIBUNWIND ++LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o ++endif +diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h +new file mode 100644 +index 0000000..2a1cfde +--- /dev/null ++++ b/tools/perf/arch/arm/include/perf_regs.h +@@ -0,0 +1,54 @@ ++#ifndef ARCH_PERF_REGS_H ++#define ARCH_PERF_REGS_H ++ ++#include ++#include "../../util/types.h" ++#include ++ ++#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1) ++#define PERF_REG_IP PERF_REG_ARM_PC ++#define PERF_REG_SP PERF_REG_ARM_SP ++ ++static inline const char *perf_reg_name(int id) ++{ ++ switch (id) { ++ case PERF_REG_ARM_R0: ++ return "r0"; ++ case PERF_REG_ARM_R1: ++ return "r1"; ++ case PERF_REG_ARM_R2: ++ return "r2"; ++ case PERF_REG_ARM_R3: ++ return "r3"; ++ case PERF_REG_ARM_R4: ++ return "r4"; ++ case PERF_REG_ARM_R5: ++ return "r5"; ++ case PERF_REG_ARM_R6: ++ return "r6"; ++ case PERF_REG_ARM_R7: ++ return "r7"; ++ case PERF_REG_ARM_R8: ++ return "r8"; ++ case PERF_REG_ARM_R9: ++ return "r9"; ++ case PERF_REG_ARM_R10: ++ return "r10"; ++ case PERF_REG_ARM_FP: ++ return "fp"; ++ case PERF_REG_ARM_IP: ++ return "ip"; ++ case PERF_REG_ARM_SP: ++ return "sp"; ++ case PERF_REG_ARM_LR: ++ return "lr"; ++ case PERF_REG_ARM_PC: ++ return "pc"; ++ default: ++ return NULL; ++ } ++ ++ return NULL; ++} ++ ++#endif /* ARCH_PERF_REGS_H */ +diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c +new file mode 100644 +index 0000000..da3dc95 +--- /dev/null ++++ b/tools/perf/arch/arm/util/unwind.c +@@ -0,0 +1,48 @@ ++ ++#include ++#include ++#include "perf_regs.h" ++#include "../../util/unwind.h" ++ ++int unwind__arch_reg_id(int regnum) ++{ ++ switch (regnum) { ++ case UNW_ARM_R0: ++ return PERF_REG_ARM_R0; ++ case UNW_ARM_R1: ++ return PERF_REG_ARM_R1; ++ case UNW_ARM_R2: ++ return PERF_REG_ARM_R2; ++ case UNW_ARM_R3: ++ return PERF_REG_ARM_R3; ++ case UNW_ARM_R4: ++ return PERF_REG_ARM_R4; ++ case UNW_ARM_R5: ++ return PERF_REG_ARM_R5; ++ case UNW_ARM_R6: ++ return PERF_REG_ARM_R6; ++ case UNW_ARM_R7: ++ return PERF_REG_ARM_R7; ++ case UNW_ARM_R8: ++ return PERF_REG_ARM_R8; ++ case UNW_ARM_R9: ++ return PERF_REG_ARM_R9; ++ case UNW_ARM_R10: ++ return PERF_REG_ARM_R10; ++ case UNW_ARM_R11: ++ return PERF_REG_ARM_FP; ++ case UNW_ARM_R12: ++ return PERF_REG_ARM_IP; ++ case UNW_ARM_R13: ++ return PERF_REG_ARM_SP; ++ case UNW_ARM_R14: ++ return PERF_REG_ARM_LR; ++ case UNW_ARM_R15: ++ return PERF_REG_ARM_PC; ++ default: ++ pr_err("unwind: invalid reg id %d\n", regnum); ++ return -EINVAL; ++ } ++ ++ return -EINVAL; ++} +-- +1.9.1 + diff --git a/meta-beagleboard-extras/recipes/linux/linux-mainline_3.8.bbappend b/meta-beagleboard-extras/recipes/linux/linux-mainline_3.8.bbappend index f91ea8e..54ef15f 100644 --- a/meta-beagleboard-extras/recipes/linux/linux-mainline_3.8.bbappend +++ b/meta-beagleboard-extras/recipes/linux/linux-mainline_3.8.bbappend @@ -1,8 +1,11 @@ + FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:" SRC_URI += "\ file://0001-AM335x-Adding-SGX-DT-node.patch \ file://0002-AM33XX-Invoke-hwmod-deassert-for-SGX-graphics-device.patch \ file://0003-video-da8xx-fb-Add-API-to-register-wait-for-vsync-ca.patch \ + file://ARM-perf-add-support-for-perf-registers-API.diff \ + file://ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch \ " INSANE_SKIP_${PN} = "installed-vs-shipped" diff --git a/meta-fsl-extras/recipes/linux/linux-boundary_3.10.17.bbappend b/meta-fsl-extras/recipes/linux/linux-boundary_3.10.17.bbappend index 415388f..d267b09 100644 --- a/meta-fsl-extras/recipes/linux/linux-boundary_3.10.17.bbappend +++ b/meta-fsl-extras/recipes/linux/linux-boundary_3.10.17.bbappend @@ -20,6 +20,12 @@ ## ############################################################################# +FILESEXTRAPATHS_prepend := "${THISDIR}/../../../recipes/linux/linux:" +SRC_URI += "\ + file://ARM-perf-add-support-for-perf-registers-API.diff \ + file://ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch \ + " + # kernel image files are not needed in the image RDEPENDS_kernel-base = "" diff --git a/meta-fsl-extras/recipes/linux/linux-imx_3.%.bbappend b/meta-fsl-extras/recipes/linux/linux-imx_3.%.bbappend deleted file mode 100644 index d01efb2..0000000 --- a/meta-fsl-extras/recipes/linux/linux-imx_3.%.bbappend +++ /dev/null @@ -1,35 +0,0 @@ -############################################################################# -## -## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). -## -## This file is part of the Qt Enterprise Embedded Scripts of the Qt -## framework. -## -## $QT_BEGIN_LICENSE$ -## Commercial License Usage Only -## Licensees holding valid commercial Qt license agreements with Digia -## with an appropriate addendum covering the Qt Enterprise Embedded Scripts, -## may use this file in accordance with the terms contained in said license -## agreement. -## -## For further information use the contact form at -## http://www.qt.io/contact-us. -## -## -## $QT_END_LICENSE$ -## -############################################################################# - -# kernel image files are not needed in the image -RDEPENDS_kernel-base = "" - -do_configure_prepend() { - # FunctionFS for adb - echo "CONFIG_USB_FUNCTIONFS=m" >> ${WORKDIR}/defconfig - - # Enable USB serial support - echo "CONFIG_USB_SERIAL=m" >> ${WORKDIR}/defconfig - echo "CONFIG_USB_SERIAL_GENERIC=y" >> ${WORKDIR}/defconfig - echo "CONFIG_USB_SERIAL_FTDI_SIO=m" >> ${WORKDIR}/defconfig - echo "CONFIG_USB_SERIAL_PL2303=m" >> ${WORKDIR}/defconfig -} diff --git a/meta-fsl-extras/recipes/linux/linux-imx_3.10.%.bbappend b/meta-fsl-extras/recipes/linux/linux-imx_3.10.%.bbappend new file mode 100644 index 0000000..d6c4db4 --- /dev/null +++ b/meta-fsl-extras/recipes/linux/linux-imx_3.10.%.bbappend @@ -0,0 +1,41 @@ +############################################################################# +## +## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +## +## This file is part of the Qt Enterprise Embedded Scripts of the Qt +## framework. +## +## $QT_BEGIN_LICENSE$ +## Commercial License Usage Only +## Licensees holding valid commercial Qt license agreements with Digia +## with an appropriate addendum covering the Qt Enterprise Embedded Scripts, +## may use this file in accordance with the terms contained in said license +## agreement. +## +## For further information use the contact form at +## http://www.qt.io/contact-us. +## +## +## $QT_END_LICENSE$ +## +############################################################################# + +FILESEXTRAPATHS_prepend := "${THISDIR}/../../../recipes/linux/linux:" +SRC_URI += "\ + file://ARM-perf-add-support-for-perf-registers-API.diff \ + file://ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch \ + " + +# kernel image files are not needed in the image +RDEPENDS_kernel-base = "" + +do_configure_prepend() { + # FunctionFS for adb + echo "CONFIG_USB_FUNCTIONFS=m" >> ${WORKDIR}/defconfig + + # Enable USB serial support + echo "CONFIG_USB_SERIAL=m" >> ${WORKDIR}/defconfig + echo "CONFIG_USB_SERIAL_GENERIC=y" >> ${WORKDIR}/defconfig + echo "CONFIG_USB_SERIAL_FTDI_SIO=m" >> ${WORKDIR}/defconfig + echo "CONFIG_USB_SERIAL_PL2303=m" >> ${WORKDIR}/defconfig +} diff --git a/meta-raspberrypi-extras/conf/layer.conf b/meta-raspberrypi-extras/conf/layer.conf new file mode 100644 index 0000000..0ac91aa --- /dev/null +++ b/meta-raspberrypi-extras/conf/layer.conf @@ -0,0 +1,33 @@ +############################################################################# +## +## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +## +## This file is part of the Qt Enterprise Embedded Scripts of the Qt +## framework. +## +## $QT_BEGIN_LICENSE$ +## Commercial License Usage Only +## Licensees holding valid commercial Qt license agreements with Digia +## with an appropriate addendum covering the Qt Enterprise Embedded Scripts, +## may use this file in accordance with the terms contained in said license +## agreement. +## +## For further information use the contact form at +## http://www.qt.io/contact-us. +## +## +## $QT_END_LICENSE$ +## +############################################################################# + +# We have a conf and classes directory, append to BBPATH +BBPATH .= ":${LAYERDIR}" + +# We have a recipes directory, add to BBFILES +BBFILES += "${LAYERDIR}/recipes*/*/*.bb \ + ${LAYERDIR}/recipes*/*/*.bbappend \ + " + +BBFILE_COLLECTIONS += "b2qt_rpi" +BBFILE_PATTERN_b2qt_rpi := "^${LAYERDIR}/" +BBFILE_PRIORITY_b2qt_rpi = "20" diff --git a/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch b/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch new file mode 100644 index 0000000..4f2a45a --- /dev/null +++ b/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch @@ -0,0 +1,171 @@ +From 7495f3742dda97612a77d92fa62f85cb7591ab14 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Thu, 26 Sep 2013 12:36:36 +0100 +Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM + +This patch hooks in the perf_regs and libunwind code for ARM. + +Cc: Jean Pihet +Signed-off-by: Will Deacon +--- + tools/perf/arch/arm/Makefile | 3 ++ + tools/perf/arch/arm/include/perf_regs.h | 54 +++++++++++++++++++++++++++++++++ + tools/perf/arch/arm/util/unwind.c | 48 +++++++++++++++++++++++++++++ + tools/perf/config/Makefile | 7 +++-- + 4 files changed, 110 insertions(+), 2 deletions(-) + create mode 100644 tools/perf/arch/arm/include/perf_regs.h + create mode 100644 tools/perf/arch/arm/util/unwind.c + +diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile +index 15130b5..fe9b61e 100644 +--- a/tools/perf/arch/arm/Makefile ++++ b/tools/perf/arch/arm/Makefile +@@ -2,3 +2,6 @@ ifndef NO_DWARF + PERF_HAVE_DWARF_REGS := 1 + LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o + endif ++ifndef NO_LIBUNWIND ++LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o ++endif +diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h +new file mode 100644 +index 0000000..2a1cfde +--- /dev/null ++++ b/tools/perf/arch/arm/include/perf_regs.h +@@ -0,0 +1,54 @@ ++#ifndef ARCH_PERF_REGS_H ++#define ARCH_PERF_REGS_H ++ ++#include ++#include "../../util/types.h" ++#include ++ ++#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1) ++#define PERF_REG_IP PERF_REG_ARM_PC ++#define PERF_REG_SP PERF_REG_ARM_SP ++ ++static inline const char *perf_reg_name(int id) ++{ ++ switch (id) { ++ case PERF_REG_ARM_R0: ++ return "r0"; ++ case PERF_REG_ARM_R1: ++ return "r1"; ++ case PERF_REG_ARM_R2: ++ return "r2"; ++ case PERF_REG_ARM_R3: ++ return "r3"; ++ case PERF_REG_ARM_R4: ++ return "r4"; ++ case PERF_REG_ARM_R5: ++ return "r5"; ++ case PERF_REG_ARM_R6: ++ return "r6"; ++ case PERF_REG_ARM_R7: ++ return "r7"; ++ case PERF_REG_ARM_R8: ++ return "r8"; ++ case PERF_REG_ARM_R9: ++ return "r9"; ++ case PERF_REG_ARM_R10: ++ return "r10"; ++ case PERF_REG_ARM_FP: ++ return "fp"; ++ case PERF_REG_ARM_IP: ++ return "ip"; ++ case PERF_REG_ARM_SP: ++ return "sp"; ++ case PERF_REG_ARM_LR: ++ return "lr"; ++ case PERF_REG_ARM_PC: ++ return "pc"; ++ default: ++ return NULL; ++ } ++ ++ return NULL; ++} ++ ++#endif /* ARCH_PERF_REGS_H */ +diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c +new file mode 100644 +index 0000000..da3dc95 +--- /dev/null ++++ b/tools/perf/arch/arm/util/unwind.c +@@ -0,0 +1,48 @@ ++ ++#include ++#include ++#include "perf_regs.h" ++#include "../../util/unwind.h" ++ ++int unwind__arch_reg_id(int regnum) ++{ ++ switch (regnum) { ++ case UNW_ARM_R0: ++ return PERF_REG_ARM_R0; ++ case UNW_ARM_R1: ++ return PERF_REG_ARM_R1; ++ case UNW_ARM_R2: ++ return PERF_REG_ARM_R2; ++ case UNW_ARM_R3: ++ return PERF_REG_ARM_R3; ++ case UNW_ARM_R4: ++ return PERF_REG_ARM_R4; ++ case UNW_ARM_R5: ++ return PERF_REG_ARM_R5; ++ case UNW_ARM_R6: ++ return PERF_REG_ARM_R6; ++ case UNW_ARM_R7: ++ return PERF_REG_ARM_R7; ++ case UNW_ARM_R8: ++ return PERF_REG_ARM_R8; ++ case UNW_ARM_R9: ++ return PERF_REG_ARM_R9; ++ case UNW_ARM_R10: ++ return PERF_REG_ARM_R10; ++ case UNW_ARM_R11: ++ return PERF_REG_ARM_FP; ++ case UNW_ARM_R12: ++ return PERF_REG_ARM_IP; ++ case UNW_ARM_R13: ++ return PERF_REG_ARM_SP; ++ case UNW_ARM_R14: ++ return PERF_REG_ARM_LR; ++ case UNW_ARM_R15: ++ return PERF_REG_ARM_PC; ++ default: ++ pr_err("unwind: invalid reg id %d\n", regnum); ++ return -EINVAL; ++ } ++ ++ return -EINVAL; ++} +diff --git a/tools/perf/config/Makefile b/tools/perf/config/Makefile +index 5f6f9b3..4796ce5 100644 +--- a/tools/perf/config/Makefile ++++ b/tools/perf/config/Makefile +@@ -29,6 +29,10 @@ ifeq ($(ARCH),x86_64) + NO_PERF_REGS := 0 + LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 + endif ++ifeq ($(ARCH),arm) ++ NO_PERF_REGS := 0 ++ LIBUNWIND_LIBS = -lunwind -lunwind-arm ++endif + + ifeq ($(NO_PERF_REGS),0) + CFLAGS += -DHAVE_PERF_REGS +@@ -208,8 +212,7 @@ ifeq ($(call try-cc,$(SOURCE_ELF_MMAP),$(FLAGS_LIBELF),-DLIBELF_MMAP),y) + endif # try-cc + endif # NO_LIBELF + +-# There's only x86 (both 32 and 64) support for CFI unwind so far +-ifneq ($(ARCH),x86) ++ifeq ($(LIBUNWIND_LIBS),) + NO_LIBUNWIND := 1 + endif + +-- +1.9.1 + diff --git a/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi_3.12.26.bbappend b/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi_3.12.26.bbappend new file mode 100644 index 0000000..94b2ab1 --- /dev/null +++ b/meta-raspberrypi-extras/recipes/linux/linux-raspberrypi_3.12.26.bbappend @@ -0,0 +1,27 @@ +############################################################################# +## +## Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies). +## +## This file is part of the Qt Enterprise Embedded Scripts of the Qt +## framework. +## +## $QT_BEGIN_LICENSE$ +## Commercial License Usage Only +## Licensees holding valid commercial Qt license agreements with Digia +## with an appropriate addendum covering the Qt Enterprise Embedded Scripts, +## may use this file in accordance with the terms contained in said license +## agreement. +## +## For further information use the contact form at +## http://www.qt.io/contact-us. +## +## +## $QT_END_LICENSE$ +## +############################################################################# + +FILESEXTRAPATHS_prepend := "${THISDIR}/${PN}:${THISDIR}/../../../recipes/linux/linux:" +SRC_URI += "\ + file://ARM-perf-add-support-for-perf-registers-API.diff \ + file://ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch \ + " diff --git a/meta-toradex-extras/recipes/linux/linux-toradex-fsl_git.bbappend b/meta-toradex-extras/recipes/linux/linux-toradex-fsl_git.bbappend index f054071..68cdfc2 100644 --- a/meta-toradex-extras/recipes/linux/linux-toradex-fsl_git.bbappend +++ b/meta-toradex-extras/recipes/linux/linux-toradex-fsl_git.bbappend @@ -20,6 +20,12 @@ ## ############################################################################# +FILESEXTRAPATHS_prepend := "${THISDIR}/../../../recipes/linux/linux:" +SRC_URI += "\ + file://ARM-perf-add-support-for-perf-registers-API.diff \ + file://ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch \ + " + # kernel image files are not needed in the image RDEPENDS_kernel-base = "" diff --git a/recipes/linux/linux/ARM-perf-add-support-for-perf-registers-API.diff b/recipes/linux/linux/ARM-perf-add-support-for-perf-registers-API.diff new file mode 100644 index 0000000..e6f44fd --- /dev/null +++ b/recipes/linux/linux/ARM-perf-add-support-for-perf-registers-API.diff @@ -0,0 +1,126 @@ +From 49863894db3ed7bd41541b1c17733273966cea71 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Thu, 26 Sep 2013 12:36:35 +0100 +Subject: [PATCH] ARM: perf: add support for perf registers API + +This patch implements the functions required for the perf registers API, +allowing the perf tool to interface kernel register dumps with libunwind +in order to provide userspace backtracing. + +Cc: Jean Pihet +Signed-off-by: Will Deacon +--- + arch/arm/Kconfig | 2 ++ + arch/arm/include/uapi/asm/Kbuild | 1 + + arch/arm/include/uapi/asm/perf_regs.h | 23 +++++++++++++++++++++++ + arch/arm/kernel/Makefile | 1 + + arch/arm/kernel/perf_regs.c | 30 ++++++++++++++++++++++++++++++ + 5 files changed, 57 insertions(+) + create mode 100644 arch/arm/include/uapi/asm/perf_regs.h + create mode 100644 arch/arm/kernel/perf_regs.c + +diff --git a/arch/arm/Kconfig b/arch/arm/Kconfig +index 1ad6fb6..899d0c6 100644 +--- a/arch/arm/Kconfig ++++ b/arch/arm/Kconfig +@@ -51,6 +51,8 @@ config ARM + select HAVE_MOD_ARCH_SPECIFIC if ARM_UNWIND + select HAVE_OPROFILE if (HAVE_PERF_EVENTS) + select HAVE_PERF_EVENTS ++ select HAVE_PERF_REGS ++ select HAVE_PERF_USER_STACK_DUMP + select HAVE_REGS_AND_STACK_ACCESS_API + select HAVE_SYSCALL_TRACEPOINTS + select HAVE_UID16 +diff --git a/arch/arm/include/uapi/asm/Kbuild b/arch/arm/include/uapi/asm/Kbuild +index 18d76fd..70a1c9d 100644 +--- a/arch/arm/include/uapi/asm/Kbuild ++++ b/arch/arm/include/uapi/asm/Kbuild +@@ -7,6 +7,7 @@ header-y += hwcap.h + header-y += ioctls.h + header-y += kvm_para.h + header-y += mman.h ++header-y += perf_regs.h + header-y += posix_types.h + header-y += ptrace.h + header-y += setup.h +diff --git a/arch/arm/include/uapi/asm/perf_regs.h b/arch/arm/include/uapi/asm/perf_regs.h +new file mode 100644 +index 0000000..ce59448 +--- /dev/null ++++ b/arch/arm/include/uapi/asm/perf_regs.h +@@ -0,0 +1,23 @@ ++#ifndef _ASM_ARM_PERF_REGS_H ++#define _ASM_ARM_PERF_REGS_H ++ ++enum perf_event_arm_regs { ++ PERF_REG_ARM_R0, ++ PERF_REG_ARM_R1, ++ PERF_REG_ARM_R2, ++ PERF_REG_ARM_R3, ++ PERF_REG_ARM_R4, ++ PERF_REG_ARM_R5, ++ PERF_REG_ARM_R6, ++ PERF_REG_ARM_R7, ++ PERF_REG_ARM_R8, ++ PERF_REG_ARM_R9, ++ PERF_REG_ARM_R10, ++ PERF_REG_ARM_FP, ++ PERF_REG_ARM_IP, ++ PERF_REG_ARM_SP, ++ PERF_REG_ARM_LR, ++ PERF_REG_ARM_PC, ++ PERF_REG_ARM_MAX, ++}; ++#endif /* _ASM_ARM_PERF_REGS_H */ +diff --git a/arch/arm/kernel/Makefile b/arch/arm/kernel/Makefile +index 5140df5f..9b818ca 100644 +--- a/arch/arm/kernel/Makefile ++++ b/arch/arm/kernel/Makefile +@@ -78,6 +78,7 @@ obj-$(CONFIG_CPU_XSC3) += xscale-cp0.o + obj-$(CONFIG_CPU_MOHAWK) += xscale-cp0.o + obj-$(CONFIG_CPU_PJ4) += pj4-cp0.o + obj-$(CONFIG_IWMMXT) += iwmmxt.o ++obj-$(CONFIG_PERF_EVENTS) += perf_regs.o + obj-$(CONFIG_HW_PERF_EVENTS) += perf_event.o perf_event_cpu.o + AFLAGS_iwmmxt.o := -Wa,-mcpu=iwmmxt + obj-$(CONFIG_ARM_CPU_TOPOLOGY) += topology.o +diff --git a/arch/arm/kernel/perf_regs.c b/arch/arm/kernel/perf_regs.c +new file mode 100644 +index 0000000..6e4379c +--- /dev/null ++++ b/arch/arm/kernel/perf_regs.c +@@ -0,0 +1,30 @@ ++ ++#include ++#include ++#include ++#include ++#include ++#include ++ ++u64 perf_reg_value(struct pt_regs *regs, int idx) ++{ ++ if (WARN_ON_ONCE((u32)idx >= PERF_REG_ARM_MAX)) ++ return 0; ++ ++ return regs->uregs[idx]; ++} ++ ++#define REG_RESERVED (~((1ULL << PERF_REG_ARM_MAX) - 1)) ++ ++int perf_reg_validate(u64 mask) ++{ ++ if (!mask || mask & REG_RESERVED) ++ return -EINVAL; ++ ++ return 0; ++} ++ ++u64 perf_reg_abi(struct task_struct *task) ++{ ++ return PERF_SAMPLE_REGS_ABI_32; ++} +-- +1.9.1 + diff --git a/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch b/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch new file mode 100644 index 0000000..1e497c6 --- /dev/null +++ b/recipes/linux/linux/ARM-perf-wire-up-perf_regs-and-unwind-support-for-AR.patch @@ -0,0 +1,172 @@ +From 8abd7519c1fd2b6ae35eddbb41f93f44d3886000 Mon Sep 17 00:00:00 2001 +From: Will Deacon +Date: Thu, 26 Sep 2013 12:36:36 +0100 +Subject: [PATCH] ARM: perf: wire up perf_regs and unwind support for ARM + +This patch hooks in the perf_regs and libunwind code for ARM. + +B2Qt: Backported for 3.10 kernel + +Cc: Jean Pihet +Signed-off-by: Will Deacon +--- + tools/perf/Makefile | 6 +++- + tools/perf/arch/arm/Makefile | 3 ++ + tools/perf/arch/arm/include/perf_regs.h | 54 +++++++++++++++++++++++++++++++++ + tools/perf/arch/arm/util/unwind.c | 48 +++++++++++++++++++++++++++++ + 4 files changed, 110 insertions(+), 1 deletion(-) + create mode 100644 tools/perf/arch/arm/include/perf_regs.h + create mode 100644 tools/perf/arch/arm/util/unwind.c + +diff --git a/tools/perf/Makefile b/tools/perf/Makefile +index b0f164b..f8fdad5 100644 +--- a/tools/perf/Makefile ++++ b/tools/perf/Makefile +@@ -87,6 +87,10 @@ ifeq ($(ARCH),x86_64) + NO_PERF_REGS := 0 + LIBUNWIND_LIBS = -lunwind -lunwind-x86_64 + endif ++ifeq ($(ARCH),arm) ++ NO_PERF_REGS := 0 ++ LIBUNWIND_LIBS = -lunwind -lunwind-arm ++endif + + # Treat warnings as errors unless directed not to + ifneq ($(WERROR),0) +@@ -607,7 +611,7 @@ endif # SOURCE_LIBELF + endif # NO_LIBELF + + # There's only x86 (both 32 and 64) support for CFI unwind so far +-ifneq ($(ARCH),x86) ++ifeq ($(LIBUNWIND_LIBS),) + NO_LIBUNWIND := 1 + endif + +diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile +index 15130b5..fe9b61e 100644 +--- a/tools/perf/arch/arm/Makefile ++++ b/tools/perf/arch/arm/Makefile +@@ -2,3 +2,6 @@ ifndef NO_DWARF + PERF_HAVE_DWARF_REGS := 1 + LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o + endif ++ifndef NO_LIBUNWIND ++LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind.o ++endif +diff --git a/tools/perf/arch/arm/include/perf_regs.h b/tools/perf/arch/arm/include/perf_regs.h +new file mode 100644 +index 0000000..2a1cfde +--- /dev/null ++++ b/tools/perf/arch/arm/include/perf_regs.h +@@ -0,0 +1,54 @@ ++#ifndef ARCH_PERF_REGS_H ++#define ARCH_PERF_REGS_H ++ ++#include ++#include "../../util/types.h" ++#include ++ ++#define PERF_REGS_MASK ((1ULL << PERF_REG_ARM_MAX) - 1) ++#define PERF_REG_IP PERF_REG_ARM_PC ++#define PERF_REG_SP PERF_REG_ARM_SP ++ ++static inline const char *perf_reg_name(int id) ++{ ++ switch (id) { ++ case PERF_REG_ARM_R0: ++ return "r0"; ++ case PERF_REG_ARM_R1: ++ return "r1"; ++ case PERF_REG_ARM_R2: ++ return "r2"; ++ case PERF_REG_ARM_R3: ++ return "r3"; ++ case PERF_REG_ARM_R4: ++ return "r4"; ++ case PERF_REG_ARM_R5: ++ return "r5"; ++ case PERF_REG_ARM_R6: ++ return "r6"; ++ case PERF_REG_ARM_R7: ++ return "r7"; ++ case PERF_REG_ARM_R8: ++ return "r8"; ++ case PERF_REG_ARM_R9: ++ return "r9"; ++ case PERF_REG_ARM_R10: ++ return "r10"; ++ case PERF_REG_ARM_FP: ++ return "fp"; ++ case PERF_REG_ARM_IP: ++ return "ip"; ++ case PERF_REG_ARM_SP: ++ return "sp"; ++ case PERF_REG_ARM_LR: ++ return "lr"; ++ case PERF_REG_ARM_PC: ++ return "pc"; ++ default: ++ return NULL; ++ } ++ ++ return NULL; ++} ++ ++#endif /* ARCH_PERF_REGS_H */ +diff --git a/tools/perf/arch/arm/util/unwind.c b/tools/perf/arch/arm/util/unwind.c +new file mode 100644 +index 0000000..da3dc95 +--- /dev/null ++++ b/tools/perf/arch/arm/util/unwind.c +@@ -0,0 +1,48 @@ ++ ++#include ++#include ++#include "perf_regs.h" ++#include "../../util/unwind.h" ++ ++int unwind__arch_reg_id(int regnum) ++{ ++ switch (regnum) { ++ case UNW_ARM_R0: ++ return PERF_REG_ARM_R0; ++ case UNW_ARM_R1: ++ return PERF_REG_ARM_R1; ++ case UNW_ARM_R2: ++ return PERF_REG_ARM_R2; ++ case UNW_ARM_R3: ++ return PERF_REG_ARM_R3; ++ case UNW_ARM_R4: ++ return PERF_REG_ARM_R4; ++ case UNW_ARM_R5: ++ return PERF_REG_ARM_R5; ++ case UNW_ARM_R6: ++ return PERF_REG_ARM_R6; ++ case UNW_ARM_R7: ++ return PERF_REG_ARM_R7; ++ case UNW_ARM_R8: ++ return PERF_REG_ARM_R8; ++ case UNW_ARM_R9: ++ return PERF_REG_ARM_R9; ++ case UNW_ARM_R10: ++ return PERF_REG_ARM_R10; ++ case UNW_ARM_R11: ++ return PERF_REG_ARM_FP; ++ case UNW_ARM_R12: ++ return PERF_REG_ARM_IP; ++ case UNW_ARM_R13: ++ return PERF_REG_ARM_SP; ++ case UNW_ARM_R14: ++ return PERF_REG_ARM_LR; ++ case UNW_ARM_R15: ++ return PERF_REG_ARM_PC; ++ default: ++ pr_err("unwind: invalid reg id %d\n", regnum); ++ return -EINVAL; ++ } ++ ++ return -EINVAL; ++} +-- +1.9.1 + diff --git a/recipes/packagegroup/packagegroup-b2qt-embedded-tools.bb b/recipes/packagegroup/packagegroup-b2qt-embedded-tools.bb index bce34ab..abd2d66 100644 --- a/recipes/packagegroup/packagegroup-b2qt-embedded-tools.bb +++ b/recipes/packagegroup/packagegroup-b2qt-embedded-tools.bb @@ -31,4 +31,5 @@ RDEPENDS_${PN} = "\ binutils \ binutils-symlinks \ i2c-tools \ + perf \ " diff --git a/recipes/perf/perf.bbappend b/recipes/perf/perf.bbappend new file mode 100644 index 0000000..1eec18d --- /dev/null +++ b/recipes/perf/perf.bbappend @@ -0,0 +1,2 @@ +PERF_FEATURES_ENABLE = "perf-libunwind" +EXTRA_OEMAKE_remove = "NO_DWARF=1" -- cgit v1.2.3-54-g00ecf