mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git
synced 2025-01-04 04:02:26 +00:00
powerpc/perf: Update perf_regs structure to include SIER
On each sample, Sample Instruction Event Register (SIER) content is saved in pt_regs. SIER does not have a entry as-is in the pt_regs but instead, SIER content is saved in the "dar" register of pt_regs. Patch adds another entry to the perf_regs structure to include the "SIER" printing which internally maps to the "dar" of pt_regs. It also check for the SIER availability in the platform and present value accordingly Signed-off-by: Madhavan Srinivasan <maddy@linux.vnet.ibm.com> Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
This commit is contained in:
parent
17cfccc915
commit
333804dc3b
@ -39,4 +39,7 @@
|
|||||||
(regs)->gpr[1] = current_stack_pointer(); \
|
(regs)->gpr[1] = current_stack_pointer(); \
|
||||||
asm volatile("mfmsr %0" : "=r" ((regs)->msr)); \
|
asm volatile("mfmsr %0" : "=r" ((regs)->msr)); \
|
||||||
} while (0)
|
} while (0)
|
||||||
|
|
||||||
|
/* To support perf_regs sier update */
|
||||||
|
extern bool is_sier_available(void);
|
||||||
#endif
|
#endif
|
||||||
|
@ -46,6 +46,7 @@ enum perf_event_powerpc_regs {
|
|||||||
PERF_REG_POWERPC_TRAP,
|
PERF_REG_POWERPC_TRAP,
|
||||||
PERF_REG_POWERPC_DAR,
|
PERF_REG_POWERPC_DAR,
|
||||||
PERF_REG_POWERPC_DSISR,
|
PERF_REG_POWERPC_DSISR,
|
||||||
|
PERF_REG_POWERPC_SIER,
|
||||||
PERF_REG_POWERPC_MAX,
|
PERF_REG_POWERPC_MAX,
|
||||||
};
|
};
|
||||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||||
|
@ -130,6 +130,14 @@ static inline void power_pmu_bhrb_read(struct cpu_hw_events *cpuhw) {}
|
|||||||
static void pmao_restore_workaround(bool ebb) { }
|
static void pmao_restore_workaround(bool ebb) { }
|
||||||
#endif /* CONFIG_PPC32 */
|
#endif /* CONFIG_PPC32 */
|
||||||
|
|
||||||
|
bool is_sier_available(void)
|
||||||
|
{
|
||||||
|
if (ppmu->flags & PPMU_HAS_SIER)
|
||||||
|
return true;
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
static bool regs_use_siar(struct pt_regs *regs)
|
static bool regs_use_siar(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
|
@ -69,6 +69,7 @@ static unsigned int pt_regs_offset[PERF_REG_POWERPC_MAX] = {
|
|||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_TRAP, trap),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_TRAP, trap),
|
||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_DAR, dar),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_DAR, dar),
|
||||||
PT_REGS_OFFSET(PERF_REG_POWERPC_DSISR, dsisr),
|
PT_REGS_OFFSET(PERF_REG_POWERPC_DSISR, dsisr),
|
||||||
|
PT_REGS_OFFSET(PERF_REG_POWERPC_SIER, dar),
|
||||||
};
|
};
|
||||||
|
|
||||||
u64 perf_reg_value(struct pt_regs *regs, int idx)
|
u64 perf_reg_value(struct pt_regs *regs, int idx)
|
||||||
@ -76,6 +77,12 @@ u64 perf_reg_value(struct pt_regs *regs, int idx)
|
|||||||
if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX))
|
if (WARN_ON_ONCE(idx >= PERF_REG_POWERPC_MAX))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
if (idx == PERF_REG_POWERPC_SIER &&
|
||||||
|
(IS_ENABLED(CONFIG_FSL_EMB_PERF_EVENT) ||
|
||||||
|
IS_ENABLED(CONFIG_PPC32) ||
|
||||||
|
!is_sier_available()))
|
||||||
|
return 0;
|
||||||
|
|
||||||
return regs_get_register(regs, pt_regs_offset[idx]);
|
return regs_get_register(regs, pt_regs_offset[idx]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -46,6 +46,7 @@ enum perf_event_powerpc_regs {
|
|||||||
PERF_REG_POWERPC_TRAP,
|
PERF_REG_POWERPC_TRAP,
|
||||||
PERF_REG_POWERPC_DAR,
|
PERF_REG_POWERPC_DAR,
|
||||||
PERF_REG_POWERPC_DSISR,
|
PERF_REG_POWERPC_DSISR,
|
||||||
|
PERF_REG_POWERPC_SIER,
|
||||||
PERF_REG_POWERPC_MAX,
|
PERF_REG_POWERPC_MAX,
|
||||||
};
|
};
|
||||||
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
#endif /* _UAPI_ASM_POWERPC_PERF_REGS_H */
|
||||||
|
@ -62,7 +62,8 @@ static const char *reg_names[] = {
|
|||||||
[PERF_REG_POWERPC_SOFTE] = "softe",
|
[PERF_REG_POWERPC_SOFTE] = "softe",
|
||||||
[PERF_REG_POWERPC_TRAP] = "trap",
|
[PERF_REG_POWERPC_TRAP] = "trap",
|
||||||
[PERF_REG_POWERPC_DAR] = "dar",
|
[PERF_REG_POWERPC_DAR] = "dar",
|
||||||
[PERF_REG_POWERPC_DSISR] = "dsisr"
|
[PERF_REG_POWERPC_DSISR] = "dsisr",
|
||||||
|
[PERF_REG_POWERPC_SIER] = "sier"
|
||||||
};
|
};
|
||||||
|
|
||||||
static inline const char *perf_reg_name(int id)
|
static inline const char *perf_reg_name(int id)
|
||||||
|
@ -52,6 +52,7 @@ const struct sample_reg sample_reg_masks[] = {
|
|||||||
SMPL_REG(trap, PERF_REG_POWERPC_TRAP),
|
SMPL_REG(trap, PERF_REG_POWERPC_TRAP),
|
||||||
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
SMPL_REG(dar, PERF_REG_POWERPC_DAR),
|
||||||
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
SMPL_REG(dsisr, PERF_REG_POWERPC_DSISR),
|
||||||
|
SMPL_REG(sier, PERF_REG_POWERPC_SIER),
|
||||||
SMPL_REG_END
|
SMPL_REG_END
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user