提交 58a032c3 编写于 作者: M Michael Ellerman 提交者: Benjamin Herrenschmidt

powerpc/perf: Add missing SIER support

Commit 8f61aa32 "Add support for SIER" missed updates to siar_valid()
and perf_get_data_addr().

In both cases we need to check the SIER instead of mmcra.
Signed-off-by: NMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: NBenjamin Herrenschmidt <benh@kernel.crashing.org>
上级 cbda6aa1
...@@ -136,22 +136,30 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs) ...@@ -136,22 +136,30 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs)
* If we're not doing instruction sampling, give them the SDAR * If we're not doing instruction sampling, give them the SDAR
* (sampled data address). If we are doing instruction sampling, then * (sampled data address). If we are doing instruction sampling, then
* only give them the SDAR if it corresponds to the instruction * only give them the SDAR if it corresponds to the instruction
* pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC or * pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC, the
* the [POWER7P_]MMCRA_SDAR_VALID bit in MMCRA. * [POWER7P_]MMCRA_SDAR_VALID bit in MMCRA, or the SDAR_VALID bit in SIER.
*/ */
static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
{ {
unsigned long mmcra = regs->dsisr; unsigned long mmcra = regs->dsisr;
unsigned long sdsync; bool sdar_valid;
if (ppmu->flags & PPMU_SIAR_VALID) if (ppmu->flags & PPMU_HAS_SIER)
sdsync = POWER7P_MMCRA_SDAR_VALID; sdar_valid = regs->dar & SIER_SDAR_VALID;
else if (ppmu->flags & PPMU_ALT_SIPR) else {
sdsync = POWER6_MMCRA_SDSYNC; unsigned long sdsync;
else
sdsync = MMCRA_SDSYNC; if (ppmu->flags & PPMU_SIAR_VALID)
sdsync = POWER7P_MMCRA_SDAR_VALID;
else if (ppmu->flags & PPMU_ALT_SIPR)
sdsync = POWER6_MMCRA_SDSYNC;
else
sdsync = MMCRA_SDSYNC;
if (!(mmcra & MMCRA_SAMPLE_ENABLE) || (mmcra & sdsync)) sdar_valid = mmcra & sdsync;
}
if (!(mmcra & MMCRA_SAMPLE_ENABLE) || sdar_valid)
*addrp = mfspr(SPRN_SDAR); *addrp = mfspr(SPRN_SDAR);
} }
...@@ -290,8 +298,13 @@ static inline int siar_valid(struct pt_regs *regs) ...@@ -290,8 +298,13 @@ static inline int siar_valid(struct pt_regs *regs)
unsigned long mmcra = regs->dsisr; unsigned long mmcra = regs->dsisr;
int marked = mmcra & MMCRA_SAMPLE_ENABLE; int marked = mmcra & MMCRA_SAMPLE_ENABLE;
if ((ppmu->flags & PPMU_SIAR_VALID) && marked) if (marked) {
return mmcra & POWER7P_MMCRA_SIAR_VALID; if (ppmu->flags & PPMU_HAS_SIER)
return regs->dar & SIER_SIAR_VALID;
if (ppmu->flags & PPMU_SIAR_VALID)
return mmcra & POWER7P_MMCRA_SIAR_VALID;
}
return 1; return 1;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册