Message ID | 20241209203629.74436-2-phil@philjordan.eu (mailing list archive) |
---|---|
State | New |
Headers | show |
Series | hvf and APIC fixes, improvements, and optimisations | expand |
On 09.12.24 21:36, phil@philjordan.eu wrote: > From: Phil Dennis-Jordan <phil@philjordan.eu> > > Some VM state required for fully configuring vCPUs is only available > after all devices have been through their init phase. This extra > function, called just before each vCPU makes its first VM entry, > allows us to perform such architecture-specific initialisation. > > Signed-off-by: Phil Dennis-Jordan <phil@philjordan.eu> Reviewed-by: Alexander Graf <agraf@csgraf.de> Alex
diff --git a/accel/hvf/hvf-accel-ops.c b/accel/hvf/hvf-accel-ops.c index d60874d3e6..c17a9a10de 100644 --- a/accel/hvf/hvf-accel-ops.c +++ b/accel/hvf/hvf-accel-ops.c @@ -442,6 +442,11 @@ static void *hvf_cpu_thread_fn(void *arg) cpu_thread_signal_created(cpu); qemu_guest_random_seed_thread_part2(cpu->random_seed); + if (!cpu_can_run(cpu)) { + qemu_wait_io_event(cpu); + } + hvf_vcpu_before_first_run(cpu); + do { if (cpu_can_run(cpu)) { r = hvf_vcpu_exec(cpu); diff --git a/include/sysemu/hvf_int.h b/include/sysemu/hvf_int.h index 42ae18433f..2775bd82d7 100644 --- a/include/sysemu/hvf_int.h +++ b/include/sysemu/hvf_int.h @@ -67,6 +67,7 @@ const char *hvf_return_string(hv_return_t ret); int hvf_arch_init(void); hv_return_t hvf_arch_vm_create(MachineState *ms, uint32_t pa_range); int hvf_arch_init_vcpu(CPUState *cpu); +void hvf_vcpu_before_first_run(CPUState *cpu); void hvf_arch_vcpu_destroy(CPUState *cpu); int hvf_vcpu_exec(CPUState *); hvf_slot *hvf_find_overlap_slot(uint64_t, uint64_t); diff --git a/target/arm/hvf/hvf.c b/target/arm/hvf/hvf.c index ca7ea92774..0b334c268e 100644 --- a/target/arm/hvf/hvf.c +++ b/target/arm/hvf/hvf.c @@ -1061,6 +1061,10 @@ int hvf_arch_init_vcpu(CPUState *cpu) return 0; } +void hvf_vcpu_before_first_run(CPUState *cpu) +{ +} + void hvf_kick_vcpu_thread(CPUState *cpu) { cpus_kick_thread(cpu); diff --git a/target/i386/hvf/hvf.c b/target/i386/hvf/hvf.c index c5d025d557..3b6ee79fb2 100644 --- a/target/i386/hvf/hvf.c +++ b/target/i386/hvf/hvf.c @@ -338,6 +338,10 @@ int hvf_arch_init_vcpu(CPUState *cpu) return 0; } +void hvf_vcpu_before_first_run(CPUState *cpu) +{ +} + static void hvf_store_events(CPUState *cpu, uint32_t ins_len, uint64_t idtvec_info) { X86CPU *x86_cpu = X86_CPU(cpu);