Skip to content

Commit

Permalink
target/i386: Use cpu_unwind_state_data for tpr access
Browse files Browse the repository at this point in the history
Avoid cpu_restore_state, and modifying env->eip out from
underneath the translator with TARGET_TB_PCREL.  There is
some slight duplication from x86_restore_state_to_opc,
but it's just a few lines.

Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1269
Reviewed-by: Claudio Fontana <cfontana@suse.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
  • Loading branch information
rth7680 committed Oct 31, 2022
1 parent 6392bd6 commit f484f21
Showing 1 changed file with 23 additions and 2 deletions.
25 changes: 23 additions & 2 deletions target/i386/helper.c
Expand Up @@ -509,6 +509,27 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
}
}

static inline target_ulong get_memio_eip(CPUX86State *env)
{
#ifdef CONFIG_TCG
uint64_t data[TARGET_INSN_START_WORDS];
CPUState *cs = env_cpu(env);

if (!cpu_unwind_state_data(cs, cs->mem_io_pc, data)) {
return env->eip;
}

/* Per x86_restore_state_to_opc. */
if (TARGET_TB_PCREL) {
return (env->eip & TARGET_PAGE_MASK) | data[0];
} else {
return data[0] - env->segs[R_CS].base;
}
#else
qemu_build_not_reached();
#endif
}

void cpu_report_tpr_access(CPUX86State *env, TPRAccess access)
{
X86CPU *cpu = env_archcpu(env);
Expand All @@ -519,9 +540,9 @@ void cpu_report_tpr_access(CPUX86State *env, TPRAccess access)

cpu_interrupt(cs, CPU_INTERRUPT_TPR);
} else if (tcg_enabled()) {
cpu_restore_state(cs, cs->mem_io_pc, false);
target_ulong eip = get_memio_eip(env);

apic_handle_tpr_access_report(cpu->apic_state, env->eip, access);
apic_handle_tpr_access_report(cpu->apic_state, eip, access);
}
}
#endif /* !CONFIG_USER_ONLY */
Expand Down

0 comments on commit f484f21

Please sign in to comment.