2 * MIPS emulation for qemu: CPU initialisation routines.
4 * Copyright (c) 2004-2005 Jocelyn Mayer
5 * Copyright (c) 2007 Herve Poussineau
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, see <http://www.gnu.org/licenses/>.
21 #include "fpu_helper.h"
23 /* CPU / CPU family specific config register values. */
25 /* Have config1, uncached coherency */
26 #define MIPS_CONFIG0 \
27 ((1U << CP0C0_M) | (0x2 << CP0C0_K0))
29 /* Have config2, no coprocessor2 attached, no MDMX support attached,
30 no performance counters, watch registers present,
31 no code compression, EJTAG present, no FPU */
32 #define MIPS_CONFIG1 \
34 (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) | \
35 (1 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) | \
38 /* Have config3, no tertiary/secondary caches implemented */
39 #define MIPS_CONFIG2 \
42 /* No config4, no DSP ASE, no large physaddr (PABITS),
43 no external interrupt controller, no vectored interrupts,
44 no 1kb pages, no SmartMIPS ASE, no trace logic */
45 #define MIPS_CONFIG3 \
46 ((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) | \
47 (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) | \
48 (0 << CP0C3_SM) | (0 << CP0C3_TL))
50 #define MIPS_CONFIG4 \
53 #define MIPS_CONFIG5 \
56 /*****************************************************************************/
57 /* MIPS CPU definitions */
58 const mips_def_t mips_defs[] =
62 .CP0_PRid = 0x00018000,
63 .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT),
64 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
65 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
66 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
68 .CP0_Config2 = MIPS_CONFIG2,
69 .CP0_Config3 = MIPS_CONFIG3,
70 .CP0_LLAddr_rw_bitmask = 0,
71 .CP0_LLAddr_shift = 4,
74 .CP0_Status_rw_bitmask = 0x1278FF17,
77 .insn_flags = CPU_MIPS32R1,
78 .mmu_type = MMU_TYPE_R4000,
82 .CP0_PRid = 0x00018300,
83 /* Config1 implemented, fixed mapping MMU,
84 no virtual icache, uncached coherency. */
85 .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT),
86 .CP0_Config1 = MIPS_CONFIG1 |
87 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
88 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
90 .CP0_Config2 = MIPS_CONFIG2,
91 .CP0_Config3 = MIPS_CONFIG3,
92 .CP0_LLAddr_rw_bitmask = 0,
93 .CP0_LLAddr_shift = 4,
96 .CP0_Status_rw_bitmask = 0x1258FF17,
99 .insn_flags = CPU_MIPS32R1 | ASE_MIPS16,
100 .mmu_type = MMU_TYPE_FMT,
104 .CP0_PRid = 0x00018400,
105 .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT),
106 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
107 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
108 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
110 .CP0_Config2 = MIPS_CONFIG2,
111 .CP0_Config3 = MIPS_CONFIG3,
112 .CP0_LLAddr_rw_bitmask = 0,
113 .CP0_LLAddr_shift = 4,
116 .CP0_Status_rw_bitmask = 0x1278FF17,
119 .insn_flags = CPU_MIPS32R1,
120 .mmu_type = MMU_TYPE_R4000,
124 .CP0_PRid = 0x00018500,
125 .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT),
126 .CP0_Config1 = MIPS_CONFIG1 |
127 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
128 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
130 .CP0_Config2 = MIPS_CONFIG2,
131 .CP0_Config3 = MIPS_CONFIG3,
132 .CP0_LLAddr_rw_bitmask = 0,
133 .CP0_LLAddr_shift = 4,
136 .CP0_Status_rw_bitmask = 0x1258FF17,
139 .insn_flags = CPU_MIPS32R1 | ASE_MIPS16,
140 .mmu_type = MMU_TYPE_FMT,
144 .CP0_PRid = 0x00019000,
145 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
146 (MMU_TYPE_R4000 << CP0C0_MT),
147 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
148 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
149 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
151 .CP0_Config2 = MIPS_CONFIG2,
152 .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
153 .CP0_LLAddr_rw_bitmask = 0,
154 .CP0_LLAddr_shift = 4,
157 .CP0_Status_rw_bitmask = 0x1278FF17,
160 .insn_flags = CPU_MIPS32R2,
161 .mmu_type = MMU_TYPE_R4000,
165 .CP0_PRid = 0x00019100,
166 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
167 (MMU_TYPE_FMT << CP0C0_MT),
168 .CP0_Config1 = MIPS_CONFIG1 |
169 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
170 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
172 .CP0_Config2 = MIPS_CONFIG2,
173 .CP0_Config3 = MIPS_CONFIG3,
174 .CP0_LLAddr_rw_bitmask = 0,
175 .CP0_LLAddr_shift = 4,
178 .CP0_Status_rw_bitmask = 0x1258FF17,
181 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16,
182 .mmu_type = MMU_TYPE_FMT,
186 .CP0_PRid = 0x00019300,
187 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
188 (MMU_TYPE_R4000 << CP0C0_MT),
189 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
190 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
191 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
193 .CP0_Config2 = MIPS_CONFIG2,
194 .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
195 .CP0_LLAddr_rw_bitmask = 0,
196 .CP0_LLAddr_shift = 4,
199 /* No DSP implemented. */
200 .CP0_Status_rw_bitmask = 0x1278FF1F,
203 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16,
204 .mmu_type = MMU_TYPE_R4000,
208 .CP0_PRid = 0x00019600,
209 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
210 (MMU_TYPE_R4000 << CP0C0_MT),
211 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
212 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
213 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
215 .CP0_Config2 = MIPS_CONFIG2,
216 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_DSPP) | (0 << CP0C3_VInt),
217 .CP0_LLAddr_rw_bitmask = 0,
218 .CP0_LLAddr_shift = 4,
221 /* we have a DSP, but no FPU */
222 .CP0_Status_rw_bitmask = 0x1378FF1F,
225 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP,
226 .mmu_type = MMU_TYPE_R4000,
230 .CP0_PRid = 0x00019300,
231 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
232 (MMU_TYPE_R4000 << CP0C0_MT),
233 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
234 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
235 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
237 .CP0_Config2 = MIPS_CONFIG2,
238 .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt),
239 .CP0_LLAddr_rw_bitmask = 0,
240 .CP0_LLAddr_shift = 4,
243 /* No DSP implemented. */
244 .CP0_Status_rw_bitmask = 0x3678FF1F,
245 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
246 (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID),
248 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
251 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16,
252 .mmu_type = MMU_TYPE_R4000,
256 .CP0_PRid = 0x00019500,
257 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
258 (MMU_TYPE_R4000 << CP0C0_MT),
259 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
260 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
261 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
263 .CP0_Config2 = MIPS_CONFIG2,
264 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_VInt) | (1 << CP0C3_MT) |
266 .CP0_LLAddr_rw_bitmask = 0,
267 .CP0_LLAddr_shift = 0,
270 .CP0_Status_rw_bitmask = 0x3778FF1F,
271 .CP0_TCStatus_rw_bitmask = (0 << CP0TCSt_TCU3) | (0 << CP0TCSt_TCU2) |
272 (1 << CP0TCSt_TCU1) | (1 << CP0TCSt_TCU0) |
273 (0 << CP0TCSt_TMX) | (1 << CP0TCSt_DT) |
274 (1 << CP0TCSt_DA) | (1 << CP0TCSt_A) |
275 (0x3 << CP0TCSt_TKSU) | (1 << CP0TCSt_IXMT) |
276 (0xff << CP0TCSt_TASID),
277 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
278 (1 << FCR0_D) | (1 << FCR0_S) | (0x95 << FCR0_PRID),
280 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
281 .CP0_SRSCtl = (0xf << CP0SRSCtl_HSS),
282 .CP0_SRSConf0_rw_bitmask = 0x3fffffff,
283 .CP0_SRSConf0 = (1U << CP0SRSC0_M) | (0x3fe << CP0SRSC0_SRS3) |
284 (0x3fe << CP0SRSC0_SRS2) | (0x3fe << CP0SRSC0_SRS1),
285 .CP0_SRSConf1_rw_bitmask = 0x3fffffff,
286 .CP0_SRSConf1 = (1U << CP0SRSC1_M) | (0x3fe << CP0SRSC1_SRS6) |
287 (0x3fe << CP0SRSC1_SRS5) | (0x3fe << CP0SRSC1_SRS4),
288 .CP0_SRSConf2_rw_bitmask = 0x3fffffff,
289 .CP0_SRSConf2 = (1U << CP0SRSC2_M) | (0x3fe << CP0SRSC2_SRS9) |
290 (0x3fe << CP0SRSC2_SRS8) | (0x3fe << CP0SRSC2_SRS7),
291 .CP0_SRSConf3_rw_bitmask = 0x3fffffff,
292 .CP0_SRSConf3 = (1U << CP0SRSC3_M) | (0x3fe << CP0SRSC3_SRS12) |
293 (0x3fe << CP0SRSC3_SRS11) | (0x3fe << CP0SRSC3_SRS10),
294 .CP0_SRSConf4_rw_bitmask = 0x3fffffff,
295 .CP0_SRSConf4 = (0x3fe << CP0SRSC4_SRS15) |
296 (0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13),
299 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_MT,
300 .mmu_type = MMU_TYPE_R4000,
304 .CP0_PRid = 0x00019700,
305 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
306 (MMU_TYPE_R4000 << CP0C0_MT),
307 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
308 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
309 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) |
311 .CP0_Config2 = MIPS_CONFIG2,
312 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_DSP2P) | (1 << CP0C3_DSPP) |
314 .CP0_LLAddr_rw_bitmask = 0,
315 .CP0_LLAddr_shift = 4,
318 .CP0_Status_rw_bitmask = 0x3778FF1F,
319 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
320 (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID),
322 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
325 .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_DSP_R2,
326 .mmu_type = MMU_TYPE_R4000,
330 .CP0_PRid = 0x00019b00,
331 /* Config1 implemented, fixed mapping MMU,
332 no virtual icache, uncached coherency. */
333 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_KU) | (0x2 << CP0C0_K23) |
334 (0x1 << CP0C0_AR) | (MMU_TYPE_FMT << CP0C0_MT),
335 .CP0_Config1 = MIPS_CONFIG1,
336 .CP0_Config2 = MIPS_CONFIG2,
337 .CP0_Config3 = MIPS_CONFIG3 | (0x2 << CP0C3_ISA) | (1 << CP0C3_VInt),
338 .CP0_LLAddr_rw_bitmask = 0,
339 .CP0_LLAddr_shift = 4,
342 .CP0_Status_rw_bitmask = 0x1258FF17,
345 .insn_flags = CPU_MIPS32R2 | ASE_MICROMIPS,
346 .mmu_type = MMU_TYPE_FMT,
350 /* This is the TLB-based MMU core. */
351 .CP0_PRid = 0x00019c00,
352 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) |
353 (MMU_TYPE_R4000 << CP0C0_MT),
354 .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) |
355 (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) |
356 (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA),
357 .CP0_Config2 = MIPS_CONFIG2,
358 .CP0_Config3 = MIPS_CONFIG3 | (0x2 << CP0C3_ISA) | (0 << CP0C3_VInt),
359 .CP0_LLAddr_rw_bitmask = 0,
360 .CP0_LLAddr_shift = 4,
363 .CP0_Status_rw_bitmask = 0x1278FF17,
366 .insn_flags = CPU_MIPS32R2 | ASE_MICROMIPS,
367 .mmu_type = MMU_TYPE_R4000,
371 * Config3: VZ, CTXTC, CDMM, TL
377 .CP0_PRid = 0x0001A800,
378 .CP0_Config0 = MIPS_CONFIG0 | (1 << CP0C0_MM) | (1 << CP0C0_AR) |
379 (MMU_TYPE_R4000 << CP0C0_MT),
380 .CP0_Config1 = MIPS_CONFIG1 | (0x3F << CP0C1_MMU) |
381 (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
382 (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
383 (1 << CP0C1_PC) | (1 << CP0C1_FP),
384 .CP0_Config2 = MIPS_CONFIG2,
385 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) |
386 (1 << CP0C3_CMGCR) | (1 << CP0C3_MSAP) |
387 (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_SC) |
388 (1 << CP0C3_PW) | (1 << CP0C3_ULRI) | (1 << CP0C3_RXI) |
389 (1 << CP0C3_LPA) | (1 << CP0C3_VInt),
390 .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (2 << CP0C4_IE) |
391 (0x1c << CP0C4_KScrExist),
392 .CP0_Config4_rw_bitmask = 0,
393 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_EVA) | (1 << CP0C5_MVH) |
394 (1 << CP0C5_LLB) | (1 << CP0C5_MRP),
395 .CP0_Config5_rw_bitmask = (1 << CP0C5_K) | (1 << CP0C5_CV) |
396 (1 << CP0C5_MSAEn) | (1 << CP0C5_UFE) |
397 (1 << CP0C5_FRE) | (1 << CP0C5_UFR),
398 .CP0_LLAddr_rw_bitmask = 0,
399 .CP0_LLAddr_shift = 0,
402 .CP0_Status_rw_bitmask = 0x3C68FF1F,
403 .CP0_PageGrain_rw_bitmask = (1U << CP0PG_RIE) | (1 << CP0PG_XIE) |
404 (1 << CP0PG_ELPA) | (1 << CP0PG_IEC),
405 .CP0_EBaseWG_rw_bitmask = (1 << CP0EBase_WG),
406 .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_UFRP) | (1 << FCR0_HAS2008) |
407 (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
408 (1 << FCR0_D) | (1 << FCR0_S) | (0x03 << FCR0_PRID),
409 .CP1_fcr31 = (1 << FCR31_ABS2008) | (1 << FCR31_NAN2008),
410 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
413 .insn_flags = CPU_MIPS32R5 | ASE_MSA,
414 .mmu_type = MMU_TYPE_R4000,
417 /* A generic CPU supporting MIPS32 Release 6 ISA.
418 FIXME: Support IEEE 754-2008 FP.
419 Eventually this should be replaced by a real CPU model. */
420 .name = "mips32r6-generic",
421 .CP0_PRid = 0x00010000,
422 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AR) |
423 (MMU_TYPE_R4000 << CP0C0_MT),
424 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) |
425 (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
426 (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
427 (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
428 .CP0_Config2 = MIPS_CONFIG2,
429 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_BP) | (1 << CP0C3_BI) |
430 (2 << CP0C3_ISA) | (1 << CP0C3_ULRI) |
431 (1 << CP0C3_RXI) | (1U << CP0C3_M),
432 .CP0_Config4 = MIPS_CONFIG4 | (0xfc << CP0C4_KScrExist) |
433 (3 << CP0C4_IE) | (1U << CP0C4_M),
434 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_XNP) | (1 << CP0C5_LLB),
435 .CP0_Config5_rw_bitmask = (1 << CP0C5_SBRI) | (1 << CP0C5_FRE) |
437 .CP0_LLAddr_rw_bitmask = 0,
438 .CP0_LLAddr_shift = 0,
441 .CP0_Status_rw_bitmask = 0x3058FF1F,
442 .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) |
444 .CP0_PageGrain_rw_bitmask = 0,
445 .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_HAS2008) | (1 << FCR0_F64) |
446 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
447 (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV),
448 .CP1_fcr31 = (1 << FCR31_ABS2008) | (1 << FCR31_NAN2008),
449 .CP1_fcr31_rw_bitmask = 0x0103FFFF,
452 .insn_flags = CPU_MIPS32R6 | ASE_MICROMIPS,
453 .mmu_type = MMU_TYPE_R4000,
457 .CP0_PRid = 0x00010000,
458 .CP0_Config0 = MIPS_CONFIG0 | (1 << CP0C0_MM) | (0x2 << CP0C0_AR) |
459 (MMU_TYPE_R4000 << CP0C0_MT),
460 .CP0_Config1 = (1U << CP0C1_M) | (15 << CP0C1_MMU) | (2 << CP0C1_IS) |
461 (4 << CP0C1_IL) | (3 << CP0C1_IA) | (2 << CP0C1_DS) |
462 (4 << CP0C1_DL) | (3 << CP0C1_DA) | (1 << CP0C1_PC) |
464 .CP0_Config2 = MIPS_CONFIG2,
465 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_CMGCR) |
466 (1 << CP0C3_BI) | (1 << CP0C3_SC) | (3 << CP0C3_MMAR) |
467 (1 << CP0C3_ISA_ON_EXC) | (1 << CP0C3_ISA) |
468 (1 << CP0C3_ULRI) | (1 << CP0C3_RXI) |
469 (1 << CP0C3_DSP2P) | (1 << CP0C3_DSPP) |
470 (1 << CP0C3_CTXTC) | (1 << CP0C3_VInt) |
471 (1 << CP0C3_CDMM) | (1 << CP0C3_MT) | (1 << CP0C3_TL),
472 .CP0_Config4 = MIPS_CONFIG4 | (0xfc << CP0C4_KScrExist) |
473 (2 << CP0C4_IE) | (1U << CP0C4_M),
474 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_MVH) | (1 << CP0C5_LLB),
475 .CP0_Config5_rw_bitmask = (1 << CP0C5_SBRI) | (1 << CP0C5_FRE) |
477 .CP0_LLAddr_rw_bitmask = 0,
478 .CP0_LLAddr_shift = 0,
481 .CP0_Status_rw_bitmask = 0x3158FF1F,
482 .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) |
484 .CP0_PageGrain_rw_bitmask = 0,
485 .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_HAS2008) | (1 << FCR0_F64) |
486 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
487 (1 << FCR0_S) | (0x02 << FCR0_PRID) | (0x0 << FCR0_REV),
488 .CP1_fcr31 = (1 << FCR31_ABS2008) | (1 << FCR31_NAN2008),
491 .insn_flags = CPU_NANOMIPS32 | ASE_DSP | ASE_DSP_R2 | ASE_DSP_R3 |
493 .mmu_type = MMU_TYPE_R4000,
495 #if defined(TARGET_MIPS64)
498 .CP0_PRid = 0x00000400,
499 /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */
500 .CP0_Config0 = (2 << CP0C0_Impl) | (1 << CP0C0_IC) | (1 << CP0C0_DC) |
502 /* Note: Config1 is only used internally, the R4000 has only Config0. */
503 .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU),
504 .CP0_LLAddr_rw_bitmask = 0xFFFFFFFF,
505 .CP0_LLAddr_shift = 4,
508 .CP0_Status_rw_bitmask = 0x3678FFFF,
509 /* The R4000 has a full 64bit FPU but doesn't use the fcr0 bits. */
510 .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x0 << FCR0_REV),
512 .CP1_fcr31_rw_bitmask = 0x0183FFFF,
515 .insn_flags = CPU_MIPS3,
516 .mmu_type = MMU_TYPE_R4000,
520 .CP0_PRid = 0x00005400,
521 /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */
522 .CP0_Config0 = (2 << CP0C0_Impl) | (1 << CP0C0_IC) | (1 << CP0C0_DC) |
524 .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU),
525 .CP0_LLAddr_rw_bitmask = 0xFFFFFFFFL,
526 .CP0_LLAddr_shift = 4,
529 .CP0_Status_rw_bitmask = 0x3678FFFF,
530 /* The VR5432 has a full 64bit FPU but doesn't use the fcr0 bits. */
531 .CP1_fcr0 = (0x54 << FCR0_PRID) | (0x0 << FCR0_REV),
533 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
536 .insn_flags = CPU_VR54XX,
537 .mmu_type = MMU_TYPE_R4000,
541 .CP0_PRid = 0x00018100,
542 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
543 (MMU_TYPE_R4000 << CP0C0_MT),
544 .CP0_Config1 = MIPS_CONFIG1 | (31 << CP0C1_MMU) |
545 (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
546 (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
547 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
548 .CP0_Config2 = MIPS_CONFIG2,
549 .CP0_Config3 = MIPS_CONFIG3,
550 .CP0_LLAddr_rw_bitmask = 0,
551 .CP0_LLAddr_shift = 4,
554 .CP0_Status_rw_bitmask = 0x12F8FFFF,
557 .insn_flags = CPU_MIPS64R1,
558 .mmu_type = MMU_TYPE_R4000,
562 .CP0_PRid = 0x00018100,
563 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
564 (MMU_TYPE_R4000 << CP0C0_MT),
565 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) |
566 (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
567 (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
568 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
569 .CP0_Config2 = MIPS_CONFIG2,
570 .CP0_Config3 = MIPS_CONFIG3,
571 .CP0_LLAddr_rw_bitmask = 0,
572 .CP0_LLAddr_shift = 4,
575 .CP0_Status_rw_bitmask = 0x36F8FFFF,
576 /* The 5Kf has F64 / L / W but doesn't use the fcr0 bits. */
577 .CP1_fcr0 = (1 << FCR0_D) | (1 << FCR0_S) |
578 (0x81 << FCR0_PRID) | (0x0 << FCR0_REV),
580 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
583 .insn_flags = CPU_MIPS64R1,
584 .mmu_type = MMU_TYPE_R4000,
588 /* We emulate a later version of the 20Kc, earlier ones had a broken
590 .CP0_PRid = 0x000182a0,
591 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) |
592 (MMU_TYPE_R4000 << CP0C0_MT) | (1 << CP0C0_VI),
593 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (47 << CP0C1_MMU) |
594 (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
595 (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
596 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
597 .CP0_Config2 = MIPS_CONFIG2,
598 .CP0_Config3 = MIPS_CONFIG3,
599 .CP0_LLAddr_rw_bitmask = 0,
600 .CP0_LLAddr_shift = 0,
603 .CP0_Status_rw_bitmask = 0x36FBFFFF,
604 /* The 20Kc has F64 / L / W but doesn't use the fcr0 bits. */
605 .CP1_fcr0 = (1 << FCR0_3D) | (1 << FCR0_PS) |
606 (1 << FCR0_D) | (1 << FCR0_S) |
607 (0x82 << FCR0_PRID) | (0x0 << FCR0_REV),
609 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
612 .insn_flags = CPU_MIPS64R1 | ASE_MIPS3D,
613 .mmu_type = MMU_TYPE_R4000,
616 /* A generic CPU providing MIPS64 Release 2 features.
617 FIXME: Eventually this should be replaced by a real CPU model. */
618 .name = "MIPS64R2-generic",
619 .CP0_PRid = 0x00010000,
620 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
621 (MMU_TYPE_R4000 << CP0C0_MT),
622 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
623 (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
624 (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
625 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
626 .CP0_Config2 = MIPS_CONFIG2,
627 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA),
628 .CP0_LLAddr_rw_bitmask = 0,
629 .CP0_LLAddr_shift = 0,
632 .CP0_Status_rw_bitmask = 0x36FBFFFF,
633 .CP0_EBaseWG_rw_bitmask = (1 << CP0EBase_WG),
634 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) |
635 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
636 (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV),
638 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
641 .insn_flags = CPU_MIPS64R2 | ASE_MIPS3D,
642 .mmu_type = MMU_TYPE_R4000,
646 .CP0_PRid = 0x00018900,
647 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
648 (MMU_TYPE_R4000 << CP0C0_MT),
649 .CP0_Config1 = MIPS_CONFIG1 | (31 << CP0C1_MMU) |
650 (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
651 (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
652 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
653 .CP0_Config2 = MIPS_CONFIG2,
654 .CP0_Config3 = MIPS_CONFIG3,
655 .CP0_LLAddr_rw_bitmask = 0,
656 .CP0_LLAddr_shift = 4,
659 .CP0_Status_rw_bitmask = 0x12F8FFFF,
662 .insn_flags = CPU_MIPS64R2,
663 .mmu_type = MMU_TYPE_R4000,
667 .CP0_PRid = 0x00018900,
668 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
669 (MMU_TYPE_R4000 << CP0C0_MT),
670 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) |
671 (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) |
672 (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) |
673 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
674 .CP0_Config2 = MIPS_CONFIG2,
675 .CP0_Config3 = MIPS_CONFIG3,
676 .CP0_LLAddr_rw_bitmask = 0,
677 .CP0_LLAddr_shift = 4,
680 .CP0_Status_rw_bitmask = 0x36F8FFFF,
681 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) |
682 (1 << FCR0_D) | (1 << FCR0_S) |
683 (0x89 << FCR0_PRID) | (0x0 << FCR0_REV),
686 .insn_flags = CPU_MIPS64R2,
687 .mmu_type = MMU_TYPE_R4000,
692 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AR) | (0x2 << CP0C0_AT) |
693 (MMU_TYPE_R4000 << CP0C0_MT),
694 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
695 (2 << CP0C1_IS) | (5 << CP0C1_IL) | (3 << CP0C1_IA) |
696 (2 << CP0C1_DS) | (5 << CP0C1_DL) | (3 << CP0C1_DA) |
697 (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
698 .CP0_Config2 = MIPS_CONFIG2,
699 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) |
700 (1 << CP0C3_CMGCR) | (1 << CP0C3_MSAP) |
701 (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_ULRI) |
702 (1 << CP0C3_RXI) | (1 << CP0C3_LPA) | (1 << CP0C3_VInt),
703 .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (3 << CP0C4_IE) |
704 (1 << CP0C4_AE) | (0xfc << CP0C4_KScrExist),
705 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_XNP) | (1 << CP0C5_VP) |
706 (1 << CP0C5_LLB) | (1 << CP0C5_MRP),
707 .CP0_Config5_rw_bitmask = (1 << CP0C5_MSAEn) | (1 << CP0C5_SBRI) |
708 (1 << CP0C5_FRE) | (1 << CP0C5_UFE),
709 .CP0_LLAddr_rw_bitmask = 0,
710 .CP0_LLAddr_shift = 0,
713 .CP0_Status_rw_bitmask = 0x30D8FFFF,
714 .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) |
716 .CP0_PageGrain_rw_bitmask = (1 << CP0PG_ELPA),
717 .CP0_EBaseWG_rw_bitmask = (1 << CP0EBase_WG),
718 .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_HAS2008) | (1 << FCR0_F64) |
719 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
720 (1 << FCR0_S) | (0x03 << FCR0_PRID) | (0x0 << FCR0_REV),
721 .CP1_fcr31 = (1 << FCR31_ABS2008) | (1 << FCR31_NAN2008),
722 .CP1_fcr31_rw_bitmask = 0x0103FFFF,
723 .MSAIR = 0x03 << MSAIR_ProcID,
726 .insn_flags = CPU_MIPS64R6 | ASE_MSA,
727 .mmu_type = MMU_TYPE_R4000,
732 .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AR) | (0x2 << CP0C0_AT) |
733 (MMU_TYPE_R4000 << CP0C0_MT),
734 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) |
735 (2 << CP0C1_IS) | (5 << CP0C1_IL) | (3 << CP0C1_IA) |
736 (2 << CP0C1_DS) | (5 << CP0C1_DL) | (3 << CP0C1_DA) |
737 (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
738 .CP0_Config2 = MIPS_CONFIG2,
739 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) |
740 (1 << CP0C3_CMGCR) | (1 << CP0C3_MSAP) |
741 (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_ULRI) |
742 (1 << CP0C3_RXI) | (1 << CP0C3_LPA) | (1 << CP0C3_VInt),
743 .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (3 << CP0C4_IE) |
744 (1 << CP0C4_AE) | (0xfc << CP0C4_KScrExist),
745 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_XNP) | (1 << CP0C5_VP) |
746 (1 << CP0C5_LLB) | (1 << CP0C5_MRP),
747 .CP0_Config5_rw_bitmask = (1 << CP0C5_MSAEn) | (1 << CP0C5_SBRI) |
748 (1 << CP0C5_FRE) | (1 << CP0C5_UFE),
749 .CP0_LLAddr_rw_bitmask = 0,
750 .CP0_LLAddr_shift = 0,
753 .CP0_Status_rw_bitmask = 0x30D8FFFF,
754 .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) |
756 .CP0_PageGrain_rw_bitmask = (1 << CP0PG_ELPA),
757 .CP0_EBaseWG_rw_bitmask = (1 << CP0EBase_WG),
758 .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_HAS2008) | (1 << FCR0_F64) |
759 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
760 (1 << FCR0_S) | (0x03 << FCR0_PRID) | (0x0 << FCR0_REV),
761 .CP1_fcr31 = (1 << FCR31_ABS2008) | (1 << FCR31_NAN2008),
762 .CP1_fcr31_rw_bitmask = 0x0103FFFF,
763 .MSAIR = 0x03 << MSAIR_ProcID,
766 .insn_flags = CPU_MIPS64R6 | ASE_MSA,
767 .mmu_type = MMU_TYPE_R4000,
770 .name = "Loongson-2E",
772 /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size. */
773 .CP0_Config0 = (3 << CP0C0_Impl) | (4 << CP0C0_IC) | (4 << CP0C0_DC) |
774 (1 << CP0C0_IB) | (1 << CP0C0_DB) | (0x2 << CP0C0_K0),
775 /* Note: Config1 is only used internally,
776 Loongson-2E has only Config0. */
777 .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU),
780 .CP0_Status_rw_bitmask = 0x35D0FFFF,
781 .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV),
783 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
786 .insn_flags = CPU_LOONGSON2E,
787 .mmu_type = MMU_TYPE_R4000,
790 .name = "Loongson-2F",
792 /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size. */
793 .CP0_Config0 = (3 << CP0C0_Impl) | (4 << CP0C0_IC) | (4 << CP0C0_DC) |
794 (1 << CP0C0_IB) | (1 << CP0C0_DB) | (0x2 << CP0C0_K0),
795 /* Note: Config1 is only used internally,
796 Loongson-2F has only Config0. */
797 .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU),
800 .CP0_Status_rw_bitmask = 0xF5D0FF1F, /* Bits 7:5 not writable. */
801 .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV),
803 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
806 .insn_flags = CPU_LOONGSON2F,
807 .mmu_type = MMU_TYPE_R4000,
810 .name = "Loongson-3A1000",
812 /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size. */
813 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
814 (MMU_TYPE_R4000 << CP0C0_MT),
815 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
816 (3 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
817 (3 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
818 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
819 .CP0_Config2 = MIPS_CONFIG2 | (7 << CP0C2_SS) | (4 << CP0C2_SL) |
821 .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA),
822 .CP0_LLAddr_rw_bitmask = 0,
825 .CP0_Status_rw_bitmask = 0x74D8FFFF,
826 .CP0_PageGrain = (1 << CP0PG_ELPA),
827 .CP0_PageGrain_rw_bitmask = (1 << CP0PG_ELPA),
828 .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV) | (0x1 << FCR0_F64) |
829 (0x1 << FCR0_PS) | (0x1 << FCR0_L) | (0x1 << FCR0_W) |
830 (0x1 << FCR0_D) | (0x1 << FCR0_S),
832 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
835 .insn_flags = CPU_LOONGSON3A,
836 .mmu_type = MMU_TYPE_R4000,
839 .name = "Loongson-3A4000", /* GS464V-based */
840 .CP0_PRid = 0x14C000,
841 /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size. */
842 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
843 (MMU_TYPE_R4000 << CP0C0_MT),
844 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
845 (2 << CP0C1_IS) | (5 << CP0C1_IL) | (3 << CP0C1_IA) |
846 (2 << CP0C1_DS) | (5 << CP0C1_DL) | (3 << CP0C1_DA) |
847 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
848 .CP0_Config2 = MIPS_CONFIG2 | (5 << CP0C2_SS) | (5 << CP0C2_SL) |
850 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_MSAP) |
851 (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_ULRI) |
852 (1 << CP0C3_RXI) | (1 << CP0C3_LPA) | (1 << CP0C3_VInt),
853 .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (2 << CP0C4_IE) |
854 (1 << CP0C4_AE) | (0x1c << CP0C4_KScrExist),
855 .CP0_Config4_rw_bitmask = 0,
856 .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_CRCP) | (1 << CP0C5_NFExists),
857 .CP0_Config5_rw_bitmask = (1 << CP0C5_K) | (1 << CP0C5_CV) |
858 (1 << CP0C5_MSAEn) | (1 << CP0C5_UFE) |
859 (1 << CP0C5_FRE) | (1 << CP0C5_SBRI),
860 .CP0_Config6 = (1 << CP0C6_VCLRU) | (1 << CP0C6_DCLRU) |
861 (1 << CP0C6_SFBEN) | (1 << CP0C6_VLTINT) |
862 (1 << CP0C6_INSTPREF) | (1 << CP0C6_DATAPREF),
863 .CP0_Config6_rw_bitmask = (1 << CP0C6_BPPASS) | (0x3f << CP0C6_KPOS) |
864 (1 << CP0C6_KE) | (1 << CP0C6_VTLBONLY) |
865 (1 << CP0C6_LASX) | (1 << CP0C6_SSEN) |
866 (1 << CP0C6_DISDRTIME) | (1 << CP0C6_PIXNUEN) |
867 (1 << CP0C6_SCRAND) | (1 << CP0C6_LLEXCEN) |
868 (1 << CP0C6_DISVC) | (1 << CP0C6_VCLRU) |
869 (1 << CP0C6_DCLRU) | (1 << CP0C6_PIXUEN) |
870 (1 << CP0C6_DISBLKLYEN) | (1 << CP0C6_UMEMUALEN) |
871 (1 << CP0C6_SFBEN) | (1 << CP0C6_FLTINT) |
872 (1 << CP0C6_VLTINT) | (1 << CP0C6_DISBTB) |
873 (3 << CP0C6_STPREFCTL) | (1 << CP0C6_INSTPREF) |
874 (1 << CP0C6_DATAPREF),
876 .CP0_Config7_rw_bitmask = (1 << CP0C7_NAPCGEN) | (1 << CP0C7_UNIMUEN) |
877 (1 << CP0C7_VFPUCGEN),
878 .CP0_LLAddr_rw_bitmask = 1,
881 .CP0_Status_rw_bitmask = 0x7DDBFFFF,
882 .CP0_PageGrain = (1 << CP0PG_ELPA),
883 .CP0_PageGrain_rw_bitmask = (1U << CP0PG_RIE) | (1 << CP0PG_XIE) |
884 (1 << CP0PG_ELPA) | (1 << CP0PG_IEC),
885 .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV) | (0x1 << FCR0_F64) |
886 (0x1 << FCR0_PS) | (0x1 << FCR0_L) | (0x1 << FCR0_W) |
887 (0x1 << FCR0_D) | (0x1 << FCR0_S),
889 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
892 .insn_flags = CPU_LOONGSON3A | ASE_MSA,
893 .mmu_type = MMU_TYPE_R4000,
896 /* A generic CPU providing MIPS64 DSP R2 ASE features.
897 FIXME: Eventually this should be replaced by a real CPU model. */
898 .name = "mips64dspr2",
899 .CP0_PRid = 0x00010000,
900 .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) |
901 (MMU_TYPE_R4000 << CP0C0_MT),
902 .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) |
903 (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) |
904 (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) |
905 (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP),
906 .CP0_Config2 = MIPS_CONFIG2,
907 .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_DSP2P) |
908 (1 << CP0C3_DSPP) | (1 << CP0C3_LPA),
909 .CP0_LLAddr_rw_bitmask = 0,
910 .CP0_LLAddr_shift = 0,
913 .CP0_Status_rw_bitmask = 0x37FBFFFF,
914 .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) |
915 (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) |
916 (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV),
918 .CP1_fcr31_rw_bitmask = 0xFF83FFFF,
921 .insn_flags = CPU_MIPS64R2 | ASE_DSP | ASE_DSP_R2,
922 .mmu_type = MMU_TYPE_R4000,
927 const int mips_defs_number = ARRAY_SIZE(mips_defs);
929 void mips_cpu_list(void)
933 for (i = 0; i < ARRAY_SIZE(mips_defs); i++) {
934 qemu_printf("MIPS '%s'\n", mips_defs[i].name);
938 #ifndef CONFIG_USER_ONLY
939 static void no_mmu_init (CPUMIPSState *env, const mips_def_t *def)
941 env->tlb->nb_tlb = 1;
942 env->tlb->map_address = &no_mmu_map_address;
945 static void fixed_mmu_init (CPUMIPSState *env, const mips_def_t *def)
947 env->tlb->nb_tlb = 1;
948 env->tlb->map_address = &fixed_mmu_map_address;
951 static void r4k_mmu_init (CPUMIPSState *env, const mips_def_t *def)
953 env->tlb->nb_tlb = 1 + ((def->CP0_Config1 >> CP0C1_MMU) & 63);
954 env->tlb->map_address = &r4k_map_address;
955 env->tlb->helper_tlbwi = r4k_helper_tlbwi;
956 env->tlb->helper_tlbwr = r4k_helper_tlbwr;
957 env->tlb->helper_tlbp = r4k_helper_tlbp;
958 env->tlb->helper_tlbr = r4k_helper_tlbr;
959 env->tlb->helper_tlbinv = r4k_helper_tlbinv;
960 env->tlb->helper_tlbinvf = r4k_helper_tlbinvf;
963 static void mmu_init (CPUMIPSState *env, const mips_def_t *def)
965 env->tlb = g_malloc0(sizeof(CPUMIPSTLBContext));
967 switch (def->mmu_type) {
969 no_mmu_init(env, def);
972 r4k_mmu_init(env, def);
975 fixed_mmu_init(env, def);
981 cpu_abort(env_cpu(env), "MMU type not supported\n");
984 #endif /* CONFIG_USER_ONLY */
986 static void fpu_init (CPUMIPSState *env, const mips_def_t *def)
990 for (i = 0; i < MIPS_FPU_MAX; i++)
991 env->fpus[i].fcr0 = def->CP1_fcr0;
993 memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu));
996 static void mvp_init(CPUMIPSState *env)
998 env->mvp = g_malloc0(sizeof(CPUMIPSMVPContext));
1000 if (!ase_mt_available(env)) {
1004 /* MVPConf1 implemented, TLB sharable, no gating storage support,
1005 programmable cache partitioning implemented, number of allocatable
1006 and shareable TLB entries, MVP has allocatable TCs, 2 VPEs
1007 implemented, 5 TCs implemented. */
1008 env->mvp->CP0_MVPConf0 = (1U << CP0MVPC0_M) | (1 << CP0MVPC0_TLBS) |
1009 (0 << CP0MVPC0_GS) | (1 << CP0MVPC0_PCP) |
1010 // TODO: actually do 2 VPEs.
1011 // (1 << CP0MVPC0_TCA) | (0x1 << CP0MVPC0_PVPE) |
1012 // (0x04 << CP0MVPC0_PTC);
1013 (1 << CP0MVPC0_TCA) | (0x0 << CP0MVPC0_PVPE) |
1014 (0x00 << CP0MVPC0_PTC);
1015 #if !defined(CONFIG_USER_ONLY)
1016 /* Usermode has no TLB support */
1017 env->mvp->CP0_MVPConf0 |= (env->tlb->nb_tlb << CP0MVPC0_PTLBE);
1020 /* Allocatable CP1 have media extensions, allocatable CP1 have FP support,
1021 no UDI implemented, no CP2 implemented, 1 CP1 implemented. */
1022 env->mvp->CP0_MVPConf1 = (1U << CP0MVPC1_CIM) | (1 << CP0MVPC1_CIF) |
1023 (0x0 << CP0MVPC1_PCX) | (0x0 << CP0MVPC1_PCP2) |
1024 (0x1 << CP0MVPC1_PCP1);
1027 static void msa_reset(CPUMIPSState *env)
1029 #ifdef CONFIG_USER_ONLY
1030 /* MSA access enabled */
1031 env->CP0_Config5 |= 1 << CP0C5_MSAEn;
1032 env->CP0_Status |= (1 << CP0St_CU1) | (1 << CP0St_FR);
1036 - non-signaling floating point exception mode off (NX bit is 0)
1037 - Cause, Enables, and Flags are all 0
1038 - round to nearest / ties to even (RM bits are 0) */
1039 env->active_tc.msacsr = 0;
1041 restore_msa_fp_status(env);
1043 /* tininess detected after rounding.*/
1044 set_float_detect_tininess(float_tininess_after_rounding,
1045 &env->active_tc.msa_fp_status);
1047 /* clear float_status exception flags */
1048 set_float_exception_flags(0, &env->active_tc.msa_fp_status);
1050 /* clear float_status nan mode */
1051 set_default_nan_mode(0, &env->active_tc.msa_fp_status);
1053 /* set proper signanling bit meaning ("1" means "quiet") */
1054 set_snan_bit_is_one(0, &env->active_tc.msa_fp_status);