| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | /*
 | 
					
						
							|  |  |  |  *  MIPS emulation for qemu: CPU initialisation routines. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  *  Copyright (c) 2004-2005 Jocelyn Mayer | 
					
						
							|  |  |  |  *  Copyright (c) 2007 Herve Poussineau | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is free software; you can redistribute it and/or | 
					
						
							|  |  |  |  * modify it under the terms of the GNU Lesser General Public | 
					
						
							|  |  |  |  * License as published by the Free Software Foundation; either | 
					
						
							|  |  |  |  * version 2 of the License, or (at your option) any later version. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * This library is distributed in the hope that it will be useful, | 
					
						
							|  |  |  |  * but WITHOUT ANY WARRANTY; without even the implied warranty of | 
					
						
							|  |  |  |  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU | 
					
						
							|  |  |  |  * Lesser General Public License for more details. | 
					
						
							|  |  |  |  * | 
					
						
							|  |  |  |  * You should have received a copy of the GNU Lesser General Public | 
					
						
							| 
									
										
										
										
											2009-07-16 20:47:01 +00:00
										 |  |  |  * License along with this library; if not, see <http://www.gnu.org/licenses/>.
 | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |  */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | /* CPU / CPU family specific config register values. */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  | /* Have config1, uncached coherency */ | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | #define MIPS_CONFIG0                                              \
 | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |   ((1U << CP0C0_M) | (0x2 << CP0C0_K0)) | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  | /* Have config2, no coprocessor2 attached, no MDMX support attached,
 | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |    no performance counters, watch registers present, | 
					
						
							|  |  |  |    no code compression, EJTAG present, no FPU */ | 
					
						
							|  |  |  | #define MIPS_CONFIG1                                              \
 | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  | ((1U << CP0C1_M) |                                                \ | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |  (0 << CP0C1_C2) | (0 << CP0C1_MD) | (0 << CP0C1_PC) |            \ | 
					
						
							|  |  |  |  (1 << CP0C1_WR) | (0 << CP0C1_CA) | (1 << CP0C1_EP) |            \ | 
					
						
							|  |  |  |  (0 << CP0C1_FP)) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /* Have config3, no tertiary/secondary caches implemented */ | 
					
						
							|  |  |  | #define MIPS_CONFIG2                                              \
 | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  | ((1U << CP0C2_M)) | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  | /* No config4, no DSP ASE, no large physaddr (PABITS),
 | 
					
						
							| 
									
										
										
										
											2011-04-28 17:20:35 +02:00
										 |  |  |    no external interrupt controller, no vectored interrupts, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |    no 1kb pages, no SmartMIPS ASE, no trace logic */ | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | #define MIPS_CONFIG3                                              \
 | 
					
						
							|  |  |  | ((0 << CP0C3_M) | (0 << CP0C3_DSPP) | (0 << CP0C3_LPA) |          \ | 
					
						
							|  |  |  |  (0 << CP0C3_VEIC) | (0 << CP0C3_VInt) | (0 << CP0C3_SP) |        \ | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |  (0 << CP0C3_SM) | (0 << CP0C3_TL)) | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-24 13:45:05 +01:00
										 |  |  | #define MIPS_CONFIG4                                              \
 | 
					
						
							|  |  |  | ((0 << CP0C4_M)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-17 19:25:57 +01:00
										 |  |  | #define MIPS_CONFIG5                                              \
 | 
					
						
							|  |  |  | ((0 << CP0C5_M)) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  | /* MMU types, the first four entries have the same layout as the
 | 
					
						
							|  |  |  |    CP0C0_MT field.  */ | 
					
						
							|  |  |  | enum mips_mmu_types { | 
					
						
							|  |  |  |     MMU_TYPE_NONE, | 
					
						
							|  |  |  |     MMU_TYPE_R4000, | 
					
						
							|  |  |  |     MMU_TYPE_RESERVED, | 
					
						
							|  |  |  |     MMU_TYPE_FMT, | 
					
						
							|  |  |  |     MMU_TYPE_R3000, | 
					
						
							|  |  |  |     MMU_TYPE_R6000, | 
					
						
							|  |  |  |     MMU_TYPE_R8000 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | struct mips_def_t { | 
					
						
							| 
									
										
										
										
											2008-07-20 19:13:19 +00:00
										 |  |  |     const char *name; | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     int32_t CP0_PRid; | 
					
						
							|  |  |  |     int32_t CP0_Config0; | 
					
						
							|  |  |  |     int32_t CP0_Config1; | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |     int32_t CP0_Config2; | 
					
						
							|  |  |  |     int32_t CP0_Config3; | 
					
						
							| 
									
										
										
										
											2014-01-24 13:45:05 +01:00
										 |  |  |     int32_t CP0_Config4; | 
					
						
							|  |  |  |     int32_t CP0_Config4_rw_bitmask; | 
					
						
							| 
									
										
										
										
											2014-01-17 19:25:57 +01:00
										 |  |  |     int32_t CP0_Config5; | 
					
						
							|  |  |  |     int32_t CP0_Config5_rw_bitmask; | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |     int32_t CP0_Config6; | 
					
						
							|  |  |  |     int32_t CP0_Config7; | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |     target_ulong CP0_LLAddr_rw_bitmask; | 
					
						
							|  |  |  |     int CP0_LLAddr_shift; | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |     int32_t SYNCI_Step; | 
					
						
							|  |  |  |     int32_t CCRes; | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     int32_t CP0_Status_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_TCStatus_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSCtl; | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |     int32_t CP1_fcr0; | 
					
						
							| 
									
										
										
										
											2014-11-01 05:28:40 +00:00
										 |  |  |     int32_t MSAIR; | 
					
						
							| 
									
										
										
										
											2007-06-23 18:04:12 +00:00
										 |  |  |     int32_t SEGBITS; | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |     int32_t PABITS; | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     int32_t CP0_SRSConf0_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf0; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf1_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf1; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf2_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf2; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf3_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf3; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf4_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_SRSConf4; | 
					
						
							| 
									
										
										
										
											2014-07-07 11:23:59 +01:00
										 |  |  |     int32_t CP0_PageGrain_rw_bitmask; | 
					
						
							|  |  |  |     int32_t CP0_PageGrain; | 
					
						
							| 
									
										
										
										
											2007-09-24 12:48:00 +00:00
										 |  |  |     int insn_flags; | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |     enum mips_mmu_types mmu_type; | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*****************************************************************************/ | 
					
						
							|  |  |  | /* MIPS CPU definitions */ | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static const mips_def_t mips_defs[] = | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "4Kc", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018000, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							| 
									
										
										
										
											2009-12-15 14:03:03 +01:00
										 |  |  |                        (0 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x1278FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2009-12-15 14:43:40 +01:00
										 |  |  |         .insn_flags = CPU_MIPS32, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "4Km", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018300, | 
					
						
							|  |  |  |         /* Config1 implemented, fixed mapping MMU,
 | 
					
						
							|  |  |  |            no virtual icache, uncached coherency. */ | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x1258FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32 | ASE_MIPS16, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_FMT, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |         .name = "4KEcR1", | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |         .CP0_PRid = 0x00018400, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							| 
									
										
										
										
											2009-12-15 14:03:03 +01:00
										 |  |  |                        (0 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x1278FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2009-12-15 14:43:40 +01:00
										 |  |  |         .insn_flags = CPU_MIPS32, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "4KEmR1", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018500, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (MMU_TYPE_FMT << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x1258FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32 | ASE_MIPS16, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_FMT, | 
					
						
							| 
									
										
										
										
											2007-11-19 16:10:33 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "4KEc", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019000, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							|  |  |  |                     (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							| 
									
										
										
										
											2009-12-15 14:03:03 +01:00
										 |  |  |                        (0 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x1278FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2009-12-15 14:43:40 +01:00
										 |  |  |         .insn_flags = CPU_MIPS32R2, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "4KEm", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019100, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_FMT << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x1258FF17, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MIPS16, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_FMT, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-03-24 23:36:18 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "24Kc", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019300, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         /* No DSP implemented. */ | 
					
						
							| 
									
										
										
										
											2007-09-29 19:21:36 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x1278FF1F, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MIPS16, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "24Kf", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019300, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							|  |  |  |                     (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-07-29 22:11:46 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-03-21 11:04:42 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (0 << CP0C3_VInt), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         /* No DSP implemented. */ | 
					
						
							| 
									
										
										
										
											2007-09-29 19:21:36 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x3678FF1F, | 
					
						
							| 
									
										
										
										
											2007-05-07 13:55:33 +00:00
										 |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | | 
					
						
							|  |  |  |                     (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID), | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-11-14 03:11:17 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MIPS16, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "34Kf", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019500, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							| 
									
										
										
										
											2009-12-08 08:06:32 -08:00
										 |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2013-08-02 10:33:43 +01:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_VInt) | (1 << CP0C3_MT) | | 
					
						
							|  |  |  |                        (1 << CP0C3_DSPP), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2013-08-02 10:33:43 +01:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x3778FF1F, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_TCStatus_rw_bitmask = (0 << CP0TCSt_TCU3) | (0 << CP0TCSt_TCU2) | | 
					
						
							|  |  |  |                     (1 << CP0TCSt_TCU1) | (1 << CP0TCSt_TCU0) | | 
					
						
							|  |  |  |                     (0 << CP0TCSt_TMX) | (1 << CP0TCSt_DT) | | 
					
						
							|  |  |  |                     (1 << CP0TCSt_DA) | (1 << CP0TCSt_A) | | 
					
						
							|  |  |  |                     (0x3 << CP0TCSt_TKSU) | (1 << CP0TCSt_IXMT) | | 
					
						
							|  |  |  |                     (0xff << CP0TCSt_TASID), | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | | 
					
						
							|  |  |  |                     (1 << FCR0_D) | (1 << FCR0_S) | (0x95 << FCR0_PRID), | 
					
						
							|  |  |  |         .CP0_SRSCtl = (0xf << CP0SRSCtl_HSS), | 
					
						
							|  |  |  |         .CP0_SRSConf0_rw_bitmask = 0x3fffffff, | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |         .CP0_SRSConf0 = (1U << CP0SRSC0_M) | (0x3fe << CP0SRSC0_SRS3) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                     (0x3fe << CP0SRSC0_SRS2) | (0x3fe << CP0SRSC0_SRS1), | 
					
						
							|  |  |  |         .CP0_SRSConf1_rw_bitmask = 0x3fffffff, | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |         .CP0_SRSConf1 = (1U << CP0SRSC1_M) | (0x3fe << CP0SRSC1_SRS6) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                     (0x3fe << CP0SRSC1_SRS5) | (0x3fe << CP0SRSC1_SRS4), | 
					
						
							|  |  |  |         .CP0_SRSConf2_rw_bitmask = 0x3fffffff, | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |         .CP0_SRSConf2 = (1U << CP0SRSC2_M) | (0x3fe << CP0SRSC2_SRS9) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                     (0x3fe << CP0SRSC2_SRS8) | (0x3fe << CP0SRSC2_SRS7), | 
					
						
							|  |  |  |         .CP0_SRSConf3_rw_bitmask = 0x3fffffff, | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |         .CP0_SRSConf3 = (1U << CP0SRSC3_M) | (0x3fe << CP0SRSC3_SRS12) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                     (0x3fe << CP0SRSC3_SRS11) | (0x3fe << CP0SRSC3_SRS10), | 
					
						
							|  |  |  |         .CP0_SRSConf4_rw_bitmask = 0x3fffffff, | 
					
						
							|  |  |  |         .CP0_SRSConf4 = (0x3fe << CP0SRSC4_SRS15) | | 
					
						
							|  |  |  |                     (0x3fe << CP0SRSC4_SRS14) | (0x3fe << CP0SRSC4_SRS13), | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							| 
									
										
										
										
											2007-10-23 17:04:27 +00:00
										 |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_MT, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2012-10-24 22:17:12 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "74Kf", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019700, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							|  |  |  |                     (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (15 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_CA), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2014-11-04 15:41:20 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_DSP2P) | (1 << CP0C3_DSPP) | | 
					
						
							| 
									
										
										
										
											2014-11-04 15:42:19 +00:00
										 |  |  |                        (1 << CP0C3_VInt), | 
					
						
							| 
									
										
										
										
											2012-10-24 22:17:12 +08:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x3778FF1F, | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | | 
					
						
							|  |  |  |                     (1 << FCR0_D) | (1 << FCR0_S) | (0x93 << FCR0_PRID), | 
					
						
							|  |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MIPS16 | ASE_DSP | ASE_DSPR2, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
											  
											
												target-mips: Add M14K and M14Kc MIPS32r2 microMIPS processors
Add the M14K and M14Kc processors from MIPS Technologies that are the
original implementation of the microMIPS ISA.  They are dual instruction
set processors, implementing both the microMIPS and the standard MIPSr32
ISA.
These processors correspond to the M4K and 4KEc CPUs respectively,
except with support for the microMIPS instruction set added, support for
the MCU ASE added and two extra interrupt lines, making a total of 8
hardware interrupts plus 2 software interrupts.  The remaining parts of
the microarchitecture, in particular the pipeline, stayed unchanged.
The presence of the microMIPS ASE is is reflected in the configuration
added.  We currently have no support for the MCU ASE, including in
particular the ACLR, ASET and IRET instructions in either encoding, and
we have no support for the extra interrupt lines, including bits in
CP0.Status and CP0.Cause registers, so these features are not marked,
making our support diverge from real hardware.
Signed-off-by: Sandra Loosemore <sandra@codesourcery.com>
Signed-off-by: Maciej W. Rozycki <macro@codesourcery.com>
Reviewed-by: Leon Alrae <leon.alrae@imgtec.com>
Signed-off-by: Leon Alrae <leon.alrae@imgtec.com>
											
										 
											2014-11-04 15:39:48 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "M14K", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019b00, | 
					
						
							|  |  |  |         /* Config1 implemented, fixed mapping MMU,
 | 
					
						
							|  |  |  |            no virtual icache, uncached coherency. */ | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_KU) | (0x2 << CP0C0_K23) | | 
					
						
							|  |  |  |                        (0x1 << CP0C0_AR) | (MMU_TYPE_FMT << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1, | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (0x2 << CP0C3_ISA) | (1 << CP0C3_VInt), | 
					
						
							|  |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x1258FF17, | 
					
						
							|  |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MICROMIPS, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_FMT, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "M14Kc", | 
					
						
							|  |  |  |         /* This is the TLB-based MMU core.  */ | 
					
						
							|  |  |  |         .CP0_PRid = 0x00019c00, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (15 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (0 << CP0C1_IS) | (3 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (0 << CP0C1_DS) | (3 << CP0C1_DL) | (1 << CP0C1_DA), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (0x2 << CP0C3_ISA) | (0 << CP0C3_VInt), | 
					
						
							|  |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x1278FF17, | 
					
						
							|  |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS32R2 | ASE_MICROMIPS, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         /* FIXME:
 | 
					
						
							|  |  |  |          * Config3: CMGCR, SC, PW, VZ, CTXTC, CDMM, TL | 
					
						
							|  |  |  |          * Config4: MMUExtDef | 
					
						
							|  |  |  |          * Config5: EVA, MRP | 
					
						
							|  |  |  |          * FIR(FCR0): Has2008 | 
					
						
							|  |  |  |          * */ | 
					
						
							|  |  |  |         .name = "P5600", | 
					
						
							|  |  |  |         .CP0_PRid = 0x0001A800, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (1 << CP0C0_MM) | (1 << CP0C0_AR) | | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |                     (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (0x3F << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_FP), | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2015-04-14 10:33:43 +01:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_MSAP) | | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |                        (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_ULRI) | | 
					
						
							|  |  |  |                        (1 << CP0C3_RXI) | (1 << CP0C3_LPA) | (1 << CP0C3_VInt), | 
					
						
							|  |  |  |         .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (2 << CP0C4_IE) | | 
					
						
							|  |  |  |                        (0x1c << CP0C4_KScrExist), | 
					
						
							| 
									
										
										
										
											2014-01-24 13:45:05 +01:00
										 |  |  |         .CP0_Config4_rw_bitmask = 0, | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_MVH) | (1 << CP0C5_LLB), | 
					
						
							|  |  |  |         .CP0_Config5_rw_bitmask = (1 << CP0C5_K) | (1 << CP0C5_CV) | | 
					
						
							|  |  |  |                                   (1 << CP0C5_MSAEn) | (1 << CP0C5_UFE) | | 
					
						
							|  |  |  |                                   (1 << CP0C5_FRE) | (1 << CP0C5_UFR), | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x3C68FF1F, | 
					
						
							|  |  |  |         .CP0_PageGrain_rw_bitmask = (1U << CP0PG_RIE) | (1 << CP0PG_XIE) | | 
					
						
							|  |  |  |                     (1 << CP0PG_ELPA) | (1 << CP0PG_IEC), | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_UFRP) | (1 << FCR0_F64) | | 
					
						
							|  |  |  |                     (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | | 
					
						
							|  |  |  |                     (1 << FCR0_S) | (0x03 << FCR0_PRID), | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |         .SEGBITS = 32, | 
					
						
							| 
									
										
										
										
											2015-04-14 10:33:43 +01:00
										 |  |  |         .PABITS = 40, | 
					
						
							| 
									
										
										
										
											2015-07-10 12:10:52 +01:00
										 |  |  |         .insn_flags = CPU_MIPS32R5 | ASE_MSA, | 
					
						
							| 
									
										
										
										
											2014-01-15 17:01:46 +01:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2015-06-25 00:24:27 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         /* A generic CPU supporting MIPS32 Release 6 ISA.
 | 
					
						
							|  |  |  |            FIXME: Support IEEE 754-2008 FP. | 
					
						
							|  |  |  |                   Eventually this should be replaced by a real CPU model. */ | 
					
						
							|  |  |  |         .name = "mips32r6-generic", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00010000, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AR) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_BP) | (1 << CP0C3_BI) | | 
					
						
							|  |  |  |                        (2 << CP0C3_ISA) | (1 << CP0C3_ULRI) | | 
					
						
							|  |  |  |                        (1 << CP0C3_RXI) | (1U << CP0C3_M), | 
					
						
							|  |  |  |         .CP0_Config4 = MIPS_CONFIG4 | (0xfc << CP0C4_KScrExist) | | 
					
						
							|  |  |  |                        (3 << CP0C4_IE) | (1U << CP0C4_M), | 
					
						
							| 
									
										
										
										
											2015-10-05 14:45:45 +01:00
										 |  |  |         .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_XNP) | (1 << CP0C5_LLB), | 
					
						
							| 
									
										
										
										
											2015-06-25 00:24:27 +01:00
										 |  |  |         .CP0_Config5_rw_bitmask = (1 << CP0C5_SBRI) | (1 << CP0C5_FRE) | | 
					
						
							|  |  |  |                                   (1 << CP0C5_UFE), | 
					
						
							|  |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x3058FF1F, | 
					
						
							|  |  |  |         .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) | | 
					
						
							|  |  |  |                          (1U << CP0PG_RIE), | 
					
						
							|  |  |  |         .CP0_PageGrain_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_F64) | (1 << FCR0_L) | | 
					
						
							|  |  |  |                     (1 << FCR0_W) | (1 << FCR0_D) | (1 << FCR0_S) | | 
					
						
							|  |  |  |                     (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 32, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS32R6 | ASE_MICROMIPS, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-11-08 18:05:37 +00:00
										 |  |  | #if defined(TARGET_MIPS64)
 | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "R4000", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00000400, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */ | 
					
						
							|  |  |  |         .CP0_Config0 = (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0), | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* Note: Config1 is only used internally, the R4000 has only Config0. */ | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0xFFFFFFFF, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-04-11 20:34:23 +00:00
										 |  |  |         .SYNCI_Step = 16, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x3678FFFF, | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* The R4000 has a full 64bit FPU but doesn't use the fcr0 bits. */ | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							| 
									
										
										
										
											2007-06-23 18:04:12 +00:00
										 |  |  |         .SEGBITS = 40, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .PABITS = 36, | 
					
						
							| 
									
										
										
										
											2007-09-24 12:48:00 +00:00
										 |  |  |         .insn_flags = CPU_MIPS3, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-12-25 20:46:56 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "VR5432", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00005400, | 
					
						
							|  |  |  |         /* No L2 cache, icache size 8k, dcache size 8k, uncached coherency. */ | 
					
						
							|  |  |  |         .CP0_Config0 = (1 << 17) | (0x1 << 9) | (0x1 << 6) | (0x2 << CP0C0_K0), | 
					
						
							|  |  |  |         .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0xFFFFFFFFL, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-12-25 20:46:56 +00:00
										 |  |  |         .SYNCI_Step = 16, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x3678FFFF, | 
					
						
							|  |  |  |         /* The VR5432 has a full 64bit FPU but doesn't use the fcr0 bits. */ | 
					
						
							|  |  |  |         .CP1_fcr0 = (0x54 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 40, | 
					
						
							|  |  |  |         .PABITS = 32, | 
					
						
							|  |  |  |         .insn_flags = CPU_VR54XX, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "5Kc", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018100, | 
					
						
							| 
									
										
										
										
											2007-12-25 17:32:46 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (31 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2014-12-20 23:00:25 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x12F8FFFF, | 
					
						
							| 
									
										
										
										
											2007-06-23 18:04:12 +00:00
										 |  |  |         .SEGBITS = 42, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .PABITS = 36, | 
					
						
							| 
									
										
										
										
											2007-09-24 12:48:00 +00:00
										 |  |  |         .insn_flags = CPU_MIPS64, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "5Kf", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018100, | 
					
						
							| 
									
										
										
										
											2007-12-25 17:32:46 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x36F8FFFF, | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* The 5Kf has F64 / L / W but doesn't use the fcr0 bits. */ | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP1_fcr0 = (1 << FCR0_D) | (1 << FCR0_S) | | 
					
						
							|  |  |  |                     (0x81 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							| 
									
										
										
										
											2007-06-23 18:04:12 +00:00
										 |  |  |         .SEGBITS = 42, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .PABITS = 36, | 
					
						
							| 
									
										
										
										
											2007-09-24 12:48:00 +00:00
										 |  |  |         .insn_flags = CPU_MIPS64, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "20Kc", | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* We emulate a later version of the 20Kc, earlier ones had a broken
 | 
					
						
							| 
									
										
										
										
											2007-06-12 12:43:47 +00:00
										 |  |  |            WAIT instruction. */ | 
					
						
							|  |  |  |         .CP0_PRid = 0x000182a0, | 
					
						
							| 
									
										
										
										
											2007-12-25 17:32:46 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AT) | | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |                     (MMU_TYPE_R4000 << CP0C0_MT) | (1 << CP0C0_VI), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (47 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							| 
									
										
										
										
											2007-12-24 14:33:57 +00:00
										 |  |  |         .CCRes = 1, | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x36FBFFFF, | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* The 20Kc has F64 / L / W but doesn't use the fcr0 bits. */ | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |         .CP1_fcr0 = (1 << FCR0_3D) | (1 << FCR0_PS) | | 
					
						
							| 
									
										
										
										
											2007-05-07 13:55:33 +00:00
										 |  |  |                     (1 << FCR0_D) | (1 << FCR0_S) | | 
					
						
							| 
									
										
										
										
											2007-06-01 14:58:56 +00:00
										 |  |  |                     (0x82 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							| 
									
										
										
										
											2007-06-23 18:04:12 +00:00
										 |  |  |         .SEGBITS = 40, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .PABITS = 36, | 
					
						
							| 
									
										
										
										
											2007-09-24 12:48:00 +00:00
										 |  |  |         .insn_flags = CPU_MIPS64 | ASE_MIPS3D, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |     { | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |         /* A generic CPU providing MIPS64 Release 2 features.
 | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |            FIXME: Eventually this should be replaced by a real CPU model. */ | 
					
						
							|  |  |  |         .name = "MIPS64R2-generic", | 
					
						
							| 
									
										
										
										
											2007-11-18 03:19:58 +00:00
										 |  |  |         .CP0_PRid = 0x00010000, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | | 
					
						
							| 
									
										
										
										
											2009-01-14 19:40:36 +00:00
										 |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1 << CP0C3_LPA), | 
					
						
							| 
									
										
										
										
											2009-11-22 13:22:54 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x36FBFFFF, | 
					
						
							| 
									
										
										
										
											2007-12-28 12:35:05 +00:00
										 |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) | | 
					
						
							|  |  |  |                     (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | | 
					
						
							|  |  |  |                     (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .SEGBITS = 42, | 
					
						
							|  |  |  |         .PABITS = 36, | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |         .insn_flags = CPU_MIPS64R2 | ASE_MIPS3D, | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2007-10-29 09:38:43 +00:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2014-11-03 19:31:26 +00:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "5KEc", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018900, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (31 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							|  |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							| 
									
										
										
										
											2014-12-20 23:00:25 +00:00
										 |  |  |         .CP0_Status_rw_bitmask = 0x12F8FFFF, | 
					
						
							| 
									
										
										
										
											2014-11-03 19:31:26 +00:00
										 |  |  |         .SEGBITS = 42, | 
					
						
							|  |  |  |         .PABITS = 36, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS64R2, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							|  |  |  |         .name = "5KEf", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00018900, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (31 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (1 << CP0C1_IS) | (4 << CP0C1_IL) | (1 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_DS) | (4 << CP0C1_DL) | (1 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							|  |  |  |         .CP0_Config3 = MIPS_CONFIG3, | 
					
						
							|  |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 4, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x36F8FFFF, | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_L) | (1 << FCR0_W) | | 
					
						
							|  |  |  |                     (1 << FCR0_D) | (1 << FCR0_S) | | 
					
						
							|  |  |  |                     (0x89 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 42, | 
					
						
							|  |  |  |         .PABITS = 36, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS64R2, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2014-06-27 08:49:09 +01:00
										 |  |  |     { | 
					
						
							|  |  |  |         /* A generic CPU supporting MIPS64 Release 6 ISA.
 | 
					
						
							| 
									
										
										
										
											2015-06-01 12:13:22 +01:00
										 |  |  |            FIXME: Support IEEE 754-2008 FP. | 
					
						
							| 
									
										
										
										
											2014-06-27 08:49:09 +01:00
										 |  |  |                   Eventually this should be replaced by a real CPU model. */ | 
					
						
							|  |  |  |         .name = "MIPS64R6-generic", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00010000, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x2 << CP0C0_AR) | (0x2 << CP0C0_AT) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (0 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2015-06-29 10:11:23 +01:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_MSAP) | | 
					
						
							|  |  |  |                        (1 << CP0C3_BP) | (1 << CP0C3_BI) | (1 << CP0C3_ULRI) | | 
					
						
							|  |  |  |                        (1 << CP0C3_RXI) | (1 << CP0C3_LPA), | 
					
						
							|  |  |  |         .CP0_Config4 = MIPS_CONFIG4 | (1U << CP0C4_M) | (3 << CP0C4_IE) | | 
					
						
							|  |  |  |                        (0xfc << CP0C4_KScrExist), | 
					
						
							| 
									
										
										
										
											2015-10-05 14:45:45 +01:00
										 |  |  |         .CP0_Config5 = MIPS_CONFIG5 | (1 << CP0C5_XNP) | (1 << CP0C5_LLB), | 
					
						
							| 
									
										
										
										
											2015-06-29 10:11:23 +01:00
										 |  |  |         .CP0_Config5_rw_bitmask = (1 << CP0C5_MSAEn) | (1 << CP0C5_SBRI) | | 
					
						
							|  |  |  |                                   (1 << CP0C5_FRE) | (1 << CP0C5_UFE), | 
					
						
							| 
									
										
										
										
											2014-06-27 08:49:09 +01:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x30D8FFFF, | 
					
						
							| 
									
										
										
										
											2014-07-11 16:11:35 +01:00
										 |  |  |         .CP0_PageGrain = (1 << CP0PG_IEC) | (1 << CP0PG_XIE) | | 
					
						
							|  |  |  |                          (1U << CP0PG_RIE), | 
					
						
							| 
									
										
										
										
											2015-04-14 10:33:43 +01:00
										 |  |  |         .CP0_PageGrain_rw_bitmask = (1 << CP0PG_ELPA), | 
					
						
							| 
									
										
										
										
											2015-04-21 16:06:28 +01:00
										 |  |  |         .CP1_fcr0 = (1 << FCR0_FREP) | (1 << FCR0_F64) | (1 << FCR0_L) | | 
					
						
							|  |  |  |                     (1 << FCR0_W) | (1 << FCR0_D) | (1 << FCR0_S) | | 
					
						
							|  |  |  |                     (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							| 
									
										
										
										
											2015-06-29 10:11:23 +01:00
										 |  |  |         .SEGBITS = 48, | 
					
						
							| 
									
										
										
										
											2015-04-14 10:33:43 +01:00
										 |  |  |         .PABITS = 48, | 
					
						
							| 
									
										
										
										
											2015-06-29 10:11:23 +01:00
										 |  |  |         .insn_flags = CPU_MIPS64R6 | ASE_MSA, | 
					
						
							| 
									
										
										
										
											2014-06-27 08:49:09 +01:00
										 |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2010-06-29 10:50:27 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         .name = "Loongson-2E", | 
					
						
							|  |  |  |         .CP0_PRid = 0x6302, | 
					
						
							| 
									
										
										
										
											2014-11-05 15:34:58 +00:00
										 |  |  |         /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size.  */ | 
					
						
							|  |  |  |         .CP0_Config0 = (0x1<<17) | (0x1<<16) | (0x1<<11) | (0x1<<8) | | 
					
						
							|  |  |  |                        (0x1<<5) | (0x1<<4) | (0x1<<1), | 
					
						
							|  |  |  |         /* Note: Config1 is only used internally,
 | 
					
						
							|  |  |  |            Loongson-2E has only Config0.  */ | 
					
						
							| 
									
										
										
										
											2010-06-29 10:50:27 +08:00
										 |  |  |         .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU), | 
					
						
							|  |  |  |         .SYNCI_Step = 16, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x35D0FFFF, | 
					
						
							|  |  |  |         .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 40, | 
					
						
							|  |  |  |         .PABITS = 40, | 
					
						
							|  |  |  |         .insn_flags = CPU_LOONGSON2E, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							|  |  |  |     { | 
					
						
							| 
									
										
										
										
											2014-11-05 15:34:58 +00:00
										 |  |  |         .name = "Loongson-2F", | 
					
						
							|  |  |  |         .CP0_PRid = 0x6303, | 
					
						
							|  |  |  |         /* 64KB I-cache and d-cache. 4 way with 32 bit cache line size.  */ | 
					
						
							|  |  |  |         .CP0_Config0 = (0x1<<17) | (0x1<<16) | (0x1<<11) | (0x1<<8) | | 
					
						
							|  |  |  |                        (0x1<<5) | (0x1<<4) | (0x1<<1), | 
					
						
							|  |  |  |         /* Note: Config1 is only used internally,
 | 
					
						
							|  |  |  |            Loongson-2F has only Config0.  */ | 
					
						
							|  |  |  |         .CP0_Config1 = (1 << CP0C1_FP) | (47 << CP0C1_MMU), | 
					
						
							|  |  |  |         .SYNCI_Step = 16, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0xF5D0FF1F,   /* Bits 7:5 not writable.  */ | 
					
						
							|  |  |  |         .CP1_fcr0 = (0x5 << FCR0_PRID) | (0x1 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 40, | 
					
						
							|  |  |  |         .PABITS = 40, | 
					
						
							|  |  |  |         .insn_flags = CPU_LOONGSON2F, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							| 
									
										
										
										
											2010-06-29 10:50:27 +08:00
										 |  |  |     }, | 
					
						
							| 
									
										
										
										
											2012-10-24 22:17:12 +08:00
										 |  |  |     { | 
					
						
							|  |  |  |         /* A generic CPU providing MIPS64 ASE DSP 2 features.
 | 
					
						
							|  |  |  |            FIXME: Eventually this should be replaced by a real CPU model. */ | 
					
						
							|  |  |  |         .name = "mips64dspr2", | 
					
						
							|  |  |  |         .CP0_PRid = 0x00010000, | 
					
						
							|  |  |  |         .CP0_Config0 = MIPS_CONFIG0 | (0x1 << CP0C0_AR) | (0x2 << CP0C0_AT) | | 
					
						
							|  |  |  |                        (MMU_TYPE_R4000 << CP0C0_MT), | 
					
						
							|  |  |  |         .CP0_Config1 = MIPS_CONFIG1 | (1 << CP0C1_FP) | (63 << CP0C1_MMU) | | 
					
						
							|  |  |  |                        (2 << CP0C1_IS) | (4 << CP0C1_IL) | (3 << CP0C1_IA) | | 
					
						
							|  |  |  |                        (2 << CP0C1_DS) | (4 << CP0C1_DL) | (3 << CP0C1_DA) | | 
					
						
							|  |  |  |                        (1 << CP0C1_PC) | (1 << CP0C1_WR) | (1 << CP0C1_EP), | 
					
						
							|  |  |  |         .CP0_Config2 = MIPS_CONFIG2, | 
					
						
							| 
									
										
										
										
											2014-11-04 15:41:20 +00:00
										 |  |  |         .CP0_Config3 = MIPS_CONFIG3 | (1U << CP0C3_M) | (1 << CP0C3_DSP2P) | | 
					
						
							|  |  |  |                        (1 << CP0C3_DSPP) | (1 << CP0C3_LPA), | 
					
						
							| 
									
										
										
										
											2012-10-24 22:17:12 +08:00
										 |  |  |         .CP0_LLAddr_rw_bitmask = 0, | 
					
						
							|  |  |  |         .CP0_LLAddr_shift = 0, | 
					
						
							|  |  |  |         .SYNCI_Step = 32, | 
					
						
							|  |  |  |         .CCRes = 2, | 
					
						
							|  |  |  |         .CP0_Status_rw_bitmask = 0x37FBFFFF, | 
					
						
							|  |  |  |         .CP1_fcr0 = (1 << FCR0_F64) | (1 << FCR0_3D) | (1 << FCR0_PS) | | 
					
						
							|  |  |  |                     (1 << FCR0_L) | (1 << FCR0_W) | (1 << FCR0_D) | | 
					
						
							|  |  |  |                     (1 << FCR0_S) | (0x00 << FCR0_PRID) | (0x0 << FCR0_REV), | 
					
						
							|  |  |  |         .SEGBITS = 42, | 
					
						
							|  |  |  |         .PABITS = 36, | 
					
						
							|  |  |  |         .insn_flags = CPU_MIPS64R2 | ASE_DSP | ASE_DSPR2, | 
					
						
							|  |  |  |         .mmu_type = MMU_TYPE_R4000, | 
					
						
							|  |  |  |     }, | 
					
						
							| 
									
										
										
										
											2010-06-29 10:50:27 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | #endif
 | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static const mips_def_t *cpu_mips_find_by_name (const char *name) | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-11-10 15:15:54 +00:00
										 |  |  |     int i; | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 20:33:55 +00:00
										 |  |  |     for (i = 0; i < ARRAY_SIZE(mips_defs); i++) { | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |         if (strcasecmp(name, mips_defs[i].name) == 0) { | 
					
						
							| 
									
										
										
										
											2007-11-10 15:15:54 +00:00
										 |  |  |             return &mips_defs[i]; | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-11-10 15:15:54 +00:00
										 |  |  |     return NULL; | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2010-10-22 23:03:33 +02:00
										 |  |  | void mips_cpu_list (FILE *f, fprintf_function cpu_fprintf) | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  | { | 
					
						
							|  |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-12-22 20:33:55 +00:00
										 |  |  |     for (i = 0; i < ARRAY_SIZE(mips_defs); i++) { | 
					
						
							| 
									
										
										
										
											2007-03-18 00:30:29 +00:00
										 |  |  |         (*cpu_fprintf)(f, "MIPS '%s'\n", | 
					
						
							|  |  |  |                        mips_defs[i].name); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-02 17:39:45 +00:00
										 |  |  | #ifndef CONFIG_USER_ONLY
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void no_mmu_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     env->tlb->nb_tlb = 1; | 
					
						
							|  |  |  |     env->tlb->map_address = &no_mmu_map_address; | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void fixed_mmu_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     env->tlb->nb_tlb = 1; | 
					
						
							|  |  |  |     env->tlb->map_address = &fixed_mmu_map_address; | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void r4k_mmu_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     env->tlb->nb_tlb = 1 + ((def->CP0_Config1 >> CP0C1_MMU) & 63); | 
					
						
							|  |  |  |     env->tlb->map_address = &r4k_map_address; | 
					
						
							| 
									
										
										
										
											2009-03-08 00:06:01 +00:00
										 |  |  |     env->tlb->helper_tlbwi = r4k_helper_tlbwi; | 
					
						
							|  |  |  |     env->tlb->helper_tlbwr = r4k_helper_tlbwr; | 
					
						
							|  |  |  |     env->tlb->helper_tlbp = r4k_helper_tlbp; | 
					
						
							|  |  |  |     env->tlb->helper_tlbr = r4k_helper_tlbr; | 
					
						
							| 
									
										
										
										
											2014-07-07 11:24:00 +01:00
										 |  |  |     env->tlb->helper_tlbinv = r4k_helper_tlbinv; | 
					
						
							|  |  |  |     env->tlb->helper_tlbinvf = r4k_helper_tlbinvf; | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void mmu_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2013-09-03 17:38:47 +02:00
										 |  |  |     MIPSCPU *cpu = mips_env_get_cpu(env); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2011-08-20 22:09:37 -05:00
										 |  |  |     env->tlb = g_malloc0(sizeof(CPUMIPSTLBContext)); | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |     switch (def->mmu_type) { | 
					
						
							|  |  |  |         case MMU_TYPE_NONE: | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |             no_mmu_init(env, def); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         case MMU_TYPE_R4000: | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |             r4k_mmu_init(env, def); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         case MMU_TYPE_FMT: | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |             fixed_mmu_init(env, def); | 
					
						
							|  |  |  |             break; | 
					
						
							| 
									
										
										
										
											2007-12-25 03:13:56 +00:00
										 |  |  |         case MMU_TYPE_R3000: | 
					
						
							|  |  |  |         case MMU_TYPE_R6000: | 
					
						
							|  |  |  |         case MMU_TYPE_R8000: | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |         default: | 
					
						
							| 
									
										
										
										
											2013-09-03 17:38:47 +02:00
										 |  |  |             cpu_abort(CPU(cpu), "MMU type not supported\n"); | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2008-09-02 17:39:45 +00:00
										 |  |  | #endif /* CONFIG_USER_ONLY */
 | 
					
						
							| 
									
										
										
										
											2007-05-13 13:49:44 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void fpu_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2008-09-18 11:57:27 +00:00
										 |  |  |     int i; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for (i = 0; i < MIPS_FPU_MAX; i++) | 
					
						
							|  |  |  |         env->fpus[i].fcr0 = def->CP1_fcr0; | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2008-09-18 11:57:27 +00:00
										 |  |  |     memcpy(&env->active_fpu, &env->fpus[0], sizeof(env->active_fpu)); | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2009-10-01 16:12:16 -05:00
										 |  |  | static void mvp_init (CPUMIPSState *env, const mips_def_t *def) | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | { | 
					
						
							| 
									
										
										
										
											2011-08-20 22:09:37 -05:00
										 |  |  |     env->mvp = g_malloc0(sizeof(CPUMIPSMVPContext)); | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  |     /* MVPConf1 implemented, TLB sharable, no gating storage support,
 | 
					
						
							|  |  |  |        programmable cache partitioning implemented, number of allocatable | 
					
						
							|  |  |  |        and sharable TLB entries, MVP has allocatable TCs, 2 VPEs | 
					
						
							|  |  |  |        implemented, 5 TCs implemented. */ | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |     env->mvp->CP0_MVPConf0 = (1U << CP0MVPC0_M) | (1 << CP0MVPC0_TLBS) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                              (0 << CP0MVPC0_GS) | (1 << CP0MVPC0_PCP) | | 
					
						
							|  |  |  | // TODO: actually do 2 VPEs.
 | 
					
						
							|  |  |  | //                             (1 << CP0MVPC0_TCA) | (0x1 << CP0MVPC0_PVPE) |
 | 
					
						
							|  |  |  | //                             (0x04 << CP0MVPC0_PTC);
 | 
					
						
							|  |  |  |                              (1 << CP0MVPC0_TCA) | (0x0 << CP0MVPC0_PVPE) | | 
					
						
							| 
									
										
										
										
											2011-08-29 23:07:38 +02:00
										 |  |  |                              (0x00 << CP0MVPC0_PTC); | 
					
						
							| 
									
										
										
										
											2009-01-12 21:33:13 +00:00
										 |  |  | #if !defined(CONFIG_USER_ONLY)
 | 
					
						
							| 
									
										
										
										
											2008-07-23 16:14:22 +00:00
										 |  |  |     /* Usermode has no TLB support */ | 
					
						
							| 
									
										
										
										
											2009-01-12 21:33:13 +00:00
										 |  |  |     env->mvp->CP0_MVPConf0 |= (env->tlb->nb_tlb << CP0MVPC0_PTLBE); | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2008-07-23 16:14:22 +00:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |     /* Allocatable CP1 have media extensions, allocatable CP1 have FP support,
 | 
					
						
							|  |  |  |        no UDI implemented, no CP2 implemented, 1 CP1 implemented. */ | 
					
						
							| 
									
										
										
										
											2014-03-17 16:00:34 +00:00
										 |  |  |     env->mvp->CP0_MVPConf1 = (1U << CP0MVPC1_CIM) | (1 << CP0MVPC1_CIF) | | 
					
						
							| 
									
										
										
										
											2007-09-06 00:18:15 +00:00
										 |  |  |                              (0x0 << CP0MVPC1_PCX) | (0x0 << CP0MVPC1_PCP2) | | 
					
						
							|  |  |  |                              (0x1 << CP0MVPC1_PCP1); | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-11-01 05:28:40 +00:00
										 |  |  | 
 | 
					
						
							|  |  |  | static void msa_reset(CPUMIPSState *env) | 
					
						
							|  |  |  | { | 
					
						
							|  |  |  | #ifdef CONFIG_USER_ONLY
 | 
					
						
							|  |  |  |     /* MSA access enabled */ | 
					
						
							|  |  |  |     env->CP0_Config5 |= 1 << CP0C5_MSAEn; | 
					
						
							|  |  |  |     env->CP0_Status |= (1 << CP0St_CU1) | (1 << CP0St_FR); | 
					
						
							|  |  |  | #endif
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* MSA CSR:
 | 
					
						
							|  |  |  |        - non-signaling floating point exception mode off (NX bit is 0) | 
					
						
							|  |  |  |        - Cause, Enables, and Flags are all 0 | 
					
						
							|  |  |  |        - round to nearest / ties to even (RM bits are 0) */ | 
					
						
							|  |  |  |     env->active_tc.msacsr = 0; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2015-02-20 13:07:45 +00:00
										 |  |  |     restore_msa_fp_status(env); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-01 05:28:40 +00:00
										 |  |  |     /* tininess detected after rounding.*/ | 
					
						
							|  |  |  |     set_float_detect_tininess(float_tininess_after_rounding, | 
					
						
							|  |  |  |                               &env->active_tc.msa_fp_status); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* clear float_status exception flags */ | 
					
						
							|  |  |  |     set_float_exception_flags(0, &env->active_tc.msa_fp_status); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     /* clear float_status nan mode */ | 
					
						
							|  |  |  |     set_default_nan_mode(0, &env->active_tc.msa_fp_status); | 
					
						
							|  |  |  | } |