diff mbox series

[v6,14/51] i386/xen: add pc_machine_kvm_type to initialize XEN_EMULATE mode

Message ID 20230110122042.1562155-15-dwmw2@infradead.org
State New
Headers show
Series Xen support under KVM | expand

Commit Message

David Woodhouse Jan. 10, 2023, 12:20 p.m. UTC
From: David Woodhouse <dwmw@amazon.co.uk>

The xen_overlay device (and later similar devices for event channels and
grant tables) need to be instantiated. Do this from a kvm_type method on
the PC machine derivatives, since KVM is only way to support Xen emulation
for now.

Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
---
 hw/i386/pc.c         | 11 +++++++++++
 include/hw/i386/pc.h |  3 +++
 2 files changed, 14 insertions(+)

Comments

Paul Durrant Jan. 16, 2023, 5:17 p.m. UTC | #1
On 10/01/2023 12:20, David Woodhouse wrote:
> From: David Woodhouse <dwmw@amazon.co.uk>
> 
> The xen_overlay device (and later similar devices for event channels and
> grant tables) need to be instantiated. Do this from a kvm_type method on
> the PC machine derivatives, since KVM is only way to support Xen emulation
> for now.
> 
> Signed-off-by: David Woodhouse <dwmw@amazon.co.uk>
> ---
>   hw/i386/pc.c         | 11 +++++++++++
>   include/hw/i386/pc.h |  3 +++
>   2 files changed, 14 insertions(+)
> 
> diff --git a/hw/i386/pc.c b/hw/i386/pc.c
> index d489ecc0d1..0ddae2f6ad 100644
> --- a/hw/i386/pc.c
> +++ b/hw/i386/pc.c
> @@ -89,6 +89,7 @@
>   #include "hw/virtio/virtio-iommu.h"
>   #include "hw/virtio/virtio-pmem-pci.h"
>   #include "hw/virtio/virtio-mem-pci.h"
> +#include "hw/i386/kvm/xen_overlay.h"
>   #include "hw/mem/memory-device.h"
>   #include "sysemu/replay.h"
>   #include "target/i386/cpu.h"
> @@ -1844,6 +1845,16 @@ static void pc_machine_initfn(Object *obj)
>       cxl_machine_init(obj, &pcms->cxl_devices_state);
>   }
>   
> +int pc_machine_kvm_type(MachineState *machine, const char *kvm_type)
> +{
> +#ifdef CONFIG_XEN_EMU
> +    if (xen_mode == XEN_EMULATE) {
> +        xen_overlay_create();
> +    }
> +#endif
> +    return 0;
> +}
> +
>   static void pc_machine_reset(MachineState *machine, ShutdownCause reason)
>   {
>       CPUState *cs;
> diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
> index 991f905f5d..b866567b7b 100644
> --- a/include/hw/i386/pc.h
> +++ b/include/hw/i386/pc.h
> @@ -293,12 +293,15 @@ extern const size_t pc_compat_1_5_len;
>   extern GlobalProperty pc_compat_1_4[];
>   extern const size_t pc_compat_1_4_len;
>   
> +extern int pc_machine_kvm_type(MachineState *machine, const char *vm_type);
> +
>   #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
>       static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
>       { \
>           MachineClass *mc = MACHINE_CLASS(oc); \
>           optsfn(mc); \
>           mc->init = initfn; \
> +        mc->kvm_type = pc_machine_kvm_type; \

Given that it does nothing in the non-Xen-emulate case, would it not be 
neater to simply wrap the above line, and the definition of the 
function, in #ifdef CONFIG_XEN_EMU?

   Paul

>       } \
>       static const TypeInfo pc_machine_type_##suffix = { \
>           .name       = namestr TYPE_MACHINE_SUFFIX, \
David Woodhouse Jan. 16, 2023, 7:45 p.m. UTC | #2
On Mon, 2023-01-16 at 17:17 +0000, Paul Durrant wrote:
> ASS(oc); \
> >            optsfn(mc); \
> >            mc->init = initfn; \
> > +        mc->kvm_type = pc_machine_kvm_type; \
> 
> Given that it does nothing in the non-Xen-emulate case, would it not be 
> neater to simply wrap the above line, and the definition of the 
> function, in #ifdef CONFIG_XEN_EMU?

I did it that way first, but you just end up with *more* ifdefs that way.

I'll fix up what looks like a stray tab vs. space issue though; I
thought I ran it all through checkpatch and fixed that kind of thing.
diff mbox series

Patch

diff --git a/hw/i386/pc.c b/hw/i386/pc.c
index d489ecc0d1..0ddae2f6ad 100644
--- a/hw/i386/pc.c
+++ b/hw/i386/pc.c
@@ -89,6 +89,7 @@ 
 #include "hw/virtio/virtio-iommu.h"
 #include "hw/virtio/virtio-pmem-pci.h"
 #include "hw/virtio/virtio-mem-pci.h"
+#include "hw/i386/kvm/xen_overlay.h"
 #include "hw/mem/memory-device.h"
 #include "sysemu/replay.h"
 #include "target/i386/cpu.h"
@@ -1844,6 +1845,16 @@  static void pc_machine_initfn(Object *obj)
     cxl_machine_init(obj, &pcms->cxl_devices_state);
 }
 
+int pc_machine_kvm_type(MachineState *machine, const char *kvm_type)
+{
+#ifdef CONFIG_XEN_EMU
+    if (xen_mode == XEN_EMULATE) {
+        xen_overlay_create();
+    }
+#endif
+    return 0;
+}
+
 static void pc_machine_reset(MachineState *machine, ShutdownCause reason)
 {
     CPUState *cs;
diff --git a/include/hw/i386/pc.h b/include/hw/i386/pc.h
index 991f905f5d..b866567b7b 100644
--- a/include/hw/i386/pc.h
+++ b/include/hw/i386/pc.h
@@ -293,12 +293,15 @@  extern const size_t pc_compat_1_5_len;
 extern GlobalProperty pc_compat_1_4[];
 extern const size_t pc_compat_1_4_len;
 
+extern int pc_machine_kvm_type(MachineState *machine, const char *vm_type);
+
 #define DEFINE_PC_MACHINE(suffix, namestr, initfn, optsfn) \
     static void pc_machine_##suffix##_class_init(ObjectClass *oc, void *data) \
     { \
         MachineClass *mc = MACHINE_CLASS(oc); \
         optsfn(mc); \
         mc->init = initfn; \
+        mc->kvm_type = pc_machine_kvm_type; \
     } \
     static const TypeInfo pc_machine_type_##suffix = { \
         .name       = namestr TYPE_MACHINE_SUFFIX, \