1 /* SPDX-License-Identifier: GPL-2.0-only */
3 * Copyright 2007 Sony Corporation
6 #ifndef _ASM_POWERPC_EMULATED_OPS_H
7 #define _ASM_POWERPC_EMULATED_OPS_H
9 #include <linux/atomic.h>
10 #include <linux/perf_event.h>
13 #ifdef CONFIG_PPC_EMULATED_STATS
15 struct ppc_emulated_entry
{
20 extern struct ppc_emulated
{
22 struct ppc_emulated_entry altivec
;
24 struct ppc_emulated_entry dcba
;
25 struct ppc_emulated_entry dcbz
;
26 struct ppc_emulated_entry fp_pair
;
27 struct ppc_emulated_entry isel
;
28 struct ppc_emulated_entry mcrxr
;
29 struct ppc_emulated_entry mfpvr
;
30 struct ppc_emulated_entry multiple
;
31 struct ppc_emulated_entry popcntb
;
32 struct ppc_emulated_entry spe
;
33 struct ppc_emulated_entry string
;
34 struct ppc_emulated_entry sync
;
35 struct ppc_emulated_entry unaligned
;
36 #ifdef CONFIG_MATH_EMULATION
37 struct ppc_emulated_entry math
;
40 struct ppc_emulated_entry vsx
;
43 struct ppc_emulated_entry mfdscr
;
44 struct ppc_emulated_entry mtdscr
;
45 struct ppc_emulated_entry lq_stq
;
46 struct ppc_emulated_entry lxvw4x
;
47 struct ppc_emulated_entry lxvh8x
;
48 struct ppc_emulated_entry lxvd2x
;
49 struct ppc_emulated_entry lxvb16x
;
53 extern u32 ppc_warn_emulated
;
55 extern void ppc_warn_emulated_print(const char *type
);
57 #define __PPC_WARN_EMULATED(type) \
59 atomic_inc(&ppc_emulated.type.val); \
60 if (ppc_warn_emulated) \
61 ppc_warn_emulated_print(ppc_emulated.type.name); \
64 #else /* !CONFIG_PPC_EMULATED_STATS */
66 #define __PPC_WARN_EMULATED(type) do { } while (0)
68 #endif /* !CONFIG_PPC_EMULATED_STATS */
70 #define PPC_WARN_EMULATED(type, regs) \
72 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, \
74 __PPC_WARN_EMULATED(type); \
77 #define PPC_WARN_ALIGNMENT(type, regs) \
79 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, \
80 1, regs, regs->dar); \
81 __PPC_WARN_EMULATED(type); \
84 #endif /* _ASM_POWERPC_EMULATED_OPS_H */