/arch/mips/include/asm/fpu_emulator.h

http://github.com/mirrors/linux · C Header · 191 lines · 166 code · 10 blank · 15 comment · 2 complexity · 3136026f241e1322fe76b39d933306ec MD5 · raw file

  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. *
  4. * Further private data for which no space exists in mips_fpu_struct.
  5. * This should be subsumed into the mips_fpu_struct structure as
  6. * defined in processor.h as soon as the absurd wired absolute assembler
  7. * offsets become dynamic at compile time.
  8. *
  9. * Kevin D. Kissell, kevink@mips.com and Carsten Langgaard, carstenl@mips.com
  10. * Copyright (C) 2000 MIPS Technologies, Inc. All rights reserved.
  11. */
  12. #ifndef _ASM_FPU_EMULATOR_H
  13. #define _ASM_FPU_EMULATOR_H
  14. #include <linux/sched.h>
  15. #include <asm/dsemul.h>
  16. #include <asm/thread_info.h>
  17. #include <asm/inst.h>
  18. #include <asm/local.h>
  19. #include <asm/processor.h>
  20. #ifdef CONFIG_DEBUG_FS
  21. struct mips_fpu_emulator_stats {
  22. unsigned long emulated;
  23. unsigned long loads;
  24. unsigned long stores;
  25. unsigned long branches;
  26. unsigned long cp1ops;
  27. unsigned long cp1xops;
  28. unsigned long errors;
  29. unsigned long ieee754_inexact;
  30. unsigned long ieee754_underflow;
  31. unsigned long ieee754_overflow;
  32. unsigned long ieee754_zerodiv;
  33. unsigned long ieee754_invalidop;
  34. unsigned long ds_emul;
  35. unsigned long abs_s;
  36. unsigned long abs_d;
  37. unsigned long add_s;
  38. unsigned long add_d;
  39. unsigned long bc1eqz;
  40. unsigned long bc1nez;
  41. unsigned long ceil_w_s;
  42. unsigned long ceil_w_d;
  43. unsigned long ceil_l_s;
  44. unsigned long ceil_l_d;
  45. unsigned long class_s;
  46. unsigned long class_d;
  47. unsigned long cmp_af_s;
  48. unsigned long cmp_af_d;
  49. unsigned long cmp_eq_s;
  50. unsigned long cmp_eq_d;
  51. unsigned long cmp_le_s;
  52. unsigned long cmp_le_d;
  53. unsigned long cmp_lt_s;
  54. unsigned long cmp_lt_d;
  55. unsigned long cmp_ne_s;
  56. unsigned long cmp_ne_d;
  57. unsigned long cmp_or_s;
  58. unsigned long cmp_or_d;
  59. unsigned long cmp_ueq_s;
  60. unsigned long cmp_ueq_d;
  61. unsigned long cmp_ule_s;
  62. unsigned long cmp_ule_d;
  63. unsigned long cmp_ult_s;
  64. unsigned long cmp_ult_d;
  65. unsigned long cmp_un_s;
  66. unsigned long cmp_un_d;
  67. unsigned long cmp_une_s;
  68. unsigned long cmp_une_d;
  69. unsigned long cmp_saf_s;
  70. unsigned long cmp_saf_d;
  71. unsigned long cmp_seq_s;
  72. unsigned long cmp_seq_d;
  73. unsigned long cmp_sle_s;
  74. unsigned long cmp_sle_d;
  75. unsigned long cmp_slt_s;
  76. unsigned long cmp_slt_d;
  77. unsigned long cmp_sne_s;
  78. unsigned long cmp_sne_d;
  79. unsigned long cmp_sor_s;
  80. unsigned long cmp_sor_d;
  81. unsigned long cmp_sueq_s;
  82. unsigned long cmp_sueq_d;
  83. unsigned long cmp_sule_s;
  84. unsigned long cmp_sule_d;
  85. unsigned long cmp_sult_s;
  86. unsigned long cmp_sult_d;
  87. unsigned long cmp_sun_s;
  88. unsigned long cmp_sun_d;
  89. unsigned long cmp_sune_s;
  90. unsigned long cmp_sune_d;
  91. unsigned long cvt_d_l;
  92. unsigned long cvt_d_s;
  93. unsigned long cvt_d_w;
  94. unsigned long cvt_l_s;
  95. unsigned long cvt_l_d;
  96. unsigned long cvt_s_d;
  97. unsigned long cvt_s_l;
  98. unsigned long cvt_s_w;
  99. unsigned long cvt_w_s;
  100. unsigned long cvt_w_d;
  101. unsigned long div_s;
  102. unsigned long div_d;
  103. unsigned long floor_w_s;
  104. unsigned long floor_w_d;
  105. unsigned long floor_l_s;
  106. unsigned long floor_l_d;
  107. unsigned long maddf_s;
  108. unsigned long maddf_d;
  109. unsigned long max_s;
  110. unsigned long max_d;
  111. unsigned long maxa_s;
  112. unsigned long maxa_d;
  113. unsigned long min_s;
  114. unsigned long min_d;
  115. unsigned long mina_s;
  116. unsigned long mina_d;
  117. unsigned long mov_s;
  118. unsigned long mov_d;
  119. unsigned long msubf_s;
  120. unsigned long msubf_d;
  121. unsigned long mul_s;
  122. unsigned long mul_d;
  123. unsigned long neg_s;
  124. unsigned long neg_d;
  125. unsigned long recip_s;
  126. unsigned long recip_d;
  127. unsigned long rint_s;
  128. unsigned long rint_d;
  129. unsigned long round_w_s;
  130. unsigned long round_w_d;
  131. unsigned long round_l_s;
  132. unsigned long round_l_d;
  133. unsigned long rsqrt_s;
  134. unsigned long rsqrt_d;
  135. unsigned long sel_s;
  136. unsigned long sel_d;
  137. unsigned long seleqz_s;
  138. unsigned long seleqz_d;
  139. unsigned long selnez_s;
  140. unsigned long selnez_d;
  141. unsigned long sqrt_s;
  142. unsigned long sqrt_d;
  143. unsigned long sub_s;
  144. unsigned long sub_d;
  145. unsigned long trunc_w_s;
  146. unsigned long trunc_w_d;
  147. unsigned long trunc_l_s;
  148. unsigned long trunc_l_d;
  149. };
  150. DECLARE_PER_CPU(struct mips_fpu_emulator_stats, fpuemustats);
  151. #define MIPS_FPU_EMU_INC_STATS(M) \
  152. do { \
  153. preempt_disable(); \
  154. __this_cpu_inc(fpuemustats.M); \
  155. preempt_enable(); \
  156. } while (0)
  157. #else
  158. #define MIPS_FPU_EMU_INC_STATS(M) do { } while (0)
  159. #endif /* CONFIG_DEBUG_FS */
  160. extern int fpu_emulator_cop1Handler(struct pt_regs *xcp,
  161. struct mips_fpu_struct *ctx, int has_fpu,
  162. void __user **fault_addr);
  163. void force_fcr31_sig(unsigned long fcr31, void __user *fault_addr,
  164. struct task_struct *tsk);
  165. int process_fpemu_return(int sig, void __user *fault_addr,
  166. unsigned long fcr31);
  167. int isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
  168. unsigned long *contpc);
  169. int mm_isBranchInstr(struct pt_regs *regs, struct mm_decoded_insn dec_insn,
  170. unsigned long *contpc);
  171. /*
  172. * Mask the FCSR Cause bits according to the Enable bits, observing
  173. * that Unimplemented is always enabled.
  174. */
  175. static inline unsigned long mask_fcr31_x(unsigned long fcr31)
  176. {
  177. return fcr31 & (FPU_CSR_UNI_X |
  178. ((fcr31 & FPU_CSR_ALL_E) <<
  179. (ffs(FPU_CSR_ALL_X) - ffs(FPU_CSR_ALL_E))));
  180. }
  181. #endif /* _ASM_FPU_EMULATOR_H */