Commit 58a032c3 authored by Michael Ellerman's avatar Michael Ellerman Committed by 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: default avatarMichael Ellerman <michael@ellerman.id.au>
Signed-off-by: default avatarBenjamin Herrenschmidt <benh@kernel.crashing.org>
parent cbda6aa1
...@@ -136,12 +136,17 @@ static inline unsigned long perf_ip_adjust(struct pt_regs *regs) ...@@ -136,12 +136,17 @@ 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;
bool sdar_valid;
if (ppmu->flags & PPMU_HAS_SIER)
sdar_valid = regs->dar & SIER_SDAR_VALID;
else {
unsigned long sdsync; unsigned long sdsync;
if (ppmu->flags & PPMU_SIAR_VALID) if (ppmu->flags & PPMU_SIAR_VALID)
...@@ -151,7 +156,10 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp) ...@@ -151,7 +156,10 @@ static inline void perf_get_data_addr(struct pt_regs *regs, u64 *addrp)
else else
sdsync = MMCRA_SDSYNC; 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) {
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 mmcra & POWER7P_MMCRA_SIAR_VALID;
}
return 1; return 1;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment