target/i386: Tidy gen_check_io
Get cur_eip from DisasContext. Do not require the caller to use svm_is_rep; get prefix from DisasContext. Use the proper symbolic constants for SVM_IOIO_*. While we're touching all call sites, return bool in preparation for gen_check_io raising #GP. Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20210514151342.384376-47-richard.henderson@linaro.org>
This commit is contained in:
parent
244843b757
commit
bc2e436d7c
@ -674,13 +674,10 @@ static void gen_helper_out_func(MemOp ot, TCGv_i32 v, TCGv_i32 n)
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_check_io(DisasContext *s, MemOp ot, target_ulong cur_eip,
|
||||
uint32_t svm_flags)
|
||||
static bool gen_check_io(DisasContext *s, MemOp ot, uint32_t svm_flags)
|
||||
{
|
||||
target_ulong next_eip;
|
||||
|
||||
tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0);
|
||||
if (PE(s) && (CPL(s) > IOPL(s) || VM86(s))) {
|
||||
tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0);
|
||||
switch (ot) {
|
||||
case MO_8:
|
||||
gen_helper_check_iob(cpu_env, s->tmp2_i32);
|
||||
@ -696,15 +693,20 @@ static void gen_check_io(DisasContext *s, MemOp ot, target_ulong cur_eip,
|
||||
}
|
||||
}
|
||||
if (GUEST(s)) {
|
||||
target_ulong cur_eip = s->base.pc_next - s->cs_base;
|
||||
target_ulong next_eip = s->pc - s->cs_base;
|
||||
|
||||
gen_update_cc_op(s);
|
||||
gen_jmp_im(s, cur_eip);
|
||||
svm_flags |= (1 << (4 + ot));
|
||||
next_eip = s->pc - s->cs_base;
|
||||
tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0);
|
||||
if (s->prefix & (PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
svm_flags |= SVM_IOIO_REP_MASK;
|
||||
}
|
||||
svm_flags |= 1 << (SVM_IOIO_SIZE_SHIFT + ot);
|
||||
gen_helper_svm_check_io(cpu_env, s->tmp2_i32,
|
||||
tcg_const_i32(svm_flags),
|
||||
tcg_const_i32(next_eip - cur_eip));
|
||||
tcg_constant_i32(svm_flags),
|
||||
tcg_constant_i32(next_eip - cur_eip));
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
static inline void gen_movs(DisasContext *s, MemOp ot)
|
||||
@ -2425,11 +2427,6 @@ static void gen_movl_seg_T0(DisasContext *s, X86Seg seg_reg)
|
||||
}
|
||||
}
|
||||
|
||||
static inline int svm_is_rep(int prefixes)
|
||||
{
|
||||
return ((prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) ? 8 : 0);
|
||||
}
|
||||
|
||||
static void gen_svm_check_intercept(DisasContext *s, uint32_t type)
|
||||
{
|
||||
/* no SVM activated; fast case */
|
||||
@ -6483,8 +6480,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
case 0x6d:
|
||||
ot = mo_b_d32(b, dflag);
|
||||
tcg_gen_ext16u_tl(s->T0, cpu_regs[R_EDX]);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes) | 4);
|
||||
if (!gen_check_io(s, ot, SVM_IOIO_TYPE_MASK | SVM_IOIO_STR_MASK)) {
|
||||
break;
|
||||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
@ -6502,8 +6500,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
case 0x6f:
|
||||
ot = mo_b_d32(b, dflag);
|
||||
tcg_gen_ext16u_tl(s->T0, cpu_regs[R_EDX]);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
svm_is_rep(prefixes) | 4);
|
||||
if (!gen_check_io(s, ot, SVM_IOIO_STR_MASK)) {
|
||||
break;
|
||||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
@ -6526,8 +6525,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
ot = mo_b_d32(b, dflag);
|
||||
val = x86_ldub_code(env, s);
|
||||
tcg_gen_movi_tl(s->T0, val);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes));
|
||||
if (!gen_check_io(s, ot, SVM_IOIO_TYPE_MASK)) {
|
||||
break;
|
||||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
@ -6544,8 +6544,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
ot = mo_b_d32(b, dflag);
|
||||
val = x86_ldub_code(env, s);
|
||||
tcg_gen_movi_tl(s->T0, val);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
svm_is_rep(prefixes));
|
||||
if (!gen_check_io(s, ot, 0)) {
|
||||
break;
|
||||
}
|
||||
gen_op_mov_v_reg(s, ot, s->T1, R_EAX);
|
||||
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
@ -6563,8 +6564,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
case 0xed:
|
||||
ot = mo_b_d32(b, dflag);
|
||||
tcg_gen_ext16u_tl(s->T0, cpu_regs[R_EDX]);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
SVM_IOIO_TYPE_MASK | svm_is_rep(prefixes));
|
||||
if (!gen_check_io(s, ot, SVM_IOIO_TYPE_MASK)) {
|
||||
break;
|
||||
}
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
gen_io_start();
|
||||
}
|
||||
@ -6580,8 +6582,9 @@ static target_ulong disas_insn(DisasContext *s, CPUState *cpu)
|
||||
case 0xef:
|
||||
ot = mo_b_d32(b, dflag);
|
||||
tcg_gen_ext16u_tl(s->T0, cpu_regs[R_EDX]);
|
||||
gen_check_io(s, ot, pc_start - s->cs_base,
|
||||
svm_is_rep(prefixes));
|
||||
if (!gen_check_io(s, ot, 0)) {
|
||||
break;
|
||||
}
|
||||
gen_op_mov_v_reg(s, ot, s->T1, R_EAX);
|
||||
|
||||
if (tb_cflags(s->base.tb) & CF_USE_ICOUNT) {
|
||||
|
Loading…
Reference in New Issue
Block a user