powerpc/perf: Use perf_instruction_pointer in callchains
authorAnton Blanchard <anton@samba.org>
Tue, 26 Jun 2012 01:04:20 +0000 (01:04 +0000)
committerBenjamin Herrenschmidt <benh@kernel.crashing.org>
Tue, 10 Jul 2012 09:18:46 +0000 (19:18 +1000)
We use SIAR or regs->nip for the instruction pointer depending on
the PMU configuration, but we always use regs->nip in the callchain.

Use perf_instruction_pointer so the backtrace is consistent.

Signed-off-by: Anton Blanchard <anton@samba.org>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
arch/powerpc/perf/callchain.c

index e8a18d1cc7c92ba51a6187920c3f624db0620038..74d1e780748b58f17f8987218a6184c87aae63da 100644 (file)
@@ -57,7 +57,7 @@ perf_callchain_kernel(struct perf_callchain_entry *entry, struct pt_regs *regs)
 
        lr = regs->link;
        sp = regs->gpr[1];
-       perf_callchain_store(entry, regs->nip);
+       perf_callchain_store(entry, perf_instruction_pointer(regs));
 
        if (!validate_sp(sp, current, STACK_FRAME_OVERHEAD))
                return;
@@ -238,7 +238,7 @@ static void perf_callchain_user_64(struct perf_callchain_entry *entry,
        struct signal_frame_64 __user *sigframe;
        unsigned long __user *fp, *uregs;
 
-       next_ip = regs->nip;
+       next_ip = perf_instruction_pointer(regs);
        lr = regs->link;
        sp = regs->gpr[1];
        perf_callchain_store(entry, next_ip);
@@ -444,7 +444,7 @@ static void perf_callchain_user_32(struct perf_callchain_entry *entry,
        long level = 0;
        unsigned int __user *fp, *uregs;
 
-       next_ip = regs->nip;
+       next_ip = perf_instruction_pointer(regs);
        lr = regs->link;
        sp = regs->gpr[1];
        perf_callchain_store(entry, next_ip);