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 3186 }
3187 3187 break;
3188 3188 case 22:
3189   - /* ignored */
  3189 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
3190 3190 rn = "'Diagnostic"; /* implementation dependent */
3191 3191 break;
3192 3192 case 23:
... ... @@ -3266,12 +3266,13 @@ static void gen_mfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int se
3266 3266 }
3267 3267 break;
3268 3268 case 26:
3269   - rn = "ECC";
3270   - break;
  3269 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
  3270 + rn = "ECC";
  3271 + break;
3271 3272 case 27:
3272 3273 switch (sel) {
3273   - /* ignored */
3274 3274 case 0 ... 3:
  3275 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
3275 3276 rn = "CacheErr";
3276 3277 break;
3277 3278 default:
... ... @@ -4372,7 +4373,7 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s
4372 4373 }
4373 4374 break;
4374 4375 case 22:
4375   - /* ignored */
  4376 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
4376 4377 rn = "'Diagnostic"; /* implementation dependent */
4377 4378 break;
4378 4379 case 23:
... ... @@ -4451,12 +4452,14 @@ static void gen_dmfc0 (CPUState *env, DisasContext *ctx, TCGv t0, int reg, int s
4451 4452 }
4452 4453 break;
4453 4454 case 26:
4454   - rn = "ECC";
4455   - break;
  4455 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
  4456 + rn = "ECC";
  4457 + break;
4456 4458 case 27:
4457 4459 switch (sel) {
4458 4460 /* ignored */
4459 4461 case 0 ... 3:
  4462 + tcg_gen_movi_tl(t0, 0); /* unimplemented */
4460 4463 rn = "CacheErr";
4461 4464 break;
4462 4465 default:
... ... @@ -8013,7 +8016,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx)
8013 8016 case OPC_EMT:
8014 8017 check_insn(env, ctx, ASE_MT);
8015 8018 tcg_gen_helper_1_1(do_emt, t0, t0);
8016   - break;
  8019 + break;
8017 8020 case OPC_DVPE:
8018 8021 check_insn(env, ctx, ASE_MT);
8019 8022 tcg_gen_helper_1_1(do_dvpe, t0, t0);
... ...