[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [PATCH v5] xen: fix build without pci passthrough
On Thu, Jun 04, 2020 at 02:31:41PM -0400, Paolo Bonzini wrote: > From: Anthony PERARD <anthony.perard@xxxxxxxxxx> > > Xen PCI passthrough support may not be available and thus the global > variable "has_igd_gfx_passthru" might be compiled out. Common code > should not access it in that case. > > Unfortunately, we can't use CONFIG_XEN_PCI_PASSTHROUGH directly in > xen-common.c so this patch instead move access to the > has_igd_gfx_passthru variable via function and those functions are > also implemented as stubs. The stubs will be used when QEMU is built > without passthrough support. > > Now, when one will want to enable igd-passthru via the -machine > property, they will get an error message if QEMU is built without > passthrough support. > > Fixes: 46472d82322d0 ('xen: convert "-machine igd-passthru" to an accelerator > property') > Reported-by: Roger Pau Monné <roger.pau@xxxxxxxxxx> > Signed-off-by: Anthony PERARD <anthony.perard@xxxxxxxxxx> > Message-Id: <20200603160442.3151170-1-anthony.perard@xxxxxxxxxx> > Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> Hi Paul, Can I backport this patch to qemu-xen-4.14? It allows to build qemu without pci passthrough support which seems to be important for FreeBSD as PT with QEMU is only available on Linux. (There's a fix to the patch that I would backport as well. "xen: Actually fix build without passthrough") Thanks. > --- > accel/xen/xen-all.c | 4 ++-- > hw/Makefile.objs | 2 +- > hw/i386/pc_piix.c | 2 +- > hw/xen/Makefile.objs | 3 ++- > hw/xen/xen_pt.c | 12 +++++++++++- > hw/xen/xen_pt.h | 6 ++++-- > hw/xen/xen_pt_stub.c | 22 ++++++++++++++++++++++ > 7 files changed, 43 insertions(+), 8 deletions(-) > create mode 100644 hw/xen/xen_pt_stub.c > > diff --git a/accel/xen/xen-all.c b/accel/xen/xen-all.c > index f3edc65ec9..0c24d4b191 100644 > --- a/accel/xen/xen-all.c > +++ b/accel/xen/xen-all.c > @@ -137,12 +137,12 @@ static void xen_change_state_handler(void *opaque, int > running, > > static bool xen_get_igd_gfx_passthru(Object *obj, Error **errp) > { > - return has_igd_gfx_passthru; > + return xen_igd_gfx_pt_enabled(); > } > > static void xen_set_igd_gfx_passthru(Object *obj, bool value, Error **errp) > { > - has_igd_gfx_passthru = value; > + xen_igd_gfx_pt_set(value, errp); > } > > static void xen_setup_post(MachineState *ms, AccelState *accel) > diff --git a/hw/Makefile.objs b/hw/Makefile.objs > index 660e2b4373..4cbe5e4e57 100644 > --- a/hw/Makefile.objs > +++ b/hw/Makefile.objs > @@ -35,7 +35,7 @@ devices-dirs-y += usb/ > devices-dirs-$(CONFIG_VFIO) += vfio/ > devices-dirs-y += virtio/ > devices-dirs-y += watchdog/ > -devices-dirs-y += xen/ > +devices-dirs-$(CONFIG_XEN) += xen/ > devices-dirs-$(CONFIG_MEM_DEVICE) += mem/ > devices-dirs-$(CONFIG_NUBUS) += nubus/ > devices-dirs-y += semihosting/ > diff --git a/hw/i386/pc_piix.c b/hw/i386/pc_piix.c > index eea964e72b..054d3aa9f7 100644 > --- a/hw/i386/pc_piix.c > +++ b/hw/i386/pc_piix.c > @@ -377,7 +377,7 @@ static void pc_init_isa(MachineState *machine) > #ifdef CONFIG_XEN > static void pc_xen_hvm_init_pci(MachineState *machine) > { > - const char *pci_type = has_igd_gfx_passthru ? > + const char *pci_type = xen_igd_gfx_pt_enabled() ? > TYPE_IGD_PASSTHROUGH_I440FX_PCI_DEVICE : > TYPE_I440FX_PCI_DEVICE; > > pc_init1(machine, > diff --git a/hw/xen/Makefile.objs b/hw/xen/Makefile.objs > index 340b2c5096..3fc715e595 100644 > --- a/hw/xen/Makefile.objs > +++ b/hw/xen/Makefile.objs > @@ -1,6 +1,7 @@ > # xen backend driver support > -common-obj-$(CONFIG_XEN) += xen-legacy-backend.o xen_devconfig.o xen_pvdev.o > xen-bus.o xen-bus-helper.o xen-backend.o > +common-obj-y += xen-legacy-backend.o xen_devconfig.o xen_pvdev.o xen-bus.o > xen-bus-helper.o xen-backend.o > > obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen-host-pci-device.o > obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pt.o xen_pt_config_init.o > xen_pt_graphics.o xen_pt_msi.o > obj-$(CONFIG_XEN_PCI_PASSTHROUGH) += xen_pt_load_rom.o > +obj-$(call $(lnot, $(CONFIG_XEN_PCI_PASSTHROUGH))) += xen_pt_stub.o > diff --git a/hw/xen/xen_pt.c b/hw/xen/xen_pt.c > index 81d5ad8da7..ab84443d5e 100644 > --- a/hw/xen/xen_pt.c > +++ b/hw/xen/xen_pt.c > @@ -65,7 +65,17 @@ > #include "qemu/range.h" > #include "exec/address-spaces.h" > > -bool has_igd_gfx_passthru; > +static bool has_igd_gfx_passthru; > + > +bool xen_igd_gfx_pt_enabled(void) > +{ > + return has_igd_gfx_passthru; > +} > + > +void xen_igd_gfx_pt_set(bool value, Error **errp) > +{ > + has_igd_gfx_passthru = value; > +} > > #define XEN_PT_NR_IRQS (256) > static uint8_t xen_pt_mapped_machine_irq[XEN_PT_NR_IRQS] = {0}; > diff --git a/hw/xen/xen_pt.h b/hw/xen/xen_pt.h > index 179775db7b..6e9cec95f3 100644 > --- a/hw/xen/xen_pt.h > +++ b/hw/xen/xen_pt.h > @@ -5,6 +5,9 @@ > #include "hw/pci/pci.h" > #include "xen-host-pci-device.h" > > +bool xen_igd_gfx_pt_enabled(void); > +void xen_igd_gfx_pt_set(bool value, Error **errp); > + > void xen_pt_log(const PCIDevice *d, const char *f, ...) GCC_FMT_ATTR(2, 3); > > #define XEN_PT_ERR(d, _f, _a...) xen_pt_log(d, "%s: Error: "_f, __func__, > ##_a) > @@ -322,10 +325,9 @@ extern void *pci_assign_dev_load_option_rom(PCIDevice > *dev, > unsigned int domain, > unsigned int bus, unsigned int > slot, > unsigned int function); > -extern bool has_igd_gfx_passthru; > static inline bool is_igd_vga_passthrough(XenHostPCIDevice *dev) > { > - return (has_igd_gfx_passthru > + return (xen_igd_gfx_pt_enabled() > && ((dev->class_code >> 0x8) == PCI_CLASS_DISPLAY_VGA)); > } > int xen_pt_register_vga_regions(XenHostPCIDevice *dev); > diff --git a/hw/xen/xen_pt_stub.c b/hw/xen/xen_pt_stub.c > new file mode 100644 > index 0000000000..2d8cac8d54 > --- /dev/null > +++ b/hw/xen/xen_pt_stub.c > @@ -0,0 +1,22 @@ > +/* > + * Copyright (C) 2020 Citrix Systems UK Ltd. > + * > + * This work is licensed under the terms of the GNU GPL, version 2 or later. > + * See the COPYING file in the top-level directory. > + */ > + > +#include "qemu/osdep.h" > +#include "hw/xen/xen_pt.h" > +#include "qapi/error.h" > + > +bool xen_igd_gfx_pt_enabled(void) > +{ > + return false; > +} > + > +void xen_igd_gfx_pt_set(bool value, Error **errp) > +{ > + if (value) { > + error_setg(errp, "Xen PCI passthrough support not built in"); > + } > +} > -- > 2.26.2 > > -- Anthony PERARD
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |