Commit b8edea50 authored by Pavel Dovgalyuk's avatar Pavel Dovgalyuk Committed by David Gibson
Browse files

target/ppc: fix mtmsr instruction for icount



This patch fixes processing of mtmsr instructions in icount mode.
In this mode writing to interrupt/peripheral state is controlled
by can_do_io flag. This flag must be set explicitly before helper
function invocation.

Signed-off-by: default avatarMaria Klimushenkova <maria.klimushenkova@ispras.ru>
Signed-off-by: default avatarPavel Dovgalyuk <pavel.dovgaluk@ispras.ru>
Reviewed-by: default avatarRichard Henderson <richard.henderson@linaro.org>
Signed-off-by: default avatarDavid Gibson <david@gibson.dropbear.id.au>
parent 1bbd6272
Loading
Loading
Loading
Loading
+12 −0
Original line number Diff line number Diff line
@@ -4298,11 +4298,17 @@ static void gen_mtmsrd(DisasContext *ctx)
         *      if we enter power saving mode, we will exit the loop
         *      directly from ppc_store_msr
         */
        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
            gen_io_start();
        }
        gen_update_nip(ctx, ctx->base.pc_next);
        gen_helper_store_msr(cpu_env, cpu_gpr[rS(ctx->opcode)]);
        /* Must stop the translation as machine state (may have) changed */
        /* Note that mtmsr is not always defined as context-synchronizing */
        gen_stop_exception(ctx);
        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
            gen_io_end();
        }
    }
#endif /* !defined(CONFIG_USER_ONLY) */
}
@@ -4327,6 +4333,9 @@ static void gen_mtmsr(DisasContext *ctx)
         *      if we enter power saving mode, we will exit the loop
         *      directly from ppc_store_msr
         */
        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
            gen_io_start();
        }
        gen_update_nip(ctx, ctx->base.pc_next);
#if defined(TARGET_PPC64)
        tcg_gen_deposit_tl(msr, cpu_msr, cpu_gpr[rS(ctx->opcode)], 0, 32);
@@ -4334,6 +4343,9 @@ static void gen_mtmsr(DisasContext *ctx)
        tcg_gen_mov_tl(msr, cpu_gpr[rS(ctx->opcode)]);
#endif
        gen_helper_store_msr(cpu_env, msr);
        if (tb_cflags(ctx->base.tb) & CF_USE_ICOUNT) {
            gen_io_end();
        }
        tcg_temp_free(msr);
        /* Must stop the translation as machine state (may have) changed */
        /* Note that mtmsr is not always defined as context-synchronizing */