Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On Wed, 15 Mar 2017, Paolo Bonzini wrote: > On 14/03/2017 21:23, Stefano Stabellini wrote: > > On Tue, 14 Mar 2017, Stefano Stabellini wrote: > >>> Then you add to Makefile: > >>> > >>> CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > >>> CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > >>> +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > >>> CONFIG_ALL=y > >>> -include config-all-devices.mak > >>> -include config-all-disas.mak > >>> > >>> The Makefile change ensures that they are built before descending in the > >>> target-specific directories. > >> > >> But I don't understand this. Please correct me if I am wrong, but this > >> change looks like it would end up setting CONFIG_XEN every time that > >> CONFIG_XEN_BACKEND is set. Without the configure change at the top, it > >> would end up setting CONFIG_XEN whenever the host supports Xen, even for > >> non-x86 and non-ARM targets. What am I missing? > > This CONFIG_XEN assignment applies to the toplevel only, i.e. to files > that are built once. Targets will still take CONFIG_XEN from > config-target.mak, and it will not be set for non-x86/non-ARM targets. > This CONFIG_XEN assignment applies to files that are compiled once. > > The issue you reported here: > > > LINKaarch64-softmmu/qemu-system-aarch64 > > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_alloc': > > /local/qemu/hw/9pfs/xen-9p-backend.c:387: undefined reference to > > `xenstore_write_be_str' > > /local/qemu/hw/9pfs/xen-9p-backend.c:388: undefined reference to > > `xenstore_write_be_int' > > is because you need this in patch 9: > > -common-obj-$(CONFIG_XEN_BACKEND) += xen-9p-backend.o > +common-obj-$(CONFIG_XEN) += xen-9p-backend.o > /me shakes his head in shame. Thank you for the explanation!
Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On 14/03/2017 21:23, Stefano Stabellini wrote: > On Tue, 14 Mar 2017, Stefano Stabellini wrote: >>> Then you add to Makefile: >>> >>> CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) >>> CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) >>> +CONFIG_XEN := $(CONFIG_XEN_BACKEND) >>> CONFIG_ALL=y >>> -include config-all-devices.mak >>> -include config-all-disas.mak >>> >>> The Makefile change ensures that they are built before descending in the >>> target-specific directories. >> >> But I don't understand this. Please correct me if I am wrong, but this >> change looks like it would end up setting CONFIG_XEN every time that >> CONFIG_XEN_BACKEND is set. Without the configure change at the top, it >> would end up setting CONFIG_XEN whenever the host supports Xen, even for >> non-x86 and non-ARM targets. What am I missing? This CONFIG_XEN assignment applies to the toplevel only, i.e. to files that are built once. Targets will still take CONFIG_XEN from config-target.mak, and it will not be set for non-x86/non-ARM targets. This CONFIG_XEN assignment applies to files that are compiled once. The issue you reported here: > LINKaarch64-softmmu/qemu-system-aarch64 > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_alloc': > /local/qemu/hw/9pfs/xen-9p-backend.c:387: undefined reference to > `xenstore_write_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:388: undefined reference to > `xenstore_write_be_int' is because you need this in patch 9: -common-obj-$(CONFIG_XEN_BACKEND) += xen-9p-backend.o +common-obj-$(CONFIG_XEN) += xen-9p-backend.o > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_connect': > /local/qemu/hw/9pfs/xen-9p-backend.c:292: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:313: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:357: undefined reference to > `xen_pv_printf' > /local/qemu/hw/9pfs/xen-9p-backend.c:307: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:362: undefined reference to > `xenstore_read_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:363: undefined reference to > `xenstore_read_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:366: undefined reference to > `xenstore_read_fe_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:353: undefined reference to > `xen_pv_printf' > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_alloc': > /local/qemu/hw/9pfs/xen-9p-backend.c:389: undefined reference to > `xenstore_write_be_int' > collect2: error: ld returned 1 exit status > make[1]: *** [qemu-system-arm] Error 1 > make: *** [subdir-arm-softmmu] Error 2 > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_alloc': > /local/qemu/hw/9pfs/xen-9p-backend.c:387: undefined reference to > `xenstore_write_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:388: undefined reference to > `xenstore_write_be_int' > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_connect': > /local/qemu/hw/9pfs/xen-9p-backend.c:292: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:313: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:357: undefined reference to > `xen_pv_printf' > /local/qemu/hw/9pfs/xen-9p-backend.c:307: undefined reference to > `xenstore_read_fe_int' > /local/qemu/hw/9pfs/xen-9p-backend.c:362: undefined reference to > `xenstore_read_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:363: undefined reference to > `xenstore_read_be_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:366: undefined reference to > `xenstore_read_fe_str' > /local/qemu/hw/9pfs/xen-9p-backend.c:353: undefined reference to > `xen_pv_printf' > ../hw/9pfs/xen-9p-backend.o: In function `xen_9pfs_alloc': > /local/qemu/hw/9pfs/xen-9p-backend.c:389: undefined reference to > `xenstore_write_be_int' > collect2: error: ld returned 1 exit status > make[1]: *** [qemu-system-aarch64] Error 1 > make: *** [subdir-aarch64-softmmu] Error 2 > > > ___ > Xen-devel mailing list > xen-de...@lists.xen.org > https://lists.xen.org/xen-devel >
Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On Tue, 14 Mar 2017 13:23:09 -0700 (PDT) Stefano Stabelliniwrote: > On Tue, 14 Mar 2017, Stefano Stabellini wrote: > > On Tue, 14 Mar 2017, Paolo Bonzini wrote: > > > On 14/03/2017 00:55, Stefano Stabellini wrote: > > > > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > > > > regardless of the chosen targets. As a consequence, Xen backends can be > > > > enabled even on targets that don't support Xen. > > > > > > > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > > > > support Xen. > > > > > > > > Signed-off-by: Stefano Stabellini > > > > CC: gr...@kaod.org > > > > CC: gr...@kaod.org > > > > CC: pbonz...@redhat.com > > > > CC: peter.mayd...@linaro.org > > > > CC: r...@twiddle.net > > > > CC: stefa...@redhat.com > > > > --- > > > > configure | 2 +- > > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > > > diff --git a/configure b/configure > > > > index 6c21975..6d8f752 100755 > > > > --- a/configure > > > > +++ b/configure > > > > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then > > > >echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > > > > fi > > > > if test "$xen" = "yes" ; then > > > > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak > > > >echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> > > > > $config_host_mak > > > >if test "$xen_pv_domain_build" = "yes" ; then > > > > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > > > > @@ -6028,6 +6027,7 @@ case "$target_name" in > > > >i386|x86_64) > > > > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > > > >echo "CONFIG_XEN=y" >> $config_target_mak > > > > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak > > > >if test "$xen_pci_passthrough" = yes; then > > > > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" > > > >fi > > > > > > > > > > This messes up a bit the way xen_nic.o and friends are compiled, I > > > think, because they are common-obj-y but they are only found when > > > compiling in the target subdirectories. So you end up building > > > x86_64-softmmu/../hw/net/xen_nic.o > > > > > > If you're unlucky, I believe this can lead to a link failure where a > > > target is building xen_nic.o, while the other tries to link to a > > > partially written object file. > > > > > > I think the files should be changed from > > > common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). > > > > > > The Makefile.objs change ensures that Xen backends are not enabled on > > > targets that support Xen. > > > > Actually I thought about doing that instead of the configure change. It > > makes sense to me. > > > > > > > Then you add to Makefile: > > > > > > CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > > > CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > > > +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > > > CONFIG_ALL=y > > > -include config-all-devices.mak > > > -include config-all-disas.mak > > > > > > The Makefile change ensures that they are built before descending in the > > > target-specific directories. > > > > But I don't understand this. Please correct me if I am wrong, but this > > change looks like it would end up setting CONFIG_XEN every time that > > CONFIG_XEN_BACKEND is set. Without the configure change at the top, it > > would end up setting CONFIG_XEN whenever the host supports Xen, even for > > non-x86 and non-ARM targets. What am I missing? > > FYI I made the following changes: > > diff --git a/Makefile b/Makefile > index 1c4c04f..b246138 100644 > --- a/Makefile > +++ b/Makefile > @@ -26,6 +26,7 @@ endif > > CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > CONFIG_ALL=y > -include config-all-devices.mak > -include config-all-disas.mak > diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs > index d4c3ab7..e0ed980 100644 > --- a/hw/block/Makefile.objs > +++ b/hw/block/Makefile.objs > @@ -4,7 +4,7 @@ common-obj-$(CONFIG_SSI_M25P80) += m25p80.o > common-obj-$(CONFIG_NAND) += nand.o > common-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o > common-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o > -common-obj-$(CONFIG_XEN_BACKEND) += xen_disk.o > +common-obj-$(CONFIG_XEN) += xen_disk.o > common-obj-$(CONFIG_ECC) += ecc.o > common-obj-$(CONFIG_ONENAND) += onenand.o > common-obj-$(CONFIG_NVME_PCI) += nvme.o > diff --git a/hw/char/Makefile.objs b/hw/char/Makefile.objs > index 6ea76fe..725fdc4 100644 > --- a/hw/char/Makefile.objs > +++ b/hw/char/Makefile.objs > @@ -7,7 +7,7 @@ common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o > common-obj-$(CONFIG_SERIAL_PCI) += serial-pci.o > common-obj-$(CONFIG_VIRTIO) += virtio-console.o > common-obj-$(CONFIG_XILINX) += xilinx_uartlite.o > -common-obj-$(CONFIG_XEN_BACKEND) += xen_console.o >
Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On Tue, 14 Mar 2017, Stefano Stabellini wrote: > On Tue, 14 Mar 2017, Paolo Bonzini wrote: > > On 14/03/2017 00:55, Stefano Stabellini wrote: > > > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > > > regardless of the chosen targets. As a consequence, Xen backends can be > > > enabled even on targets that don't support Xen. > > > > > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > > > support Xen. > > > > > > Signed-off-by: Stefano Stabellini> > > CC: gr...@kaod.org > > > CC: gr...@kaod.org > > > CC: pbonz...@redhat.com > > > CC: peter.mayd...@linaro.org > > > CC: r...@twiddle.net > > > CC: stefa...@redhat.com > > > --- > > > configure | 2 +- > > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > > > diff --git a/configure b/configure > > > index 6c21975..6d8f752 100755 > > > --- a/configure > > > +++ b/configure > > > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then > > >echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > > > fi > > > if test "$xen" = "yes" ; then > > > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak > > >echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> > > > $config_host_mak > > >if test "$xen_pv_domain_build" = "yes" ; then > > > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > > > @@ -6028,6 +6027,7 @@ case "$target_name" in > > >i386|x86_64) > > > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > > >echo "CONFIG_XEN=y" >> $config_target_mak > > > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak > > >if test "$xen_pci_passthrough" = yes; then > > > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" > > >fi > > > > > > > This messes up a bit the way xen_nic.o and friends are compiled, I > > think, because they are common-obj-y but they are only found when > > compiling in the target subdirectories. So you end up building > > x86_64-softmmu/../hw/net/xen_nic.o > > > > If you're unlucky, I believe this can lead to a link failure where a > > target is building xen_nic.o, while the other tries to link to a > > partially written object file. > > > > I think the files should be changed from > > common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). > > > > The Makefile.objs change ensures that Xen backends are not enabled on > > targets that support Xen. > > Actually I thought about doing that instead of the configure change. It > makes sense to me. > > > > Then you add to Makefile: > > > > CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > > CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > > +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > > CONFIG_ALL=y > > -include config-all-devices.mak > > -include config-all-disas.mak > > > > The Makefile change ensures that they are built before descending in the > > target-specific directories. > > But I don't understand this. Please correct me if I am wrong, but this > change looks like it would end up setting CONFIG_XEN every time that > CONFIG_XEN_BACKEND is set. Without the configure change at the top, it > would end up setting CONFIG_XEN whenever the host supports Xen, even for > non-x86 and non-ARM targets. What am I missing? FYI I made the following changes: diff --git a/Makefile b/Makefile index 1c4c04f..b246138 100644 --- a/Makefile +++ b/Makefile @@ -26,6 +26,7 @@ endif CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) +CONFIG_XEN := $(CONFIG_XEN_BACKEND) CONFIG_ALL=y -include config-all-devices.mak -include config-all-disas.mak diff --git a/hw/block/Makefile.objs b/hw/block/Makefile.objs index d4c3ab7..e0ed980 100644 --- a/hw/block/Makefile.objs +++ b/hw/block/Makefile.objs @@ -4,7 +4,7 @@ common-obj-$(CONFIG_SSI_M25P80) += m25p80.o common-obj-$(CONFIG_NAND) += nand.o common-obj-$(CONFIG_PFLASH_CFI01) += pflash_cfi01.o common-obj-$(CONFIG_PFLASH_CFI02) += pflash_cfi02.o -common-obj-$(CONFIG_XEN_BACKEND) += xen_disk.o +common-obj-$(CONFIG_XEN) += xen_disk.o common-obj-$(CONFIG_ECC) += ecc.o common-obj-$(CONFIG_ONENAND) += onenand.o common-obj-$(CONFIG_NVME_PCI) += nvme.o diff --git a/hw/char/Makefile.objs b/hw/char/Makefile.objs index 6ea76fe..725fdc4 100644 --- a/hw/char/Makefile.objs +++ b/hw/char/Makefile.objs @@ -7,7 +7,7 @@ common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o common-obj-$(CONFIG_SERIAL_PCI) += serial-pci.o common-obj-$(CONFIG_VIRTIO) += virtio-console.o common-obj-$(CONFIG_XILINX) += xilinx_uartlite.o -common-obj-$(CONFIG_XEN_BACKEND) += xen_console.o +common-obj-$(CONFIG_XEN) += xen_console.o common-obj-$(CONFIG_CADENCE) += cadence_uart.o obj-$(CONFIG_EXYNOS4) += exynos4210_uart.o diff --git a/hw/display/Makefile.objs b/hw/display/Makefile.objs index 063889b..3d02e8b 100644 --- a/hw/display/Makefile.objs +++ b/hw/display/Makefile.objs @@ -5,7 +5,7 @@ common-obj-$(CONFIG_JAZZ_LED) += jazz_led.o
Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On Tue, 14 Mar 2017, Paolo Bonzini wrote: > On 14/03/2017 00:55, Stefano Stabellini wrote: > > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > > regardless of the chosen targets. As a consequence, Xen backends can be > > enabled even on targets that don't support Xen. > > > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > > support Xen. > > > > Signed-off-by: Stefano Stabellini> > CC: gr...@kaod.org > > CC: gr...@kaod.org > > CC: pbonz...@redhat.com > > CC: peter.mayd...@linaro.org > > CC: r...@twiddle.net > > CC: stefa...@redhat.com > > --- > > configure | 2 +- > > 1 file changed, 1 insertion(+), 1 deletion(-) > > > > diff --git a/configure b/configure > > index 6c21975..6d8f752 100755 > > --- a/configure > > +++ b/configure > > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then > >echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > > fi > > if test "$xen" = "yes" ; then > > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak > >echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> > > $config_host_mak > >if test "$xen_pv_domain_build" = "yes" ; then > > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > > @@ -6028,6 +6027,7 @@ case "$target_name" in > >i386|x86_64) > > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then > >echo "CONFIG_XEN=y" >> $config_target_mak > > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak > >if test "$xen_pci_passthrough" = yes; then > > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" > >fi > > > > This messes up a bit the way xen_nic.o and friends are compiled, I > think, because they are common-obj-y but they are only found when > compiling in the target subdirectories. So you end up building > x86_64-softmmu/../hw/net/xen_nic.o > > If you're unlucky, I believe this can lead to a link failure where a > target is building xen_nic.o, while the other tries to link to a > partially written object file. > > I think the files should be changed from > common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). > > The Makefile.objs change ensures that Xen backends are not enabled on > targets that support Xen. Actually I thought about doing that instead of the configure change. It makes sense to me. > Then you add to Makefile: > > CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) > CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) > +CONFIG_XEN := $(CONFIG_XEN_BACKEND) > CONFIG_ALL=y > -include config-all-devices.mak > -include config-all-disas.mak > > The Makefile change ensures that they are built before descending in the > target-specific directories. But I don't understand this. Please correct me if I am wrong, but this change looks like it would end up setting CONFIG_XEN every time that CONFIG_XEN_BACKEND is set. Without the configure change at the top, it would end up setting CONFIG_XEN whenever the host supports Xen, even for non-x86 and non-ARM targets. What am I missing?
Re: [Qemu-devel] [PATCH v2 1/9] configure: change CONFIG_XEN_BACKEND to be a target property
On 14/03/2017 00:55, Stefano Stabellini wrote: > CONFIG_XEN_BACKEND is currently set when the host supports Xen, > regardless of the chosen targets. As a consequence, Xen backends can be > enabled even on targets that don't support Xen. > > Fix the issue by setting CONFIG_XEN_BACKEND only for targets that > support Xen. > > Signed-off-by: Stefano Stabellini> CC: gr...@kaod.org > CC: gr...@kaod.org > CC: pbonz...@redhat.com > CC: peter.mayd...@linaro.org > CC: r...@twiddle.net > CC: stefa...@redhat.com > --- > configure | 2 +- > 1 file changed, 1 insertion(+), 1 deletion(-) > > diff --git a/configure b/configure > index 6c21975..6d8f752 100755 > --- a/configure > +++ b/configure > @@ -5442,7 +5442,6 @@ if test "$virglrenderer" = "yes" ; then >echo "VIRGL_LIBS=$virgl_libs" >> $config_host_mak > fi > if test "$xen" = "yes" ; then > - echo "CONFIG_XEN_BACKEND=y" >> $config_host_mak >echo "CONFIG_XEN_CTRL_INTERFACE_VERSION=$xen_ctrl_version" >> > $config_host_mak >if test "$xen_pv_domain_build" = "yes" ; then > echo "CONFIG_XEN_PV_DOMAIN_BUILD=y" >> $config_host_mak > @@ -6028,6 +6027,7 @@ case "$target_name" in >i386|x86_64) > if test "$xen" = "yes" -a "$target_softmmu" = "yes" ; then >echo "CONFIG_XEN=y" >> $config_target_mak > + echo "CONFIG_XEN_BACKEND=y" >> $config_target_mak >if test "$xen_pci_passthrough" = yes; then > echo "CONFIG_XEN_PCI_PASSTHROUGH=y" >> "$config_target_mak" >fi > This messes up a bit the way xen_nic.o and friends are compiled, I think, because they are common-obj-y but they are only found when compiling in the target subdirectories. So you end up building x86_64-softmmu/../hw/net/xen_nic.o If you're unlucky, I believe this can lead to a link failure where a target is building xen_nic.o, while the other tries to link to a partially written object file. I think the files should be changed from common-obj-$(CONFIG_XEN_BACKEND) to common-obj-$(CONFIG_XEN). Then you add to Makefile: CONFIG_SOFTMMU := $(if $(filter %-softmmu,$(TARGET_DIRS)),y) CONFIG_USER_ONLY := $(if $(filter %-user,$(TARGET_DIRS)),y) +CONFIG_XEN := $(CONFIG_XEN_BACKEND) CONFIG_ALL=y -include config-all-devices.mak -include config-all-disas.mak The Makefile change ensures that they are built before descending in the target-specific directories. The Makefile.objs change ensures that Xen backends are not enabled on targets that support Xen. Paolo