jtag: linuxgpiod: drop extra parenthesis
[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 MIPS32NUMDSPREGS 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 mips32_cp0 {
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 (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 /* The cp0 registers implemented on different processor cores could be different, too.
401 * Here you can see most of the registers are implemented on interAptiv, which is
402 * a 2c4t SMP processor, it has more features than M-class processors, like vpe
403 * and other config registers for multhreading. */
404 uint32_t cp0_mask;
405
406 /* FPU enabled (cp0.status.cu1) */
407 bool fpu_enabled;
408 /* FPU mode (cp0.status.fr) */
409 bool fpu_in_64bit;
410
411 /* processor identification register */
412 uint32_t prid;
413 /* detected CPU type */
414 const struct cpu_entry *cpu_info;
415 /* CPU specific quirks */
416 uint32_t cpu_quirks;
417
418 /* working area for fastdata access */
419 struct working_area *fast_data_area;
420
421 int bp_scanned;
422 int num_inst_bpoints;
423 int num_data_bpoints;
424 int num_inst_bpoints_avail;
425 int num_data_bpoints_avail;
426 struct mips32_comparator *inst_break_list;
427 struct mips32_comparator *data_break_list;
428
429 /* register cache to processor synchronization */
430 int (*read_core_reg)(struct target *target, unsigned int num);
431 int (*write_core_reg)(struct target *target, unsigned int num);
432 };
433
434 static inline struct mips32_common *
435 target_to_mips32(struct target *target)
436 {
437 return target->arch_info;
438 }
439
440 struct mips32_core_reg {
441 uint32_t num;
442 struct target *target;
443 struct mips32_common *mips32_common;
444 };
445
446 struct mips32_algorithm {
447 unsigned int common_magic;
448 enum mips32_isa_mode isa_mode;
449 };
450
451 #define MIPS32_OP_ADDU 0x21u
452 #define MIPS32_OP_ADDIU 0x09u
453 #define MIPS32_OP_ANDI 0x0Cu
454 #define MIPS32_OP_BEQ 0x04u
455 #define MIPS32_OP_BGTZ 0x07u
456 #define MIPS32_OP_BNE 0x05u
457 #define MIPS32_OP_ADD 0x20u
458 #define MIPS32_OP_ADDI 0x08u
459 #define MIPS32_OP_AND 0x24u
460 #define MIPS32_OP_CACHE 0x2Fu
461 #define MIPS32_OP_COP0 0x10u
462 #define MIPS32_OP_COP1 0x11u
463 #define MIPS32_OP_J 0x02u
464 #define MIPS32_OP_JR 0x08u
465 #define MIPS32_OP_LUI 0x0Fu
466 #define MIPS32_OP_LW 0x23u
467 #define MIPS32_OP_LWC1 0x31u
468 #define MIPS32_OP_LDC1 0x35u
469 #define MIPS32_OP_LB 0x20u
470 #define MIPS32_OP_LBU 0x24u
471 #define MIPS32_OP_LHU 0x25u
472 #define MIPS32_OP_MFHI 0x10u
473 #define MIPS32_OP_MTHI 0x11u
474 #define MIPS32_OP_MFLO 0x12u
475 #define MIPS32_OP_MTLO 0x13u
476 #define MIPS32_OP_MUL 0x02u
477 #define MIPS32_OP_RDHWR 0x3Bu
478 #define MIPS32_OP_SB 0x28u
479 #define MIPS32_OP_SH 0x29u
480 #define MIPS32_OP_SW 0x2Bu
481 #define MIPS32_OP_ORI 0x0Du
482 #define MIPS32_OP_XORI 0x0Eu
483 #define MIPS32_OP_XOR 0x26u
484 #define MIPS32_OP_SLTU 0x2Bu
485 #define MIPS32_OP_SRL 0x02u
486 #define MIPS32_OP_SRA 0x03u
487 #define MIPS32_OP_SYNCI 0x1Fu
488 #define MIPS32_OP_SLL 0x00u
489 #define MIPS32_OP_SLLV 0x04u
490 #define MIPS32_OP_SLTI 0x0Au
491 #define MIPS32_OP_MOVN 0x0Bu
492 #define MIPS32_OP_SWC1 0x39u
493 #define MIPS32_OP_SDC1 0x3Du
494
495 #define MIPS32_OP_REGIMM 0x01u
496 #define MIPS32_OP_SDBBP 0x3Fu
497 #define MIPS32_OP_SPECIAL 0x00u
498 #define MIPS32_OP_SPECIAL2 0x07u
499 #define MIPS32_OP_SPECIAL3 0x1Fu
500
501 #define MIPS32_COP_MF 0x00u
502 #define MIPS32_COP_CF 0x02u
503 #define MIPS32_COP_MFH 0x03u
504 #define MIPS32_COP_MT 0x04u
505 #define MIPS32_COP_MTH 0x07u
506
507 #define MIPS32_R_INST(opcode, rs, rt, rd, shamt, funct) \
508 (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | ((rd) << 11) | ((shamt) << 6) | (funct))
509 #define MIPS32_I_INST(opcode, rs, rt, immd) \
510 (((opcode) << 26) | ((rs) << 21) | ((rt) << 16) | (immd))
511 #define MIPS32_J_INST(opcode, addr) (((opcode) << 26) | (addr))
512
513 #define MIPS32_ISA_NOP 0
514 #define MIPS32_ISA_ADD(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_ADD)
515 #define MIPS32_ISA_ADDI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ADDI, src, tar, val)
516 #define MIPS32_ISA_ADDIU(tar, src, val) MIPS32_I_INST(MIPS32_OP_ADDIU, src, tar, val)
517 #define MIPS32_ISA_ADDU(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_ADDU)
518 #define MIPS32_ISA_AND(dst, src, tar) MIPS32_R_INST(0, src, tar, dst, 0, MIPS32_OP_AND)
519 #define MIPS32_ISA_ANDI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ANDI, src, tar, val)
520
521 #define MIPS32_ISA_B(off) MIPS32_ISA_BEQ(0, 0, off)
522 #define MIPS32_ISA_BEQ(src, tar, off) MIPS32_I_INST(MIPS32_OP_BEQ, src, tar, off)
523 #define MIPS32_ISA_BGTZ(reg, off) MIPS32_I_INST(MIPS32_OP_BGTZ, reg, 0, off)
524 #define MIPS32_ISA_BNE(src, tar, off) MIPS32_I_INST(MIPS32_OP_BNE, src, tar, off)
525 #define MIPS32_ISA_CACHE(op, off, base) MIPS32_I_INST(MIPS32_OP_CACHE, base, op, off)
526 #define MIPS32_ISA_CFC1(gpr, cpr) MIPS32_R_INST(MIPS32_OP_COP1, MIPS32_COP_CF, gpr, cpr, 0, 0)
527 #define MIPS32_ISA_J(tar) MIPS32_J_INST(MIPS32_OP_J, (0x0FFFFFFFu & (tar)) >> 2)
528 #define MIPS32_ISA_JR(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_JR)
529 #define MIPS32_ISA_JRHB(reg) MIPS32_R_INST(0, reg, 0, 0, 0x10, MIPS32_OP_JR)
530
531 #define MIPS32_ISA_LB(reg, off, base) MIPS32_I_INST(MIPS32_OP_LB, base, reg, off)
532 #define MIPS32_ISA_LBU(reg, off, base) MIPS32_I_INST(MIPS32_OP_LBU, base, reg, off)
533 #define MIPS32_ISA_LHU(reg, off, base) MIPS32_I_INST(MIPS32_OP_LHU, base, reg, off)
534 #define MIPS32_ISA_LUI(reg, val) MIPS32_I_INST(MIPS32_OP_LUI, 0, reg, val)
535 #define MIPS32_ISA_LW(reg, off, base) MIPS32_I_INST(MIPS32_OP_LW, base, reg, off)
536 #define MIPS32_ISA_LWC1(reg, off, base) MIPS32_I_INST(MIPS32_OP_LWC1, base, reg, off)
537 #define MIPS32_ISA_LDC1(reg, off, base) MIPS32_I_INST(MIPS32_OP_LDC1, base, reg, off)
538
539 #define MIPS32_ISA_MFC0(gpr, cpr, sel) MIPS32_R_INST(MIPS32_OP_COP0, MIPS32_COP_MF, gpr, cpr, 0, sel)
540 #define MIPS32_ISA_MTC0(gpr, cpr, sel) MIPS32_R_INST(MIPS32_OP_COP0, MIPS32_COP_MT, gpr, cpr, 0, sel)
541 #define MIPS32_ISA_MFC1(gpr, cpr) MIPS32_R_INST(MIPS32_OP_COP1, MIPS32_COP_MF, gpr, cpr, 0, 0)
542 #define MIPS32_ISA_MFHC1(gpr, cpr) MIPS32_R_INST(MIPS32_OP_COP1, MIPS32_COP_MFH, gpr, cpr, 0, 0)
543 #define MIPS32_ISA_MTC1(gpr, cpr) MIPS32_R_INST(MIPS32_OP_COP1, MIPS32_COP_MT, gpr, cpr, 0, 0)
544 #define MIPS32_ISA_MTHC1(gpr, cpr) MIPS32_R_INST(MIPS32_OP_COP1, MIPS32_COP_MTH, gpr, cpr, 0, 0)
545 #define MIPS32_ISA_MFLO(reg) MIPS32_R_INST(0, 0, 0, reg, 0, MIPS32_OP_MFLO)
546 #define MIPS32_ISA_MFHI(reg) MIPS32_R_INST(0, 0, 0, reg, 0, MIPS32_OP_MFHI)
547 #define MIPS32_ISA_MTLO(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_MTLO)
548 #define MIPS32_ISA_MTHI(reg) MIPS32_R_INST(0, reg, 0, 0, 0, MIPS32_OP_MTHI)
549
550 #define MIPS32_ISA_MUL(dst, src, t) MIPS32_R_INST(28, src, t, dst, 0, MIPS32_OP_MUL)
551 #define MIPS32_ISA_MOVN(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_MOVN)
552 #define MIPS32_ISA_OR(dst, src, val) MIPS32_R_INST(0, src, val, dst, 0, 37)
553 #define MIPS32_ISA_ORI(tar, src, val) MIPS32_I_INST(MIPS32_OP_ORI, src, tar, val)
554 #define MIPS32_ISA_RDHWR(tar, dst) MIPS32_R_INST(MIPS32_OP_SPECIAL3, 0, tar, dst, 0, MIPS32_OP_RDHWR)
555 #define MIPS32_ISA_SB(reg, off, base) MIPS32_I_INST(MIPS32_OP_SB, base, reg, off)
556 #define MIPS32_ISA_SH(reg, off, base) MIPS32_I_INST(MIPS32_OP_SH, base, reg, off)
557 #define MIPS32_ISA_SW(reg, off, base) MIPS32_I_INST(MIPS32_OP_SW, base, reg, off)
558 #define MIPS32_ISA_SWC1(reg, off, base) MIPS32_I_INST(MIPS32_OP_SWC1, base, reg, off)
559 #define MIPS32_ISA_SDC1(reg, off, base) MIPS32_I_INST(MIPS32_OP_SDC1, base, reg, off)
560
561 #define MIPS32_ISA_SLL(dst, src, sa) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, dst, sa, MIPS32_OP_SLL)
562 #define MIPS32_ISA_SLLV(dst, src, sa) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, dst, sa, MIPS32_OP_SLLV)
563 #define MIPS32_ISA_SLTI(tar, src, val) MIPS32_I_INST(MIPS32_OP_SLTI, src, tar, val)
564 #define MIPS32_ISA_SLTU(dst, src, tar) MIPS32_R_INST(MIPS32_OP_SPECIAL, src, tar, dst, 0, MIPS32_OP_SLTU)
565 #define MIPS32_ISA_SRA(reg, src, off) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, reg, off, MIPS32_OP_SRA)
566 #define MIPS32_ISA_SRL(reg, src, off) MIPS32_R_INST(MIPS32_OP_SPECIAL, 0, src, reg, off, MIPS32_OP_SRL)
567 #define MIPS32_ISA_SYNC 0xFu
568 #define MIPS32_ISA_SYNCI(off, base) MIPS32_I_INST(MIPS32_OP_REGIMM, base, MIPS32_OP_SYNCI, off)
569
570 #define MIPS32_ISA_XOR(reg, val1, val2) MIPS32_R_INST(0, val1, val2, reg, 0, MIPS32_OP_XOR)
571 #define MIPS32_ISA_XORI(tar, src, val) MIPS32_I_INST(MIPS32_OP_XORI, src, tar, val)
572
573 #define MIPS32_ISA_SYNCI_STEP 0x1 /* reg num od address step size to be used with synci instruction */
574
575 /**
576 * Cache operations definitions
577 * Operation field is 5 bits long :
578 * 1) bits 1..0 hold cache type
579 * 2) bits 4..2 hold operation code
580 */
581 #define MIPS32_CACHE_D_HIT_WRITEBACK ((0x1 << 0) | (0x6 << 2))
582 #define MIPS32_CACHE_I_HIT_INVALIDATE ((0x0 << 0) | (0x4 << 2))
583
584 /* ejtag specific instructions */
585 #define MIPS32_ISA_DRET 0x4200001Fu
586 /* MIPS32_ISA_J_INST(MIPS32_ISA_OP_SPECIAL2, MIPS32_ISA_OP_SDBBP) */
587 #define MIPS32_ISA_SDBBP 0x7000003Fu
588 #define MIPS16_ISA_SDBBP 0xE801u
589
590 /*MICRO MIPS INSTRUCTIONS, see doc MD00582 */
591 #define MMIPS32_POOL32A 0x00u
592 #define MMIPS32_POOL32F 0x15u
593 #define MMIPS32_POOL32FXF 0x3Bu
594 #define MMIPS32_POOL32AXF 0x3Cu
595 #define MMIPS32_POOL32B 0x08u
596 #define MMIPS32_POOL32I 0x10u
597 #define MMIPS32_OP_ADDI 0x04u
598 #define MMIPS32_OP_ADDIU 0x0Cu
599 #define MMIPS32_OP_ADDU 0x150u
600 #define MMIPS32_OP_AND 0x250u
601 #define MMIPS32_OP_ANDI 0x34u
602 #define MMIPS32_OP_BEQ 0x25u
603 #define MMIPS32_OP_BGTZ 0x06u
604 #define MMIPS32_OP_BNE 0x2Du
605 #define MMIPS32_OP_CACHE 0x06u
606 #define MMIPS32_OP_CFC1 0x40u
607 #define MMIPS32_OP_J 0x35u
608 #define MMIPS32_OP_JALR 0x03Cu
609 #define MMIPS32_OP_JALRHB 0x07Cu
610 #define MMIPS32_OP_LB 0x07u
611 #define MMIPS32_OP_LBU 0x05u
612 #define MMIPS32_OP_LHU 0x0Du
613 #define MMIPS32_OP_LUI 0x0Du
614 #define MMIPS32_OP_LW 0x3Fu
615 #define MMIPS32_OP_LWC1 0x27u
616 #define MMIPS32_OP_LDC1 0x2Fu
617 #define MMIPS32_OP_MFC0 0x03u
618 #define MMIPS32_OP_MFC1 0x80u
619 #define MMIPS32_OP_MFHC1 0xC0u
620 #define MMIPS32_OP_MTC0 0x0Bu
621 #define MMIPS32_OP_MTC1 0xA0u
622 #define MMIPS32_OP_MTHC1 0xE0u
623 #define MMIPS32_OP_MFLO 0x075u
624 #define MMIPS32_OP_MFHI 0x035u
625 #define MMIPS32_OP_MTLO 0x0F5u
626 #define MMIPS32_OP_MTHI 0x0B5u
627 #define MMIPS32_OP_MOVN 0x018u
628 #define MMIPS32_OP_ORI 0x14u
629 #define MMIPS32_OP_RDHWR 0x1ACu
630 #define MMIPS32_OP_SB 0x06u
631 #define MMIPS32_OP_SH 0x0Eu
632 #define MMIPS32_OP_SW 0x3Eu
633 #define MMIPS32_OP_SWC1 0x26u
634 #define MMIPS32_OP_SDC1 0x2Eu
635 #define MMIPS32_OP_SLTU 0x390u
636 #define MMIPS32_OP_SLL 0x000u
637 #define MMIPS32_OP_SLTI 0x24u
638 #define MMIPS32_OP_SRL 0x040u
639 #define MMIPS32_OP_SYNCI 0x10u
640 #define MMIPS32_OP_XOR 0x310u
641 #define MMIPS32_OP_XORI 0x1Cu
642
643 #define MMIPS32_ADDI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ADDI, tar, src, val)
644 #define MMIPS32_ADDIU(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ADDIU, tar, src, val)
645 #define MMIPS32_ADDU(dst, src, tar) MIPS32_R_INST(MMIPS32_POOL32A, tar, src, dst, 0, MMIPS32_OP_ADDU)
646 #define MMIPS32_AND(dst, src, tar) MIPS32_R_INST(MMIPS32_POOL32A, tar, src, dst, 0, MMIPS32_OP_AND)
647 #define MMIPS32_ANDI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ANDI, tar, src, val)
648
649 #define MMIPS32_B(off) MMIPS32_BEQ(0, 0, off)
650 #define MMIPS32_BEQ(src, tar, off) MIPS32_I_INST(MMIPS32_OP_BEQ, tar, src, off)
651 #define MMIPS32_BGTZ(reg, off) MIPS32_I_INST(MMIPS32_POOL32I, MMIPS32_OP_BGTZ, reg, off)
652 #define MMIPS32_BNE(src, tar, off) MIPS32_I_INST(MMIPS32_OP_BNE, tar, src, off)
653 #define MMIPS32_CACHE(op, off, base) MIPS32_R_INST(MMIPS32_POOL32B, op, base, MMIPS32_OP_CACHE << 1, 0, off)
654 #define MMIPS32_CFC1(gpr, cpr) MIPS32_R_INST(MMIPS32_POOL32F, gpr, cpr, 0, MMIPS32_OP_CFC1, MMIPS32_POOL32FXF)
655
656 #define MMIPS32_J(tar) MIPS32_J_INST(MMIPS32_OP_J, ((0x07FFFFFFu & ((tar) >> 1))))
657 #define MMIPS32_JR(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_JALR, MMIPS32_POOL32AXF)
658 #define MMIPS32_JRHB(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_JALRHB, MMIPS32_POOL32AXF)
659 #define MMIPS32_LB(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LB, reg, base, off)
660 #define MMIPS32_LBU(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LBU, reg, base, off)
661 #define MMIPS32_LHU(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LHU, reg, base, off)
662 #define MMIPS32_LUI(reg, val) MIPS32_I_INST(MMIPS32_POOL32I, MMIPS32_OP_LUI, reg, val)
663 #define MMIPS32_LW(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LW, reg, base, off)
664 #define MMIPS32_LWC1(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LWC1, reg, base, off)
665 #define MMIPS32_LDC1(reg, off, base) MIPS32_I_INST(MMIPS32_OP_LDC1, reg, base, off)
666
667 #define MMIPS32_MFC0(gpr, cpr, sel) MIPS32_R_INST(MMIPS32_POOL32A, gpr, cpr, sel,\
668 MMIPS32_OP_MFC0, MMIPS32_POOL32AXF)
669 #define MMIPS32_MFC1(gpr, cpr) MIPS32_R_INST(MMIPS32_POOL32F, gpr, cpr, 0, MMIPS32_OP_MFC1, MMIPS32_POOL32FXF)
670 #define MMIPS32_MFHC1(gpr, cpr) MIPS32_R_INST(MMIPS32_POOL32F, gpr, cpr, 0, MMIPS32_OP_MFHC1, MMIPS32_POOL32FXF)
671 #define MMIPS32_MFLO(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_MFLO, MMIPS32_POOL32AXF)
672 #define MMIPS32_MFHI(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_MFHI, MMIPS32_POOL32AXF)
673 #define MMIPS32_MTC0(gpr, cpr, sel) MIPS32_R_INST(MMIPS32_POOL32A, gpr, cpr, sel,\
674 MMIPS32_OP_MTC0, MMIPS32_POOL32AXF)
675 #define MMIPS32_MTC1(gpr, cpr) MIPS32_R_INST(MMIPS32_POOL32F, gpr, cpr, 0, MMIPS32_OP_MTC1, MMIPS32_POOL32FXF)
676 #define MMIPS32_MTHC1(gpr, cpr) MIPS32_R_INST(MMIPS32_POOL32F, gpr, cpr, 0, MMIPS32_OP_MTHC1, MMIPS32_POOL32FXF)
677 #define MMIPS32_MTLO(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_MTLO, MMIPS32_POOL32AXF)
678 #define MMIPS32_MTHI(reg) MIPS32_R_INST(MMIPS32_POOL32A, 0, reg, 0, MMIPS32_OP_MTHI, MMIPS32_POOL32AXF)
679
680 #define MMIPS32_MOVN(dst, src, tar) MIPS32_R_INST(MMIPS32_POOL32A, tar, src, dst, 0, MMIPS32_OP_MOVN)
681 #define MMIPS32_NOP 0
682 #define MMIPS32_ORI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_ORI, tar, src, val)
683 #define MMIPS32_RDHWR(tar, dst) MIPS32_R_INST(MMIPS32_POOL32A, dst, tar, 0, MMIPS32_OP_RDHWR, MMIPS32_POOL32AXF)
684 #define MMIPS32_SB(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SB, reg, base, off)
685 #define MMIPS32_SH(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SH, reg, base, off)
686 #define MMIPS32_SW(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SW, reg, base, off)
687 #define MMIPS32_SWC1(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SWC1, reg, base, off)
688 #define MMIPS32_SDC1(reg, off, base) MIPS32_I_INST(MMIPS32_OP_SDC1, reg, base, off)
689
690 #define MMIPS32_SRL(reg, src, off) MIPS32_R_INST(MMIPS32_POOL32A, reg, src, off, 0, MMIPS32_OP_SRL)
691 #define MMIPS32_SLTU(dst, src, tar) MIPS32_R_INST(MMIPS32_POOL32A, tar, src, dst, 0, MMIPS32_OP_SLTU)
692 #define MMIPS32_SYNCI(off, base) MIPS32_I_INST(MMIPS32_POOL32I, MMIPS32_OP_SYNCI, base, off)
693 #define MMIPS32_SLL(dst, src, sa) MIPS32_R_INST(MMIPS32_POOL32A, dst, src, sa, 0, MMIPS32_OP_SLL)
694 #define MMIPS32_SLLV(dst, src, sa) MIPS32_R_INST(MMIPS32_POOL32A, dst, src, sa, 0, MMIPS32_OP_SLLV)
695 #define MMIPS32_SLTI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_SLTI, tar, src, val)
696 #define MMIPS32_SYNC 0x00001A7Cu /* MIPS32_R_INST(MMIPS32_POOL32A, 0, 0, 0, 0x1ADu, MMIPS32_POOL32AXF) */
697
698 #define MMIPS32_XOR(reg, val1, val2) MIPS32_R_INST(MMIPS32_POOL32A, val1, val2, reg, 0, MMIPS32_OP_XOR)
699 #define MMIPS32_XORI(tar, src, val) MIPS32_I_INST(MMIPS32_OP_XORI, tar, src, val)
700
701 #define MMIPS32_SYNCI_STEP 0x1u /* reg num od address step size to be used with synci instruction */
702
703
704 /* ejtag specific instructions */
705 #define MMIPS32_DRET 0x0000E37Cu /* MIPS32_R_INST(MMIPS32_POOL32A, 0, 0, 0, 0x38D, MMIPS32_POOL32AXF) */
706 #define MMIPS32_SDBBP 0x0000DB7Cu /* MIPS32_R_INST(MMIPS32_POOL32A, 0, 0, 0, 0x1BD, MMIPS32_POOL32AXF) */
707 #define MMIPS16_SDBBP 0x46C0u /* POOL16C instr */
708
709 /* instruction code with isa selection */
710 #define MIPS32_NOP 0 /* same for both isa's */
711 #define MIPS32_ADDI(isa, tar, src, val) (isa ? MMIPS32_ADDI(tar, src, val) : MIPS32_ISA_ADDI(tar, src, val))
712 #define MIPS32_ADDIU(isa, tar, src, val) (isa ? MMIPS32_ADDIU(tar, src, val) : MIPS32_ISA_ADDIU(tar, src, val))
713 #define MIPS32_ADDU(isa, dst, src, tar) (isa ? MMIPS32_ADDU(dst, src, tar) : MIPS32_ISA_ADDU(dst, src, tar))
714 #define MIPS32_AND(isa, dst, src, tar) (isa ? MMIPS32_AND(dst, src, tar) : MIPS32_ISA_AND(dst, src, tar))
715 #define MIPS32_ANDI(isa, tar, src, val) (isa ? MMIPS32_ANDI(tar, src, val) : MIPS32_ISA_ANDI(tar, src, val))
716
717 #define MIPS32_B(isa, off) (isa ? MMIPS32_B(off) : MIPS32_ISA_B(off))
718 #define MIPS32_BEQ(isa, src, tar, off) (isa ? MMIPS32_BEQ(src, tar, off) : MIPS32_ISA_BEQ(src, tar, off))
719 #define MIPS32_BGTZ(isa, reg, off) (isa ? MMIPS32_BGTZ(reg, off) : MIPS32_ISA_BGTZ(reg, off))
720 #define MIPS32_BNE(isa, src, tar, off) (isa ? MMIPS32_BNE(src, tar, off) : MIPS32_ISA_BNE(src, tar, off))
721 #define MIPS32_CACHE(isa, op, off, base) (isa ? MMIPS32_CACHE(op, off, base) : MIPS32_ISA_CACHE(op, off, base))
722 #define MIPS32_CFC1(isa, gpr, cpr) (isa ? MMIPS32_CFC1(gpr, cpr) : MIPS32_ISA_CFC1(gpr, cpr))
723
724 #define MIPS32_J(isa, tar) (isa ? MMIPS32_J(tar) : MIPS32_ISA_J(tar))
725 #define MIPS32_JR(isa, reg) (isa ? MMIPS32_JR(reg) : MIPS32_ISA_JR(reg))
726 #define MIPS32_JRHB(isa, reg) (isa ? MMIPS32_JRHB(reg) : MIPS32_ISA_JRHB(reg))
727 #define MIPS32_LB(isa, reg, off, base) (isa ? MMIPS32_LB(reg, off, base) : MIPS32_ISA_LB(reg, off, base))
728 #define MIPS32_LBU(isa, reg, off, base) (isa ? MMIPS32_LBU(reg, off, base) : MIPS32_ISA_LBU(reg, off, base))
729 #define MIPS32_LHU(isa, reg, off, base) (isa ? MMIPS32_LHU(reg, off, base) : MIPS32_ISA_LHU(reg, off, base))
730 #define MIPS32_LW(isa, reg, off, base) (isa ? MMIPS32_LW(reg, off, base) : MIPS32_ISA_LW(reg, off, base))
731 #define MIPS32_LWC1(isa, reg, off, base) (isa ? MMIPS32_LWC1(reg, off, base) : MIPS32_ISA_LWC1(reg, off, base))
732 #define MIPS32_LUI(isa, reg, val) (isa ? MMIPS32_LUI(reg, val) : MIPS32_ISA_LUI(reg, val))
733
734 #define MIPS32_MFC0(isa, gpr, cpr, sel) (isa ? MMIPS32_MFC0(gpr, cpr, sel) : MIPS32_ISA_MFC0(gpr, cpr, sel))
735 #define MIPS32_MTC0(isa, gpr, cpr, sel) (isa ? MMIPS32_MTC0(gpr, cpr, sel) : MIPS32_ISA_MTC0(gpr, cpr, sel))
736 #define MIPS32_MFC1(isa, gpr, cpr) (isa ? MMIPS32_MFC1(gpr, cpr) : MIPS32_ISA_MFC1(gpr, cpr))
737 #define MIPS32_MFHC1(isa, gpr, cpr) (isa ? MMIPS32_MFHC1(gpr, cpr) : MIPS32_ISA_MFHC1(gpr, cpr))
738 #define MIPS32_MTC1(isa, gpr, cpr) (isa ? MMIPS32_MTC1(gpr, cpr) : MIPS32_ISA_MTC1(gpr, cpr))
739 #define MIPS32_MTHC1(isa, gpr, cpr) (isa ? MMIPS32_MTHC1(gpr, cpr) : MIPS32_ISA_MTHC1(gpr, cpr))
740 #define MIPS32_MFLO(isa, reg) (isa ? MMIPS32_MFLO(reg) : MIPS32_ISA_MFLO(reg))
741 #define MIPS32_MFHI(isa, reg) (isa ? MMIPS32_MFHI(reg) : MIPS32_ISA_MFHI(reg))
742 #define MIPS32_MTLO(isa, reg) (isa ? MMIPS32_MTLO(reg) : MIPS32_ISA_MTLO(reg))
743 #define MIPS32_MTHI(isa, reg) (isa ? MMIPS32_MTHI(reg) : MIPS32_ISA_MTHI(reg))
744
745 #define MIPS32_MUL(isa, dst, src, t) (MIPS32_ISA_MUL(dst, src, t))
746 #define MIPS32_MOVN(isa, dst, src, tar) (isa ? MMIPS32_MOVN(dst, src, tar) : MIPS32_ISA_MOVN(dst, src, tar))
747 #define MIPS32_ORI(isa, tar, src, val) (isa ? MMIPS32_ORI(tar, src, val) : MIPS32_ISA_ORI(tar, src, val))
748 #define MIPS32_RDHWR(isa, tar, dst) (isa ? MMIPS32_RDHWR(tar, dst) : MIPS32_ISA_RDHWR(tar, dst))
749 #define MIPS32_SB(isa, reg, off, base) (isa ? MMIPS32_SB(reg, off, base) : MIPS32_ISA_SB(reg, off, base))
750 #define MIPS32_SH(isa, reg, off, base) (isa ? MMIPS32_SH(reg, off, base) : MIPS32_ISA_SH(reg, off, base))
751 #define MIPS32_SW(isa, reg, off, base) (isa ? MMIPS32_SW(reg, off, base) : MIPS32_ISA_SW(reg, off, base))
752 #define MIPS32_SWC1(isa, reg, off, base) (isa ? MMIPS32_SWC1(reg, off, base) : MIPS32_ISA_SWC1(reg, off, base))
753 #define MIPS32_SDC1(isa, reg, off, base) (isa ? MMIPS32_SDC1(reg, off, base) : MIPS32_ISA_SDC1(reg, off, base))
754
755 #define MIPS32_SLL(isa, dst, src, sa) (isa ? MMIPS32_SLL(dst, src, sa) : MIPS32_ISA_SLL(dst, src, sa))
756 #define MIPS32_EHB(isa) (isa ? MMIPS32_SLL(0, 0, 3) : MIPS32_ISA_SLL(0, 0, 3))
757 #define MIPS32_SLLV(isa, dst, src, sa) (MIPS32_ISA_SLLV(dst, src, sa))
758 #define MIPS32_SLTI(isa, tar, src, val) (isa ? MMIPS32_SLTI(tar, src, val) : MIPS32_ISA_SLTI(tar, src, val))
759 #define MIPS32_SLTU(isa, dst, src, tar) (isa ? MMIPS32_SLTU(dst, src, tar) : MIPS32_ISA_SLTU(dst, src, tar))
760 #define MIPS32_SRL(isa, reg, src, off) (isa ? MMIPS32_SRL(reg, src, off) : MIPS32_ISA_SRL(reg, src, off))
761
762 #define MIPS32_SYNCI(isa, off, base) (isa ? MMIPS32_SYNCI(off, base) : MIPS32_ISA_SYNCI(off, base))
763 #define MIPS32_SYNC(isa) (isa ? MMIPS32_SYNC : MIPS32_ISA_SYNC)
764 #define MIPS32_XOR(isa, reg, val1, val2) (isa ? MMIPS32_XOR(reg, val1, val2) : MIPS32_ISA_XOR(reg, val1, val2))
765 #define MIPS32_XORI(isa, tar, src, val) (isa ? MMIPS32_XORI(tar, src, val) : MIPS32_ISA_XORI(tar, src, val))
766
767 #define MIPS32_SYNCI_STEP 0x1
768
769 /* ejtag specific instructions */
770 #define MIPS32_DRET(isa) (isa ? MMIPS32_DRET : MIPS32_ISA_DRET)
771 #define MIPS32_SDBBP(isa) (isa ? MMIPS32_SDBBP : MIPS32_ISA_SDBBP)
772
773 #define MIPS16_SDBBP(isa) (isa ? MMIPS16_SDBBP : MIPS16_ISA_SDBBP)
774
775 /* ejtag specific instructions */
776 #define MICRO_MIPS32_SDBBP 0x000046C0
777 #define MICRO_MIPS_SDBBP 0x46C0
778 #define MIPS32_DSP_ENABLE 0x1000000
779
780 #define MIPS32_S_INST(rs, rac, opcode) \
781 (((rs) << 21) | ((rac) << 11) | (opcode))
782
783 #define MIPS32_DSP_R_INST(rt, immd, opcode, extrw) \
784 ((0x1F << 26) | ((immd) << 16) | ((rt) << 11) | ((opcode) << 6) | (extrw))
785 #define MIPS32_DSP_W_INST(rs, immd, opcode, extrw) \
786 ((0x1F << 26) | ((rs) << 21) | ((immd) << 11) | ((opcode) << 6) | (extrw))
787
788 #define MIPS32_DSP_MFHI(reg, ac) MIPS32_R_INST(0, ac, 0, reg, 0, MIPS32_OP_MFHI)
789 #define MIPS32_DSP_MFLO(reg, ac) MIPS32_R_INST(0, ac, 0, reg, 0, MIPS32_OP_MFLO)
790 #define MIPS32_DSP_MTLO(reg, ac) MIPS32_S_INST(reg, ac, MIPS32_OP_MTLO)
791 #define MIPS32_DSP_MTHI(reg, ac) MIPS32_S_INST(reg, ac, MIPS32_OP_MTHI)
792 #define MIPS32_DSP_RDDSP(rt, mask) MIPS32_DSP_R_INST(rt, mask, 0x12, 0x38)
793 #define MIPS32_DSP_WRDSP(rs, mask) MIPS32_DSP_W_INST(rs, mask, 0x13, 0x38)
794
795
796 /*
797 * MIPS32 Config1 Register (CP0 Register 16, Select 1)
798 */
799 #define MIPS32_CFG1_M 0x80000000 /* Config2 implemented */
800 #define MIPS32_CFG1_MMUSMASK 0x7e000000 /* mmu size - 1 */
801 #define MIPS32_CFG1_MMUSSHIFT 25
802 #define MIPS32_CFG1_ISMASK 0x01c00000 /* icache lines 64<<n */
803 #define MIPS32_CFG1_ISSHIFT 22
804 #define MIPS32_CFG1_ILMASK 0x00380000 /* icache line size 2<<n */
805 #define MIPS32_CFG1_ILSHIFT 19
806 #define MIPS32_CFG1_IAMASK 0x00070000 /* icache ways - 1 */
807 #define MIPS32_CFG1_IASHIFT 16
808 #define MIPS32_CFG1_DSMASK 0x0000e000 /* dcache lines 64<<n */
809 #define MIPS32_CFG1_DSSHIFT 13
810 #define MIPS32_CFG1_DLMASK 0x00001c00 /* dcache line size 2<<n */
811 #define MIPS32_CFG1_DLSHIFT 10
812 #define MIPS32_CFG1_DAMASK 0x00000380 /* dcache ways - 1 */
813 #define MIPS32_CFG1_DASHIFT 7
814 #define MIPS32_CFG1_C2 0x00000040 /* Coprocessor 2 present */
815 #define MIPS32_CFG1_MD 0x00000020 /* MDMX implemented */
816 #define MIPS32_CFG1_PC 0x00000010 /* performance counters implemented */
817 #define MIPS32_CFG1_WR 0x00000008 /* watch registers implemented */
818 #define MIPS32_CFG1_CA 0x00000004 /* compression (mips16) implemented */
819 #define MIPS32_CFG1_EP 0x00000002 /* ejtag implemented */
820 #define MIPS32_CFG1_FP 0x00000001 /* fpu implemented */
821
822 /*
823 * MIPS32 Coprocessor 0 register numbers
824 */
825 #define MIPS32_C0_INDEX 0
826 #define MIPS32_C0_INX 0
827 #define MIPS32_C0_RANDOM 1
828 #define MIPS32_C0_RAND 1
829 #define MIPS32_C0_ENTRYLO0 2
830 #define MIPS32_C0_TLBLO0 2
831 #define MIPS32_C0_ENTRYLO1 3
832 #define MIPS32_C0_TLBLO1 3
833 #define MIPS32_C0_CONTEXT 4
834 #define MIPS32_C0_CTXT 4
835 #define MIPS32_C0_PAGEMASK 5
836 #define MIPS32_C0_PAGEGRAIN (5, 1)
837 #define MIPS32_C0_WIRED 6
838 #define MIPS32_C0_HWRENA 7
839 #define MIPS32_C0_BADVADDR 8
840 #define MIPS32_C0_VADDR 8
841 #define MIPS32_C0_COUNT 9
842 #define MIPS32_C0_ENTRYHI 10
843 #define MIPS32_C0_TLBHI 10
844 #define MIPS32_C0_GUESTCTL1 10
845 #define MIPS32_C0_COMPARE 11
846 #define MIPS32_C0_STATUS 12
847 #define MIPS32_C0_SR 12
848 #define MIPS32_C0_INTCTL (12, 1)
849 #define MIPS32_C0_SRSCTL (12, 2)
850 #define MIPS32_C0_SRSMAP (12, 3)
851 #define MIPS32_C0_CAUSE 13
852 #define MIPS32_C0_CR 13
853 #define MIPS32_C0_EPC 14
854 #define MIPS32_C0_PRID 15
855 #define MIPS32_C0_EBASE (15, 1)
856 #define MIPS32_C0_CONFIG 16
857 #define MIPS32_C0_CONFIG0 (16, 0)
858 #define MIPS32_C0_CONFIG1 (16, 1)
859 #define MIPS32_C0_CONFIG2 (16, 2)
860 #define MIPS32_C0_CONFIG3 (16, 3)
861 #define MIPS32_C0_LLADDR 17
862 #define MIPS32_C0_WATCHLO 18
863 #define MIPS32_C0_WATCHHI 19
864 #define MIPS32_C0_DEBUG 23
865 #define MIPS32_C0_DEPC 24
866 #define MIPS32_C0_PERFCNT 25
867 #define MIPS32_C0_ERRCTL 26
868 #define MIPS32_C0_CACHEERR 27
869 #define MIPS32_C0_TAGLO 28
870 #define MIPS32_C0_ITAGLO 28
871 #define MIPS32_C0_DTAGLO (28, 2)
872 #define MIPS32_C0_TAGLO2 (28, 4)
873 #define MIPS32_C0_DATALO (28, 1)
874 #define MIPS32_C0_IDATALO (28, 1)
875 #define MIPS32_C0_DDATALO (28, 3)
876 #define MIPS32_C0_DATALO2 (28, 5)
877 #define MIPS32_C0_TAGHI 29
878 #define MIPS32_C0_ITAGHI 29
879 #define MIPS32_C0_DATAHI (29, 1)
880 #define MIPS32_C0_ERRPC 30
881 #define MIPS32_C0_DESAVE 31
882
883 /*
884 * MIPS32 MMU types
885 */
886 #define MIPS32_MMU_TLB 1
887 #define MIPS32_MMU_BAT 2
888 #define MIPS32_MMU_FIXED 3
889 #define MIPS32_MMU_DUAL_VTLB_FTLB 4
890
891 extern const struct command_registration mips32_command_handlers[];
892
893 int mips32_arch_state(struct target *target);
894
895 int mips32_init_arch_info(struct target *target,
896 struct mips32_common *mips32, struct jtag_tap *tap);
897
898 int mips32_restore_context(struct target *target);
899 int mips32_save_context(struct target *target);
900
901 struct reg_cache *mips32_build_reg_cache(struct target *target);
902
903 int mips32_run_algorithm(struct target *target,
904 int num_mem_params, struct mem_param *mem_params,
905 int num_reg_params, struct reg_param *reg_params,
906 target_addr_t entry_point, target_addr_t exit_point,
907 unsigned int timeout_ms, void *arch_info);
908
909 int mips32_configure_break_unit(struct target *target);
910
911 int mips32_enable_interrupts(struct target *target, int enable);
912
913 int mips32_examine(struct target *target);
914
915 int mips32_cpu_probe(struct target *target);
916
917 int mips32_read_config_regs(struct target *target);
918
919 int mips32_register_commands(struct command_context *cmd_ctx);
920
921 int mips32_get_gdb_reg_list(struct target *target,
922 struct reg **reg_list[], int *reg_list_size,
923 enum target_register_class reg_class);
924 int mips32_checksum_memory(struct target *target, target_addr_t address,
925 uint32_t count, uint32_t *checksum);
926 int mips32_blank_check_memory(struct target *target,
927 struct target_memory_check_block *blocks, int num_blocks, uint8_t erased_value);
928
929 bool mips32_cpu_support_sync(struct mips_ejtag *ejtag_info);
930 bool mips32_cpu_support_hazard_barrier(struct mips_ejtag *ejtag_info);
931
932 #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)