Skip to content

Commit

Permalink
powerpc/perf: Use regs->nip when SIAR is zero
Browse files Browse the repository at this point in the history
In power10 DD1, there is an issue where the SIAR (Sampled Instruction
Address Register) is not latching to the sampled address during random
sampling. This results in value of 0s in the SIAR. Add a check to use
regs->nip when SIAR is zero.

Signed-off-by: Madhavan Srinivasan <maddy@linux.ibm.com>
Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
Link: https://lore.kernel.org/r/20201021085329.384535-5-maddy@linux.ibm.com
  • Loading branch information
maddy-kerneldev authored and mpe committed Nov 19, 2020
1 parent d9f7088 commit 2ca13a4
Showing 1 changed file with 17 additions and 4 deletions.
21 changes: 17 additions & 4 deletions arch/powerpc/perf/core-book3s.c
Original file line number Diff line number Diff line change
Expand Up @@ -263,9 +263,16 @@ static inline u32 perf_get_misc_flags(struct pt_regs *regs)
* DD1.
*/
if (marked && (ppmu->flags & PPMU_P10_DD1)) {
if (is_kernel_addr(mfspr(SPRN_SIAR)))
return PERF_RECORD_MISC_KERNEL;
return PERF_RECORD_MISC_USER;
unsigned long siar = mfspr(SPRN_SIAR);
if (siar) {
if (is_kernel_addr(siar))
return PERF_RECORD_MISC_KERNEL;
return PERF_RECORD_MISC_USER;
} else {
if (is_kernel_addr(regs->nip))
return PERF_RECORD_MISC_KERNEL;
return PERF_RECORD_MISC_USER;
}
}

/*
Expand Down Expand Up @@ -2199,8 +2206,14 @@ unsigned long perf_misc_flags(struct pt_regs *regs)
unsigned long perf_instruction_pointer(struct pt_regs *regs)
{
bool use_siar = regs_use_siar(regs);
unsigned long siar = mfspr(SPRN_SIAR);

if (use_siar && siar_valid(regs))
if (ppmu->flags & PPMU_P10_DD1) {
if (siar)
return siar;
else
return regs->nip;
} else if (use_siar && siar_valid(regs))
return mfspr(SPRN_SIAR) + perf_ip_adjust(regs);
else if (use_siar)
return 0; // no valid instruction pointer
Expand Down

0 comments on commit 2ca13a4

Please sign in to comment.