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 sync;
  47        struct ppc_emulated_entry unaligned;
  48#ifdef CONFIG_MATH_EMULATION
  49        struct ppc_emulated_entry math;
  50#endif
  51#ifdef CONFIG_VSX
  52        struct ppc_emulated_entry vsx;
  53#endif
  54#ifdef CONFIG_PPC64
  55        struct ppc_emulated_entry mfdscr;
  56        struct ppc_emulated_entry mtdscr;
  57        struct ppc_emulated_entry lq_stq;
  58#endif
  59} ppc_emulated;
  60
  61extern u32 ppc_warn_emulated;
  62
  63extern void ppc_warn_emulated_print(const char *type);
  64
  65#define __PPC_WARN_EMULATED(type)                                        \
  66        do {                                                             \
  67                atomic_inc(&ppc_emulated.type.val);                      \
  68                if (ppc_warn_emulated)                                   \
  69                        ppc_warn_emulated_print(ppc_emulated.type.name); \
  70        } while (0)
  71
  72#else /* !CONFIG_PPC_EMULATED_STATS */
  73
  74#define __PPC_WARN_EMULATED(type)       do { } while (0)
  75
  76#endif /* !CONFIG_PPC_EMULATED_STATS */
  77
  78#define PPC_WARN_EMULATED(type, regs)                                   \
  79        do {                                                            \
  80                perf_sw_event(PERF_COUNT_SW_EMULATION_FAULTS,           \
  81                        1, regs, 0);                                    \
  82                __PPC_WARN_EMULATED(type);                              \
  83        } while (0)
  84
  85#define PPC_WARN_ALIGNMENT(type, regs)                                  \
  86        do {                                                            \
  87                perf_sw_event(PERF_COUNT_SW_ALIGNMENT_FAULTS,           \
  88                        1, regs, regs->dar);                            \
  89                __PPC_WARN_EMULATED(type);                              \
  90        } while (0)
  91
  92#endif /* _ASM_POWERPC_EMULATED_OPS_H */
  93