Richard Henderson <richard.hender...@linaro.org> writes:
> On 3/20/23 03:10, Alex Bennée wrote: >> Signed-off-by: Alex Bennée <alex.ben...@linaro.org> >> --- >> include/hw/core/sysemu-cpu-ops.h | 11 +++++++++++ >> target/i386/cpu-internal.h | 1 + >> accel/tcg/cpu-exec-softmmu.c | 16 ++++++++++++++++ >> accel/tcg/cpu-exec.c | 31 ++++++++++--------------------- >> target/i386/cpu-sysemu.c | 17 +++++++++++++++++ >> target/i386/cpu.c | 1 + >> 6 files changed, 56 insertions(+), 21 deletions(-) >> diff --git a/include/hw/core/sysemu-cpu-ops.h >> b/include/hw/core/sysemu-cpu-ops.h >> index c9d30172c4..d53907b517 100644 >> --- a/include/hw/core/sysemu-cpu-ops.h >> +++ b/include/hw/core/sysemu-cpu-ops.h >> @@ -53,6 +53,15 @@ typedef struct SysemuCPUOps { >> * @cs: The CPUState >> */ >> void (*handle_cpu_halt)(CPUState *cpu); >> + /** >> + * @handle_cpu_interrupt: handle init/reset interrupts >> + * @cs: The CPUState >> + * @irq_request: the interrupt request >> + * >> + * Most architectures share a common handler. Returns true if the >> + * handler did indeed handle and interrupt. >> + */ > > and -> the? or any? > > This should be a tcg hook, not a sysemu hook, per the previous one. > I would very much like it to never be NULL, but instead your new > common_cpu_handle_interrupt function. I was trying to figure out how to instantiate a default but ran into const problems eventually forcing me to give up. Why a TCG hook? Do we not process any interrupts for KVM or HVF? > >> -#if defined(TARGET_I386) >> - else if (interrupt_request & CPU_INTERRUPT_INIT) { >> - X86CPU *x86_cpu = X86_CPU(cpu); >> - CPUArchState *env = &x86_cpu->env; >> - replay_interrupt(); >> - cpu_svm_check_intercept_param(env, SVM_EXIT_INIT, 0, 0); >> - do_cpu_init(x86_cpu); >> - cpu->exception_index = EXCP_HALTED; >> - return true; >> - } >> -#else >> - else if (interrupt_request & CPU_INTERRUPT_RESET) { >> - replay_interrupt(); >> - cpu_reset(cpu); >> + else if (cpu->cc->sysemu_ops->handle_cpu_interrupt && >> + cpu->cc->sysemu_ops->handle_cpu_interrupt(cpu, >> interrupt_request)) { >> + return true; >> + } else if (common_cpu_handle_interrupt(cpu, interrupt_request)) { >> return true; > > ... because this is pretty ugly, and incorrectly indented. > > > r~ -- Alex Bennée Virtualisation Tech Lead @ Linaro