WIP FPC-III support
[linux/fpc-iii.git] / arch / powerpc / include / asm / emulated_ops.h
blob800cb21000cfb95534653c57bbc33462aac6e866
1 /* SPDX-License-Identifier: GPL-2.0-only */
2 /*
3 * Copyright 2007 Sony Corporation
4 */
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 {
16 const char *name;
17 atomic_t val;
20 extern struct ppc_emulated {
21 #ifdef CONFIG_ALTIVEC
22 struct ppc_emulated_entry altivec;
23 #endif
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;
38 #endif
39 #ifdef CONFIG_VSX
40 struct ppc_emulated_entry vsx;
41 #endif
42 #ifdef CONFIG_PPC64
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;
50 #endif
51 } ppc_emulated;
53 extern u32 ppc_warn_emulated;
55 extern void ppc_warn_emulated_print(const char *type);
57 #define __PPC_WARN_EMULATED(type) \
58 do { \
59 atomic_inc(&ppc_emulated.type.val); \
60 if (ppc_warn_emulated) \
61 ppc_warn_emulated_print(ppc_emulated.type.name); \
62 } while (0)
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) \
71 do { \
72 perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS, \
73 1, regs, 0); \
74 __PPC_WARN_EMULATED(type); \
75 } while (0)
77 #define PPC_WARN_ALIGNMENT(type, regs) \
78 do { \
79 perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS, \
80 1, regs, regs->dar); \
81 __PPC_WARN_EMULATED(type); \
82 } while (0)
84 #endif /* _ASM_POWERPC_EMULATED_OPS_H */