Revisión | 8da54b2507c1cabf60c2de904cf0383b23239231 (tree) |
---|---|
Tiempo | 2017-06-20 03:11:26 |
Autor | Richard Henderson <rth@twid...> |
Commiter | Richard Henderson |
target/arm: Exit after clearing aarch64 interrupt mask
Exit to cpu loop so we reevaluate cpu_arm_hw_interrupts.
Tested-by: Emilio G. Cota <cota@braap.org>
Tested-by: Alex Bennée <alex.bennee@linaro.org>
Reviewed-by: Emilio G. Cota <cota@braap.org>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Richard Henderson <rth@twiddle.net>
@@ -1422,7 +1422,9 @@ static void handle_msr_i(DisasContext *s, uint32_t insn, | ||
1422 | 1422 | gen_helper_msr_i_pstate(cpu_env, tcg_op, tcg_imm); |
1423 | 1423 | tcg_temp_free_i32(tcg_imm); |
1424 | 1424 | tcg_temp_free_i32(tcg_op); |
1425 | - s->is_jmp = DISAS_UPDATE; | |
1425 | + /* For DAIFClear, exit the cpu loop to re-evaluate pending IRQs. */ | |
1426 | + gen_a64_set_pc_im(s->pc); | |
1427 | + s->is_jmp = (op == 0x1f ? DISAS_EXIT : DISAS_JUMP); | |
1426 | 1428 | break; |
1427 | 1429 | } |
1428 | 1430 | default: |
@@ -11369,6 +11371,9 @@ void gen_intermediate_code_a64(ARMCPU *cpu, TranslationBlock *tb) | ||
11369 | 11371 | case DISAS_JUMP: |
11370 | 11372 | tcg_gen_lookup_and_goto_ptr(cpu_pc); |
11371 | 11373 | break; |
11374 | + case DISAS_EXIT: | |
11375 | + tcg_gen_exit_tb(0); | |
11376 | + break; | |
11372 | 11377 | case DISAS_TB_JUMP: |
11373 | 11378 | case DISAS_EXC: |
11374 | 11379 | case DISAS_SWI: |