mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
101 lines
2.0 KiB
101 lines
2.0 KiB
/* |
|
* 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 <[email protected]> |
|
*/ |
|
|
|
#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) { \ |
|
if (nir == BREAK_MATH(0)) \ |
|
__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); |
|
}; |
|
|
|
|
|
extern void do_trap_or_bp(struct pt_regs *regs, unsigned int code, int si_code, |
|
const char *str); |
|
|
|
#ifndef CONFIG_MIPSR2_TO_R6_EMULATOR |
|
static int mipsr2_emulation; |
|
static inline int mipsr2_decoder(struct pt_regs *regs, u32 inst, |
|
unsigned long *fcr31) |
|
{ |
|
return 0; |
|
}; |
|
#else |
|
/* MIPS R2 Emulator ON/OFF */ |
|
extern int mipsr2_emulation; |
|
extern int mipsr2_decoder(struct pt_regs *regs, u32 inst, |
|
unsigned long *fcr31); |
|
#endif /* CONFIG_MIPSR2_TO_R6_EMULATOR */ |
|
|
|
#define NO_R6EMU (cpu_has_mips_r6 && !mipsr2_emulation) |
|
|
|
#endif /* __ASM_MIPS_R2_TO_R6_EMUL_H */
|
|
|