Message ID | 20230110122042.1562155-15-dwmw2@infradead.org |
---|---|
State | New |
Headers | show |
Series | Xen support under KVM | expand |
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, \
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 --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, \