Commit da80682b4220712d65af5ba041e2d7411d98d528

Authored by aurel32
1 parent 64b4d28c

target-mips: avoid tcg internal error in mfc0/dmfc0

Set t0 to 0 for unimplemented mfc0/dmfc0 instructions. This fixes a tcg
internal error while booting mips linux.

Noticed by Julia Longtin.

Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>

git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@5723 c046a42c-6fe2-441c-8c8c-71466251a162
Showing 1 changed file with 11 additions and 8 deletions
target-mips/translate.c
@@ -3186,7 +3186,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int se @@ -3186,7 +3186,7 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int se
3186 } 3186 }
3187 break; 3187 break;
3188 case 22: 3188 case 22:
3189 - /* ignored */ 3189 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
3190 rn = "'Diagnostic"; /* implementation dependent */ 3190 rn = "'Diagnostic"; /* implementation dependent */
3191 break; 3191 break;
3192 case 23: 3192 case 23:
@@ -3266,12 +3266,13 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int se @@ -3266,12 +3266,13 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int se
3266 } 3266 }
3267 break; 3267 break;
3268 case 26: 3268 case 26:
3269 - rn = "ECC";  
3270 - break; 3269 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
  3270 + rn = "ECC";
  3271 + break;
3271 case 27: 3272 case 27:
3272 switch (sel) { 3273 switch (sel) {
3273 - /* ignored */  
3274 case 0 ... 3: 3274 case 0 ... 3:
  3275 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
3275 rn = "CacheErr"; 3276 rn = "CacheErr";
3276 break; 3277 break;
3277 default: 3278 default:
@@ -4372,7 +4373,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s @@ -4372,7 +4373,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s
4372 } 4373 }
4373 break; 4374 break;
4374 case 22: 4375 case 22:
4375 - /* ignored */ 4376 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
4376 rn = "'Diagnostic"; /* implementation dependent */ 4377 rn = "'Diagnostic"; /* implementation dependent */
4377 break; 4378 break;
4378 case 23: 4379 case 23:
@@ -4451,12 +4452,14 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s @@ -4451,12 +4452,14 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s
4451 } 4452 }
4452 break; 4453 break;
4453 case 26: 4454 case 26:
4454 - rn = "ECC";  
4455 - break; 4455 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
  4456 + rn = "ECC";
  4457 + break;
4456 case 27: 4458 case 27:
4457 switch (sel) { 4459 switch (sel) {
4458 /* ignored */ 4460 /* ignored */
4459 case 0 ... 3: 4461 case 0 ... 3:
  4462 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
4460 rn = "CacheErr"; 4463 rn = "CacheErr";
4461 break; 4464 break;
4462 default: 4465 default:
@@ -8013,7 +8016,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) @@ -8013,7 +8016,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
8013 case OPC_EMT: 8016 case OPC_EMT:
8014 check_insn(env, ctx, ASE_MT); 8017 check_insn(env, ctx, ASE_MT);
8015 tcg_gen_helper_1_1(do_emt, t0, t0); 8018 tcg_gen_helper_1_1(do_emt, t0, t0);
8016 - break; 8019 + break;
8017 case OPC_DVPE: 8020 case OPC_DVPE:
8018 check_insn(env, ctx, ASE_MT); 8021 check_insn(env, ctx, ASE_MT);
8019 tcg_gen_helper_1_1(do_dvpe, t0, t0); 8022 tcg_gen_helper_1_1(do_dvpe, t0, t0);