diff mbox

[3/3] perf tools: Add libdw DWARF post unwind support for ARM

Message ID 1399389979-11279-4-git-send-email-jean.pihet@linaro.org (mailing list archive)
State New, archived
Headers show

Commit Message

Jean Pihet May 6, 2014, 3:26 p.m. UTC
Adding libdw DWARF post unwind support, which is part
of elfutils-devel/libdw-dev package from version 0.158.

The new code is contained in unwin-libdw.c object, and
implements unwind__get_entries unwind interface function.

Signed-off-by: Jean Pihet <jean.pihet@linaro.org>
Cc: Jiri Olsa <jolsa@redhat.com>
Cc: Corey Ashford <cjashfor@linux.vnet.ibm.com>
Cc: Frederic Weisbecker <fweisbec@gmail.com>
Cc: Ingo Molnar <mingo@kernel.org>
Cc: Namhyung Kim <namhyung@kernel.org>
Cc: Paul Mackerras <paulus@samba.org>
Cc: Peter Zijlstra <a.p.zijlstra@chello.nl>
Cc: Arnaldo Carvalho de Melo <acme@infradead.org>
Cc: David Ahern <dsahern@gmail.com>
---
 tools/perf/arch/arm/Makefile            |  5 +++++
 tools/perf/arch/arm/util/unwind-libdw.c | 36 +++++++++++++++++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 tools/perf/arch/arm/util/unwind-libdw.c

Comments

Will Deacon May 6, 2014, 5:56 p.m. UTC | #1
On Tue, May 06, 2014 at 04:26:19PM +0100, Jean Pihet wrote:
> Adding libdw DWARF post unwind support, which is part
> of elfutils-devel/libdw-dev package from version 0.158.
> 
> The new code is contained in unwin-libdw.c object, and
> implements unwind__get_entries unwind interface function.

  Reviewed-by: Will Deacon <will.deacon@arm.com>

Will
Jean Pihet May 7, 2014, 9:52 a.m. UTC | #2
On 6 May 2014 19:56, Will Deacon <will.deacon@arm.com> wrote:
> On Tue, May 06, 2014 at 04:26:19PM +0100, Jean Pihet wrote:
>> Adding libdw DWARF post unwind support, which is part
>> of elfutils-devel/libdw-dev package from version 0.158.
>>
>> The new code is contained in unwin-libdw.c object, and
>> implements unwind__get_entries unwind interface function.
>
>   Reviewed-by: Will Deacon <will.deacon@arm.com>

Ok, thx!

Jiri, Arnaldo,
Can you take the series for ARM and ARM64?

Jean
>
> Will
Will Deacon May 7, 2014, 10 a.m. UTC | #3
On Wed, May 07, 2014 at 10:52:05AM +0100, Jean Pihet wrote:
> On 6 May 2014 19:56, Will Deacon <will.deacon@arm.com> wrote:
> > On Tue, May 06, 2014 at 04:26:19PM +0100, Jean Pihet wrote:
> >> Adding libdw DWARF post unwind support, which is part
> >> of elfutils-devel/libdw-dev package from version 0.158.
> >>
> >> The new code is contained in unwin-libdw.c object, and
> >> implements unwind__get_entries unwind interface function.
> >
> >   Reviewed-by: Will Deacon <will.deacon@arm.com>
> 
> Ok, thx!
> 
> Jiri, Arnaldo,
> Can you take the series for ARM and ARM64?

Wait: I thought you were going to add compat support for arm64? I haven't
acked that patch yet, because it's lacking those changes.

The 32-bit ARM patches look fine though.

Will
Jean Pihet May 7, 2014, 10:14 a.m. UTC | #4
On 7 May 2014 12:00, Will Deacon <will.deacon@arm.com> wrote:
> On Wed, May 07, 2014 at 10:52:05AM +0100, Jean Pihet wrote:
>> On 6 May 2014 19:56, Will Deacon <will.deacon@arm.com> wrote:
>> > On Tue, May 06, 2014 at 04:26:19PM +0100, Jean Pihet wrote:
>> >> Adding libdw DWARF post unwind support, which is part
>> >> of elfutils-devel/libdw-dev package from version 0.158.
>> >>
>> >> The new code is contained in unwin-libdw.c object, and
>> >> implements unwind__get_entries unwind interface function.
>> >
>> >   Reviewed-by: Will Deacon <will.deacon@arm.com>
>>
>> Ok, thx!
>>
>> Jiri, Arnaldo,
>> Can you take the series for ARM and ARM64?
>
> Wait: I thought you were going to add compat support for arm64? I haven't
> acked that patch yet, because it's lacking those changes.
The compat mode is supported by libdw and _should_ work in principle.
I am following it up with Mark Wielaard on elfutils-devel.
Cf. [1] for the discussion and [2] for the compat mode support in libdw.

[1] https://lists.fedorahosted.org/pipermail/elfutils-devel/2014-March/003905.html
[2] https://lists.fedorahosted.org/pipermail/elfutils-devel/2014-March/003910.html

So in summary the kernel changes should be fine (it works ok with
libunwind), the problem lies somewhere in the libdw registers setup
and usage for compat mode.

>
> The 32-bit ARM patches look fine though.
Thx!

>
> Will

Jean
diff mbox

Patch

diff --git a/tools/perf/arch/arm/Makefile b/tools/perf/arch/arm/Makefile
index 221f21d..09d6215 100644
--- a/tools/perf/arch/arm/Makefile
+++ b/tools/perf/arch/arm/Makefile
@@ -4,6 +4,11 @@  LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/dwarf-regs.o
 endif
 ifndef NO_LIBUNWIND
 LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libunwind.o
+endif
+ifndef NO_LIBDW_DWARF_UNWIND
+LIB_OBJS += $(OUTPUT)arch/$(ARCH)/util/unwind-libdw.o
+endif
+ifndef NO_DWARF_UNWIND
 LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/regs_load.o
 LIB_OBJS += $(OUTPUT)arch/$(ARCH)/tests/dwarf-unwind.o
 endif
diff --git a/tools/perf/arch/arm/util/unwind-libdw.c b/tools/perf/arch/arm/util/unwind-libdw.c
new file mode 100644
index 0000000..b4176c6
--- /dev/null
+++ b/tools/perf/arch/arm/util/unwind-libdw.c
@@ -0,0 +1,36 @@ 
+#include <elfutils/libdwfl.h>
+#include "../../util/unwind-libdw.h"
+#include "../../util/perf_regs.h"
+
+bool libdw__arch_set_initial_registers(Dwfl_Thread *thread, void *arg)
+{
+	struct unwind_info *ui = arg;
+	struct regs_dump *user_regs = &ui->sample->user_regs;
+	Dwarf_Word dwarf_regs[PERF_REG_ARM_MAX];
+
+#define REG(r) ({						\
+	Dwarf_Word val = 0;					\
+	perf_reg_value(&val, user_regs, PERF_REG_ARM_##r);	\
+	val;							\
+})
+
+	dwarf_regs[0]  = REG(R0);
+	dwarf_regs[1]  = REG(R1);
+	dwarf_regs[2]  = REG(R2);
+	dwarf_regs[3]  = REG(R3);
+	dwarf_regs[4]  = REG(R4);
+	dwarf_regs[5]  = REG(R5);
+	dwarf_regs[6]  = REG(R6);
+	dwarf_regs[7]  = REG(R7);
+	dwarf_regs[8]  = REG(R8);
+	dwarf_regs[9]  = REG(R9);
+	dwarf_regs[10] = REG(R10);
+	dwarf_regs[11] = REG(FP);
+	dwarf_regs[12] = REG(IP);
+	dwarf_regs[13] = REG(SP);
+	dwarf_regs[14] = REG(LR);
+	dwarf_regs[15] = REG(PC);
+
+	return dwfl_thread_state_registers(thread, 0, PERF_REG_ARM_MAX,
+					   dwarf_regs);
+}