mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 11:39:53 +00:00
target/i386: Use cpu_unwind_state_data for tpr access
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>
This commit is contained in:
parent
6392bd6b90
commit
f484f213c9
@ -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);
|
||||
@ -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 */
|
||||
|
Loading…
Reference in New Issue
Block a user