qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v4] hw/i386/cpu: remove default_cpu_version and simplify


From: Zhao Liu
Subject: Re: [PATCH v4] hw/i386/cpu: remove default_cpu_version and simplify
Date: Thu, 23 Jan 2025 16:45:56 +0800

Hi Ani,

[snip]

> --- a/include/hw/i386/x86.h
> +++ b/include/hw/i386/x86.h
> @@ -114,7 +114,10 @@ void init_topo_info(X86CPUTopoInfo *topo_info, const 
> X86MachineState *x86ms);
>  uint32_t x86_cpu_apic_id_from_index(X86MachineState *x86ms,
>                                      unsigned int cpu_index);
>  
> -void x86_cpus_init(X86MachineState *pcms, int default_cpu_version);
> +void x86_cpus_init(X86MachineState *pcms);
> +#ifndef I386_CPU_H
> +void x86_cpu_set_legacy_version(void);
> +#endif
>  void x86_rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count);
>  void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
>                        DeviceState *dev, Error **errp);

[snip]

> --- a/target/i386/cpu.h
> +++ b/target/i386/cpu.h

...

> +#ifndef HW_I386_X86_H
> +void x86_cpu_set_legacy_version(void);
> +#endif
>  #ifndef CONFIG_USER_ONLY
>  
>  void do_cpu_sipi(X86CPU *cpu);

I see your problem: Due to the complex reference relationships, you have
to check the header files and make declarations twice.

What about the following solution?

 * Declare pc_init_cpus() in pc.h and define it in pc.c (including cpu.h
   in pc.c).
 * Only declare x86_cpu_set_legacy_version() in cpu.h.

An example would be like:

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index b46975c8a4db..9e8b5fa33596 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -61,6 +61,7 @@
 #include "hw/i386/kvm/xen_xenstore.h"
 #include "hw/mem/memory-device.h"
 #include "e820_memory_layout.h"
+#include "target/i386/cpu.h"
 #include "trace.h"
 #include "sev.h"
 #include CONFIG_DEVICES
@@ -615,6 +616,19 @@ void pc_acpi_smi_interrupt(void *opaque, int irq, int 
level)
     }
 }

+void pc_init_cpus(MachineState *ms)
+{
+    X86MachineState *x86ms = X86_MACHINE(ms);
+    PCMachineState *pcms = PC_MACHINE(ms);
+    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
+
+    if (pcmc->no_versioned_cpu_model) {
+        /* use legacy cpu as it does not support versions */
+        x86_cpu_set_legacy_version();
+    }
+    x86_cpus_init(x86ms);
+}
+
 static
 void pc_machine_done(Notifier *notifier, void *data)
 {
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 34106bb52db8..dc0ca5bcb2a5 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -130,19 +130,6 @@ struct PCMachineClass {
 #define TYPE_PC_MACHINE "generic-pc-machine"
 OBJECT_DECLARE_TYPE(PCMachineState, PCMachineClass, PC_MACHINE)

-static inline void pc_init_cpus(MachineState *ms)
-{
-    X86MachineState *x86ms = X86_MACHINE(ms);
-    PCMachineState *pcms = PC_MACHINE(ms);
-    PCMachineClass *pcmc = PC_MACHINE_GET_CLASS(pcms);
-
-    if (pcmc->no_versioned_cpu_model) {
-        /* use legacy cpu as it does not support versions */
-        x86_cpu_set_legacy_version();
-    }
-    x86_cpus_init(x86ms);
-}
-
 /* ioapic.c */

 GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled);
@@ -150,6 +137,7 @@ GSIState *pc_gsi_create(qemu_irq **irqs, bool pci_enabled);
 /* pc.c */

 void pc_acpi_smi_interrupt(void *opaque, int irq, int level);
+void pc_init_cpus(MachineState *ms);

 #define PCI_HOST_PROP_RAM_MEM          "ram-mem"
 #define PCI_HOST_PROP_PCI_MEM          "pci-mem"
diff --git a/include/hw/i386/x86.h b/include/hw/i386/x86.h
index 41236d2a8081..2d2b987fa135 100644
--- a/include/hw/i386/x86.h
+++ b/include/hw/i386/x86.h
@@ -115,9 +115,6 @@ uint32_t x86_cpu_apic_id_from_index(X86MachineState *x86ms,
                                     unsigned int cpu_index);

 void x86_cpus_init(X86MachineState *pcms);
-#ifndef I386_CPU_H
-void x86_cpu_set_legacy_version(void);
-#endif
 void x86_rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count);
 void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
                       DeviceState *dev, Error **errp);
diff --git a/target/i386/cpu.h b/target/i386/cpu.h
index 9c0ce2adafe7..bdbe54b26f60 100644
--- a/target/i386/cpu.h
+++ b/target/i386/cpu.h
@@ -2686,10 +2686,8 @@ typedef int X86CPUVersion;
  * Currently, this is only used by microvm.
  */
 void x86_cpu_uses_lastest_version(void);
-
-#ifndef HW_I386_X86_H
 void x86_cpu_set_legacy_version(void);
-#endif
+
 #ifndef CONFIG_USER_ONLY

 void do_cpu_sipi(X86CPU *cpu);

---

The change can be applied on this patch I think. If you like this
approach, you can try if the pipeline is happy with it.

Regards,
Zhao





reply via email to

[Prev in Thread] Current Thread [Next in Thread]