Commit 9c2149c8e06cf6fbf1bd5096a50486abc3b71f17

Authored by ths
1 parent 17c275d9

Implementing dmfc/dmtc.


git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2348 c046a42c-6fe2-441c-8c8c-71466251a162
target-mips/cpu.h
... ... @@ -44,7 +44,7 @@ union fpr_t {
44 44 typedef struct tlb_t tlb_t;
45 45 struct tlb_t {
46 46 target_ulong VPN;
47   - uint_fast32_t PageMask;
  47 + uint32_t PageMask;
48 48 uint_fast8_t ASID;
49 49 uint_fast16_t G:1;
50 50 uint_fast16_t C0:3;
... ... @@ -110,20 +110,20 @@ struct CPUMIPSState {
110 110 tlb_t tlb[MIPS_TLB_MAX];
111 111 uint32_t tlb_in_use;
112 112 #endif
113   - uint32_t CP0_index;
114   - uint32_t CP0_random;
115   - uint64_t CP0_EntryLo0;
116   - uint64_t CP0_EntryLo1;
117   - uint64_t CP0_Context;
118   - uint32_t CP0_PageMask;
119   - uint32_t CP0_PageGrain;
120   - uint32_t CP0_Wired;
121   - uint32_t CP0_HWREna;
  113 + int32_t CP0_Index;
  114 + int32_t CP0_Random;
  115 + target_ulong CP0_EntryLo0;
  116 + target_ulong CP0_EntryLo1;
  117 + target_ulong CP0_Context;
  118 + int32_t CP0_PageMask;
  119 + int32_t CP0_PageGrain;
  120 + int32_t CP0_Wired;
  121 + int32_t CP0_HWREna;
122 122 target_ulong CP0_BadVAddr;
123   - uint32_t CP0_Count;
124   - uint64_t CP0_EntryHi;
125   - uint32_t CP0_Compare;
126   - uint32_t CP0_Status;
  123 + int32_t CP0_Count;
  124 + target_ulong CP0_EntryHi;
  125 + int32_t CP0_Compare;
  126 + int32_t CP0_Status;
127 127 #define CP0St_CU3 31
128 128 #define CP0St_CU2 30
129 129 #define CP0St_CU1 29
... ... @@ -146,9 +146,10 @@ struct CPUMIPSState {
146 146 #define CP0St_ERL 2
147 147 #define CP0St_EXL 1
148 148 #define CP0St_IE 0
149   - uint32_t CP0_IntCtl;
150   - uint32_t CP0_SRSCtl;
151   - uint32_t CP0_Cause;
  149 + int32_t CP0_IntCtl;
  150 + int32_t CP0_SRSCtl;
  151 + int32_t CP0_SRSMap;
  152 + int32_t CP0_Cause;
152 153 #define CP0Ca_BD 31
153 154 #define CP0Ca_TI 30
154 155 #define CP0Ca_CE 28
... ... @@ -159,9 +160,9 @@ struct CPUMIPSState {
159 160 #define CP0Ca_IP 8
160 161 #define CP0Ca_EC 2
161 162 target_ulong CP0_EPC;
162   - uint32_t CP0_PRid;
  163 + int32_t CP0_PRid;
163 164 target_ulong CP0_EBase;
164   - uint32_t CP0_Config0;
  165 + int32_t CP0_Config0;
165 166 #define CP0C0_M 31
166 167 #define CP0C0_K23 28
167 168 #define CP0C0_KU 25
... ... @@ -174,7 +175,7 @@ struct CPUMIPSState {
174 175 #define CP0C0_MT 7
175 176 #define CP0C0_VI 3
176 177 #define CP0C0_K0 0
177   - uint32_t CP0_Config1;
  178 + int32_t CP0_Config1;
178 179 #define CP0C1_M 31
179 180 #define CP0C1_MMU 25
180 181 #define CP0C1_IS 22
... ... @@ -190,7 +191,7 @@ struct CPUMIPSState {
190 191 #define CP0C1_CA 2
191 192 #define CP0C1_EP 1
192 193 #define CP0C1_FP 0
193   - uint32_t CP0_Config2;
  194 + int32_t CP0_Config2;
194 195 #define CP0C2_M 31
195 196 #define CP0C2_TU 28
196 197 #define CP0C2_TS 24
... ... @@ -200,7 +201,7 @@ struct CPUMIPSState {
200 201 #define CP0C2_SS 8
201 202 #define CP0C2_SL 4
202 203 #define CP0C2_SA 0
203   - uint32_t CP0_Config3;
  204 + int32_t CP0_Config3;
204 205 #define CP0C3_M 31
205 206 #define CP0C3_DSPP 10
206 207 #define CP0C3_LPA 7
... ... @@ -211,11 +212,11 @@ struct CPUMIPSState {
211 212 #define CP0C3_SM 1
212 213 #define CP0C3_TL 0
213 214 target_ulong CP0_LLAddr;
214   - uint32_t CP0_WatchLo;
215   - uint32_t CP0_WatchHi;
216   - uint32_t CP0_XContext;
217   - uint32_t CP0_Framemask;
218   - uint32_t CP0_Debug;
  215 + target_ulong CP0_WatchLo;
  216 + int32_t CP0_WatchHi;
  217 + target_ulong CP0_XContext;
  218 + int32_t CP0_Framemask;
  219 + int32_t CP0_Debug;
219 220 #define CPDB_DBD 31
220 221 #define CP0DB_DM 30
221 222 #define CP0DB_LSNM 28
... ... @@ -235,13 +236,13 @@ struct CPUMIPSState {
235 236 #define CP0DB_DBp 1
236 237 #define CP0DB_DSS 0
237 238 target_ulong CP0_DEPC;
238   - uint32_t CP0_Performance0;
239   - uint32_t CP0_TagLo;
240   - uint32_t CP0_DataLo;
241   - uint32_t CP0_TagHi;
242   - uint32_t CP0_DataHi;
  239 + int32_t CP0_Performance0;
  240 + int32_t CP0_TagLo;
  241 + int32_t CP0_DataLo;
  242 + int32_t CP0_TagHi;
  243 + int32_t CP0_DataHi;
243 244 target_ulong CP0_ErrorEPC;
244   - uint32_t CP0_DESAVE;
  245 + int32_t CP0_DESAVE;
245 246 /* Qemu */
246 247 int interrupt_request;
247 248 jmp_buf jmp_env;
... ...
target-mips/op.c
... ... @@ -1032,7 +1032,7 @@ void op_jnz_T2 (void)
1032 1032 /* CP0 functions */
1033 1033 void op_mfc0_index (void)
1034 1034 {
1035   - T0 = (int32_t)(env->CP0_index);
  1035 + T0 = env->CP0_Index;
1036 1036 RETURN();
1037 1037 }
1038 1038  
... ... @@ -1044,49 +1044,49 @@ void op_mfc0_random (void)
1044 1044  
1045 1045 void op_mfc0_entrylo0 (void)
1046 1046 {
1047   - T0 = env->CP0_EntryLo0;
  1047 + T0 = (int32_t)env->CP0_EntryLo0;
1048 1048 RETURN();
1049 1049 }
1050 1050  
1051 1051 void op_mfc0_entrylo1 (void)
1052 1052 {
1053   - T0 = env->CP0_EntryLo1;
  1053 + T0 = (int32_t)env->CP0_EntryLo1;
1054 1054 RETURN();
1055 1055 }
1056 1056  
1057 1057 void op_mfc0_context (void)
1058 1058 {
1059   - T0 = env->CP0_Context;
  1059 + T0 = (int32_t)env->CP0_Context;
1060 1060 RETURN();
1061 1061 }
1062 1062  
1063 1063 void op_mfc0_pagemask (void)
1064 1064 {
1065   - T0 = (int32_t)env->CP0_PageMask;
  1065 + T0 = env->CP0_PageMask;
1066 1066 RETURN();
1067 1067 }
1068 1068  
1069 1069 void op_mfc0_pagegrain (void)
1070 1070 {
1071   - T0 = (int32_t)env->CP0_PageGrain;
  1071 + T0 = env->CP0_PageGrain;
1072 1072 RETURN();
1073 1073 }
1074 1074  
1075 1075 void op_mfc0_wired (void)
1076 1076 {
1077   - T0 = (int32_t)env->CP0_Wired;
  1077 + T0 = env->CP0_Wired;
1078 1078 RETURN();
1079 1079 }
1080 1080  
1081 1081 void op_mfc0_hwrena (void)
1082 1082 {
1083   - T0 = (int32_t)env->CP0_HWREna;
  1083 + T0 = env->CP0_HWREna;
1084 1084 RETURN();
1085 1085 }
1086 1086  
1087 1087 void op_mfc0_badvaddr (void)
1088 1088 {
1089   - T0 = env->CP0_BadVAddr;
  1089 + T0 = (int32_t)env->CP0_BadVAddr;
1090 1090 RETURN();
1091 1091 }
1092 1092  
... ... @@ -1098,19 +1098,19 @@ void op_mfc0_count (void)
1098 1098  
1099 1099 void op_mfc0_entryhi (void)
1100 1100 {
1101   - T0 = env->CP0_EntryHi;
  1101 + T0 = (int32_t)env->CP0_EntryHi;
1102 1102 RETURN();
1103 1103 }
1104 1104  
1105 1105 void op_mfc0_compare (void)
1106 1106 {
1107   - T0 = (int32_t)env->CP0_Compare;
  1107 + T0 = env->CP0_Compare;
1108 1108 RETURN();
1109 1109 }
1110 1110  
1111 1111 void op_mfc0_status (void)
1112 1112 {
1113   - T0 = (int32_t)env->CP0_Status;
  1113 + T0 = env->CP0_Status;
1114 1114 if (env->hflags & MIPS_HFLAG_UM)
1115 1115 T0 |= (1 << CP0St_UM);
1116 1116 if (env->hflags & MIPS_HFLAG_ERL)
... ... @@ -1122,67 +1122,73 @@ void op_mfc0_status (void)
1122 1122  
1123 1123 void op_mfc0_intctl (void)
1124 1124 {
1125   - T0 = (int32_t)env->CP0_IntCtl;
  1125 + T0 = env->CP0_IntCtl;
1126 1126 RETURN();
1127 1127 }
1128 1128  
1129 1129 void op_mfc0_srsctl (void)
1130 1130 {
1131   - T0 = (int32_t)env->CP0_SRSCtl;
  1131 + T0 = env->CP0_SRSCtl;
  1132 + RETURN();
  1133 +}
  1134 +
  1135 +void op_mfc0_srsmap (void)
  1136 +{
  1137 + T0 = env->CP0_SRSMap;
1132 1138 RETURN();
1133 1139 }
1134 1140  
1135 1141 void op_mfc0_cause (void)
1136 1142 {
1137   - T0 = (int32_t)env->CP0_Cause;
  1143 + T0 = env->CP0_Cause;
1138 1144 RETURN();
1139 1145 }
1140 1146  
1141 1147 void op_mfc0_epc (void)
1142 1148 {
1143   - T0 = env->CP0_EPC;
  1149 + T0 = (int32_t)env->CP0_EPC;
1144 1150 RETURN();
1145 1151 }
1146 1152  
1147 1153 void op_mfc0_prid (void)
1148 1154 {
1149   - T0 = (int32_t)env->CP0_PRid;
  1155 + T0 = env->CP0_PRid;
1150 1156 RETURN();
1151 1157 }
1152 1158  
1153 1159 void op_mfc0_ebase (void)
1154 1160 {
1155   - T0 = env->CP0_EBase;
  1161 + T0 = (int32_t)env->CP0_EBase;
1156 1162 RETURN();
1157 1163 }
1158 1164  
1159 1165 void op_mfc0_config0 (void)
1160 1166 {
1161   - T0 = (int32_t)env->CP0_Config0;
  1167 + T0 = env->CP0_Config0;
1162 1168 RETURN();
1163 1169 }
1164 1170  
1165 1171 void op_mfc0_config1 (void)
1166 1172 {
1167   - T0 = (int32_t)env->CP0_Config1;
  1173 + T0 = env->CP0_Config1;
1168 1174 RETURN();
1169 1175 }
1170 1176  
1171 1177 void op_mfc0_config2 (void)
1172 1178 {
1173   - T0 = (int32_t)env->CP0_Config2;
  1179 + T0 = env->CP0_Config2;
1174 1180 RETURN();
1175 1181 }
1176 1182  
1177 1183 void op_mfc0_config3 (void)
1178 1184 {
1179   - T0 = (int32_t)env->CP0_Config3;
  1185 + T0 = env->CP0_Config3;
1180 1186 RETURN();
1181 1187 }
1182 1188  
1183 1189 void op_mfc0_lladdr (void)
1184 1190 {
1185   - T0 = env->CP0_LLAddr >> 4;
  1191 + T0 = (int32_t)env->CP0_LLAddr >> 4;
1186 1192 RETURN();
1187 1193 }
1188 1194  
... ... @@ -1194,13 +1200,13 @@ void op_mfc0_watchlo0 (void)
1194 1200  
1195 1201 void op_mfc0_watchhi0 (void)
1196 1202 {
1197   - T0 = (int32_t)env->CP0_WatchHi;
  1203 + T0 = env->CP0_WatchHi;
1198 1204 RETURN();
1199 1205 }
1200 1206  
1201 1207 void op_mfc0_xcontext (void)
1202 1208 {
1203   - T0 = env->CP0_XContext;
  1209 + T0 = (int32_t)env->CP0_XContext;
1204 1210 RETURN();
1205 1211 }
1206 1212  
... ... @@ -1212,7 +1218,7 @@ void op_mfc0_framemask (void)
1212 1218  
1213 1219 void op_mfc0_debug (void)
1214 1220 {
1215   - T0 = (int32_t)env->CP0_Debug;
  1221 + T0 = env->CP0_Debug;
1216 1222 if (env->hflags & MIPS_HFLAG_DM)
1217 1223 T0 |= 1 << CP0DB_DM;
1218 1224 RETURN();
... ... @@ -1220,55 +1226,55 @@ void op_mfc0_debug (void)
1220 1226  
1221 1227 void op_mfc0_depc (void)
1222 1228 {
1223   - T0 = env->CP0_DEPC;
  1229 + T0 = (int32_t)env->CP0_DEPC;
1224 1230 RETURN();
1225 1231 }
1226 1232  
1227 1233 void op_mfc0_performance0 (void)
1228 1234 {
1229   - T0 = (int32_t)env->CP0_Performance0;
  1235 + T0 = env->CP0_Performance0;
1230 1236 RETURN();
1231 1237 }
1232 1238  
1233 1239 void op_mfc0_taglo (void)
1234 1240 {
1235   - T0 = (int32_t)env->CP0_TagLo;
  1241 + T0 = env->CP0_TagLo;
1236 1242 RETURN();
1237 1243 }
1238 1244  
1239 1245 void op_mfc0_datalo (void)
1240 1246 {
1241   - T0 = (int32_t)env->CP0_DataLo;
  1247 + T0 = env->CP0_DataLo;
1242 1248 RETURN();
1243 1249 }
1244 1250  
1245 1251 void op_mfc0_taghi (void)
1246 1252 {
1247   - T0 = (int32_t)env->CP0_TagHi;
  1253 + T0 = env->CP0_TagHi;
1248 1254 RETURN();
1249 1255 }
1250 1256  
1251 1257 void op_mfc0_datahi (void)
1252 1258 {
1253   - T0 = (int32_t)env->CP0_DataHi;
  1259 + T0 = env->CP0_DataHi;
1254 1260 RETURN();
1255 1261 }
1256 1262  
1257 1263 void op_mfc0_errorepc (void)
1258 1264 {
1259   - T0 = env->CP0_ErrorEPC;
  1265 + T0 = (int32_t)env->CP0_ErrorEPC;
1260 1266 RETURN();
1261 1267 }
1262 1268  
1263 1269 void op_mfc0_desave (void)
1264 1270 {
1265   - T0 = (int32_t)env->CP0_DESAVE;
  1271 + T0 = env->CP0_DESAVE;
1266 1272 RETURN();
1267 1273 }
1268 1274  
1269 1275 void op_mtc0_index (void)
1270 1276 {
1271   - env->CP0_index = (env->CP0_index & 0x80000000) | (T0 & (MIPS_TLB_NB - 1));
  1277 + env->CP0_Index = (env->CP0_Index & 0x80000000) | (T0 & (MIPS_TLB_NB - 1));
1272 1278 RETURN();
1273 1279 }
1274 1280  
... ... @@ -1276,7 +1282,7 @@ void op_mtc0_entrylo0 (void)
1276 1282 {
1277 1283 /* Large physaddr not implemented */
1278 1284 /* 1k pages not implemented */
1279   - env->CP0_EntryLo0 = T0 & (int32_t)0x3FFFFFFF;
  1285 + env->CP0_EntryLo0 = (int32_t)T0 & 0x3FFFFFFF;
1280 1286 RETURN();
1281 1287 }
1282 1288  
... ... @@ -1284,7 +1290,7 @@ void op_mtc0_entrylo1 (void)
1284 1290 {
1285 1291 /* Large physaddr not implemented */
1286 1292 /* 1k pages not implemented */
1287   - env->CP0_EntryLo1 = T0 & (int32_t)0x3FFFFFFF;
  1293 + env->CP0_EntryLo1 = (int32_t)T0 & 0x3FFFFFFF;
1288 1294 RETURN();
1289 1295 }
1290 1296  
... ... @@ -1334,7 +1340,7 @@ void op_mtc0_entryhi (void)
1334 1340  
1335 1341 /* 1k pages not implemented */
1336 1342 /* Ignore MIPS64 TLB for now */
1337   - val = T0 & (int32_t)0xFFFFE0FF;
  1343 + val = (int32_t)T0 & 0xFFFFE0FF;
1338 1344 old = env->CP0_EntryHi;
1339 1345 env->CP0_EntryHi = val;
1340 1346 /* If the ASID changes, flush qemu's TLB. */
... ... @@ -1353,7 +1359,7 @@ void op_mtc0_status (void)
1353 1359 {
1354 1360 uint32_t val, old, mask;
1355 1361  
1356   - val = T0 & (int32_t)0xFA78FF01;
  1362 + val = (int32_t)T0 & 0xFA78FF01;
1357 1363 old = env->CP0_Status;
1358 1364 if (T0 & (1 << CP0St_UM))
1359 1365 env->hflags |= MIPS_HFLAG_UM;
... ... @@ -1400,6 +1406,13 @@ void op_mtc0_srsctl (void)
1400 1406 RETURN();
1401 1407 }
1402 1408  
  1409 +void op_mtc0_srsmap (void)
  1410 +{
  1411 + /* shadow registers not implemented */
  1412 + env->CP0_SRSMap = 0;
  1413 + RETURN();
  1414 +}
  1415 +
1403 1416 void op_mtc0_cause (void)
1404 1417 {
1405 1418 uint32_t val, old;
... ... @@ -1423,7 +1436,7 @@ void op_mtc0_cause (void)
1423 1436  
1424 1437 void op_mtc0_epc (void)
1425 1438 {
1426   - env->CP0_EPC = T0;
  1439 + env->CP0_EPC = (int32_t)T0;
1427 1440 RETURN();
1428 1441 }
1429 1442  
... ... @@ -1455,7 +1468,7 @@ void op_mtc0_config2 (void)
1455 1468  
1456 1469 void op_mtc0_watchlo0 (void)
1457 1470 {
1458   - env->CP0_WatchLo = T0;
  1471 + env->CP0_WatchLo = (int32_t)T0;
1459 1472 RETURN();
1460 1473 }
1461 1474  
... ... @@ -1467,7 +1480,7 @@ void op_mtc0_watchhi0 (void)
1467 1480  
1468 1481 void op_mtc0_xcontext (void)
1469 1482 {
1470   - env->CP0_XContext = T0; /* XXX */
  1483 + env->CP0_XContext = (int32_t)T0; /* XXX */
1471 1484 RETURN();
1472 1485 }
1473 1486  
... ... @@ -1489,7 +1502,7 @@ void op_mtc0_debug (void)
1489 1502  
1490 1503 void op_mtc0_depc (void)
1491 1504 {
1492   - env->CP0_DEPC = T0;
  1505 + env->CP0_DEPC = (int32_t)T0;
1493 1506 RETURN();
1494 1507 }
1495 1508  
... ... @@ -1501,7 +1514,7 @@ void op_mtc0_performance0 (void)
1501 1514  
1502 1515 void op_mtc0_taglo (void)
1503 1516 {
1504   - env->CP0_TagLo = T0 & (int32_t)0xFFFFFCF6;
  1517 + env->CP0_TagLo = T0 & 0xFFFFFCF6;
1505 1518 RETURN();
1506 1519 }
1507 1520  
... ... @@ -1525,7 +1538,7 @@ void op_mtc0_datahi (void)
1525 1538  
1526 1539 void op_mtc0_errorepc (void)
1527 1540 {
1528   - env->CP0_ErrorEPC = T0;
  1541 + env->CP0_ErrorEPC = (int32_t)T0;
1529 1542 RETURN();
1530 1543 }
1531 1544  
... ... @@ -1535,6 +1548,139 @@ void op_mtc0_desave (void)
1535 1548 RETURN();
1536 1549 }
1537 1550  
  1551 +void op_dmfc0_entrylo0 (void)
  1552 +{
  1553 + T0 = env->CP0_EntryLo0;
  1554 + RETURN();
  1555 +}
  1556 +
  1557 +void op_dmfc0_entrylo1 (void)
  1558 +{
  1559 + T0 = env->CP0_EntryLo1;
  1560 + RETURN();
  1561 +}
  1562 +
  1563 +void op_dmfc0_context (void)
  1564 +{
  1565 + T0 = env->CP0_Context;
  1566 + RETURN();
  1567 +}
  1568 +
  1569 +void op_dmfc0_badvaddr (void)
  1570 +{
  1571 + T0 = env->CP0_BadVAddr;
  1572 + RETURN();
  1573 +}
  1574 +
  1575 +void op_dmfc0_entryhi (void)
  1576 +{
  1577 + T0 = env->CP0_EntryHi;
  1578 + RETURN();
  1579 +}
  1580 +
  1581 +void op_dmfc0_epc (void)
  1582 +{
  1583 + T0 = env->CP0_EPC;
  1584 + RETURN();
  1585 +}
  1586 +
  1587 +void op_dmfc0_ebase (void)
  1588 +{
  1589 + T0 = env->CP0_EBase;
  1590 + RETURN();
  1591 +}
  1592 +
  1593 +void op_dmfc0_lladdr (void)
  1594 +{
  1595 + T0 = env->CP0_LLAddr >> 4;
  1596 + RETURN();
  1597 +}
  1598 +
  1599 +void op_dmfc0_watchlo0 (void)
  1600 +{
  1601 + T0 = env->CP0_WatchLo;
  1602 + RETURN();
  1603 +}
  1604 +
  1605 +void op_dmfc0_xcontext (void)
  1606 +{
  1607 + T0 = env->CP0_XContext;
  1608 + RETURN();
  1609 +}
  1610 +
  1611 +void op_dmfc0_depc (void)
  1612 +{
  1613 + T0 = env->CP0_DEPC;
  1614 + RETURN();
  1615 +}
  1616 +
  1617 +void op_dmfc0_errorepc (void)
  1618 +{
  1619 + T0 = env->CP0_ErrorEPC;
  1620 + RETURN();
  1621 +}
  1622 +
  1623 +void op_dmtc0_entrylo0 (void)
  1624 +{
  1625 + /* Large physaddr not implemented */
  1626 + /* 1k pages not implemented */
  1627 + env->CP0_EntryLo0 = T0 & 0x3FFFFFFF;
  1628 + RETURN();
  1629 +}
  1630 +
  1631 +void op_dmtc0_entrylo1 (void)
  1632 +{
  1633 + /* Large physaddr not implemented */
  1634 + /* 1k pages not implemented */
  1635 + env->CP0_EntryLo1 = T0 & 0x3FFFFFFF;
  1636 + RETURN();
  1637 +}
  1638 +
  1639 +void op_dmtc0_context (void)
  1640 +{
  1641 + env->CP0_Context = (env->CP0_Context & ~0x007FFFFF) | (T0 & 0x007FFFF0);
  1642 + RETURN();
  1643 +}
  1644 +
  1645 +void op_dmtc0_epc (void)
  1646 +{
  1647 + env->CP0_EPC = T0;
  1648 + RETURN();
  1649 +}
  1650 +
  1651 +void op_dmtc0_ebase (void)
  1652 +{
  1653 + /* vectored interrupts not implemented */
  1654 + /* Multi-CPU not implemented */
  1655 + /* XXX: 64bit addressing broken */
  1656 + env->CP0_EBase = (int32_t)0x80000000 | (T0 & 0x3FFFF000);
  1657 + RETURN();
  1658 +}
  1659 +
  1660 +void op_dmtc0_watchlo0 (void)
  1661 +{
  1662 + env->CP0_WatchLo = T0;
  1663 + RETURN();
  1664 +}
  1665 +
  1666 +void op_dmtc0_xcontext (void)
  1667 +{
  1668 + env->CP0_XContext = T0; /* XXX */
  1669 + RETURN();
  1670 +}
  1671 +
  1672 +void op_dmtc0_depc (void)
  1673 +{
  1674 + env->CP0_DEPC = T0;
  1675 + RETURN();
  1676 +}
  1677 +
  1678 +void op_dmtc0_errorepc (void)
  1679 +{
  1680 + env->CP0_ErrorEPC = T0;
  1681 + RETURN();
  1682 +}
  1683 +
1538 1684 #ifdef MIPS_USES_FPU
1539 1685  
1540 1686 #if 0
... ...
target-mips/op_helper.c
... ... @@ -411,10 +411,10 @@ void do_tlbwi (void)
411 411 that might be a further win. */
412 412 mips_tlb_flush_extra (env, MIPS_TLB_NB);
413 413  
414   - /* Wildly undefined effects for CP0_index containing a too high value and
  414 + /* Wildly undefined effects for CP0_Index containing a too high value and
415 415 MIPS_TLB_NB not being a power of two. But so does real silicon. */
416   - invalidate_tlb(env, env->CP0_index & (MIPS_TLB_NB - 1), 0);
417   - fill_tlb(env->CP0_index & (MIPS_TLB_NB - 1));
  416 + invalidate_tlb(env, env->CP0_Index & (MIPS_TLB_NB - 1), 0);
  417 + fill_tlb(env->CP0_Index & (MIPS_TLB_NB - 1));
418 418 }
419 419  
420 420 void do_tlbwr (void)
... ... @@ -439,7 +439,7 @@ void do_tlbp (void)
439 439 /* Check ASID, virtual page number & size */
440 440 if ((tlb->G == 1 || tlb->ASID == ASID) && tlb->VPN == tag) {
441 441 /* TLB match */
442   - env->CP0_index = i;
  442 + env->CP0_Index = i;
443 443 break;
444 444 }
445 445 }
... ... @@ -455,7 +455,7 @@ void do_tlbp (void)
455 455 }
456 456 }
457 457  
458   - env->CP0_index |= 0x80000000;
  458 + env->CP0_Index |= 0x80000000;
459 459 }
460 460 }
461 461  
... ... @@ -465,7 +465,7 @@ void do_tlbr (void)
465 465 uint8_t ASID;
466 466  
467 467 ASID = env->CP0_EntryHi & 0xFF;
468   - tlb = &env->tlb[env->CP0_index & (MIPS_TLB_NB - 1)];
  468 + tlb = &env->tlb[env->CP0_Index & (MIPS_TLB_NB - 1)];
469 469  
470 470 /* If this will change the current ASID, flush qemu's TLB. */
471 471 if (ASID != tlb->ASID)
... ...
target-mips/translate.c
... ... @@ -2827,6 +2827,1181 @@ die:
2827 2827 generate_exception(ctx, EXCP_RI);
2828 2828 }
2829 2829  
  2830 +static void gen_dmfc0 (DisasContext *ctx, int reg, int sel)
  2831 +{
  2832 + const char *rn = "invalid";
  2833 +
  2834 + switch (reg) {
  2835 + case 0:
  2836 + switch (sel) {
  2837 + case 0:
  2838 + gen_op_mfc0_index();
  2839 + rn = "Index";
  2840 + break;
  2841 + case 1:
  2842 +// gen_op_dmfc0_mvpcontrol(); /* MT ASE */
  2843 + rn = "MVPControl";
  2844 +// break;
  2845 + case 2:
  2846 +// gen_op_dmfc0_mvpconf0(); /* MT ASE */
  2847 + rn = "MVPConf0";
  2848 +// break;
  2849 + case 3:
  2850 +// gen_op_dmfc0_mvpconf1(); /* MT ASE */
  2851 + rn = "MVPConf1";
  2852 +// break;
  2853 + default:
  2854 + goto die;
  2855 + }
  2856 + break;
  2857 + case 1:
  2858 + switch (sel) {
  2859 + case 0:
  2860 + gen_op_mfc0_random();
  2861 + rn = "Random";
  2862 + break;
  2863 + case 1:
  2864 +// gen_op_dmfc0_vpecontrol(); /* MT ASE */
  2865 + rn = "VPEControl";
  2866 +// break;
  2867 + case 2:
  2868 +// gen_op_dmfc0_vpeconf0(); /* MT ASE */
  2869 + rn = "VPEConf0";
  2870 +// break;
  2871 + case 3:
  2872 +// gen_op_dmfc0_vpeconf1(); /* MT ASE */
  2873 + rn = "VPEConf1";
  2874 +// break;
  2875 + case 4:
  2876 +// gen_op_dmfc0_YQMask(); /* MT ASE */
  2877 + rn = "YQMask";
  2878 +// break;
  2879 + case 5:
  2880 +// gen_op_dmfc0_vpeschedule(); /* MT ASE */
  2881 + rn = "VPESchedule";
  2882 +// break;
  2883 + case 6:
  2884 +// gen_op_dmfc0_vpeschefback(); /* MT ASE */
  2885 + rn = "VPEScheFBack";
  2886 +// break;
  2887 + case 7:
  2888 +// gen_op_dmfc0_vpeopt(); /* MT ASE */
  2889 + rn = "VPEOpt";
  2890 +// break;
  2891 + default:
  2892 + goto die;
  2893 + }
  2894 + break;
  2895 + case 2:
  2896 + switch (sel) {
  2897 + case 0:
  2898 + gen_op_dmfc0_entrylo0();
  2899 + rn = "EntryLo0";
  2900 + break;
  2901 + case 1:
  2902 +// gen_op_dmfc0_tcstatus(); /* MT ASE */
  2903 + rn = "TCStatus";
  2904 +// break;
  2905 + case 2:
  2906 +// gen_op_dmfc0_tcbind(); /* MT ASE */
  2907 + rn = "TCBind";
  2908 +// break;
  2909 + case 3:
  2910 +// gen_op_dmfc0_tcrestart(); /* MT ASE */
  2911 + rn = "TCRestart";
  2912 +// break;
  2913 + case 4:
  2914 +// gen_op_dmfc0_tchalt(); /* MT ASE */
  2915 + rn = "TCHalt";
  2916 +// break;
  2917 + case 5:
  2918 +// gen_op_dmfc0_tccontext(); /* MT ASE */
  2919 + rn = "TCContext";
  2920 +// break;
  2921 + case 6:
  2922 +// gen_op_dmfc0_tcschedule(); /* MT ASE */
  2923 + rn = "TCSchedule";
  2924 +// break;
  2925 + case 7:
  2926 +// gen_op_dmfc0_tcschefback(); /* MT ASE */
  2927 + rn = "TCScheFBack";
  2928 +// break;
  2929 + default:
  2930 + goto die;
  2931 + }
  2932 + break;
  2933 + case 3:
  2934 + switch (sel) {
  2935 + case 0:
  2936 + gen_op_dmfc0_entrylo1();
  2937 + rn = "EntryLo1";
  2938 + break;
  2939 + default:
  2940 + goto die;
  2941 + }
  2942 + break;
  2943 + case 4:
  2944 + switch (sel) {
  2945 + case 0:
  2946 + gen_op_dmfc0_context();
  2947 + rn = "Context";
  2948 + break;
  2949 + case 1:
  2950 +// gen_op_dmfc0_contextconfig(); /* SmartMIPS ASE */
  2951 + rn = "ContextConfig";
  2952 +// break;
  2953 + default:
  2954 + goto die;
  2955 + }
  2956 + break;
  2957 + case 5:
  2958 + switch (sel) {
  2959 + case 0:
  2960 + gen_op_mfc0_pagemask();
  2961 + rn = "PageMask";
  2962 + break;
  2963 + case 1:
  2964 + gen_op_mfc0_pagegrain();
  2965 + rn = "PageGrain";
  2966 + break;
  2967 + default:
  2968 + goto die;
  2969 + }
  2970 + break;
  2971 + case 6:
  2972 + switch (sel) {
  2973 + case 0:
  2974 + gen_op_mfc0_wired();
  2975 + rn = "Wired";
  2976 + break;
  2977 + case 1:
  2978 +// gen_op_dmfc0_srsconf0(); /* shadow registers */
  2979 + rn = "SRSConf0";
  2980 +// break;
  2981 + case 2:
  2982 +// gen_op_dmfc0_srsconf1(); /* shadow registers */
  2983 + rn = "SRSConf1";
  2984 +// break;
  2985 + case 3:
  2986 +// gen_op_dmfc0_srsconf2(); /* shadow registers */
  2987 + rn = "SRSConf2";
  2988 +// break;
  2989 + case 4:
  2990 +// gen_op_dmfc0_srsconf3(); /* shadow registers */
  2991 + rn = "SRSConf3";
  2992 +// break;
  2993 + case 5:
  2994 +// gen_op_dmfc0_srsconf4(); /* shadow registers */
  2995 + rn = "SRSConf4";
  2996 +// break;
  2997 + default:
  2998 + goto die;
  2999 + }
  3000 + break;
  3001 + case 7:
  3002 + switch (sel) {
  3003 + case 0:
  3004 + gen_op_mfc0_hwrena();
  3005 + rn = "HWREna";
  3006 + break;
  3007 + default:
  3008 + goto die;
  3009 + }
  3010 + break;
  3011 + case 8:
  3012 + switch (sel) {
  3013 + case 0:
  3014 + gen_op_dmfc0_badvaddr();
  3015 + rn = "BadVaddr";
  3016 + break;
  3017 + default:
  3018 + goto die;
  3019 + }
  3020 + break;
  3021 + case 9:
  3022 + switch (sel) {
  3023 + case 0:
  3024 + gen_op_mfc0_count();
  3025 + rn = "Count";
  3026 + break;
  3027 + /* 6,7 are implementation dependent */
  3028 + default:
  3029 + goto die;
  3030 + }
  3031 + break;
  3032 + case 10:
  3033 + switch (sel) {
  3034 + case 0:
  3035 + gen_op_dmfc0_entryhi();
  3036 + rn = "EntryHi";
  3037 + break;
  3038 + default:
  3039 + goto die;
  3040 + }
  3041 + break;
  3042 + case 11:
  3043 + switch (sel) {
  3044 + case 0:
  3045 + gen_op_mfc0_compare();
  3046 + rn = "Compare";
  3047 + break;
  3048 + /* 6,7 are implementation dependent */
  3049 + default:
  3050 + goto die;
  3051 + }
  3052 + break;
  3053 + case 12:
  3054 + switch (sel) {
  3055 + case 0:
  3056 + gen_op_mfc0_status();
  3057 + rn = "Status";
  3058 + break;
  3059 + case 1:
  3060 + gen_op_mfc0_intctl();
  3061 + rn = "IntCtl";
  3062 + break;
  3063 + case 2:
  3064 + gen_op_mfc0_srsctl();
  3065 + rn = "SRSCtl";
  3066 + break;
  3067 + case 3:
  3068 + gen_op_mfc0_srsmap(); /* shadow registers */
  3069 + rn = "SRSMap";
  3070 + break;
  3071 + default:
  3072 + goto die;
  3073 + }
  3074 + break;
  3075 + case 13:
  3076 + switch (sel) {
  3077 + case 0:
  3078 + gen_op_mfc0_cause();
  3079 + rn = "Cause";
  3080 + break;
  3081 + default:
  3082 + goto die;
  3083 + }
  3084 + break;
  3085 + case 14:
  3086 + switch (sel) {
  3087 + case 0:
  3088 + gen_op_dmfc0_epc();
  3089 + rn = "EPC";
  3090 + break;
  3091 + default:
  3092 + goto die;
  3093 + }
  3094 + break;
  3095 + case 15:
  3096 + switch (sel) {
  3097 + case 0:
  3098 + gen_op_mfc0_prid();
  3099 + rn = "PRid";
  3100 + break;
  3101 + case 1:
  3102 + gen_op_dmfc0_ebase();
  3103 + rn = "EBase";
  3104 + break;
  3105 + default:
  3106 + goto die;
  3107 + }
  3108 + break;
  3109 + case 16:
  3110 + switch (sel) {
  3111 + case 0:
  3112 + gen_op_mfc0_config0();
  3113 + rn = "Config";
  3114 + break;
  3115 + case 1:
  3116 + gen_op_mfc0_config1();
  3117 + rn = "Config1";
  3118 + break;
  3119 + case 2:
  3120 + gen_op_mfc0_config2();
  3121 + rn = "Config2";
  3122 + break;
  3123 + case 3:
  3124 + gen_op_mfc0_config3();
  3125 + rn = "Config3";
  3126 + break;
  3127 + /* 6,7 are implementation dependent */
  3128 + default:
  3129 + goto die;
  3130 + }
  3131 + break;
  3132 + case 17:
  3133 + switch (sel) {
  3134 + case 0:
  3135 + gen_op_dmfc0_lladdr();
  3136 + rn = "LLAddr";
  3137 + break;
  3138 + default:
  3139 + goto die;
  3140 + }
  3141 + break;
  3142 + case 18:
  3143 + switch (sel) {
  3144 + case 0:
  3145 + gen_op_dmfc0_watchlo0();
  3146 + rn = "WatchLo";
  3147 + break;
  3148 + case 1:
  3149 +// gen_op_dmfc0_watchlo1();
  3150 + rn = "WatchLo1";
  3151 +// break;
  3152 + case 2:
  3153 +// gen_op_dmfc0_watchlo2();
  3154 + rn = "WatchLo2";
  3155 +// break;
  3156 + case 3:
  3157 +// gen_op_dmfc0_watchlo3();
  3158 + rn = "WatchLo3";
  3159 +// break;
  3160 + case 4:
  3161 +// gen_op_dmfc0_watchlo4();
  3162 + rn = "WatchLo4";
  3163 +// break;
  3164 + case 5:
  3165 +// gen_op_dmfc0_watchlo5();
  3166 + rn = "WatchLo5";
  3167 +// break;
  3168 + case 6:
  3169 +// gen_op_dmfc0_watchlo6();
  3170 + rn = "WatchLo6";
  3171 +// break;
  3172 + case 7:
  3173 +// gen_op_dmfc0_watchlo7();
  3174 + rn = "WatchLo7";
  3175 +// break;
  3176 + default:
  3177 + goto die;
  3178 + }
  3179 + break;
  3180 + case 19:
  3181 + switch (sel) {
  3182 + case 0:
  3183 + gen_op_mfc0_watchhi0();
  3184 + rn = "WatchHi";
  3185 + break;
  3186 + case 1:
  3187 +// gen_op_mfc0_watchhi1();
  3188 + rn = "WatchHi1";
  3189 +// break;
  3190 + case 2:
  3191 +// gen_op_mfc0_watchhi2();
  3192 + rn = "WatchHi2";
  3193 +// break;
  3194 + case 3:
  3195 +// gen_op_mfc0_watchhi3();
  3196 + rn = "WatchHi3";
  3197 +// break;
  3198 + case 4:
  3199 +// gen_op_mfc0_watchhi4();
  3200 + rn = "WatchHi4";
  3201 +// break;
  3202 + case 5:
  3203 +// gen_op_mfc0_watchhi5();
  3204 + rn = "WatchHi5";
  3205 +// break;
  3206 + case 6:
  3207 +// gen_op_mfc0_watchhi6();
  3208 + rn = "WatchHi6";
  3209 +// break;
  3210 + case 7:
  3211 +// gen_op_mfc0_watchhi7();
  3212 + rn = "WatchHi7";
  3213 +// break;
  3214 + default:
  3215 + goto die;
  3216 + }
  3217 + break;
  3218 + case 20:
  3219 + switch (sel) {
  3220 + case 0:
  3221 + /* 64 bit MMU only */
  3222 + gen_op_dmfc0_xcontext();
  3223 + rn = "XContext";
  3224 + break;
  3225 + default:
  3226 + goto die;
  3227 + }
  3228 + break;
  3229 + case 21:
  3230 + /* Officially reserved, but sel 0 is used for R1x000 framemask */
  3231 + switch (sel) {
  3232 + case 0:
  3233 + gen_op_mfc0_framemask();
  3234 + rn = "Framemask";
  3235 + break;
  3236 + default:
  3237 + goto die;
  3238 + }
  3239 + break;
  3240 + case 22:
  3241 + /* ignored */
  3242 + rn = "'Diagnostic"; /* implementation dependent */
  3243 + break;
  3244 + case 23:
  3245 + switch (sel) {
  3246 + case 0:
  3247 + gen_op_mfc0_debug(); /* EJTAG support */
  3248 + rn = "Debug";
  3249 + break;
  3250 + case 1:
  3251 +// gen_op_dmfc0_tracecontrol(); /* PDtrace support */
  3252 + rn = "TraceControl";
  3253 +// break;
  3254 + case 2:
  3255 +// gen_op_dmfc0_tracecontrol2(); /* PDtrace support */
  3256 + rn = "TraceControl2";
  3257 +// break;
  3258 + case 3:
  3259 +// gen_op_dmfc0_usertracedata(); /* PDtrace support */
  3260 + rn = "UserTraceData";
  3261 +// break;
  3262 + case 4:
  3263 +// gen_op_dmfc0_debug(); /* PDtrace support */
  3264 + rn = "TraceBPC";
  3265 +// break;
  3266 + default:
  3267 + goto die;
  3268 + }
  3269 + break;
  3270 + case 24:
  3271 + switch (sel) {
  3272 + case 0:
  3273 + gen_op_dmfc0_depc(); /* EJTAG support */
  3274 + rn = "DEPC";
  3275 + break;
  3276 + default:
  3277 + goto die;
  3278 + }
  3279 + break;
  3280 + case 25:
  3281 + switch (sel) {
  3282 + case 0:
  3283 + gen_op_mfc0_performance0();
  3284 + rn = "Performance0";
  3285 + break;
  3286 + case 1:
  3287 +// gen_op_dmfc0_performance1();
  3288 + rn = "Performance1";
  3289 +// break;
  3290 + case 2:
  3291 +// gen_op_dmfc0_performance2();
  3292 + rn = "Performance2";
  3293 +// break;
  3294 + case 3:
  3295 +// gen_op_dmfc0_performance3();
  3296 + rn = "Performance3";
  3297 +// break;
  3298 + case 4:
  3299 +// gen_op_dmfc0_performance4();
  3300 + rn = "Performance4";
  3301 +// break;
  3302 + case 5:
  3303 +// gen_op_dmfc0_performance5();
  3304 + rn = "Performance5";
  3305 +// break;
  3306 + case 6:
  3307 +// gen_op_dmfc0_performance6();
  3308 + rn = "Performance6";
  3309 +// break;
  3310 + case 7:
  3311 +// gen_op_dmfc0_performance7();
  3312 + rn = "Performance7";
  3313 +// break;
  3314 + default:
  3315 + goto die;
  3316 + }
  3317 + break;
  3318 + case 26:
  3319 + rn = "ECC";
  3320 + break;
  3321 + case 27:
  3322 + switch (sel) {
  3323 + /* ignored */
  3324 + case 0 ... 3:
  3325 + rn = "CacheErr";
  3326 + break;
  3327 + default:
  3328 + goto die;
  3329 + }
  3330 + break;
  3331 + case 28:
  3332 + switch (sel) {
  3333 + case 0:
  3334 + case 2:
  3335 + case 4:
  3336 + case 6:
  3337 + gen_op_mfc0_taglo();
  3338 + rn = "TagLo";
  3339 + break;
  3340 + case 1:
  3341 + case 3:
  3342 + case 5:
  3343 + case 7:
  3344 + gen_op_mfc0_datalo();
  3345 + rn = "DataLo";
  3346 + break;
  3347 + default:
  3348 + goto die;
  3349 + }
  3350 + break;
  3351 + case 29:
  3352 + switch (sel) {
  3353 + case 0:
  3354 + case 2:
  3355 + case 4:
  3356 + case 6:
  3357 + gen_op_mfc0_taghi();
  3358 + rn = "TagHi";
  3359 + break;
  3360 + case 1:
  3361 + case 3:
  3362 + case 5:
  3363 + case 7:
  3364 + gen_op_mfc0_datahi();
  3365 + rn = "DataHi";
  3366 + break;
  3367 + default:
  3368 + goto die;
  3369 + }
  3370 + break;
  3371 + case 30:
  3372 + switch (sel) {
  3373 + case 0:
  3374 + gen_op_dmfc0_errorepc();
  3375 + rn = "ErrorEPC";
  3376 + break;
  3377 + default:
  3378 + goto die;
  3379 + }
  3380 + break;
  3381 + case 31:
  3382 + switch (sel) {
  3383 + case 0:
  3384 + gen_op_mfc0_desave(); /* EJTAG support */
  3385 + rn = "DESAVE";
  3386 + break;
  3387 + default:
  3388 + goto die;
  3389 + }
  3390 + break;
  3391 + default:
  3392 + goto die;
  3393 + }
  3394 +#if defined MIPS_DEBUG_DISAS
  3395 + if (loglevel & CPU_LOG_TB_IN_ASM) {
  3396 + fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n",
  3397 + rn, reg, sel);
  3398 + }
  3399 +#endif
  3400 + return;
  3401 +
  3402 +die:
  3403 +#if defined MIPS_DEBUG_DISAS
  3404 + if (loglevel & CPU_LOG_TB_IN_ASM) {
  3405 + fprintf(logfile, "dmfc0 %s (reg %d sel %d)\n",
  3406 + rn, reg, sel);
  3407 + }
  3408 +#endif
  3409 + generate_exception(ctx, EXCP_RI);
  3410 +}
  3411 +
  3412 +static void gen_dmtc0 (DisasContext *ctx, int reg, int sel)
  3413 +{
  3414 + const char *rn = "invalid";
  3415 +
  3416 + switch (reg) {
  3417 + case 0:
  3418 + switch (sel) {
  3419 + case 0:
  3420 + gen_op_mtc0_index();
  3421 + rn = "Index";
  3422 + break;
  3423 + case 1:
  3424 +// gen_op_dmtc0_mvpcontrol(); /* MT ASE */
  3425 + rn = "MVPControl";
  3426 +// break;
  3427 + case 2:
  3428 +// gen_op_dmtc0_mvpconf0(); /* MT ASE */
  3429 + rn = "MVPConf0";
  3430 +// break;
  3431 + case 3:
  3432 +// gen_op_dmtc0_mvpconf1(); /* MT ASE */
  3433 + rn = "MVPConf1";
  3434 +// break;
  3435 + default:
  3436 + goto die;
  3437 + }
  3438 + break;
  3439 + case 1:
  3440 + switch (sel) {
  3441 + case 0:
  3442 + /* ignored */
  3443 + rn = "Random";
  3444 + break;
  3445 + case 1:
  3446 +// gen_op_dmtc0_vpecontrol(); /* MT ASE */
  3447 + rn = "VPEControl";
  3448 +// break;
  3449 + case 2:
  3450 +// gen_op_dmtc0_vpeconf0(); /* MT ASE */
  3451 + rn = "VPEConf0";
  3452 +// break;
  3453 + case 3:
  3454 +// gen_op_dmtc0_vpeconf1(); /* MT ASE */
  3455 + rn = "VPEConf1";
  3456 +// break;
  3457 + case 4:
  3458 +// gen_op_dmtc0_YQMask(); /* MT ASE */
  3459 + rn = "YQMask";
  3460 +// break;
  3461 + case 5:
  3462 +// gen_op_dmtc0_vpeschedule(); /* MT ASE */
  3463 + rn = "VPESchedule";
  3464 +// break;
  3465 + case 6:
  3466 +// gen_op_dmtc0_vpeschefback(); /* MT ASE */
  3467 + rn = "VPEScheFBack";
  3468 +// break;
  3469 + case 7:
  3470 +// gen_op_dmtc0_vpeopt(); /* MT ASE */
  3471 + rn = "VPEOpt";
  3472 +// break;
  3473 + default:
  3474 + goto die;
  3475 + }
  3476 + break;
  3477 + case 2:
  3478 + switch (sel) {
  3479 + case 0:
  3480 + gen_op_dmtc0_entrylo0();
  3481 + rn = "EntryLo0";
  3482 + break;
  3483 + case 1:
  3484 +// gen_op_dmtc0_tcstatus(); /* MT ASE */
  3485 + rn = "TCStatus";
  3486 +// break;
  3487 + case 2:
  3488 +// gen_op_dmtc0_tcbind(); /* MT ASE */
  3489 + rn = "TCBind";
  3490 +// break;
  3491 + case 3:
  3492 +// gen_op_dmtc0_tcrestart(); /* MT ASE */
  3493 + rn = "TCRestart";
  3494 +// break;
  3495 + case 4:
  3496 +// gen_op_dmtc0_tchalt(); /* MT ASE */
  3497 + rn = "TCHalt";
  3498 +// break;
  3499 + case 5:
  3500 +// gen_op_dmtc0_tccontext(); /* MT ASE */
  3501 + rn = "TCContext";
  3502 +// break;
  3503 + case 6:
  3504 +// gen_op_dmtc0_tcschedule(); /* MT ASE */
  3505 + rn = "TCSchedule";
  3506 +// break;
  3507 + case 7:
  3508 +// gen_op_dmtc0_tcschefback(); /* MT ASE */
  3509 + rn = "TCScheFBack";
  3510 +// break;
  3511 + default:
  3512 + goto die;
  3513 + }
  3514 + break;
  3515 + case 3:
  3516 + switch (sel) {
  3517 + case 0:
  3518 + gen_op_dmtc0_entrylo1();
  3519 + rn = "EntryLo1";
  3520 + break;
  3521 + default:
  3522 + goto die;
  3523 + }
  3524 + break;
  3525 + case 4:
  3526 + switch (sel) {
  3527 + case 0:
  3528 + gen_op_dmtc0_context();
  3529 + rn = "Context";
  3530 + break;
  3531 + case 1:
  3532 +// gen_op_dmtc0_contextconfig(); /* SmartMIPS ASE */
  3533 + rn = "ContextConfig";
  3534 +// break;
  3535 + default:
  3536 + goto die;
  3537 + }
  3538 + break;
  3539 + case 5:
  3540 + switch (sel) {
  3541 + case 0:
  3542 + gen_op_mtc0_pagemask();
  3543 + rn = "PageMask";
  3544 + break;
  3545 + case 1:
  3546 + gen_op_mtc0_pagegrain();
  3547 + rn = "PageGrain";
  3548 + break;
  3549 + default:
  3550 + goto die;
  3551 + }
  3552 + break;
  3553 + case 6:
  3554 + switch (sel) {
  3555 + case 0:
  3556 + gen_op_mtc0_wired();
  3557 + rn = "Wired";
  3558 + break;
  3559 + case 1:
  3560 +// gen_op_dmtc0_srsconf0(); /* shadow registers */
  3561 + rn = "SRSConf0";
  3562 +// break;
  3563 + case 2:
  3564 +// gen_op_dmtc0_srsconf1(); /* shadow registers */
  3565 + rn = "SRSConf1";
  3566 +// break;
  3567 + case 3:
  3568 +// gen_op_dmtc0_srsconf2(); /* shadow registers */
  3569 + rn = "SRSConf2";
  3570 +// break;
  3571 + case 4:
  3572 +// gen_op_dmtc0_srsconf3(); /* shadow registers */
  3573 + rn = "SRSConf3";
  3574 +// break;
  3575 + case 5:
  3576 +// gen_op_dmtc0_srsconf4(); /* shadow registers */
  3577 + rn = "SRSConf4";
  3578 +// break;
  3579 + default:
  3580 + goto die;
  3581 + }
  3582 + break;
  3583 + case 7:
  3584 + switch (sel) {
  3585 + case 0:
  3586 + gen_op_mtc0_hwrena();
  3587 + rn = "HWREna";
  3588 + break;
  3589 + default:
  3590 + goto die;
  3591 + }
  3592 + break;
  3593 + case 8:
  3594 + /* ignored */
  3595 + rn = "BadVaddr";
  3596 + break;
  3597 + case 9:
  3598 + switch (sel) {
  3599 + case 0:
  3600 + gen_op_mtc0_count();
  3601 + rn = "Count";
  3602 + break;
  3603 + /* 6,7 are implementation dependent */
  3604 + default:
  3605 + goto die;
  3606 + }
  3607 + /* Stop translation as we may have switched the execution mode */
  3608 + ctx->bstate = BS_STOP;
  3609 + break;
  3610 + case 10:
  3611 + switch (sel) {
  3612 + case 0:
  3613 + gen_op_mtc0_entryhi();
  3614 + rn = "EntryHi";
  3615 + break;
  3616 + default:
  3617 + goto die;
  3618 + }
  3619 + break;
  3620 + case 11:
  3621 + switch (sel) {
  3622 + case 0:
  3623 + gen_op_mtc0_compare();
  3624 + rn = "Compare";
  3625 + break;
  3626 + /* 6,7 are implementation dependent */
  3627 + default:
  3628 + goto die;
  3629 + }
  3630 + /* Stop translation as we may have switched the execution mode */
  3631 + ctx->bstate = BS_STOP;
  3632 + break;
  3633 + case 12:
  3634 + switch (sel) {
  3635 + case 0:
  3636 + gen_op_mtc0_status();
  3637 + rn = "Status";
  3638 + break;
  3639 + case 1:
  3640 + gen_op_mtc0_intctl();
  3641 + rn = "IntCtl";
  3642 + break;
  3643 + case 2:
  3644 + gen_op_mtc0_srsctl();
  3645 + rn = "SRSCtl";
  3646 + break;
  3647 + case 3:
  3648 + gen_op_mtc0_srsmap(); /* shadow registers */
  3649 + rn = "SRSMap";
  3650 + break;
  3651 + default:
  3652 + goto die;
  3653 + }
  3654 + /* Stop translation as we may have switched the execution mode */
  3655 + ctx->bstate = BS_STOP;
  3656 + break;
  3657 + case 13:
  3658 + switch (sel) {
  3659 + case 0:
  3660 + gen_op_mtc0_cause();
  3661 + rn = "Cause";
  3662 + break;
  3663 + default:
  3664 + goto die;
  3665 + }
  3666 + /* Stop translation as we may have switched the execution mode */
  3667 + ctx->bstate = BS_STOP;
  3668 + break;
  3669 + case 14:
  3670 + switch (sel) {
  3671 + case 0:
  3672 + gen_op_dmtc0_epc();
  3673 + rn = "EPC";
  3674 + break;
  3675 + default:
  3676 + goto die;
  3677 + }
  3678 + break;
  3679 + case 15:
  3680 + switch (sel) {
  3681 + case 0:
  3682 + /* ignored */
  3683 + rn = "PRid";
  3684 + break;
  3685 + case 1:
  3686 + gen_op_dmtc0_ebase();
  3687 + rn = "EBase";
  3688 + break;
  3689 + default:
  3690 + goto die;
  3691 + }
  3692 + break;
  3693 + case 16:
  3694 + switch (sel) {
  3695 + case 0:
  3696 + gen_op_mtc0_config0();
  3697 + rn = "Config";
  3698 + break;
  3699 + case 1:
  3700 + /* ignored */
  3701 + rn = "Config1";
  3702 + break;
  3703 + case 2:
  3704 + gen_op_mtc0_config2();
  3705 + rn = "Config2";
  3706 + break;
  3707 + case 3:
  3708 + /* ignored */
  3709 + rn = "Config3";
  3710 + break;
  3711 + /* 6,7 are implementation dependent */
  3712 + default:
  3713 + rn = "Invalid config selector";
  3714 + goto die;
  3715 + }
  3716 + /* Stop translation as we may have switched the execution mode */
  3717 + ctx->bstate = BS_STOP;
  3718 + break;
  3719 + case 17:
  3720 + switch (sel) {
  3721 + case 0:
  3722 + /* ignored */
  3723 + rn = "LLAddr";
  3724 + break;
  3725 + default:
  3726 + goto die;
  3727 + }
  3728 + break;
  3729 + case 18:
  3730 + switch (sel) {
  3731 + case 0:
  3732 + gen_op_dmtc0_watchlo0();
  3733 + rn = "WatchLo";
  3734 + break;
  3735 + case 1:
  3736 +// gen_op_dmtc0_watchlo1();
  3737 + rn = "WatchLo1";
  3738 +// break;
  3739 + case 2:
  3740 +// gen_op_dmtc0_watchlo2();
  3741 + rn = "WatchLo2";
  3742 +// break;
  3743 + case 3:
  3744 +// gen_op_dmtc0_watchlo3();
  3745 + rn = "WatchLo3";
  3746 +// break;
  3747 + case 4:
  3748 +// gen_op_dmtc0_watchlo4();
  3749 + rn = "WatchLo4";
  3750 +// break;
  3751 + case 5:
  3752 +// gen_op_dmtc0_watchlo5();
  3753 + rn = "WatchLo5";
  3754 +// break;
  3755 + case 6:
  3756 +// gen_op_dmtc0_watchlo6();
  3757 + rn = "WatchLo6";
  3758 +// break;
  3759 + case 7:
  3760 +// gen_op_dmtc0_watchlo7();
  3761 + rn = "WatchLo7";
  3762 +// break;
  3763 + default:
  3764 + goto die;
  3765 + }
  3766 + break;
  3767 + case 19:
  3768 + switch (sel) {
  3769 + case 0:
  3770 + gen_op_mtc0_watchhi0();
  3771 + rn = "WatchHi";
  3772 + break;
  3773 + case 1:
  3774 +// gen_op_dmtc0_watchhi1();
  3775 + rn = "WatchHi1";
  3776 +// break;
  3777 + case 2:
  3778 +// gen_op_dmtc0_watchhi2();
  3779 + rn = "WatchHi2";
  3780 +// break;
  3781 + case 3:
  3782 +// gen_op_dmtc0_watchhi3();
  3783 + rn = "WatchHi3";
  3784 +// break;
  3785 + case 4:
  3786 +// gen_op_dmtc0_watchhi4();
  3787 + rn = "WatchHi4";
  3788 +// break;
  3789 + case 5:
  3790 +// gen_op_dmtc0_watchhi5();
  3791 + rn = "WatchHi5";
  3792 +// break;
  3793 + case 6:
  3794 +// gen_op_dmtc0_watchhi6();
  3795 + rn = "WatchHi6";
  3796 +// break;
  3797 + case 7:
  3798 +// gen_op_dmtc0_watchhi7();
  3799 + rn = "WatchHi7";
  3800 +// break;
  3801 + default:
  3802 + goto die;
  3803 + }
  3804 + break;
  3805 + case 20:
  3806 + switch (sel) {
  3807 + case 0:
  3808 + /* 64 bit MMU only */
  3809 + gen_op_dmtc0_xcontext();
  3810 + rn = "XContext";
  3811 + break;
  3812 + default:
  3813 + goto die;
  3814 + }
  3815 + break;
  3816 + case 21:
  3817 + /* Officially reserved, but sel 0 is used for R1x000 framemask */
  3818 + switch (sel) {
  3819 + case 0:
  3820 + gen_op_mtc0_framemask();
  3821 + rn = "Framemask";
  3822 + break;
  3823 + default:
  3824 + goto die;
  3825 + }
  3826 + break;
  3827 + case 22:
  3828 + /* ignored */
  3829 + rn = "Diagnostic"; /* implementation dependent */
  3830 + break;
  3831 + case 23:
  3832 + switch (sel) {
  3833 + case 0:
  3834 + gen_op_mtc0_debug(); /* EJTAG support */
  3835 + rn = "Debug";
  3836 + break;
  3837 + case 1:
  3838 +// gen_op_dmtc0_tracecontrol(); /* PDtrace support */
  3839 + rn = "TraceControl";
  3840 +// break;
  3841 + case 2:
  3842 +// gen_op_dmtc0_tracecontrol2(); /* PDtrace support */
  3843 + rn = "TraceControl2";
  3844 +// break;
  3845 + case 3:
  3846 +// gen_op_dmtc0_usertracedata(); /* PDtrace support */
  3847 + rn = "UserTraceData";
  3848 +// break;
  3849 + case 4:
  3850 +// gen_op_dmtc0_debug(); /* PDtrace support */
  3851 + rn = "TraceBPC";
  3852 +// break;
  3853 + default:
  3854 + goto die;
  3855 + }
  3856 + /* Stop translation as we may have switched the execution mode */
  3857 + ctx->bstate = BS_STOP;
  3858 + break;
  3859 + case 24:
  3860 + switch (sel) {
  3861 + case 0:
  3862 + gen_op_dmtc0_depc(); /* EJTAG support */
  3863 + rn = "DEPC";
  3864 + break;
  3865 + default:
  3866 + goto die;
  3867 + }
  3868 + break;
  3869 + case 25:
  3870 + switch (sel) {
  3871 + case 0:
  3872 + gen_op_mtc0_performance0();
  3873 + rn = "Performance0";
  3874 + break;
  3875 + case 1:
  3876 +// gen_op_dmtc0_performance1();
  3877 + rn = "Performance1";
  3878 +// break;
  3879 + case 2:
  3880 +// gen_op_dmtc0_performance2();
  3881 + rn = "Performance2";
  3882 +// break;
  3883 + case 3:
  3884 +// gen_op_dmtc0_performance3();
  3885 + rn = "Performance3";
  3886 +// break;
  3887 + case 4:
  3888 +// gen_op_dmtc0_performance4();
  3889 + rn = "Performance4";
  3890 +// break;
  3891 + case 5:
  3892 +// gen_op_dmtc0_performance5();
  3893 + rn = "Performance5";
  3894 +// break;
  3895 + case 6:
  3896 +// gen_op_dmtc0_performance6();
  3897 + rn = "Performance6";
  3898 +// break;
  3899 + case 7:
  3900 +// gen_op_dmtc0_performance7();
  3901 + rn = "Performance7";
  3902 +// break;
  3903 + default:
  3904 + goto die;
  3905 + }
  3906 + break;
  3907 + case 26:
  3908 + /* ignored */
  3909 + rn = "ECC";
  3910 + break;
  3911 + case 27:
  3912 + switch (sel) {
  3913 + case 0 ... 3:
  3914 + /* ignored */
  3915 + rn = "CacheErr";
  3916 + break;
  3917 + default:
  3918 + goto die;
  3919 + }
  3920 + break;
  3921 + case 28:
  3922 + switch (sel) {
  3923 + case 0:
  3924 + case 2:
  3925 + case 4:
  3926 + case 6:
  3927 + gen_op_mtc0_taglo();
  3928 + rn = "TagLo";
  3929 + break;
  3930 + case 1:
  3931 + case 3:
  3932 + case 5:
  3933 + case 7:
  3934 + gen_op_mtc0_datalo();
  3935 + rn = "DataLo";
  3936 + break;
  3937 + default:
  3938 + goto die;
  3939 + }
  3940 + break;
  3941 + case 29:
  3942 + switch (sel) {
  3943 + case 0:
  3944 + case 2:
  3945 + case 4:
  3946 + case 6:
  3947 + gen_op_mtc0_taghi();
  3948 + rn = "TagHi";
  3949 + break;
  3950 + case 1:
  3951 + case 3:
  3952 + case 5:
  3953 + case 7:
  3954 + gen_op_mtc0_datahi();
  3955 + rn = "DataHi";
  3956 + break;
  3957 + default:
  3958 + rn = "invalid sel";
  3959 + goto die;
  3960 + }
  3961 + break;
  3962 + case 30:
  3963 + switch (sel) {
  3964 + case 0:
  3965 + gen_op_dmtc0_errorepc();
  3966 + rn = "ErrorEPC";
  3967 + break;
  3968 + default:
  3969 + goto die;
  3970 + }
  3971 + break;
  3972 + case 31:
  3973 + switch (sel) {
  3974 + case 0:
  3975 + gen_op_mtc0_desave(); /* EJTAG support */
  3976 + rn = "DESAVE";
  3977 + break;
  3978 + default:
  3979 + goto die;
  3980 + }
  3981 + /* Stop translation as we may have switched the execution mode */
  3982 + ctx->bstate = BS_STOP;
  3983 + break;
  3984 + default:
  3985 + goto die;
  3986 + }
  3987 +#if defined MIPS_DEBUG_DISAS
  3988 + if (loglevel & CPU_LOG_TB_IN_ASM) {
  3989 + fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n",
  3990 + rn, reg, sel);
  3991 + }
  3992 +#endif
  3993 + return;
  3994 +
  3995 +die:
  3996 +#if defined MIPS_DEBUG_DISAS
  3997 + if (loglevel & CPU_LOG_TB_IN_ASM) {
  3998 + fprintf(logfile, "dmtc0 %s (reg %d sel %d)\n",
  3999 + rn, reg, sel);
  4000 + }
  4001 +#endif
  4002 + generate_exception(ctx, EXCP_RI);
  4003 +}
  4004 +
2830 4005 static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd)
2831 4006 {
2832 4007 const char *opn = "unk";
... ... @@ -2854,7 +4029,7 @@ static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd)
2854 4029 break;
2855 4030 case OPC_MTC0:
2856 4031 /* If we get an exception, we want to restart at next instruction */
2857   - /* XXX: breaks for mtc in delay slot */
  4032 + /* XXX: breaks for mtc in delay slot */
2858 4033 ctx->pc += 4;
2859 4034 save_cpu_state(ctx, 1);
2860 4035 ctx->pc -= 4;
... ... @@ -2862,6 +4037,25 @@ static void gen_cp0 (DisasContext *ctx, uint32_t opc, int rt, int rd)
2862 4037 gen_mtc0(ctx, rd, ctx->opcode & 0x7);
2863 4038 opn = "mtc0";
2864 4039 break;
  4040 + case OPC_DMFC0:
  4041 + if (rt == 0) {
  4042 + /* Treat as NOP */
  4043 + return;
  4044 + }
  4045 + gen_dmfc0(ctx, rd, ctx->opcode & 0x7);
  4046 + gen_op_store_T0_gpr(rt);
  4047 + opn = "dmfc0";
  4048 + break;
  4049 + case OPC_DMTC0:
  4050 + /* If we get an exception, we want to restart at next instruction */
  4051 + /* XXX: breaks for dmtc in delay slot */
  4052 + ctx->pc += 4;
  4053 + save_cpu_state(ctx, 1);
  4054 + ctx->pc -= 4;
  4055 + GEN_LOAD_REG_TN(T0, rt);
  4056 + gen_dmtc0(ctx, rd, ctx->opcode & 0x7);
  4057 + opn = "dmtc0";
  4058 + break;
2865 4059 #if defined(MIPS_USES_R4K_TLB)
2866 4060 case OPC_TLBWI:
2867 4061 gen_op_tlbwi();
... ... @@ -3002,6 +4196,9 @@ static void gen_cp1 (DisasContext *ctx, uint32_t opc, int rt, int fs)
3002 4196 gen_op_ctc1();
3003 4197 opn = "ctc1";
3004 4198 break;
  4199 + case OPC_DMFC1:
  4200 + case OPC_DMTC1:
  4201 + /* Not implemented, fallthrough. */
3005 4202 default:
3006 4203 if (loglevel & CPU_LOG_TB_IN_ASM) {
3007 4204 fprintf(logfile, "Invalid CP1 opcode: %08x %03x %03x %03x\n",
... ... @@ -3703,6 +4900,10 @@ static void decode_opc (DisasContext *ctx)
3703 4900 case OPC_CFC1:
3704 4901 case OPC_MTC1:
3705 4902 case OPC_CTC1:
  4903 +#ifdef MIPS_HAS_MIPS64
  4904 + case OPC_DMFC1:
  4905 + case OPC_DMTC1:
  4906 +#endif
3706 4907 gen_cp1(ctx, op1, rt, rd);
3707 4908 break;
3708 4909 case OPC_BC1:
... ... @@ -4099,7 +5300,7 @@ void cpu_reset (CPUMIPSState *env)
4099 5300 }
4100 5301 env->PC = (int32_t)0xBFC00000;
4101 5302 #if defined (MIPS_USES_R4K_TLB)
4102   - env->CP0_random = MIPS_TLB_NB - 1;
  5303 + env->CP0_Random = MIPS_TLB_NB - 1;
4103 5304 env->tlb_in_use = MIPS_TLB_NB;
4104 5305 #endif
4105 5306 env->CP0_Wired = 0;
... ...