target/mips32: add cpu info detection
[openocd.git] / src / target / mips32.h
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2
3 /***************************************************************************
4 * Copyright (C) 2008 by Spencer Oliver *
5 * spen@spen-soft.co.uk *
6 * *
7 * Copyright (C) 2008 by David T.L. Wong *
8 * *
9 * Copyright (C) 2011 by Drasko DRASKOVIC *
10 * drasko.draskovic@gmail.com *
11 ***************************************************************************/
12
13 #ifndef OPENOCD_TARGET_MIPS32_H
14 #define OPENOCD_TARGET_MIPS32_H
15
16 #include <helper/bits.h>
17
18 #include "target.h"
19 #include "mips32_pracc.h"
20
21 #define MIPS32_COMMON_MAGIC 0xB320B320U
22
23 /**
24 * Memory segments (32bit kernel mode addresses)
25 * These are the traditional names used in the 32-bit universe.
26 */
27 #define KUSEG 0x00000000
28 #define KSEG0 0x80000000
29 #define KSEG1 0xa0000000
30 #define KSEG2 0xc0000000
31 #define KSEG3 0xe0000000
32
33 /** Returns the kernel segment base of a given address */
34 #define KSEGX(a) ((a) & 0xe0000000)
35
36 /** CP0 CONFIG register fields */
37 #define MIPS32_CONFIG0_KU_SHIFT 25
38 #define MIPS32_CONFIG0_KU_MASK (0x7 << MIPS32_CONFIG0_KU_SHIFT)
39
40 #define MIPS32_CONFIG0_K0_SHIFT 0
41 #define MIPS32_CONFIG0_K0_MASK (0x7 << MIPS32_CONFIG0_K0_SHIFT)
42
43 #define MIPS32_CONFIG0_K23_SHIFT 28
44 #define MIPS32_CONFIG0_K23_MASK (0x7 << MIPS32_CONFIG0_K23_SHIFT)
45
46 #define MIPS32_CONFIG0_AR_SHIFT 10
47 #define MIPS32_CONFIG0_AR_MASK (0x7 << MIPS32_CONFIG0_AR_SHIFT)
48
49 #define MIPS32_CONFIG1_FP_SHIFT 0
50 #define MIPS32_CONFIG1_FP_MASK BIT(MIPS32_CONFIG1_FP_SHIFT)
51
52 #define MIPS32_CONFIG1_DL_SHIFT 10
53 #define MIPS32_CONFIG1_DL_MASK (0x7 << MIPS32_CONFIG1_DL_SHIFT)
54
55 #define MIPS32_CONFIG3_CDMM_SHIFT 3
56 #define MIPS32_CONFIG3_CDMM_MASK BIT(MIPS32_CONFIG3_CDMM_SHIFT)
57
58 #define MIPS32_CONFIG3_DSPP_SHIFT 10
59 #define MIPS32_CONFIG3_DSPP_MASK BIT(MIPS32_CONFIG3_DSPP_SHIFT)
60
61 #define MIPS32_CONFIG3_DSPREV_SHIFT 11
62 #define MIPS32_CONFIG3_DSPREV_MASK BIT(MIPS32_CONFIG3_DSPREV_SHIFT)
63
64 #define MIPS32_CONFIG3_ISA_SHIFT 14
65 #define MIPS32_CONFIG3_ISA_MASK (3 << MIPS32_CONFIG3_ISA_SHIFT)
66
67 #define MIPS32_ARCH_REL1 0x0
68 #define MIPS32_ARCH_REL2 0x1
69
70 #define MIPS32_SCAN_DELAY_LEGACY_MODE 2000000
71
72 #define MIPS32_NUM_DSPREGS 9
73
74 /* Bit Mask indicating CP0 register supported by this core */
75 #define MIPS_CP0_MK4 0x0001
76 #define MIPS_CP0_MAPTIV_UC 0x0002
77 #define MIPS_CP0_MAPTIV_UP 0x0004
78 #define MIPS_CP0_IAPTIV 0x0008
79
80 /* CP0 Status register fields */
81 #define MIPS32_CP0_STATUS_FR_SHIFT 26
82 #define MIPS32_CP0_STATUS_CU1_SHIFT 29
83
84 /* CP1 FIR register fields */
85 #define MIPS32_CP1_FIR_F64_SHIFT 22
86
87 static const struct {
88 unsigned int reg;
89 unsigned int sel;
90 const char *name;
91 const unsigned int core;
92 } mips32_cp0_regs[] = {
93 {0, 0, "index", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
94 {0, 1, "mvpcontrol", MIPS_CP0_IAPTIV},
95 {0, 2, "mvpconf0", MIPS_CP0_IAPTIV},
96 {0, 3, "mvpconf1", MIPS_CP0_IAPTIV},
97 {1, 0, "random", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
98 {1, 1, "vpecontrol", MIPS_CP0_IAPTIV},
99 {1, 2, "vpeconf0", MIPS_CP0_IAPTIV},
100 {1, 3, "vpeconf1", MIPS_CP0_IAPTIV},
101 {1, 4, "yqmask", MIPS_CP0_IAPTIV},
102 {1, 5, "vpeschedule", MIPS_CP0_IAPTIV},
103 {1, 6, "vpeschefback", MIPS_CP0_IAPTIV},
104 {1, 7, "vpeopt", MIPS_CP0_IAPTIV},
105 {2, 0, "entrylo0", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
106 {2, 1, "tcstatus", MIPS_CP0_IAPTIV},
107 {2, 2, "tcbind", MIPS_CP0_IAPTIV},
108 {2, 3, "tcrestart", MIPS_CP0_IAPTIV},
109 {2, 4, "tchalt", MIPS_CP0_IAPTIV},
110 {2, 5, "tccontext", MIPS_CP0_IAPTIV},
111 {2, 6, "tcschedule", MIPS_CP0_IAPTIV},
112 {2, 7, "tcschefback", MIPS_CP0_IAPTIV},
113 {3, 0, "entrylo1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
114 {3, 7, "tcopt", MIPS_CP0_IAPTIV},
115 {4, 0, "context", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
116 {4, 2, "userlocal", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
117 {5, 0, "pagemask", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
118 {5, 1, "pagegrain", MIPS_CP0_MAPTIV_UP},
119 {5, 2, "segctl0", MIPS_CP0_IAPTIV},
120 {5, 3, "segctl1", MIPS_CP0_IAPTIV},
121 {5, 4, "segctl2", MIPS_CP0_IAPTIV},
122 {6, 0, "wired", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
123 {6, 1, "srsconf0", MIPS_CP0_IAPTIV},
124 {6, 2, "srsconf1", MIPS_CP0_IAPTIV},
125 {6, 3, "srsconf2", MIPS_CP0_IAPTIV},
126 {6, 4, "srsconf3", MIPS_CP0_IAPTIV},
127 {6, 5, "srsconf4", MIPS_CP0_IAPTIV},
128 {7, 0, "hwrena", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
129 {8, 0, "badvaddr", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
130 {8, 1, "badinstr", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
131 {8, 2, "badinstrp", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
132 {9, 0, "count", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
133 {10, 0, "entryhi", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP},
134 {10, 4, "guestctl1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
135 {10, 5, "guestctl2", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
136 {10, 6, "guestctl3", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
137 {11, 0, "compare", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
138 {11, 4, "guestctl0ext", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
139 {12, 0, "status", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
140 {12, 1, "intctl", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
141 {12, 2, "srsctl", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
142 {12, 3, "srsmap", MIPS_CP0_IAPTIV},
143 {12, 3, "srsmap1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
144 {12, 4, "view_ipl", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
145 {12, 5, "srsmap2", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
146 {12, 6, "guestctl0", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
147 {12, 7, "gtoffset", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MK4},
148 {13, 0, "cause", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
149 {13, 5, "nestedexc", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
150 {14, 0, "epc", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
151 {14, 2, "nestedepc", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
152 {15, 0, "prid", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
153 {15, 1, "ebase", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
154 {15, 2, "cdmmbase", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
155 {15, 3, "cmgcrbase", MIPS_CP0_IAPTIV},
156 {16, 0, "config", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
157 {16, 1, "config1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
158 {16, 2, "config2", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
159 {16, 3, "config3", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
160 {16, 4, "config4", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
161 {16, 5, "config5", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
162 {16, 7, "config7", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
163 {17, 0, "lladdr", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
164 {18, 0, "watchlo0", MIPS_CP0_IAPTIV},
165 {18, 1, "watchlo1", MIPS_CP0_IAPTIV},
166 {18, 2, "watchlo2", MIPS_CP0_IAPTIV},
167 {18, 3, "watchlo3", MIPS_CP0_IAPTIV},
168 {19, 0, "watchhi0", MIPS_CP0_IAPTIV},
169 {19, 1, "watchhi1", MIPS_CP0_IAPTIV},
170 {19, 2, "watchhi2", MIPS_CP0_IAPTIV},
171 {19, 3, "watchhi3", MIPS_CP0_IAPTIV},
172 {23, 0, "debug", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
173 {23, 1, "tracecontrol", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
174 {23, 2, "tracecontrol2", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
175 {23, 3, "usertracedata1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
176 {23, 4, "tracebpc", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
177 {23, 4, "traceibpc", MIPS_CP0_IAPTIV},
178 {23, 5, "tracedbpc", MIPS_CP0_IAPTIV},
179 {24, 0, "depc", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
180 {24, 2, "tracecontrol3", MIPS_CP0_IAPTIV},
181 {24, 3, "usertracedata2", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
182 {25, 0, "perfctl0", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
183 {25, 1, "perfcnt0", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
184 {25, 2, "perfctl1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
185 {25, 3, "perfcnt1", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
186 {26, 0, "errctl", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
187 {27, 0, "cacheerr", MIPS_CP0_IAPTIV},
188 {28, 0, "itaglo", MIPS_CP0_IAPTIV},
189 {28, 0, "taglo", MIPS_CP0_IAPTIV},
190 {28, 1, "idatalo", MIPS_CP0_IAPTIV},
191 {28, 1, "datalo", MIPS_CP0_IAPTIV},
192 {28, 2, "dtaglo", MIPS_CP0_IAPTIV},
193 {28, 3, "ddatalo", MIPS_CP0_IAPTIV},
194 {28, 4, "l23taglo", MIPS_CP0_IAPTIV},
195 {28, 5, "l23datalo", MIPS_CP0_IAPTIV},
196 {29, 1, "idatahi", MIPS_CP0_IAPTIV},
197 {29, 2, "dtaghi", MIPS_CP0_IAPTIV},
198 {29, 5, "l23datahi", MIPS_CP0_IAPTIV},
199 {30, 0, "errorepc", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
200 {31, 0, "desave", MIPS_CP0_IAPTIV | MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP | MIPS_CP0_MK4},
201 {31, 2, "kscratch1", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
202 {31, 3, "kscratch2", MIPS_CP0_MAPTIV_UC | MIPS_CP0_MAPTIV_UP},
203 };
204
205 #define MIPS32NUMCP0REGS ((int)ARRAY_SIZE(mips32_cp0_regs))
206
207 /* Insert extra NOPs after the DRET instruction on exit from debug. */
208 #define EJTAG_QUIRK_PAD_DRET BIT(0)
209
210 /* offsets into mips32 core register cache */
211 enum {
212 MIPS32_PC = 37,
213 MIPS32_FIR = 71,
214 MIPS32NUMCOREREGS
215 };
216
217 /* offsets into mips32 core register cache */
218
219 #define MIPS32_REG_GP_COUNT 34
220 #define MIPS32_REG_FP_COUNT 32
221 #define MIPS32_REG_FPC_COUNT 2
222 #define MIPS32_REG_C0_COUNT 5
223
224 #define MIPS32_REGLIST_GP_INDEX 0
225 #define MIPS32_REGLIST_FP_INDEX (MIPS32_REGLIST_GP_INDEX + MIPS32_REG_GP_COUNT)
226 #define MIPS32_REGLIST_FPC_INDEX (MIPS32_REGLIST_FP_INDEX + MIPS32_REG_FP_COUNT)
227 #define MIPS32_REGLIST_C0_INDEX (MIPS32_REGLIST_FPC_INDEX + MIPS32_REG_FPC_COUNT)
228
229 #define MIPS32_REGLIST_C0_STATUS_INDEX (MIPS32_REGLIST_C0_INDEX + 0)
230 #define MIPS32_REGLIST_C0_BADVADDR_INDEX (MIPS32_REGLIST_C0_INDEX + 1)
231 #define MIPS32_REGLIST_C0_CAUSE_INDEX (MIPS32_REGLIST_C0_INDEX + 2)
232 #define MIPS32_REGLIST_C0_PC_INDEX (MIPS32_REGLIST_C0_INDEX + 3)
233 #define MIPS32_REGLIST_C0_GUESTCTL1_INDEX (MIPS32_REGLIST_C0_INDEX + 4)
234
235 #define MIPS32_REG_C0_STATUS_INDEX 0
236 #define MIPS32_REG_C0_BADVADDR_INDEX 1
237 #define MIPS32_REG_C0_CAUSE_INDEX 2
238 #define MIPS32_REG_C0_PC_INDEX 3
239 #define MIPS32_REG_C0_GUESTCTL1_INDEX 4
240
241 enum mips32_isa_mode {
242 MIPS32_ISA_MIPS32 = 0,
243 MIPS32_ISA_MIPS16E = 1,
244 MIPS32_ISA_MMIPS32 = 3,
245 };
246
247 enum mips32_isa_imp {
248 MIPS32_ONLY = 0,
249 MMIPS32_ONLY = 1,
250 MIPS32_MIPS16 = 2,
251 MIPS32_MMIPS32 = 3,
252 };
253
254 /* Release 2~5 does not have much change regarding to the ISA under User mode,
255 * therefore no new Architecture Revision(AR) level is assigned to them.
256 * Release 6 changed some instruction's encoding/mnemonic, removed instructions that
257 * has lost its purposes/none are using, and added some new instructions as well.
258 */
259 enum mips32_isa_rel {
260 MIPS32_RELEASE_1 = 0,
261 MIPS32_RELEASE_2 = 1,
262 MIPS32_RELEASE_6 = 2,
263 MIPS32_RELEASE_UNKNOWN,
264 };
265
266 enum mips32_isa_supported {
267 MIPS16,
268 MIPS32,
269 MIPS64,
270 MICROMIPS_ONLY,
271 MIPS32_AT_RESET_AND_MICROMIPS,
272 MICROMIPS_AT_RESET_AND_MIPS32,
273 };
274 #define MIPS32_CORE_MASK 0xFFFFFF00
275 #define MIPS32_VARIANT_MASK 0x00FF
276
277 /* This struct contains mips cpu types with their name respectively.
278 * The PrID register format is as following:
279 * - Company Optionsp[31:24]
280 * - Company ID[23:16]
281 * - Processor ID[15:8]
282 * - Revision[7:0]
283 * Here the revision field represents the maximum value of revision.
284 */
285 static const struct cpu_entry {
286 uint32_t prid;
287 enum mips32_isa_supported isa;
288 const char *vendor;
289 const char *cpu_name;
290 } mips32_cpu_entry[] = {
291 /* MIPS Technologies cores */
292 {0x000180FF, MIPS32, "MIPS", "4Kc"},
293 {0x000181FF, MIPS64, "MIPS", "5Kc"},
294 {0x000182FF, MIPS64, "MIPS", "20Kc"},
295 {0x000183FF, MIPS32, "MIPS", "4KM"},
296
297 {0x000184FF, MIPS32, "MIPS", "4KEc"},
298 {0x000190FF, MIPS32, "MIPS", "4KEc"},
299
300 {0x000185FF, MIPS32, "MIPS", "4KEm"},
301 {0x000191FF, MIPS32, "MIPS", "4KEm"},
302
303 {0x000186FF, MIPS32, "MIPS", "4KSc"},
304 {0x000187FF, MIPS32, "MIPS", "M4K"},
305 {0x000188FF, MIPS64, "MIPS", "25Kf"},
306 {0x000189FF, MIPS64, "MIPS", "5KEc"},
307 {0x000192FF, MIPS32, "MIPS", "4KSD"},
308 {0x000193FF, MIPS32, "MIPS", "24Kc"},
309 {0x000195FF, MIPS32, "MIPS", "34Kc"},
310 {0x000196FF, MIPS32, "MIPS", "24KEc"},
311 {0x000197FF, MIPS32, "MIPS", "74Kc"},
312 {0x000199FF, MIPS32, "MIPS", "1004Kc"},
313 {0x00019AFF, MIPS32, "MIPS", "1074Kc"},
314 {0x00019BFF, MIPS32, "MIPS", "M14K"},
315 {0x00019CFF, MIPS32, "MIPS", "M14Kc"},
316 {0x00019DFF, MIPS32, "MIPS", "microAptiv_UC(M14KE)"},
317 {0x00019EFF, MIPS32, "MIPS", "microAptiv_UP(M14KEc)"},
318 {0x0001A0FF, MIPS32, "MIPS", "interAptiv"},
319 {0x0001A1FF, MIPS32, "MIPS", "interAptiv_CM"},
320 {0x0001A2FF, MIPS32, "MIPS", "proAptiv"},
321 {0x0001A3FF, MIPS32, "MIPS", "proAptiv_CM"},
322 {0x0001A6FF, MIPS32, "MIPS", "M5100"},
323 {0x0001A7FF, MIPS32, "MIPS", "M5150"},
324 {0x0001A8FF, MIPS32, "MIPS", "P5600"},
325 {0x0001A9FF, MIPS32, "MIPS", "I5500"},
326
327 /* Broadcom */
328 {0x000200FF, MIPS32, "Broadcom", "Broadcom"},
329
330 /* AMD Alchemy Series*/
331 /* NOTE: AMD/Alchemy series uses Company Option instead of
332 * Processor ID, to match the find function, Processor ID field
333 * is the copy of Company Option field */
334 {0x000300FF, MIPS32, "AMD Alchemy", "AU1000"},
335 {0x010301FF, MIPS32, "AMD Alchemy", "AU1500"},
336 {0x020302FF, MIPS32, "AMD Alchemy", "AU1100"},
337 {0x030303FF, MIPS32, "AMD Alchemy", "AU1550"},
338 {0x04030401, MIPS32, "AMD Alchemy", "AU1200"},
339 {0x040304FF, MIPS32, "AMD Alchemy", "AU1250"},
340 {0x050305FF, MIPS32, "AMD Alchemy", "AU1210"},
341
342 /* Altera */
343 {0x001000FF, MIPS32, "Altera", "Altera"},
344
345 /* Lexra */
346 {0x000B00FF, MIPS32, "Lexra", "Lexra"},
347
348 /* Ingenic */
349 {0x00e102FF, MIPS32, "Ingenic", "Ingenic XBurst rev1"},
350
351 {0xFFFFFFFF, MIPS32, "Unknown", "Unknown"}
352 };
353
354 #define MIPS32_NUM_CPU_ENTRIES (ARRAY_SIZE(mips32_cpu_entry))
355
356 enum mips32_fp_imp {
357 MIPS32_FP_IMP_NONE = 0,
358 MIPS32_FP_IMP_32 = 1,
359 MIPS32_FP_IMP_64 = 2,
360 MIPS32_FP_IMP_UNKNOWN = 3,
361 };
362
363 enum mips32_dsp_imp {
364 MIPS32_DSP_IMP_NONE = 0,
365 MIPS32_DSP_IMP_REV1 = 1,
366 MIPS32_DSP_IMP_REV2 = 2,
367 };
368
369 struct mips32_comparator {
370 int used;
371 uint32_t bp_value;
372 uint32_t reg_address;
373 };
374
375 struct mips32_core_regs {
376 uint32_t gpr[MIPS32_REG_GP_COUNT];
377 uint64_t fpr[MIPS32_REG_FP_COUNT];
378 uint32_t fpcr[MIPS32_REG_FPC_COUNT];
379 uint32_t cp0[MIPS32_REG_C0_COUNT];
380 };
381
382 struct mips32_common {
383 unsigned int common_magic;
384
385 void *arch_info;
386 struct reg_cache *core_cache;
387 struct mips_ejtag ejtag_info;
388
389 struct mips32_core_regs core_regs;
390
391 enum mips32_isa_mode isa_mode;
392 enum mips32_isa_imp isa_imp;
393 enum mips32_isa_rel isa_rel;
394 enum mips32_fp_imp fp_imp;
395 enum mips32_dsp_imp dsp_imp;
396
397 int fdc;
398 int semihosting;
399
400 /* FPU enabled (cp0.status.cu1) */
401 bool fpu_enabled;
402 /* FPU mode (cp0.status.fr) */
403 bool fpu_in_64bit;
404
405 /* processor identification register */
406 uint32_t prid;
407 /* detected CPU type */
408 const struct cpu_entry *cpu_info;
409 /* CPU specific quirks */
410 uint32_t cpu_quirks;
411
412 /* working area for fastdata access */
413 struct working_area *fast_data_area;
414
415 int bp_scanned;
416 int num_inst_bpoints;
417 int num_data_bpoints;
418 int num_inst_bpoints_avail;
419 int num_data_bpoints_avail;
420 struct mips32_comparator *inst_break_list;
421 struct mips32_comparator *data_break_list;
422
423 /* register cache to processor synchronization */
424 int (*read_core_reg)(struct target *target, unsigned int num);
425 int (*write_core_reg)(struct target *target, unsigned int num);
426 };
427
428 static inline struct mips32_common *
429 target_to_mips32(struct target *target)
430 {
431 return target->arch_info;
432 }
433
434 struct mips32_core_reg {
435 uint32_t num;
436 struct target *target;
437 struct mips32_common *mips32_common;
438 };
439
440 struct mips32_algorithm {
441 unsigned int common_magic;
442 enum mips32_isa_mode isa_mode;
443 };
444
445 #define MIPS32_OP_ADDU 0x21u
446 #define MIPS32_OP_ADDIU 0x09u
447 #define MIPS32_OP_ANDI 0x0Cu
448 #define MIPS32_OP_BEQ 0x04u
449 #define MIPS32_OP_BGTZ 0x07u
450 #define MIPS32_OP_BNE 0x05u
451 #define MIPS32_OP_ADDI 0x08u
452 #define MIPS32_OP_AND 0x24u
453 #define MIPS32_OP_CACHE 0x2Fu
454 #define MIPS32_OP_COP0 0x10u
455 #define MIPS32_OP_J 0x02u
456 #define MIPS32_OP_JR 0x08u
457 #define MIPS32_OP_LUI 0x0Fu
458 #define MIPS32_OP_LW 0x23u
459 #define MIPS32_OP_LB 0x20u
460 #define MIPS32_OP_LBU 0x24u
461 #define MIPS32_OP_LHU 0x25u
462 #define MIPS32_OP_MFHI 0x10u
463 #define MIPS32_OP_MTHI 0x11u
464 #define MIPS32_OP_MFLO 0x12u
465 #define MIPS32_OP_MTLO 0x13u
466 #define MIPS32_OP_RDHWR 0x3Bu
467 #define MIPS32_OP_SB 0x28u
468 #define MIPS32_OP_SH 0x29u
469 #define MIPS32_OP_SW 0x2Bu
470 #define MIPS32_OP_ORI 0x0Du
471 #define MIPS32_OP_XORI 0x0Eu
472 #define MIPS32_OP_XOR 0x26u
473 #define MIPS32_OP_SLTU 0x2Bu
474 #define MIPS32_OP_SRL 0x02u
475 #define MIPS32_OP_SRA 0x03u
476 #define MIPS32_OP_SYNCI 0x1Fu
477 #define MIPS32_OP_SLL 0x00u
478 #define MIPS32_OP_SLTI 0x0Au
479 #define MIPS32_OP_MOVN 0x0Bu
480
481 #define MIPS32_OP_REGIMM 0x01u
482 #define MIPS32_OP_SDBBP 0x3Fu
483 #define MIPS32_OP_SPECIAL 0x00u
484 #define MIPS32_OP_SPECIAL2 0x07u
485 #define MIPS32_OP_SPECIAL3 0x1Fu
486
487 #define MIPS32_COP0_MF 0x00u
488 #define MIPS32_COP0_MT 0x04u
489
490 #define MIPS32_R_INST(opcode, rs, rt, rd, shamt, funct) \
491 (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | ((rd) << 11) | ((shamt) << 6) | (funct))
492 #define MIPS32_I_INST(opcode, rs, rt, immd) \
493 (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | (immd))
494 #define MIPS32_J_INST(opcode, addr) (((opcode) << 26) | (addr))
495
496 #define MIPS32_ISA_NOP 0
497 #define MIPS32_ISA_ADDI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ADDI, src, tar, val)
498 #define MIPS32_ISA_ADDIU(tar, src, val) MIPS32_I_INST(MIPS32_OP_ADDIU, src, tar, val)
499 #define MIPS32_ISA_ADDU(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_ADDU)
500 #define MIPS32_ISA_AND(dst, src, tar) MIPS32_R_INST(0, src, tar, dst, 0, MIPS32_OP_AND)
501 #define MIPS32_ISA_ANDI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ANDI, src, tar, val)
502
503 #define MIPS32_ISA_B(off) MIPS32_ISA_BEQ(0, 0, off)
504 #define MIPS32_ISA_BEQ(src, tar, off) MIPS32_I_INST(MIPS32_OP_BEQ, src, tar, off)
505 #define MIPS32_ISA_BGTZ(reg, off) MIPS32_I_INST(MIPS32_OP_BGTZ, reg, 0, off)
506 #define MIPS32_ISA_BNE(src, tar, off) MIPS32_I_INST(MIPS32_OP_BNE, src, tar, off)
507 #define MIPS32_ISA_CACHE(op, off, base) MIPS32_I_INST(MIPS32_OP_CACHE, base, op, off)
508 #define MIPS32_ISA_J(tar) MIPS32_J_INST(MIPS32_OP_J, (0x0FFFFFFFu & (tar)) >> 2)
509 #define MIPS32_ISA_JR(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_JR)
510
511 #define MIPS32_ISA_LB(reg, off, base) MIPS32_I_INST(MIPS32_OP_LB, base, reg, off)
512 #define MIPS32_ISA_LBU(reg, off, base) MIPS32_I_INST(MIPS32_OP_LBU, base, reg, off)
513 #define MIPS32_ISA_LHU(reg, off, base) MIPS32_I_INST(MIPS32_OP_LHU, base, reg, off)
514 #define MIPS32_ISA_LUI(reg, val) MIPS32_I_INST(MIPS32_OP_LUI, 0, reg, val)
515 #define MIPS32_ISA_LW(reg, off, base) MIPS32_I_INST(MIPS32_OP_LW, base, reg, off)
516
517 #define MIPS32_ISA_MFC0(gpr, cpr, sel) MIPS32_R_INST(MIPS32_OP_COP0, MIPS32_COP0_MF, gpr, cpr, 0, sel)
518 #define MIPS32_ISA_MTC0(gpr, cpr, sel) MIPS32_R_INST(MIPS32_OP_COP0, MIPS32_COP0_MT, gpr, cpr, 0, sel)
519 #define MIPS32_ISA_MFLO(reg) MIPS32_R_INST(0, 0, 0, reg, 0, MIPS32_OP_MFLO)
520 #define MIPS32_ISA_MFHI(reg) MIPS32_R_INST(0, 0, 0, reg, 0, MIPS32_OP_MFHI)
521 #define MIPS32_ISA_MTLO(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_MTLO)
522 #define MIPS32_ISA_MTHI(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_MTHI)
523
524 #define MIPS32_ISA_MOVN(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_MOVN)
525 #define MIPS32_ISA_ORI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ORI, src, tar, val)
526 #define MIPS32_ISA_RDHWR(tar, dst) MIPS32_R_INST(MIPS32_OP_SPECIAL3, 0, tar, dst, 0, MIPS32_OP_RDHWR)
527 #define MIPS32_ISA_SB(reg, off, base) MIPS32_I_INST(MIPS32_OP_SB, base, reg, off)
528 #define MIPS32_ISA_SH(reg, off, base) MIPS32_I_INST(MIPS32_OP_SH, base, reg, off)
529 #define MIPS32_ISA_SW(reg, off, base) MIPS32_I_INST(MIPS32_OP_SW, base, reg, off)
530
531 #define MIPS32_ISA_SLL(dst, src, sa) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, dst, sa, MIPS32_OP_SLL)
532 #define MIPS32_ISA_SLTI(tar, src, val) MIPS32_I_INST(MIPS32_OP_SLTI, src, tar, val)
533 #define MIPS32_ISA_SLTU(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_SLTU)
534 #define MIPS32_ISA_SRA(reg, src, off) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, reg, off, MIPS32_OP_SRA)
535 #define MIPS32_ISA_SRL(reg, src, off) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, reg, off, MIPS32_OP_SRL)
536 #define MIPS32_ISA_SYNC 0xFu
537 #define MIPS32_ISA_SYNCI(off, base) MIPS32_I_INST(MIPS32_OP_REGIMM, base, MIPS32_OP_SYNCI, off)
538
539 #define MIPS32_ISA_XOR(reg, val1, val2) MIPS32_R_INST(0, val1, val2, reg, 0, MIPS32_OP_XOR)
540 #define MIPS32_ISA_XORI(tar, src, val) MIPS32_I_INST(MIPS32_OP_XORI, src, tar, val)
541
542 #define MIPS32_ISA_SYNCI_STEP 0x1 /* reg num od address step size to be used with synci instruction */
543
544 /**
545 * Cache operations definitions
546 * Operation field is 5 bits long :
547 * 1) bits 1..0 hold cache type
548 * 2) bits 4..2 hold operation code
549 */
550 #define MIPS32_CACHE_D_HIT_WRITEBACK ((0x1 << 0) | (0x6 << 2))
551 #define MIPS32_CACHE_I_HIT_INVALIDATE ((0x0 << 0) | (0x4 << 2))
552
553 /* ejtag specific instructions */
554 #define MIPS32_ISA_DRET 0x4200001Fu
555 /* MIPS32_ISA_J_INST(MIPS32_ISA_OP_SPECIAL2, MIPS32_ISA_OP_SDBBP) */
556 #define MIPS32_ISA_SDBBP 0x7000003Fu
557 #define MIPS16_ISA_SDBBP 0xE801u
558
559 /*MICRO MIPS INSTRUCTIONS, see doc MD00582 */
560 #define POOL32A 0X00u
561 #define POOL32AXF 0x3Cu
562 #define POOL32B 0x08u
563 #define POOL32I 0x10u
564 #define MMIPS32_OP_ADDI 0x04u
565 #define MMIPS32_OP_ADDIU 0x0Cu
566 #define MMIPS32_OP_ADDU 0x150u
567 #define MMIPS32_OP_AND 0x250u
568 #define MMIPS32_OP_ANDI 0x34u
569 #define MMIPS32_OP_BEQ 0x25u
570 #define MMIPS32_OP_BGTZ 0x06u
571 #define MMIPS32_OP_BNE 0x2Du
572 #define MMIPS32_OP_CACHE 0x06u
573 #define MMIPS32_OP_J 0x35u
574 #define MMIPS32_OP_JALR 0x03Cu
575 #define MMIPS32_OP_LB 0x07u
576 #define MMIPS32_OP_LBU 0x05u
577 #define MMIPS32_OP_LHU 0x0Du
578 #define MMIPS32_OP_LUI 0x0Du
579 #define MMIPS32_OP_LW 0x3Fu
580 #define MMIPS32_OP_MFC0 0x03u
581 #define MMIPS32_OP_MTC0 0x0Bu
582 #define MMIPS32_OP_MFLO 0x075u
583 #define MMIPS32_OP_MFHI 0x035u
584 #define MMIPS32_OP_MTLO 0x0F5u
585 #define MMIPS32_OP_MTHI 0x0B5u
586 #define MMIPS32_OP_MOVN 0x018u
587 #define MMIPS32_OP_ORI 0x14u
588 #define MMIPS32_OP_RDHWR 0x1ACu
589 #define MMIPS32_OP_SB 0x06u
590 #define MMIPS32_OP_SH 0x0Eu
591 #define MMIPS32_OP_SW 0x3Eu
592 #define MMIPS32_OP_SLTU 0x390u
593 #define MMIPS32_OP_SLL 0x000u
594 #define MMIPS32_OP_SLTI 0x24u
595 #define MMIPS32_OP_SRL 0x040u
596 #define MMIPS32_OP_SYNCI 0x10u
597 #define MMIPS32_OP_XOR 0x310u
598 #define MMIPS32_OP_XORI 0x1Cu
599
600 #define MMIPS32_ADDI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ADDI, tar, src, val)
601 #define MMIPS32_ADDIU(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ADDIU, tar, src, val)
602 #define MMIPS32_ADDU(dst, src, tar) MIPS32_R_INST(POOL32A, tar, src, dst, 0, MMIPS32_OP_ADDU)
603 #define MMIPS32_AND(dst, src, tar) MIPS32_R_INST(POOL32A, tar, src, dst, 0, MMIPS32_OP_AND)
604 #define MMIPS32_ANDI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ANDI, tar, src, val)
605
606 #define MMIPS32_B(off) MMIPS32_BEQ(0, 0, off)
607 #define MMIPS32_BEQ(src, tar, off) MIPS32_I_INST(MMIPS32_OP_BEQ, tar, src, off)
608 #define MMIPS32_BGTZ(reg, off) MIPS32_I_INST(POOL32I, MMIPS32_OP_BGTZ, reg, off)
609 #define MMIPS32_BNE(src, tar, off) MIPS32_I_INST(MMIPS32_OP_BNE, tar, src, off)
610 #define MMIPS32_CACHE(op, off, base) MIPS32_R_INST(POOL32B, op, base, MMIPS32_OP_CACHE << 1, 0, off)
611
612 #define MMIPS32_J(tar) MIPS32_J_INST(MMIPS32_OP_J, ((0x07FFFFFFu & ((tar) >> 1))))
613 #define MMIPS32_JR(reg) MIPS32_R_INST(POOL32A, 0, reg, 0, MMIPS32_OP_JALR, POOL32AXF)
614 #define MMIPS32_LB(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LB, reg, base, off)
615 #define MMIPS32_LBU(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LBU, reg, base, off)
616 #define MMIPS32_LHU(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LHU, reg, base, off)
617 #define MMIPS32_LUI(reg, val) MIPS32_I_INST(POOL32I, MMIPS32_OP_LUI, reg, val)
618 #define MMIPS32_LW(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LW, reg, base, off)
619
620 #define MMIPS32_MFC0(gpr, cpr, sel) MIPS32_R_INST(POOL32A, gpr, cpr, sel, MMIPS32_OP_MFC0, POOL32AXF)
621 #define MMIPS32_MFLO(reg) MIPS32_R_INST(POOL32A, 0, reg, 0, MMIPS32_OP_MFLO, POOL32AXF)
622 #define MMIPS32_MFHI(reg) MIPS32_R_INST(POOL32A, 0, reg, 0, MMIPS32_OP_MFHI, POOL32AXF)
623 #define MMIPS32_MTC0(gpr, cpr, sel) MIPS32_R_INST(POOL32A, gpr, cpr, sel, MMIPS32_OP_MTC0, POOL32AXF)
624 #define MMIPS32_MTLO(reg) MIPS32_R_INST(POOL32A, 0, reg, 0, MMIPS32_OP_MTLO, POOL32AXF)
625 #define MMIPS32_MTHI(reg) MIPS32_R_INST(POOL32A, 0, reg, 0, MMIPS32_OP_MTHI, POOL32AXF)
626
627 #define MMIPS32_MOVN(dst, src, tar) MIPS32_R_INST(POOL32A, tar, src, dst, 0, MMIPS32_OP_MOVN)
628 #define MMIPS32_NOP 0
629 #define MMIPS32_ORI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ORI, tar, src, val)
630 #define MMIPS32_RDHWR(tar, dst) MIPS32_R_INST(POOL32A, dst, tar, 0, MMIPS32_OP_RDHWR, POOL32AXF)
631 #define MMIPS32_SB(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SB, reg, base, off)
632 #define MMIPS32_SH(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SH, reg, base, off)
633 #define MMIPS32_SW(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SW, reg, base, off)
634
635 #define MMIPS32_SRL(reg, src, off) MIPS32_R_INST(POOL32A, reg, src, off, 0, MMIPS32_OP_SRL)
636 #define MMIPS32_SLTU(dst, src, tar) MIPS32_R_INST(POOL32A, tar, src, dst, 0, MMIPS32_OP_SLTU)
637 #define MMIPS32_SYNCI(off, base) MIPS32_I_INST(POOL32I, MMIPS32_OP_SYNCI, base, off)
638 #define MMIPS32_SLL(dst, src, sa) MIPS32_R_INST(POOL32A, dst, src, sa, 0, MMIPS32_OP_SLL)
639 #define MMIPS32_SLTI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_SLTI, tar, src, val)
640 #define MMIPS32_SYNC 0x00001A7Cu /* MIPS32_R_INST(POOL32A, 0, 0, 0, 0x1ADu, POOL32AXF) */
641
642 #define MMIPS32_XOR(reg, val1, val2) MIPS32_R_INST(POOL32A, val1, val2, reg, 0, MMIPS32_OP_XOR)
643 #define MMIPS32_XORI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_XORI, tar, src, val)
644
645 #define MMIPS32_SYNCI_STEP 0x1u /* reg num od address step size to be used with synci instruction */
646
647
648 /* ejtag specific instructions */
649 #define MMIPS32_DRET 0x0000E37Cu /* MIPS32_R_INST(POOL32A, 0, 0, 0, 0x38D, POOL32AXF) */
650 #define MMIPS32_SDBBP 0x0000DB7Cu /* MIPS32_R_INST(POOL32A, 0, 0, 0, 0x1BD, POOL32AXF) */
651 #define MMIPS16_SDBBP 0x46C0u /* POOL16C instr */
652
653 /* instruction code with isa selection */
654 #define MIPS32_NOP 0 /* same for both isa's */
655 #define MIPS32_ADDI(isa, tar, src, val) (isa ? MMIPS32_ADDI(tar, src, val) : MIPS32_ISA_ADDI(tar, src, val))
656 #define MIPS32_ADDIU(isa, tar, src, val) (isa ? MMIPS32_ADDIU(tar, src, val) : MIPS32_ISA_ADDIU(tar, src, val))
657 #define MIPS32_ADDU(isa, dst, src, tar) (isa ? MMIPS32_ADDU(dst, src, tar) : MIPS32_ISA_ADDU(dst, src, tar))
658 #define MIPS32_AND(isa, dst, src, tar) (isa ? MMIPS32_AND(dst, src, tar) : MIPS32_ISA_AND(dst, src, tar))
659 #define MIPS32_ANDI(isa, tar, src, val) (isa ? MMIPS32_ANDI(tar, src, val) : MIPS32_ISA_ANDI(tar, src, val))
660
661 #define MIPS32_B(isa, off) (isa ? MMIPS32_B(off) : MIPS32_ISA_B(off))
662 #define MIPS32_BEQ(isa, src, tar, off) (isa ? MMIPS32_BEQ(src, tar, off) : MIPS32_ISA_BEQ(src, tar, off))
663 #define MIPS32_BGTZ(isa, reg, off) (isa ? MMIPS32_BGTZ(reg, off) : MIPS32_ISA_BGTZ(reg, off))
664 #define MIPS32_BNE(isa, src, tar, off) (isa ? MMIPS32_BNE(src, tar, off) : MIPS32_ISA_BNE(src, tar, off))
665 #define MIPS32_CACHE(isa, op, off, base) (isa ? MMIPS32_CACHE(op, off, base) : MIPS32_ISA_CACHE(op, off, base))
666
667 #define MIPS32_J(isa, tar) (isa ? MMIPS32_J(tar) : MIPS32_ISA_J(tar))
668 #define MIPS32_JR(isa, reg) (isa ? MMIPS32_JR(reg) : MIPS32_ISA_JR(reg))
669 #define MIPS32_LB(isa, reg, off, base) (isa ? MMIPS32_LB(reg, off, base) : MIPS32_ISA_LB(reg, off, base))
670 #define MIPS32_LBU(isa, reg, off, base) (isa ? MMIPS32_LBU(reg, off, base) : MIPS32_ISA_LBU(reg, off, base))
671 #define MIPS32_LHU(isa, reg, off, base) (isa ? MMIPS32_LHU(reg, off, base) : MIPS32_ISA_LHU(reg, off, base))
672 #define MIPS32_LW(isa, reg, off, base) (isa ? MMIPS32_LW(reg, off, base) : MIPS32_ISA_LW(reg, off, base))
673 #define MIPS32_LUI(isa, reg, val) (isa ? MMIPS32_LUI(reg, val) : MIPS32_ISA_LUI(reg, val))
674
675 #define MIPS32_MFC0(isa, gpr, cpr, sel) (isa ? MMIPS32_MFC0(gpr, cpr, sel) : MIPS32_ISA_MFC0(gpr, cpr, sel))
676 #define MIPS32_MTC0(isa, gpr, cpr, sel) (isa ? MMIPS32_MTC0(gpr, cpr, sel) : MIPS32_ISA_MTC0(gpr, cpr, sel))
677 #define MIPS32_MFLO(isa, reg) (isa ? MMIPS32_MFLO(reg) : MIPS32_ISA_MFLO(reg))
678 #define MIPS32_MFHI(isa, reg) (isa ? MMIPS32_MFHI(reg) : MIPS32_ISA_MFHI(reg))
679 #define MIPS32_MTLO(isa, reg) (isa ? MMIPS32_MTLO(reg) : MIPS32_ISA_MTLO(reg))
680 #define MIPS32_MTHI(isa, reg) (isa ? MMIPS32_MTHI(reg) : MIPS32_ISA_MTHI(reg))
681
682 #define MIPS32_MOVN(isa, dst, src, tar) (isa ? MMIPS32_MOVN(dst, src, tar) : MIPS32_ISA_MOVN(dst, src, tar))
683 #define MIPS32_ORI(isa, tar, src, val) (isa ? MMIPS32_ORI(tar, src, val) : MIPS32_ISA_ORI(tar, src, val))
684 #define MIPS32_RDHWR(isa, tar, dst) (isa ? MMIPS32_RDHWR(tar, dst) : MIPS32_ISA_RDHWR(tar, dst))
685 #define MIPS32_SB(isa, reg, off, base) (isa ? MMIPS32_SB(reg, off, base) : MIPS32_ISA_SB(reg, off, base))
686 #define MIPS32_SH(isa, reg, off, base) (isa ? MMIPS32_SH(reg, off, base) : MIPS32_ISA_SH(reg, off, base))
687 #define MIPS32_SW(isa, reg, off, base) (isa ? MMIPS32_SW(reg, off, base) : MIPS32_ISA_SW(reg, off, base))
688
689 #define MIPS32_SLL(isa, dst, src, sa) (isa ? MMIPS32_SLL(dst, src, sa) : MIPS32_ISA_SLL(dst, src, sa))
690 #define MIPS32_SLTI(isa, tar, src, val) (isa ? MMIPS32_SLTI(tar, src, val) : MIPS32_ISA_SLTI(tar, src, val))
691 #define MIPS32_SLTU(isa, dst, src, tar) (isa ? MMIPS32_SLTU(dst, src, tar) : MIPS32_ISA_SLTU(dst, src, tar))
692 #define MIPS32_SRL(isa, reg, src, off) (isa ? MMIPS32_SRL(reg, src, off) : MIPS32_ISA_SRL(reg, src, off))
693
694 #define MIPS32_SYNCI(isa, off, base) (isa ? MMIPS32_SYNCI(off, base) : MIPS32_ISA_SYNCI(off, base))
695 #define MIPS32_SYNC(isa) (isa ? MMIPS32_SYNC : MIPS32_ISA_SYNC)
696 #define MIPS32_XOR(isa, reg, val1, val2) (isa ? MMIPS32_XOR(reg, val1, val2) : MIPS32_ISA_XOR(reg, val1, val2))
697 #define MIPS32_XORI(isa, tar, src, val) (isa ? MMIPS32_XORI(tar, src, val) : MIPS32_ISA_XORI(tar, src, val))
698
699 #define MIPS32_SYNCI_STEP 0x1
700
701 /* ejtag specific instructions */
702 #define MIPS32_DRET(isa) (isa ? MMIPS32_DRET : MIPS32_ISA_DRET)
703 #define MIPS32_SDBBP(isa) (isa ? MMIPS32_SDBBP : MIPS32_ISA_SDBBP)
704
705 #define MIPS16_SDBBP(isa) (isa ? MMIPS16_SDBBP : MIPS16_ISA_SDBBP)
706
707 /*
708 * MIPS32 Config1 Register (CP0 Register 16, Select 1)
709 */
710 #define MIPS32_CFG1_M 0x80000000 /* Config2 implemented */
711 #define MIPS32_CFG1_MMUSMASK 0x7e000000 /* mmu size - 1 */
712 #define MIPS32_CFG1_MMUSSHIFT 25
713 #define MIPS32_CFG1_ISMASK 0x01c00000 /* icache lines 64<<n */
714 #define MIPS32_CFG1_ISSHIFT 22
715 #define MIPS32_CFG1_ILMASK 0x00380000 /* icache line size 2<<n */
716 #define MIPS32_CFG1_ILSHIFT 19
717 #define MIPS32_CFG1_IAMASK 0x00070000 /* icache ways - 1 */
718 #define MIPS32_CFG1_IASHIFT 16
719 #define MIPS32_CFG1_DSMASK 0x0000e000 /* dcache lines 64<<n */
720 #define MIPS32_CFG1_DSSHIFT 13
721 #define MIPS32_CFG1_DLMASK 0x00001c00 /* dcache line size 2<<n */
722 #define MIPS32_CFG1_DLSHIFT 10
723 #define MIPS32_CFG1_DAMASK 0x00000380 /* dcache ways - 1 */
724 #define MIPS32_CFG1_DASHIFT 7
725 #define MIPS32_CFG1_C2 0x00000040 /* Coprocessor 2 present */
726 #define MIPS32_CFG1_MD 0x00000020 /* MDMX implemented */
727 #define MIPS32_CFG1_PC 0x00000010 /* performance counters implemented */
728 #define MIPS32_CFG1_WR 0x00000008 /* watch registers implemented */
729 #define MIPS32_CFG1_CA 0x00000004 /* compression (mips16) implemented */
730 #define MIPS32_CFG1_EP 0x00000002 /* ejtag implemented */
731 #define MIPS32_CFG1_FP 0x00000001 /* fpu implemented */
732
733 /*
734 * MIPS32 Coprocessor 0 register numbers
735 */
736 #define MIPS32_C0_INDEX 0
737 #define MIPS32_C0_INX 0
738 #define MIPS32_C0_RANDOM 1
739 #define MIPS32_C0_RAND 1
740 #define MIPS32_C0_ENTRYLO0 2
741 #define MIPS32_C0_TLBLO0 2
742 #define MIPS32_C0_ENTRYLO1 3
743 #define MIPS32_C0_TLBLO1 3
744 #define MIPS32_C0_CONTEXT 4
745 #define MIPS32_C0_CTXT 4
746 #define MIPS32_C0_PAGEMASK 5
747 #define MIPS32_C0_PAGEGRAIN (5, 1)
748 #define MIPS32_C0_WIRED 6
749 #define MIPS32_C0_HWRENA 7
750 #define MIPS32_C0_BADVADDR 8
751 #define MIPS32_C0_VADDR 8
752 #define MIPS32_C0_COUNT 9
753 #define MIPS32_C0_ENTRYHI 10
754 #define MIPS32_C0_TLBHI 10
755 #define MIPS32_C0_GUESTCTL1 10
756 #define MIPS32_C0_COMPARE 11
757 #define MIPS32_C0_STATUS 12
758 #define MIPS32_C0_SR 12
759 #define MIPS32_C0_INTCTL (12, 1)
760 #define MIPS32_C0_SRSCTL (12, 2)
761 #define MIPS32_C0_SRSMAP (12, 3)
762 #define MIPS32_C0_CAUSE 13
763 #define MIPS32_C0_CR 13
764 #define MIPS32_C0_EPC 14
765 #define MIPS32_C0_PRID 15
766 #define MIPS32_C0_EBASE (15, 1)
767 #define MIPS32_C0_CONFIG 16
768 #define MIPS32_C0_CONFIG0 (16, 0)
769 #define MIPS32_C0_CONFIG1 (16, 1)
770 #define MIPS32_C0_CONFIG2 (16, 2)
771 #define MIPS32_C0_CONFIG3 (16, 3)
772 #define MIPS32_C0_LLADDR 17
773 #define MIPS32_C0_WATCHLO 18
774 #define MIPS32_C0_WATCHHI 19
775 #define MIPS32_C0_DEBUG 23
776 #define MIPS32_C0_DEPC 24
777 #define MIPS32_C0_PERFCNT 25
778 #define MIPS32_C0_ERRCTL 26
779 #define MIPS32_C0_CACHEERR 27
780 #define MIPS32_C0_TAGLO 28
781 #define MIPS32_C0_ITAGLO 28
782 #define MIPS32_C0_DTAGLO (28, 2)
783 #define MIPS32_C0_TAGLO2 (28, 4)
784 #define MIPS32_C0_DATALO (28, 1)
785 #define MIPS32_C0_IDATALO (28, 1)
786 #define MIPS32_C0_DDATALO (28, 3)
787 #define MIPS32_C0_DATALO2 (28, 5)
788 #define MIPS32_C0_TAGHI 29
789 #define MIPS32_C0_ITAGHI 29
790 #define MIPS32_C0_DATAHI (29, 1)
791 #define MIPS32_C0_ERRPC 30
792 #define MIPS32_C0_DESAVE 31
793
794 /*
795 * MIPS32 MMU types
796 */
797 #define MIPS32_MMU_TLB 1
798 #define MIPS32_MMU_BAT 2
799 #define MIPS32_MMU_FIXED 3
800 #define MIPS32_MMU_DUAL_VTLB_FTLB 4
801
802 extern const struct command_registration mips32_command_handlers[];
803
804 int mips32_arch_state(struct target *target);
805
806 int mips32_init_arch_info(struct target *target,
807 struct mips32_common *mips32, struct jtag_tap *tap);
808
809 int mips32_restore_context(struct target *target);
810 int mips32_save_context(struct target *target);
811
812 struct reg_cache *mips32_build_reg_cache(struct target *target);
813
814 int mips32_run_algorithm(struct target *target,
815 int num_mem_params, struct mem_param *mem_params,
816 int num_reg_params, struct reg_param *reg_params,
817 target_addr_t entry_point, target_addr_t exit_point,
818 unsigned int timeout_ms, void *arch_info);
819
820 int mips32_configure_break_unit(struct target *target);
821
822 int mips32_enable_interrupts(struct target *target, int enable);
823
824 int mips32_examine(struct target *target);
825
826 int mips32_cpu_probe(struct target *target);
827
828 int mips32_read_config_regs(struct target *target);
829
830 int mips32_register_commands(struct command_context *cmd_ctx);
831
832 int mips32_get_gdb_reg_list(struct target *target,
833 struct reg **reg_list[], int *reg_list_size,
834 enum target_register_class reg_class);
835 int mips32_checksum_memory(struct target *target, target_addr_t address,
836 uint32_t count, uint32_t *checksum);
837 int mips32_blank_check_memory(struct target *target,
838 struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value);
839
840 #endif /* OPENOCD_TARGET_MIPS32_H */

Linking to existing account procedure

If you already have an account and want to add another login method you MUST first sign in with your existing account and then change URL to read https://review.openocd.org/login/?link to get to this page again but this time it'll work for linking. Thank you.

SSH host keys fingerprints

1024 SHA256:YKx8b7u5ZWdcbp7/4AeXNaqElP49m6QrwfXaqQGJAOk gerrit-code-review@openocd.zylin.com (DSA)
384 SHA256:jHIbSQa4REvwCFG4cq5LBlBLxmxSqelQPem/EXIrxjk gerrit-code-review@openocd.org (ECDSA)
521 SHA256:UAOPYkU9Fjtcao0Ul/Rrlnj/OsQvt+pgdYSZ4jOYdgs gerrit-code-review@openocd.org (ECDSA)
256 SHA256:A13M5QlnozFOvTllybRZH6vm7iSt0XLxbA48yfc2yfY gerrit-code-review@openocd.org (ECDSA)
256 SHA256:spYMBqEYoAOtK7yZBrcwE8ZpYt6b68Cfh9yEVetvbXg gerrit-code-review@openocd.org (ED25519)
+--[ED25519 256]--+
|=..              |
|+o..   .         |
|*.o   . .        |
|+B . . .         |
|Bo. = o S        |
|Oo.+ + =         |
|oB=.* = . o      |
| =+=.+   + E     |
|. .=o   . o      |
+----[SHA256]-----+
2048 SHA256:0Onrb7/PHjpo6iVZ7xQX2riKN83FJ3KGU0TvI0TaFG4 gerrit-code-review@openocd.zylin.com (RSA)