linux/arch/powerpc/include/asm/emulated_ops.h
<<
>>
Prefs
   1/*
   2 *  Copyright 2007 Sony Corporation
   3 *
   4 *  This program is free software; you can redistribute it and/or modify
   5 *  it under the terms of the GNU General Public License as published by
   6 *  the Free Software Foundation; version 2 of the License.
   7 *
   8 *  This program is distributed in the hope that it will be useful,
   9 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  10 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  11 *  GNU General Public License for more details.
  12 *
  13 *  You should have received a copy of the GNU General Public License
  14 *  along with this program.
  15 *  If not, see <http://www.gnu.org/licenses/>.
  16 */
  17
  18#ifndef _ASM_POWERPC_EMULATED_OPS_H
  19#define _ASM_POWERPC_EMULATED_OPS_H
  20
  21#include <linux/atomic.h>
  22#include <linux/perf_event.h>
  23
  24
  25#ifdef CONFIG_PPC_EMULATED_STATS
  26
  27struct ppc_emulated_entry {
  28        const char *name;
  29        atomic_t val;
  30};
  31
  32extern struct ppc_emulated {
  33#ifdef CONFIG_ALTIVEC
  34        struct ppc_emulated_entry altivec;
  35#endif
  36        struct ppc_emulated_entry dcba;
  37        struct ppc_emulated_entry dcbz;
  38        struct ppc_emulated_entry fp_pair;
  39        struct ppc_emulated_entry isel;
  40        struct ppc_emulated_entry mcrxr;
  41        struct ppc_emulated_entry mfpvr;
  42        struct ppc_emulated_entry multiple;
  43        struct ppc_emulated_entry popcntb;
  44        struct ppc_emulated_entry spe;
  45        struct ppc_emulated_entry string;
  46        struct ppc_emulated_entry unaligned;
  47#ifdef CONFIG_MATH_EMULATION
  48        struct ppc_emulated_entry math;
  49#endif
  50#ifdef CONFIG_VSX
  51        struct ppc_emulated_entry vsx;
  52#endif
  53#ifdef CONFIG_PPC64
  54        struct ppc_emulated_entry mfdscr;
  55        struct ppc_emulated_entry mtdscr;
  56#endif
  57} ppc_emulated;
  58
  59extern u32 ppc_warn_emulated;
  60
  61extern void ppc_warn_emulated_print(const char *type);
  62
  63#define __PPC_WARN_EMULATED(type)                                        \
  64        do {                                                             \
  65                atomic_inc(&ppc_emulated.type.val);                      \
  66                if (ppc_warn_emulated)                                   \
  67                        ppc_warn_emulated_print(ppc_emulated.type.name); \
  68        } while (0)
  69
  70#else /* !CONFIG_PPC_EMULATED_STATS */
  71
  72#define __PPC_WARN_EMULATED(type)       do { } while (0)
  73
  74#endif /* !CONFIG_PPC_EMULATED_STATS */
  75
  76#define PPC_WARN_EMULATED(type, regs)                                   \
  77        do {                                                            \
  78                perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,           \
  79                        1, regs, 0);                                    \
  80                __PPC_WARN_EMULATED(type);                              \
  81        } while (0)
  82
  83#define PPC_WARN_ALIGNMENT(type, regs)                                  \
  84        do {                                                            \
  85                perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,           \
  86                        1, regs, regs->dar);                            \
  87                __PPC_WARN_EMULATED(type);                              \
  88        } while (0)
  89
  90#endif /* _ASM_POWERPC_EMULATED_OPS_H */
  91