powerpc/perf: Add missing SIER support
Commit 8f61aa3
"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: Michael Ellerman <michael@ellerman.id.au>
Signed-off-by: Benjamin Herrenschmidt <benh@kernel.crashing.org>
This commit is contained in:
parent
cbda6aa10b
commit
58a032c3b1
|
@ -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
|
||||
* (sampled data address). If we are doing instruction sampling, then
|
||||
* only give them the SDAR if it corresponds to the instruction
|
||||
* pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC or
|
||||
* the [POWER7P_]MMCRA_SDAR_VALID bit in MMCRA.
|
||||
* pointed to by SIAR; this is indicated by the [POWER6_]MMCRA_SDSYNC, the
|
||||
* [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)
|
||||
{
|
||||
unsigned long mmcra = regs->dsisr;
|
||||
unsigned long sdsync;
|
||||
bool sdar_valid;
|
||||
|
||||
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 (ppmu->flags & PPMU_HAS_SIER)
|
||||
sdar_valid = regs->dar & SIER_SDAR_VALID;
|
||||
else {
|
||||
unsigned long sdsync;
|
||||
|
||||
if (!(mmcra & MMCRA_SAMPLE_ENABLE) || (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;
|
||||
|
||||
sdar_valid = mmcra & sdsync;
|
||||
}
|
||||
|
||||
if (!(mmcra & MMCRA_SAMPLE_ENABLE) || sdar_valid)
|
||||
*addrp = mfspr(SPRN_SDAR);
|
||||
}
|
||||
|
||||
|
@ -290,8 +298,13 @@ static inline int siar_valid(struct pt_regs *regs)
|
|||
unsigned long mmcra = regs->dsisr;
|
||||
int marked = mmcra & MMCRA_SAMPLE_ENABLE;
|
||||
|
||||
if ((ppmu->flags & PPMU_SIAR_VALID) && marked)
|
||||
return mmcra & POWER7P_MMCRA_SIAR_VALID;
|
||||
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 1;
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue