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.
 
 
 
 
 
 

227 lines
8.5 KiB

  1. /* SPDX-License-Identifier: GPL-2.0-or-later */
  2. /*
  3. * Support for processors implementing MIPS64 instruction set
  4. *
  5. * Copyright (C) 2014 by Andrey Sidorov <anysidorov@gmail.com>
  6. * Copyright (C) 2014 by Aleksey Kuleshov <rndfax@yandex.ru>
  7. * Copyright (C) 2014-2019 by Peter Mamonov <pmamonov@gmail.com>
  8. *
  9. * Based on the work of:
  10. * Copyright (C) 2008 by Spencer Oliver
  11. * Copyright (C) 2008 by David T.L. Wong
  12. * Copyright (C) 2010 by Konstantin Kostyukhin, Nikolay Shmyrev
  13. */
  14. #ifndef OPENOCD_TARGET_MIPS64_H
  15. #define OPENOCD_TARGET_MIPS64_H
  16. #include "target.h"
  17. #include "register.h"
  18. #include "mips64_pracc.h"
  19. #define MIPS64_COMMON_MAGIC 0xB640B640
  20. /* MIPS64 CP0 registers */
  21. #define MIPS64_C0_INDEX 0
  22. #define MIPS64_C0_RANDOM 1
  23. #define MIPS64_C0_ENTRYLO0 2
  24. #define MIPS64_C0_ENTRYLO1 3
  25. #define MIPS64_C0_CONTEXT 4
  26. #define MIPS64_C0_PAGEMASK 5
  27. #define MIPS64_C0_WIRED 6
  28. #define MIPS64_C0_BADVADDR 8
  29. #define MIPS64_C0_COUNT 9
  30. #define MIPS64_C0_ENTRYHI 10
  31. #define MIPS64_C0_COMPARE 11
  32. #define MIPS64_C0_STATUS 12
  33. #define MIPS64_C0_CAUSE 13
  34. #define MIPS64_C0_EPC 14
  35. #define MIPS64_C0_PRID 15
  36. #define MIPS64_C0_CONFIG 16
  37. #define MIPS64_C0_LLA 17
  38. #define MIPS64_C0_WATCHLO 18
  39. #define MIPS64_C0_WATCHHI 19
  40. #define MIPS64_C0_XCONTEXT 20
  41. #define MIPS64_C0_MEMCTRL 22
  42. #define MIPS64_C0_DEBUG 23
  43. #define MIPS64_C0_DEPC 24
  44. #define MIPS64_C0_PERFCOUNT 25
  45. #define MIPS64_C0_ECC 26
  46. #define MIPS64_C0_CACHERR 27
  47. #define MIPS64_C0_TAGLO 28
  48. #define MIPS64_C0_TAGHI 29
  49. #define MIPS64_C0_DATAHI 29
  50. #define MIPS64_C0_EEPC 30
  51. /* MIPS64 CP1 registers */
  52. #define MIPS64_C1_FIR 0
  53. #define MIPS64_C1_FCONFIG 24
  54. #define MIPS64_C1_FCSR 31
  55. #define MIPS64_C1_FCCR 25
  56. #define MIPS64_C1_FEXR 26
  57. #define MIPS64_C1_FENR 28
  58. /* offsets into mips64 register cache */
  59. #define MIPS64_NUM_CORE_REGS 34
  60. #define MIPS64_NUM_C0_REGS 34
  61. #define MIPS64_NUM_FP_REGS 38
  62. #define MIPS64_NUM_REGS (MIPS64_NUM_CORE_REGS + \
  63. MIPS64_NUM_C0_REGS + \
  64. MIPS64_NUM_FP_REGS)
  65. #define MIPS64_NUM_CORE_C0_REGS (MIPS64_NUM_CORE_REGS + MIPS64_NUM_C0_REGS)
  66. #define MIPS64_PC MIPS64_NUM_CORE_REGS
  67. struct mips64_comparator {
  68. bool used;
  69. uint64_t bp_value;
  70. uint64_t reg_address;
  71. };
  72. struct mips64_common {
  73. uint32_t common_magic;
  74. void *arch_info;
  75. struct reg_cache *core_cache;
  76. struct mips_ejtag ejtag_info;
  77. uint64_t core_regs[MIPS64_NUM_REGS];
  78. struct working_area *fast_data_area;
  79. bool bp_scanned;
  80. int num_inst_bpoints;
  81. int num_data_bpoints;
  82. int num_inst_bpoints_avail;
  83. int num_data_bpoints_avail;
  84. struct mips64_comparator *inst_break_list;
  85. struct mips64_comparator *data_break_list;
  86. /* register cache to processor synchronization */
  87. int (*read_core_reg)(struct target *target, int num);
  88. int (*write_core_reg)(struct target *target, int num);
  89. bool mips64mode32;
  90. };
  91. struct mips64_core_reg {
  92. uint32_t num;
  93. struct target *target;
  94. struct mips64_common *mips64_common;
  95. uint8_t value[8];
  96. struct reg_feature feature;
  97. struct reg_data_type reg_data_type;
  98. };
  99. #define MIPS64_OP_SRL 0x02
  100. #define MIPS64_OP_BEQ 0x04
  101. #define MIPS64_OP_BNE 0x05
  102. #define MIPS64_OP_ADDI 0x08
  103. #define MIPS64_OP_ANDI 0x0c
  104. #define MIPS64_OP_DADDI 0x18
  105. #define MIPS64_OP_DADDIU 0x19
  106. #define MIPS64_OP_AND 0x24
  107. #define MIPS64_OP_LUI 0x0F
  108. #define MIPS64_OP_LW 0x23
  109. #define MIPS64_OP_LD 0x37
  110. #define MIPS64_OP_LBU 0x24
  111. #define MIPS64_OP_LHU 0x25
  112. #define MIPS64_OP_MFHI 0x10
  113. #define MIPS64_OP_MTHI 0x11
  114. #define MIPS64_OP_MFLO 0x12
  115. #define MIPS64_OP_MTLO 0x13
  116. #define MIPS64_OP_SB 0x28
  117. #define MIPS64_OP_SH 0x29
  118. #define MIPS64_OP_SW 0x2B
  119. #define MIPS64_OP_SD 0x3F
  120. #define MIPS64_OP_ORI 0x0D
  121. #define MIPS64_OP_JR 0x08
  122. #define MIPS64_OP_COP0 0x10
  123. #define MIPS64_OP_COP1 0x11
  124. #define MIPS64_OP_COP2 0x12
  125. #define MIPS64_COP_MF 0x00
  126. #define MIPS64_COP_DMF 0x01
  127. #define MIPS64_COP_MT 0x04
  128. #define MIPS64_COP_DMT 0x05
  129. #define MIPS64_COP_CF 0x02
  130. #define MIPS64_COP_CT 0x06
  131. #define MIPS64_R_INST(opcode, rs, rt, rd, shamt, funct) \
  132. (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | ((rd) << 11) | ((shamt) << 6) | (funct))
  133. #define MIPS64_I_INST(opcode, rs, rt, immd) (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | (immd))
  134. #define MIPS64_J_INST(opcode, addr) (((opcode) << 26) | (addr))
  135. #define MIPS64_NOP 0
  136. #define MIPS64_ADDI(tar, src, val) MIPS64_I_INST(MIPS64_OP_ADDI, src, tar, val)
  137. #define MIPS64_DADDI(tar, src, val) MIPS64_I_INST(MIPS64_OP_DADDI, src, tar, val)
  138. #define MIPS64_DADDIU(tar, src, val) MIPS64_I_INST(MIPS64_OP_DADDIU, src, tar, val)
  139. #define MIPS64_AND(reg, off, val) MIPS64_R_INST(0, off, val, reg, 0, MIPS64_OP_AND)
  140. #define MIPS64_ANDI(d, s, im) MIPS64_I_INST(MIPS64_OP_ANDI, s, d, im)
  141. #define MIPS64_SRL(d, w, sh) MIPS64_R_INST(0, 0, w, d, sh, MIPS64_OP_SRL)
  142. #define MIPS64_B(off) MIPS64_BEQ(0, 0, off)
  143. #define MIPS64_BEQ(src, tar, off) MIPS64_I_INST(MIPS64_OP_BEQ, src, tar, off)
  144. #define MIPS64_BNE(src, tar, off) MIPS64_I_INST(MIPS64_OP_BNE, src, tar, off)
  145. #define MIPS64_MFC0(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP0, MIPS64_COP_MF, gpr, cpr, 0, sel)
  146. #define MIPS64_DMFC0(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP0, MIPS64_COP_DMF, gpr, cpr, 0, sel)
  147. #define MIPS64_MTC0(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP0, MIPS64_COP_MT, gpr, cpr, 0, sel)
  148. #define MIPS64_DMTC0(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP0, MIPS64_COP_DMT, gpr, cpr, 0, sel)
  149. #define MIPS64_MFC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_MF, gpr, cpr, 0, 0)
  150. #define MIPS64_DMFC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_DMF, gpr, cpr, 0, 0)
  151. #define MIPS64_MTC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_MT, gpr, cpr, 0, 0)
  152. #define MIPS64_DMTC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_DMT, gpr, cpr, 0, 0)
  153. #define MIPS64_MFC2(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP2, MIPS64_COP_MF, gpr, cpr, 0, sel)
  154. #define MIPS64_MTC2(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP2, MIPS64_COP_MT, gpr, cpr, 0, sel)
  155. #define MIPS64_CFC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_CF, gpr, cpr, 0, 0)
  156. #define MIPS64_CTC1(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP1, MIPS64_COP_CT, gpr, cpr, 0, 0)
  157. #define MIPS64_CFC2(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP2, MIPS64_COP_CF, gpr, cpr, 0, sel)
  158. #define MIPS64_CTC2(gpr, cpr, sel) MIPS64_R_INST(MIPS64_OP_COP2, MIPS64_COP_CT, gpr, cpr, 0, sel)
  159. #define MIPS64_LBU(reg, off, base) MIPS64_I_INST(MIPS64_OP_LBU, base, reg, off)
  160. #define MIPS64_LHU(reg, off, base) MIPS64_I_INST(MIPS64_OP_LHU, base, reg, off)
  161. #define MIPS64_LUI(reg, val) MIPS64_I_INST(MIPS64_OP_LUI, 0, reg, val)
  162. #define MIPS64_LW(reg, off, base) MIPS64_I_INST(MIPS64_OP_LW, base, reg, off)
  163. #define MIPS64_LD(reg, off, base) MIPS64_I_INST(MIPS64_OP_LD, base, reg, off)
  164. #define MIPS64_MFLO(reg) MIPS64_R_INST(0, 0, 0, reg, 0, MIPS64_OP_MFLO)
  165. #define MIPS64_MFHI(reg) MIPS64_R_INST(0, 0, 0, reg, 0, MIPS64_OP_MFHI)
  166. #define MIPS64_MTLO(reg) MIPS64_R_INST(0, reg, 0, 0, 0, MIPS64_OP_MTLO)
  167. #define MIPS64_MTHI(reg) MIPS64_R_INST(0, reg, 0, 0, 0, MIPS64_OP_MTHI)
  168. #define MIPS64_ORI(src, tar, val) MIPS64_I_INST(MIPS64_OP_ORI, src, tar, val)
  169. #define MIPS64_SB(reg, off, base) MIPS64_I_INST(MIPS64_OP_SB, base, reg, off)
  170. #define MIPS64_SH(reg, off, base) MIPS64_I_INST(MIPS64_OP_SH, base, reg, off)
  171. #define MIPS64_SW(reg, off, base) MIPS64_I_INST(MIPS64_OP_SW, base, reg, off)
  172. #define MIPS64_SD(reg, off, base) MIPS64_I_INST(MIPS64_OP_SD, base, reg, off)
  173. #define MIPS64_CACHE(op, reg, off) (47 << 26 | (reg) << 21 | (op) << 16 | (off))
  174. #define MIPS64_SYNCI(reg, off) (1 << 26 | (reg) << 21 | 0x1f << 16 | (off))
  175. #define MIPS64_JR(reg) MIPS64_R_INST(0, reg, 0, 0, 0, MIPS64_OP_JR)
  176. /* ejtag specific instructions */
  177. #define MIPS64_DRET 0x4200001F
  178. #define MIPS64_SDBBP 0x7000003F
  179. #define MIPS64_SDBBP_LE 0x3f000007
  180. #define MIPS64_SDBBP_SIZE 4
  181. #define MIPS16_SDBBP_SIZE 2
  182. #define MIPS64_SYNC 0x0000000F
  183. int mips64_arch_state(struct target *target);
  184. int mips64_init_arch_info(struct target *target, struct mips64_common *mips64, struct jtag_tap *tap);
  185. int mips64_restore_context(struct target *target);
  186. int mips64_save_context(struct target *target);
  187. int mips64_build_reg_cache(struct target *target);
  188. int mips64_run_algorithm(struct target *target, int num_mem_params, struct mem_param *mem_params,
  189. int num_reg_params, struct reg_param *reg_params,
  190. target_addr_t entry_point, target_addr_t exit_point,
  191. int timeout_ms, void *arch_info);
  192. int mips64_configure_break_unit(struct target *target);
  193. int mips64_enable_interrupts(struct target *target, bool enable);
  194. int mips64_examine(struct target *target);
  195. int mips64_register_commands(struct command_context *cmd_ctx);
  196. int mips64_invalidate_core_regs(struct target *target);
  197. int mips64_get_gdb_reg_list(struct target *target,
  198. struct reg **reg_list[], int *reg_list_size,
  199. enum target_register_class reg_class);
  200. #endif /* OPENOCD_TARGET_MIPS64_H */