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