2014-12-03 15:47:03 +00:00
/*
* This file is subject to the terms and conditions of the GNU General Public
* License . See the file " COPYING " in the main directory of this archive
* for more details .
*
* Copyright ( c ) 2014 Imagination Technologies Ltd .
* Author : Markos Chandras < markos . chandras @ imgtec . com >
*/
# ifndef __ASM_MIPS_R2_TO_R6_EMUL_H
# define __ASM_MIPS_R2_TO_R6_EMUL_H
struct mips_r2_emulator_stats {
u64 movs ;
u64 hilo ;
u64 muls ;
u64 divs ;
u64 dsps ;
u64 bops ;
u64 traps ;
u64 fpus ;
u64 loads ;
u64 stores ;
u64 llsc ;
u64 dsemul ;
} ;
struct mips_r2br_emulator_stats {
u64 jrs ;
u64 bltzl ;
u64 bgezl ;
u64 bltzll ;
u64 bgezll ;
u64 bltzall ;
u64 bgezall ;
u64 bltzal ;
u64 bgezal ;
u64 beql ;
u64 bnel ;
u64 blezl ;
u64 bgtzl ;
} ;
# ifdef CONFIG_DEBUG_FS
# define MIPS_R2_STATS(M) \
do { \
u32 nir ; \
int err ; \
\
preempt_disable ( ) ; \
__this_cpu_inc ( mipsr2emustats . M ) ; \
err = __get_user ( nir , ( u32 __user * ) regs - > cp0_epc ) ; \
if ( ! err ) { \
2016-01-22 05:20:46 +00:00
if ( nir = = BREAK_MATH ( 0 ) ) \
2014-12-03 15:47:03 +00:00
__this_cpu_inc ( mipsr2bdemustats . M ) ; \
} \
preempt_enable ( ) ; \
} while ( 0 )
# define MIPS_R2BR_STATS(M) \
do { \
preempt_disable ( ) ; \
__this_cpu_inc ( mipsr2bremustats . M ) ; \
preempt_enable ( ) ; \
} while ( 0 )
# else
# define MIPS_R2_STATS(M) do { } while (0)
# define MIPS_R2BR_STATS(M) do { } while (0)
# endif /* CONFIG_DEBUG_FS */
struct r2_decoder_table {
u32 mask ;
u32 code ;
int ( * func ) ( struct pt_regs * regs , u32 inst ) ;
} ;
2016-03-04 01:44:28 +00:00
extern void do_trap_or_bp ( struct pt_regs * regs , unsigned int code , int si_code ,
2014-12-03 15:47:03 +00:00
const char * str ) ;
# ifndef CONFIG_MIPSR2_TO_R6_EMULATOR
static int mipsr2_emulation ;
2015-04-03 23:27:15 +01:00
static inline int mipsr2_decoder ( struct pt_regs * regs , u32 inst ,
unsigned long * fcr31 )
{
return 0 ;
} ;
2014-12-03 15:47:03 +00:00
# else
/* MIPS R2 Emulator ON/OFF */
extern int mipsr2_emulation ;
2015-04-03 23:27:15 +01:00
extern int mipsr2_decoder ( struct pt_regs * regs , u32 inst ,
unsigned long * fcr31 ) ;
2014-12-03 15:47:03 +00:00
# endif /* CONFIG_MIPSR2_TO_R6_EMULATOR */
# define NO_R6EMU (cpu_has_mips_r6 && !mipsr2_emulation)
# endif /* __ASM_MIPS_R2_TO_R6_EMUL_H */