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