|
@@ -2746,6 +2746,26 @@ static void gen_reset_hflag(DisasContext *s, uint32_t mask)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static void gen_set_eflags(DisasContext *s, target_ulong mask)
|
|
|
+{
|
|
|
+ TCGv t = tcg_temp_new();
|
|
|
+
|
|
|
+ tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
|
|
+ tcg_gen_ori_tl(t, t, mask);
|
|
|
+ tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
|
|
+ tcg_temp_free(t);
|
|
|
+}
|
|
|
+
|
|
|
+static void gen_reset_eflags(DisasContext *s, target_ulong mask)
|
|
|
+{
|
|
|
+ TCGv t = tcg_temp_new();
|
|
|
+
|
|
|
+ tcg_gen_ld_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
|
|
+ tcg_gen_andi_tl(t, t, ~mask);
|
|
|
+ tcg_gen_st_tl(t, cpu_env, offsetof(CPUX86State, eflags));
|
|
|
+ tcg_temp_free(t);
|
|
|
+}
|
|
|
+
|
|
|
/* Clear BND registers during legacy branches. */
|
|
|
static void gen_bnd_jmp(DisasContext *s)
|
|
|
{
|
|
@@ -2776,7 +2796,7 @@ do_gen_eob_worker(DisasContext *s, bool inhibit, bool recheck_tf, bool jr)
|
|
|
}
|
|
|
|
|
|
if (s->base.tb->flags & HF_RF_MASK) {
|
|
|
- gen_helper_reset_rf(cpu_env);
|
|
|
+ gen_reset_eflags(s, RF_MASK);
|
|
|
}
|
|
|
if (recheck_tf) {
|
|
|
gen_helper_rechecking_single_step(cpu_env);
|
|
@@ -5502,12 +5522,12 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|
|
#endif
|
|
|
case 0xfa: /* cli */
|
|
|
if (check_iopl(s)) {
|
|
|
- gen_helper_cli(cpu_env);
|
|
|
+ gen_reset_eflags(s, IF_MASK);
|
|
|
}
|
|
|
break;
|
|
|
case 0xfb: /* sti */
|
|
|
if (check_iopl(s)) {
|
|
|
- gen_helper_sti(cpu_env);
|
|
|
+ gen_set_eflags(s, IF_MASK);
|
|
|
/* interruptions are enabled only the first insn after sti */
|
|
|
gen_update_eip_next(s);
|
|
|
gen_eob_inhibit_irq(s, true);
|
|
@@ -5789,7 +5809,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|
|
|| CPL(s) != 0) {
|
|
|
goto illegal_op;
|
|
|
}
|
|
|
- gen_helper_clac(cpu_env);
|
|
|
+ gen_reset_eflags(s, AC_MASK);
|
|
|
s->base.is_jmp = DISAS_EOB_NEXT;
|
|
|
break;
|
|
|
|
|
@@ -5798,7 +5818,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
|
|
|| CPL(s) != 0) {
|
|
|
goto illegal_op;
|
|
|
}
|
|
|
- gen_helper_stac(cpu_env);
|
|
|
+ gen_set_eflags(s, AC_MASK);
|
|
|
s->base.is_jmp = DISAS_EOB_NEXT;
|
|
|
break;
|
|
|
|