[RFC,0/5] Add configure flag to disable TCG

Message ID alpine.DEB.2.00.1109051525270.12963@kaball-desktop
State New
Headers show

Commit Message

Stefano Stabellini Sept. 5, 2011, 2:53 p.m.
On Fri, 2 Sep 2011, Anthony Liguori wrote:
> Hi,
> There have been a few attempts in the past to allow TCG to be disabled
> at build time.  Recently, Alex made the suggestion that we could do it by using
> the same trick that we used to introduce kvm support.  That involves introducing
> a tcg_enabled() macro that will be (0) if TCG is disabled in the build.
> GCC is smart enough to do dead code elimination if it sees an if (0) and the
> result is that if you can do:
> if (tcg_enabled()) {
>   foo();
> }
> and it's more or less equivalent to:
> #ifdef CONFIG_TCG
>   foo();
> #endif
> Without the ugliness that comes from using the preprocessor.  I think this ended
> up being pretty straight forward.  exec.c could use a fair bit of cleanup but
> other than that, this pretty much eliminates all of the TCG code from the build.
> This absolutely is going to break non-x86 KVM builds if they use the
> --disable-tcg flag as I haven't tested those yet.  The normal TCG build
> shouldn't be affected at all though.
> In principle, the code assumes that you need KVM if you don't have TCG.  Of
> course, some extra logic could be added to allow for Xen if TCG isn't present.

I like the goal if the series very much and compilation with
--disable-tcg --enable-xen works out of the box!

However there are two problems:

- compilation with --disable-kvm --disable-xen (--enable-tcg) breaks on
my box, log attached;

- the automatic filtering on the target list introduced by the first
patch effectively prevents users from enabling xen with --disable-tcg,
unless they also enable kvm. See appended patch.
sstabellini@dt02:/local/scratch/sstabellini/qemu$ ./configure --disable-kvm --disable-xen --target-list=i386-softmmu
Install prefix    /usr/local
BIOS directory    /usr/local/share/qemu
binary directory  /usr/local/bin
library directory /usr/local/lib
include directory /usr/local/include
config directory  /usr/local/etc
Manual directory  /usr/local/share/man
ELF interp prefix /usr/gnemul/qemu-%M
Source path       /local/scratch/sstabellini/qemu
C compiler        gcc
Host C compiler   gcc
CFLAGS            -O2 -g 
QEMU_CFLAGS       -Werror -m64 -D_FORTIFY_SOURCE=2 -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64 -D_LARGEFILE_SOURCE -Wstrict-prototypes -Wredundant-decls -Wall -Wundef -Wwrite-strings -Wmissing-prototypes -fno-strict-aliasing  -fstack-protector-all -Wendif-labels -Wmissing-include-dirs -Wempty-body -Wnested-externs -Wformat-security -Wformat-y2k -Winit-self -Wignored-qualifiers -Wold-style-declaration -Wold-style-definition -Wtype-limits -I/usr/include/libpng12   -I/usr/local/include/spice-server -I/usr/local/include/pixman-1 -I/usr/local/include -I/usr/local/include/spice-1  
LDFLAGS           -Wl,--warn-common -m64 -g 
make              make
install           install
python            python
smbd              /usr/sbin/smbd
host CPU          x86_64
host big endian   no
target list       i386-softmmu
tcg debug enabled no
Mon debug enabled no
gprof enabled     no
sparse enabled    no
strip binaries    yes
profiler          no
static build      no
-Werror enabled   yes
SDL support       yes
curses support    yes
curl support      no
check support     no
mingw32 support   no
Audio drivers     oss
Extra audio cards ac97 es1370 sb16 hda
Block whitelist   
Mixer emulation   no
VNC support       yes
VNC TLS support   no
VNC SASL support  no
VNC JPEG support  yes
VNC PNG support   yes
VNC thread        no
xen support       no
brlapi support    no
bluez  support    no
Documentation     yes
NPTL support      yes
GUEST_BASE        yes
PIE user targets  no
vde support       no
Linux AIO support yes
ATTR/XATTR support no
Install blobs     yes
KVM support       no
fdt support       no
preadv support    yes
fdatasync         yes
madvise           yes
posix_madvise     yes
uuid support      yes
vhost-net support yes
Trace backend     nop
Trace output file trace-<pid>
spice support     yes
rbd support       no
xfsctl support    no
nss used          no
usb net redir     no
OpenGL support    yes
build guest agent yes
sstabellini@dt02:/local/scratch/sstabellini/qemu$ make -j12
  GEN   config-host.h
  GEN   trace.h
  GEN   qemu-options.def
  GEN   qapi-generated/qga-qapi-visit.h
  GEN   trace.c
  CC    trace/control.o
  CC    trace/default.o
  GEN   qemu-img-cmds.h
  GEN   qapi-generated/qga-qapi-types.h
  GEN   qapi-generated/qga-qmp-marshal.c
  CC    qemu-ga.o
  CC    qga/guest-agent-commands.o
  CC    qga/guest-agent-command-state.o
  CC    qemu-tool.o
  CC    qemu-error.o
  CC    trace/default.o
  CC    trace/control.o
  CC    qint.o
  CC    qstring.o
  CC    qdict.o
  CC    qlist.o
  CC    qfloat.o
  CC    qjson.o
  CC    qbool.o
  CC    json-lexer.o
  CC    json-streamer.o
  CC    json-parser.o
  CC    qerror.o
  CC    error.o
  CC    qemu-nbd.o
  CC    qemu-thread-posix.o
  CC    cache-utils.o
  CC    async.o
  CC    nbd.o
  CC    block.o
  CC    aio.o
  CC    aes.o
  CC    qemu-config.o
  CC    qemu-progress.o
  CC    qemu-coroutine.o
  CC    qemu-coroutine-lock.o
  CC    coroutine-ucontext.o
  CC    posix-aio-compat.o
  CC    linux-aio.o
  CC    block/raw.o
  CC    block/cow.o
  CC    block/qcow.o
  CC    block/vdi.o
  CC    block/vmdk.o
  CC    block/cloop.o
  CC    block/dmg.o
  CC    block/bochs.o
  CC    block/vpc.o
  CC    block/vvfat.o
  CC    block/qcow2.o
  CC    block/qcow2-refcount.o
  CC    block/qcow2-cluster.o
  CC    block/qcow2-snapshot.o
  CC    block/qcow2-cache.o
  CC    block/qed.o
  CC    block/qed-gencb.o
  CC    block/qed-l2-cache.o
  CC    block/qed-table.o
  CC    block/qed-cluster.o
  CC    block/qed-check.o
  CC    block/parallels.o
  CC    block/nbd.o
  CC    block/blkdebug.o
  CC    block/sheepdog.o
  CC    block/blkverify.o
  CC    block/raw-posix.o
  CC    qemu-timer-common.o
  CC    qemu-img.o
  CC    qemu-io.o
  CC    cmd.o
  CC    libhw64/vl.o
  CC    blockdev.o
  CC    libhw64/loader.o
  CC    libhw64/virtio-console.o
  CC    libhw64/usb-libhw.o
  CC    net.o
  CC    net/queue.o
  CC    net/checksum.o
  CC    libhw64/virtio-pci.o
  CC    libhw64/fw_cfg.o
  CC    net/util.o
  CC    net/socket.o
  CC    net/dump.o
  CC    net/tap.o
  CC    net/tap-linux.o
  CC    net/slirp.o
  CC    readline.o
  CC    console.o
  CC    cursor.o
  CC    libhw64/pci.o
  CC    os-posix.o
  CC    tcg-runtime.o
  CC    host-utils.o
  CC    irq.o
  CC    ioport.o
  CC    libhw64/pci_bridge.o
  CC    input.o
  CC    libhw64/msix.o
  CC    i2c.o
  CC    smbus.o
  CC    smbus_eeprom.o
  CC    eeprom93xx.o
  CC    scsi-disk.o
  CC    cdrom.o
  CC    scsi-generic.o
  CC    libhw64/msi.o
  CC    scsi-bus.o
  CC    hid.o
  CC    usb.o
  CC    usb-hub.o
  CC    usb-linux.o
  CC    libhw64/pci_host.o
  CC    libhw64/pcie_host.o
  CC    usb-hid.o
  CC    usb-msd.o
  CC    libhw64/ioh3420.o
  CC    usb-wacom.o
  CC    usb-serial.o
  CC    libhw64/xio3130_upstream.o
  CC    libhw64/xio3130_downstream.o
  CC    usb-net.o
  CC    libhw64/watchdog.o
  CC    usb-bus.o
  CC    libhw64/serial.o
  CC    usb-desc.o
  CC    bt.o
  CC    bt-host.o
  CC    libhw64/parallel.o
  CC    bt-vhci.o
  CC    libhw64/i8254.o
  CC    bt-l2cap.o
  CC    libhw64/pcspk.o
  CC    bt-sdp.o
  CC    bt-hci.o
  CC    bt-hid.o
  CC    usb-bt.o
  CC    bt-hci-csr.o
  CC    buffered_file.o
  CC    libhw64/pckbd.o
  CC    libhw64/usb-uhci.o
  CC    libhw64/usb-ohci.o
  CC    migration.o
  CC    libhw64/usb-ehci.o
  CC    migration-tcp.o
  CC    qemu-char.o
  CC    savevm.o
  CC    msmouse.o
  CC    ps2.o
  CC    qdev.o
  CC    libhw64/fdc.o
  CC    qdev-properties.o
  CC    block-migration.o
  CC    iohandler.o
  CC    libhw64/acpi.o
  CC    pflib.o
  CC    bitmap.o
  CC    bitops.o
  CC    libhw64/acpi_piix4.o
  CC    migration-exec.o
  CC    migration-unix.o
  CC    migration-fd.o
  CC    libhw64/pm_smbus.o
  CC    libhw64/apm.o
  CC    ui/spice-core.o
  CC    ui/spice-input.o
  CC    ui/spice-display.o
  CC    spice-qemu-char.o
  CC    libhw64/dma.o
  CC    audio/audio.o
  CC    audio/noaudio.o
  CC    audio/wavaudio.o
  CC    libhw64/hpet.o
  CC    libhw64/applesmc.o
  CC    libhw64/usb-ccid.o
  CC    audio/mixeng.o
  CC    audio/sdlaudio.o
  CC    audio/ossaudio.o
  CC    audio/spiceaudio.o
  CC    libhw64/ccid-card-passthru.o
  CC    audio/wavcapture.o
  CC    libhw64/wdt_i6300esb.o
  CC    ui/keymaps.o
  CC    libhw64/pcie.o
  CC    libhw64/pcie_aer.o
  CC    ui/sdl.o
  CC    ui/sdl_zoom.o
  CC    ui/x_keymap.o
  CC    libhw64/pcie_port.o
  CC    libhw64/ne2000.o
  CC    ui/curses.o
  CC    libhw64/eepro100.o
  CC    ui/vnc.o
  CC    ui/d3des.o
  CC    ui/vnc-enc-zlib.o
  CC    libhw64/pcnet-pci.o
  CC    ui/vnc-enc-hextile.o
  CC    libhw64/pcnet.o
  CC    ui/vnc-enc-tight.o
  CC    ui/vnc-palette.o
  CC    libhw64/e1000.o
  CC    ui/vnc-enc-zrle.o
  CC    libhw64/rtl8139.o
  CC    libhw64/ne2000-isa.o
  CC    ui/vnc-jobs-sync.o
  CC    libhw64/ide/core.o
  CC    iov.o
  CC    libhw64/ide/atapi.o
  CC    acl.o
  CC    libhw64/ide/qdev.o
  CC    compatfd.o
  CC    notify.o
  CC    libhw64/ide/pci.o
  CC    event_notifier.o
  CC    libhw64/ide/isa.o
  CC    qemu-timer.o
  CC    slirp/cksum.o
  CC    libhw64/ide/piix.o
  CC    slirp/if.o
  CC    libhw64/ide/ahci.o
  CC    libhw64/ide/ich.o
  CC    libhw64/lsi53c895a.o
  CC    libhw64/dma-helpers.o
  CC    slirp/ip_icmp.o
  CC    slirp/ip_input.o
  CC    slirp/ip_output.o
  CC    libhw64/sysbus.o
  CC    slirp/slirp.o
  CC    libhw64/isa-bus.o
  CC    libhw64/qdev-addr.o
  CC    libhw64/vga-pci.o
  CC    slirp/mbuf.o
  CC    slirp/misc.o
  CC    slirp/sbuf.o
  CC    slirp/socket.o
  CC    libhw64/vga-isa.o
  CC    libhw64/vmware_vga.o
  CC    libhw64/vmmouse.o
  CC    libhw64/sb16.o
  CC    slirp/tcp_input.o
  CC    libhw64/es1370.o
  CC    slirp/tcp_output.o
  CC    slirp/tcp_subr.o
  CC    libhw64/ac97.o
  CC    slirp/tcp_timer.o
  CC    libhw64/intel-hda.o
  CC    slirp/udp.o
  CC    slirp/bootp.o
  CC    slirp/tftp.o
  CC    libhw64/hda-audio.o
  CC    slirp/arp_table.o
  AS    optionrom/multiboot.o
  AS    optionrom/linuxboot.o
  CC    libdis/i386-dis.o
  Building optionrom/multiboot.img
  Building optionrom/multiboot.raw
  Building optionrom/linuxboot.img
  CC    qemu-error.o
  Signing optionrom/multiboot.bin
  CC    qemu-sockets.o
  Building optionrom/linuxboot.raw
  Signing optionrom/linuxboot.bin
  CC    module.o
  CC    qemu-option.o
  CC    cutils.o
  CC    osdep.o
  CC    oslib-posix.o
  CC    qapi/qapi-visit-core.o
  CC    qapi/qmp-input-visitor.o
  CC    qapi/qmp-output-visitor.o
  CC    qapi/qapi-dealloc-visitor.o
  CC    qapi/qmp-registry.o
  CC    qapi/qmp-dispatch.o
  CC    trace.o
  CC    qapi-generated/qga-qapi-visit.o
  CC    qapi-generated/qga-qapi-types.o
  CC    qapi-generated/qga-qmp-marshal.o
  LINK  qemu-nbd
  LINK  qemu-io
  LINK  qemu-img
  LINK  qemu-ga
  GEN   config-target.h
  GEN   i386-softmmu/hmp-commands.h
  GEN   i386-softmmu/qmp-commands.h
  CC    i386-softmmu/arch_init.o
  CC    i386-softmmu/cpus.o
  CC    i386-softmmu/machine.o
  CC    i386-softmmu/gdbstub.o
  CC    i386-softmmu/balloon.o
  CC    i386-softmmu/virtio.o
  CC    i386-softmmu/virtio-blk.o
  CC    i386-softmmu/virtio-balloon.o
  CC    i386-softmmu/virtio-net.o
  CC    i386-softmmu/virtio-serial-bus.o
  CC    i386-softmmu/vhost_net.o
  CC    i386-softmmu/rwhandler.o
  CC    i386-softmmu/kvm-stub.o
  CC    i386-softmmu/memory.o
  CC    i386-softmmu/xen-stub.o
  CC    i386-softmmu/exec.o
  CC    i386-softmmu/helper.o
  CC    i386-softmmu/cpuid.o
  CC    i386-softmmu/disas.o
  CC    i386-softmmu/vga.o
  CC    i386-softmmu/mc146818rtc.o
  CC    i386-softmmu/i8259.o
  CC    i386-softmmu/pc.o
  CC    i386-softmmu/cirrus_vga.o
  CC    i386-softmmu/sga.o
  CC    i386-softmmu/apic.o
  CC    i386-softmmu/ioapic.o
  CC    i386-softmmu/piix_pci.o
  CC    i386-softmmu/vmport.o
rm multiboot.o linuxboot.raw linuxboot.img multiboot.raw multiboot.img linuxboot.o
  CC    i386-softmmu/device-hotplug.o
  CC    i386-softmmu/pci-hotplug.o
  CC    i386-softmmu/smbios.o
  CC    i386-softmmu/wdt_ib700.o
  CC    i386-softmmu/debugcon.o
  CC    i386-softmmu/multiboot.o
  CC    i386-softmmu/pc_piix.o
  CC    i386-softmmu/qxl.o
  CC    i386-softmmu/qxl-logger.o
  CC    i386-softmmu/qxl-render.o
  CC    i386-softmmu/monitor.o
  LINK  i386-softmmu/qemu-system-i386
cpus.o: In function `tcg_cpu_exec':
/local/scratch/sstabellini/qemu/cpus.c:919: undefined reference to `cpu_x86_exec'
exec.o: In function `tb_phys_invalidate':
/local/scratch/sstabellini/qemu/exec.c:912: undefined reference to `tb_invalidated_flag'
/local/scratch/sstabellini/qemu/exec.c:912: undefined reference to `tb_invalidated_flag'
exec.o: In function `tcg_exec_init':
/local/scratch/sstabellini/qemu/exec.c:585: undefined reference to `cpu_gen_init'
/local/scratch/sstabellini/qemu/exec.c:592: undefined reference to `tcg_ctx'
exec.o: In function `tb_gen_code':
/local/scratch/sstabellini/qemu/exec.c:1016: undefined reference to `tb_invalidated_flag'
/local/scratch/sstabellini/qemu/exec.c:1026: undefined reference to `cpu_x86_gen_code'
exec.o: In function `cpu_io_recompile':
/local/scratch/sstabellini/qemu/exec.c:4695: undefined reference to `cpu_restore_state'
exec.o: In function `slow_ldq_cmmu':
/local/scratch/sstabellini/qemu/softmmu_template.h:186: undefined reference to `tlb_fill'
exec.o: In function `__ldq_cmmu':
/local/scratch/sstabellini/qemu/softmmu_template.h:135: undefined reference to `tlb_fill'
exec.o: In function `slow_ldb_cmmu':
/local/scratch/sstabellini/qemu/softmmu_template.h:186: undefined reference to `tlb_fill'
exec.o: In function `__ldb_cmmu':
/local/scratch/sstabellini/qemu/softmmu_template.h:135: undefined reference to `tlb_fill'
exec.o: In function `slow_ldw_cmmu':
/local/scratch/sstabellini/qemu/softmmu_template.h:186: undefined reference to `tlb_fill'
exec.o:/local/scratch/sstabellini/qemu/softmmu_template.h:135: more undefined references to `tlb_fill' follow
exec.o: In function `tb_invalidate_phys_page_range':
/local/scratch/sstabellini/qemu/exec.c:1109: undefined reference to `cpu_restore_state'
exec.o: In function `check_watchpoint':
/local/scratch/sstabellini/qemu/exec.c:3450: undefined reference to `cpu_restore_state'
/local/scratch/sstabellini/qemu/exec.c:3460: undefined reference to `cpu_resume_from_signal'
exec.o: In function `dump_exec_info':
/local/scratch/sstabellini/qemu/exec.c:4794: undefined reference to `tcg_dump_info'
exec.o: In function `tcg_exec_init':
/local/scratch/sstabellini/qemu/exec.c:592: undefined reference to `tcg_prologue_init'
exec.o: In function `cpu_io_recompile':
/local/scratch/sstabellini/qemu/exec.c:4738: undefined reference to `cpu_resume_from_signal'
exec.o: In function `tb_invalidate_phys_page_range':
/local/scratch/sstabellini/qemu/exec.c:1147: undefined reference to `cpu_resume_from_signal'
helper.o: In function `breakpoint_handler':
/local/scratch/sstabellini/qemu/target-i386/helper.c:1058: undefined reference to `cpu_resume_from_signal'
/local/scratch/sstabellini/qemu/target-i386/helper.c:1065: undefined reference to `raise_exception_env'
helper.o: In function `cpu_x86_init':
/local/scratch/sstabellini/qemu/target-i386/helper.c:1267: undefined reference to `optimize_flags_init'
/local/scratch/sstabellini/qemu/target-i386/helper.c:1270: undefined reference to `cpu_set_debug_excp_handler'
collect2: ld returned 1 exit status
make[1]: *** [qemu-system-i386] Error 1
make: *** [subdir-i386-softmmu] Error 2


diff --git a/configure b/configure
index 3f2cf6a..64f85b6 100755
--- a/configure
+++ b/configure
@@ -3148,7 +3148,7 @@  if test "$static" = "no" -a "$user_pie" = "yes" ; then
   echo "QEMU_CFLAGS+=-fpie" > libdis-user/config.mak
-kvm_incompatible() {
+virt_incompatible() {
     if test "$kvm" = "yes" -a \
       \( "$1" = "$cpu" -o \
       \( "$1" = "ppcemb" -a "$cpu" = "ppc" \) -o \
@@ -3158,9 +3158,14 @@  kvm_incompatible() {
       \( "$1" = "x86_64" -a "$cpu" = "i386"   \) -o \
       \( "$1" = "i386"   -a "$cpu" = "x86_64" \) \) ; then
 	return 1
-    else
-	return 0
+    if test "$xen" = "yes" -a \ 
+      \( "$1" = "$cpu" -o \
+      \( "$1" = "x86_64" -a "$cpu" = "i386"   \) -o \
+      \( "$1" = "i386"   -a "$cpu" = "x86_64" \) \) ; then
+	return 1
+    fi
+    return 0
@@ -3219,7 +3224,7 @@  if test "$tcg" = "no"; then
     if test "$target_softmmu" = "no"; then
-    if kvm_incompatible "$target_arch2"; then
+    if virt_incompatible "$target_arch2"; then