Commit c53f4a62e3a87b4200d7245ae273a4d187394779
1 parent
5a63bcb2
fix branch delay slot cornercases.
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@2615 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
2 changed files
with
6 additions
and
3 deletions
target-mips/helper.c
... | ... | @@ -387,7 +387,6 @@ void do_interrupt (CPUState *env) |
387 | 387 | come back to the jump. */ |
388 | 388 | env->CP0_EPC = env->PC - 4; |
389 | 389 | env->CP0_Cause |= (1 << CP0Ca_BD); |
390 | - env->hflags &= ~MIPS_HFLAG_BMASK; | |
391 | 390 | } else { |
392 | 391 | env->CP0_EPC = env->PC; |
393 | 392 | env->CP0_Cause &= ~(1 << CP0Ca_BD); |
... | ... | @@ -395,6 +394,7 @@ void do_interrupt (CPUState *env) |
395 | 394 | env->CP0_Status |= (1 << CP0St_EXL); |
396 | 395 | env->hflags &= ~MIPS_HFLAG_UM; |
397 | 396 | } |
397 | + env->hflags &= ~MIPS_HFLAG_BMASK; | |
398 | 398 | if (env->CP0_Status & (1 << CP0St_BEV)) { |
399 | 399 | env->PC = (int32_t)0xBFC00200; |
400 | 400 | } else { | ... | ... |
target-mips/translate.c
... | ... | @@ -1640,6 +1640,10 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
1640 | 1640 | likely: |
1641 | 1641 | ctx->hflags |= MIPS_HFLAG_BL; |
1642 | 1642 | break; |
1643 | + default: | |
1644 | + MIPS_INVAL("conditional branch/jump"); | |
1645 | + generate_exception(ctx, EXCP_RI); | |
1646 | + return; | |
1643 | 1647 | } |
1644 | 1648 | gen_op_set_bcond(); |
1645 | 1649 | } |
... | ... | @@ -1650,7 +1654,6 @@ static void gen_compute_branch (DisasContext *ctx, uint32_t opc, |
1650 | 1654 | gen_op_set_T0(ctx->pc + 8); |
1651 | 1655 | gen_op_store_T0_gpr(blink); |
1652 | 1656 | } |
1653 | - return; | |
1654 | 1657 | } |
1655 | 1658 | |
1656 | 1659 | /* special3 bitfield operations */ |
... | ... | @@ -5053,7 +5056,7 @@ static void decode_opc (CPUState *env, DisasContext *ctx) |
5053 | 5056 | break; |
5054 | 5057 | } |
5055 | 5058 | if (ctx->hflags & MIPS_HFLAG_BMASK) { |
5056 | - int hflags = ctx->hflags; | |
5059 | + int hflags = ctx->hflags & MIPS_HFLAG_BMASK; | |
5057 | 5060 | /* Branches completion */ |
5058 | 5061 | ctx->hflags &= ~MIPS_HFLAG_BMASK; |
5059 | 5062 | ctx->bstate = BS_BRANCH; | ... | ... |