mirror of https://github.com/xemu-project/xemu.git
target/i386: Restrict cpu_exec_interrupt() handler to sysemu
Restrict cpu_exec_interrupt() and its callees to sysemu. Signed-off-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Reviewed-by: Warner Losh <imp@bsdimp.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20210911165434.531552-11-f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
68fa1780e0
commit
604664726f
|
@ -38,7 +38,9 @@ QEMU_BUILD_BUG_ON(TCG_PHYS_ADDR_BITS > TARGET_PHYS_ADDR_SPACE_BITS);
|
|||
* @cpu: vCPU the interrupt is to be handled by.
|
||||
*/
|
||||
void x86_cpu_do_interrupt(CPUState *cpu);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
bool x86_cpu_exec_interrupt(CPUState *cpu, int int_req);
|
||||
#endif
|
||||
|
||||
/* helper.c */
|
||||
bool x86_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
|
||||
|
|
|
@ -1110,6 +1110,7 @@ void do_interrupt_x86_hardirq(CPUX86State *env, int intno, int is_hw)
|
|||
do_interrupt_all(env_archcpu(env), intno, 0, 0, 0, is_hw);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
||||
{
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
|
@ -1125,23 +1126,17 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
* This is required to make icount-driven execution deterministic.
|
||||
*/
|
||||
switch (interrupt_request) {
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
case CPU_INTERRUPT_POLL:
|
||||
cs->interrupt_request &= ~CPU_INTERRUPT_POLL;
|
||||
apic_poll_irq(cpu->apic_state);
|
||||
break;
|
||||
#endif
|
||||
case CPU_INTERRUPT_SIPI:
|
||||
do_cpu_sipi(cpu);
|
||||
break;
|
||||
case CPU_INTERRUPT_SMI:
|
||||
cpu_svm_check_intercept_param(env, SVM_EXIT_SMI, 0, 0);
|
||||
cs->interrupt_request &= ~CPU_INTERRUPT_SMI;
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
cpu_abort(CPU(cpu), "SMI interrupt: cannot enter SMM in user-mode");
|
||||
#else
|
||||
do_smm_enter(cpu);
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
break;
|
||||
case CPU_INTERRUPT_NMI:
|
||||
cpu_svm_check_intercept_param(env, SVM_EXIT_NMI, 0, 0);
|
||||
|
@ -1162,7 +1157,6 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
"Servicing hardware INT=0x%02x\n", intno);
|
||||
do_interrupt_x86_hardirq(env, intno, 1);
|
||||
break;
|
||||
#if !defined(CONFIG_USER_ONLY)
|
||||
case CPU_INTERRUPT_VIRQ:
|
||||
cpu_svm_check_intercept_param(env, SVM_EXIT_VINTR, 0, 0);
|
||||
intno = x86_ldl_phys(cs, env->vm_vmcb
|
||||
|
@ -1173,12 +1167,12 @@ bool x86_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
|
|||
cs->interrupt_request &= ~CPU_INTERRUPT_VIRQ;
|
||||
env->int_ctl &= ~V_IRQ_MASK;
|
||||
break;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Ensure that no TB jump will be modified as the program flow was changed. */
|
||||
return true;
|
||||
}
|
||||
#endif /* CONFIG_USER_ONLY */
|
||||
|
||||
void helper_lldt(CPUX86State *env, int selector)
|
||||
{
|
||||
|
|
|
@ -72,12 +72,12 @@ static const struct TCGCPUOps x86_tcg_ops = {
|
|||
.synchronize_from_tb = x86_cpu_synchronize_from_tb,
|
||||
.cpu_exec_enter = x86_cpu_exec_enter,
|
||||
.cpu_exec_exit = x86_cpu_exec_exit,
|
||||
.cpu_exec_interrupt = x86_cpu_exec_interrupt,
|
||||
.tlb_fill = x86_cpu_tlb_fill,
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
.fake_user_interrupt = x86_cpu_do_interrupt,
|
||||
#else
|
||||
.do_interrupt = x86_cpu_do_interrupt,
|
||||
.cpu_exec_interrupt = x86_cpu_exec_interrupt,
|
||||
.debug_excp_handler = breakpoint_handler,
|
||||
.debug_check_breakpoint = x86_debug_check_breakpoint,
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
|
Loading…
Reference in New Issue