forked from mirrors/linux
		
	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
					
				
					 7 changed files with 23 additions and 1 deletions
				
			
		| 
						 | 
					@ -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 a new issue