On 28/11/19 14:56, Paolo Bonzini wrote: > On 26/11/19 21:04, Cameron Esfahani wrote: >> Our test case was booting many concurrent macOS VMs under heavy >> system load. I don't know if I could create one to replicate that. > > Does this work? > > diff --git a/target/i386/hvf/x86hvf.c b/target/i386/hvf/x86hvf.c > index 1485b95776..26c6c3a49f 100644 > --- a/target/i386/hvf/x86hvf.c > +++ b/target/i386/hvf/x86hvf.c > @@ -357,7 +357,11 @@ bool hvf_inject_interrupts(CPUState *cpu_state) > bool have_event = true; > if (env->interrupt_injected != -1) { > vector = env->interrupt_injected; > - intr_type = VMCS_INTR_T_SWINTR; > + if (env->ins_len) { > + intr_type = VMCS_INTR_T_SWINTR; > + } else { > + intr_type = VMCS_INTR_T_HWINTR; > + } > } else if (env->exception_nr != -1) { > vector = env->exception_nr; > if (vector == EXCP03_INT3 || vector == EXCP04_INTO) {
Better include this too: diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index 784e67d77e..5dc7515841 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -637,6 +637,7 @@ static void hvf_store_events(CPUState *cpu, uint32_t ins_len, uint64_t idtvec_in env->exception_injected = 0; env->interrupt_injected = -1; env->nmi_injected = false; + env->ins_len = 0; if (idtvec_info & VMCS_IDT_VEC_VALID) { switch (idtvec_info & VMCS_IDT_VEC_TYPE) { case VMCS_IDT_VEC_HWINTR: Paolo