To execute confidential guest specific cpu realize operations. Signed-off-by: Xiaoyao Li <xiaoyao.li@xxxxxxxxx> --- changes in v6: - new patch; --- target/i386/confidential-guest.h | 12 ++++++++++++ target/i386/cpu.c | 13 ++++++++++++- 2 files changed, 24 insertions(+), 1 deletion(-) diff --git a/target/i386/confidential-guest.h b/target/i386/confidential-guest.h index 38169ed68e06..4b7ea91023dc 100644 --- a/target/i386/confidential-guest.h +++ b/target/i386/confidential-guest.h @@ -40,6 +40,7 @@ struct X86ConfidentialGuestClass { /* <public> */ int (*kvm_type)(X86ConfidentialGuest *cg); void (*cpu_instance_init)(X86ConfidentialGuest *cg, CPUState *cpu); + void (*cpu_realizefn)(X86ConfidentialGuest *cg, CPUState *cpu, Error **errp); uint32_t (*mask_cpuid_features)(X86ConfidentialGuest *cg, uint32_t feature, uint32_t index, int reg, uint32_t value); }; @@ -70,6 +71,17 @@ static inline void x86_confidential_guest_cpu_instance_init(X86ConfidentialGuest } } +static inline void x86_confidenetial_guest_cpu_realizefn(X86ConfidentialGuest *cg, + CPUState *cpu, + Error **errp) +{ + X86ConfidentialGuestClass *klass = X86_CONFIDENTIAL_GUEST_GET_CLASS(cg); + + if (klass->cpu_realizefn) { + klass->cpu_realizefn(cg, cpu, errp); + } +} + /** * x86_confidential_guest_mask_cpuid_features: * diff --git a/target/i386/cpu.c b/target/i386/cpu.c index c7d65bbeab9b..1ffbafef03e7 100644 --- a/target/i386/cpu.c +++ b/target/i386/cpu.c @@ -7848,6 +7848,18 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) return; } +#ifndef CONFIG_USER_ONLY + MachineState *ms = MACHINE(qdev_get_machine()); + + if (ms->cgs) { + x86_confidenetial_guest_cpu_realizefn(X86_CONFIDENTIAL_GUEST(ms->cgs), + cs, &local_err); + if (local_err != NULL) { + goto out; + } + } +#endif + if (xcc->host_cpuid_required && !accel_uses_host_cpuid()) { g_autofree char *name = x86_cpu_class_get_model_name(xcc); error_setg(&local_err, "CPU model '%s' requires KVM or HVF", name); @@ -7972,7 +7984,6 @@ static void x86_cpu_realizefn(DeviceState *dev, Error **errp) } #ifndef CONFIG_USER_ONLY - MachineState *ms = MACHINE(qdev_get_machine()); qemu_register_reset(x86_cpu_machine_reset_cb, cpu); if (cpu->env.features[FEAT_1_EDX] & CPUID_APIC || ms->smp.cpus > 1) { -- 2.34.1