xref: /linux/arch/powerpc/include/asm/emulated_ops.h (revision 2b72c9e3)
1*2b72c9e3SThomas Gleixner /* SPDX-License-Identifier: GPL-2.0-only */
280947e7cSGeert Uytterhoeven /*
380947e7cSGeert Uytterhoeven  *  Copyright 2007 Sony Corporation
480947e7cSGeert Uytterhoeven  */
580947e7cSGeert Uytterhoeven 
680947e7cSGeert Uytterhoeven #ifndef _ASM_POWERPC_EMULATED_OPS_H
780947e7cSGeert Uytterhoeven #define _ASM_POWERPC_EMULATED_OPS_H
880947e7cSGeert Uytterhoeven 
960063497SArun Sharma #include <linux/atomic.h>
10196f02bfSAnton Blanchard #include <linux/perf_event.h>
1180947e7cSGeert Uytterhoeven 
1280947e7cSGeert Uytterhoeven 
1380947e7cSGeert Uytterhoeven #ifdef CONFIG_PPC_EMULATED_STATS
1480947e7cSGeert Uytterhoeven 
1580947e7cSGeert Uytterhoeven struct ppc_emulated_entry {
1680947e7cSGeert Uytterhoeven 	const char *name;
1780947e7cSGeert Uytterhoeven 	atomic_t val;
1880947e7cSGeert Uytterhoeven };
1980947e7cSGeert Uytterhoeven 
2080947e7cSGeert Uytterhoeven extern struct ppc_emulated {
2180947e7cSGeert Uytterhoeven #ifdef CONFIG_ALTIVEC
2280947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry altivec;
2380947e7cSGeert Uytterhoeven #endif
2480947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry dcba;
2580947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry dcbz;
2680947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry fp_pair;
2780947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry isel;
2880947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry mcrxr;
2980947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry mfpvr;
3080947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry multiple;
3180947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry popcntb;
3280947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry spe;
3380947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry string;
34a3821b2aSScott Wood 	struct ppc_emulated_entry sync;
3580947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry unaligned;
3680947e7cSGeert Uytterhoeven #ifdef CONFIG_MATH_EMULATION
3780947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry math;
3880947e7cSGeert Uytterhoeven #endif
3980947e7cSGeert Uytterhoeven #ifdef CONFIG_VSX
4080947e7cSGeert Uytterhoeven 	struct ppc_emulated_entry vsx;
4180947e7cSGeert Uytterhoeven #endif
42efcac658SAlexey Kardashevskiy #ifdef CONFIG_PPC64
43efcac658SAlexey Kardashevskiy 	struct ppc_emulated_entry mfdscr;
44efcac658SAlexey Kardashevskiy 	struct ppc_emulated_entry mtdscr;
45f83319d7SAnton Blanchard 	struct ppc_emulated_entry lq_stq;
465080332cSMichael Neuling 	struct ppc_emulated_entry lxvw4x;
475080332cSMichael Neuling 	struct ppc_emulated_entry lxvh8x;
485080332cSMichael Neuling 	struct ppc_emulated_entry lxvd2x;
495080332cSMichael Neuling 	struct ppc_emulated_entry lxvb16x;
50efcac658SAlexey Kardashevskiy #endif
5180947e7cSGeert Uytterhoeven } ppc_emulated;
5280947e7cSGeert Uytterhoeven 
5380947e7cSGeert Uytterhoeven extern u32 ppc_warn_emulated;
5480947e7cSGeert Uytterhoeven 
5580947e7cSGeert Uytterhoeven extern void ppc_warn_emulated_print(const char *type);
5680947e7cSGeert Uytterhoeven 
57eecff81dSAnton Blanchard #define __PPC_WARN_EMULATED(type)					 \
5880947e7cSGeert Uytterhoeven 	do {								 \
5980947e7cSGeert Uytterhoeven 		atomic_inc(&ppc_emulated.type.val);			 \
6080947e7cSGeert Uytterhoeven 		if (ppc_warn_emulated)					 \
6180947e7cSGeert Uytterhoeven 			ppc_warn_emulated_print(ppc_emulated.type.name); \
6280947e7cSGeert Uytterhoeven 	} while (0)
6380947e7cSGeert Uytterhoeven 
6480947e7cSGeert Uytterhoeven #else /* !CONFIG_PPC_EMULATED_STATS */
6580947e7cSGeert Uytterhoeven 
66eecff81dSAnton Blanchard #define __PPC_WARN_EMULATED(type)	do { } while (0)
6780947e7cSGeert Uytterhoeven 
6880947e7cSGeert Uytterhoeven #endif /* !CONFIG_PPC_EMULATED_STATS */
6980947e7cSGeert Uytterhoeven 
70196f02bfSAnton Blanchard #define PPC_WARN_EMULATED(type, regs)					\
71196f02bfSAnton Blanchard 	do {								\
72196f02bfSAnton Blanchard 		perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,		\
73a8b0ca17SPeter Zijlstra 			1, regs, 0);					\
74196f02bfSAnton Blanchard 		__PPC_WARN_EMULATED(type);				\
75196f02bfSAnton Blanchard 	} while (0)
76196f02bfSAnton Blanchard 
77196f02bfSAnton Blanchard #define PPC_WARN_ALIGNMENT(type, regs)					\
78196f02bfSAnton Blanchard 	do {								\
79196f02bfSAnton Blanchard 		perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,		\
80a8b0ca17SPeter Zijlstra 			1, regs, regs->dar);				\
81196f02bfSAnton Blanchard 		__PPC_WARN_EMULATED(type);				\
82196f02bfSAnton Blanchard 	} while (0)
83eecff81dSAnton Blanchard 
8480947e7cSGeert Uytterhoeven #endif /* _ASM_POWERPC_EMULATED_OPS_H */
85