Commit d673a68d authored by James Hogan's avatar James Hogan Committed by Yongbok Kim
Browse files

target/mips: Fix RDHWR CC with icount



RDHWR CC reads the CPU timer like MFC0 CP0_Count, so with icount enabled
it must set can_do_io while it calls the helper to avoid the "Bad icount
read" error. It should also break out of the translation loop to ensure
that timer interrupts are immediately handled.

Fixes: 2e70f6ef ("Add instruction counter.")
Signed-off-by: default avatarJames Hogan <james.hogan@imgtec.com>
Cc: Aurelien Jarno <aurelien@aurel32.net>
Cc: Yongbok Kim <yongbok.kim@imgtec.com>
Reviewed-by: default avatarRichard Henderson <rth@twiddle.net>
Signed-off-by: default avatarYongbok Kim <yongbok.kim@imgtec.com>
parent 51ca717b
Loading
Loading
Loading
Loading
+11 −0
Original line number Diff line number Diff line
@@ -10755,8 +10755,19 @@ static void gen_rdhwr(DisasContext *ctx, int rt, int rd, int sel)
        gen_store_gpr(t0, rt);
        break;
    case 2:
        if (ctx->tb->cflags & CF_USE_ICOUNT) {
            gen_io_start();
        }
        gen_helper_rdhwr_cc(t0, cpu_env);
        if (ctx->tb->cflags & CF_USE_ICOUNT) {
            gen_io_end();
        }
        gen_store_gpr(t0, rt);
        /* Break the TB to be able to take timer interrupts immediately
           after reading count. BS_STOP isn't sufficient, we need to ensure
           we break completely out of translated code.  */
        gen_save_pc(ctx->pc + 4);
        ctx->bstate = BS_EXCP;
        break;
    case 3:
        gen_helper_rdhwr_ccres(t0, cpu_env);