On 14/06/2017 18:51, Richard Henderson wrote: > On 06/14/2017 09:08 AM, Paolo Bonzini wrote: >> I think this is a band-aid, and would rather fix the front-ends as in >> Emilio's patch. For Alpha my guess would be: >> >> diff --git a/target/alpha/translate.c b/target/alpha/translate.c >> index 7c45ae360c..6e2ee3f958 100644 >> --- a/target/alpha/translate.c >> +++ b/target/alpha/translate.c >> @@ -1198,7 +1198,9 @@ static ExitStatus gen_call_pal(DisasContext >> *ctx, int palcode) >> tcg_gen_andi_i64(tmp, ctx->ir[IR_A0], PS_INT_MASK); >> tcg_gen_st8_i64(tmp, cpu_env, offsetof(CPUAlphaState, >> ps)); >> tcg_temp_free(tmp); >> - break; >> + >> + /* Reevaluate interrupts */ >> + return EXIT_PC_STALE; >> case 0x36: >> /* RDPS */ > > Thanks! > > You're right that adjusting SWPIPL along these lines does fix the > problem for Alpha. Given that Alpha would typically hang in arch_idle, > I'd been focusing primarily on WTINT.
And MIPS: diff --git a/target/mips/translate.c b/target/mips/translate.c index 559f8fed89..244f3cb9ab 100644 --- a/target/mips/translate.c +++ b/target/mips/translate.c @@ -13403,8 +13403,9 @@ static void gen_pool32axf (CPUMIPSState *env, DisasContext *ctx, int rt, int rs) save_cpu_state(ctx, 1); gen_helper_ei(t0, cpu_env); gen_store_gpr(t0, rs); - /* Stop translation as we may have switched the execution mode */ - ctx->bstate = BS_STOP; + /* BS_STOP isn't good enough here, reevaluate cpu_mips_hw_interrupts_enabled. */ + gen_save_pc(ctx->pc + 4); + ctx->bstate = BS_EXCP; tcg_temp_free(t0); } break; The others seem okay. Paolo