Commit da80682b4220712d65af5ba041e2d7411d98d528
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); | ... | ... |