qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Anthony Liguori <anthony@codemonkey.ws>
To: Blue Swirl <blauwirbel@gmail.com>
Cc: qemu-devel <qemu-devel@nongnu.org>
Subject: Re: [Qemu-devel] [PATCH 7/7] Refactor target specific handling, compile vl.c only once
Date: Wed, 31 Mar 2010 13:42:41 -0500	[thread overview]
Message-ID: <4BB397A1.2000508@codemonkey.ws> (raw)
In-Reply-To: <f43fc5581003271511s7f7ab89ew847ea5a33b7ed2dc@mail.gmail.com>

On 03/27/2010 05:11 PM, Blue Swirl wrote:
> Move target specific functions and RAM handling to arch_init.c.
>
> Add a flag to QEMUOptions structure to indicate for which
> architectures the option is allowed, check the flag
> in run time and remove conditional code in option handling.
>
> Now that no target dependencies remain, compile vl.c only once
> for all targets.
>
> Signed-off-by: Blue Swirl<blauwirbel@gmail.com>
>    

This causes -enable-kvm to seg fault.

Regards,

Anthony Liguori

> ---
>   Makefile.objs   |   12 ++-
>   Makefile.target |   13 +-
>   arch_init.c     |  509 +++++++++++++++++++++++++++++++++++++++++++++++++++++++
>   arch_init.h     |   33 ++++
>   qemu-options.hx |  309 +++++++++++++++++----------------
>   sysemu.h        |    4 -
>   vl.c            |  476 ++++-----------------------------------------------
>   7 files changed, 751 insertions(+), 605 deletions(-)
>   create mode 100644 arch_init.c
>   create mode 100644 arch_init.h
>
> diff --git a/Makefile.objs b/Makefile.objs
> index 50ae890..d8eef0a 100644
> --- a/Makefile.objs
> +++ b/Makefile.objs
> @@ -127,7 +127,7 @@ user-obj-y += cutils.o cache-utils.o
>   # libhw
>
>   hw-obj-y =
> -hw-obj-y += loader.o
> +hw-obj-y += vl.o loader.o
>   hw-obj-y += virtio.o virtio-console.o
>   hw-obj-$(CONFIG_VIRTIO_PCI) += virtio-pci.o
>   hw-obj-y += fw_cfg.o pci.o pci_host.o pcie_host.o
> @@ -216,3 +216,13 @@ libdis-$(CONFIG_PPC_DIS) += ppc-dis.o
>   libdis-$(CONFIG_S390_DIS) += s390-dis.o
>   libdis-$(CONFIG_SH4_DIS) += sh4-dis.o
>   libdis-$(CONFIG_SPARC_DIS) += sparc-dis.o
> +
> +vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> +
> +vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> +
> +vl.o: qemu-options.h
> +
> +qemu-options.h: $(SRC_PATH)/qemu-options.hx
> +	$(call quiet-command,sh $(SRC_PATH)/hxtool -h<  $<  >  $@,"  GEN
> $(TARGET_DIR)$@")
> +
> diff --git a/Makefile.target b/Makefile.target
> index a89158a..36b3408 100644
> --- a/Makefile.target
> +++ b/Makefile.target
> @@ -161,7 +161,7 @@ endif #CONFIG_BSD_USER
>   # System emulator target
>   ifdef CONFIG_SOFTMMU
>
> -obj-y = vl.o cpus.o monitor.o machine.o gdbstub.o
> +obj-y = arch_init.o cpus.o monitor.o machine.o gdbstub.o
>   obj-y += qemu-timer.o
>   # virtio has to be here due to weird dependency between PCI and virtio-net.
>   # need to fix this properly
> @@ -285,11 +285,7 @@ obj-s390x-y = s390-virtio-bus.o s390-virtio.o
>
>   obj-alpha-y = alpha_palcode.o
>
> -main.o vl.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
> -
> -vl.o: QEMU_CFLAGS+=$(SDL_CFLAGS)
> -
> -vl.o: qemu-options.h
> +main.o: QEMU_CFLAGS+=$(GPROF_CFLAGS)
>
>   monitor.o: qemu-monitor.h
>
> @@ -311,16 +307,13 @@ $(QEMU_PROG): $(obj-y) $(obj-$(TARGET_BASE_ARCH)-y)
>   gdbstub-xml.c: $(TARGET_XML_FILES) $(SRC_PATH)/feature_to_c.sh
>   	$(call quiet-command,rm -f $@&&  $(SHELL)
> $(SRC_PATH)/feature_to_c.sh $@ $(TARGET_XML_FILES),"  GEN
> $(TARGET_DIR)$@")
>
> -qemu-options.h: $(SRC_PATH)/qemu-options.hx
> -	$(call quiet-command,sh $(SRC_PATH)/hxtool -h<  $<  >  $@,"  GEN
> $(TARGET_DIR)$@")
> -
>   qemu-monitor.h: $(SRC_PATH)/qemu-monitor.hx
>   	$(call quiet-command,sh $(SRC_PATH)/hxtool -h<  $<  >  $@,"  GEN
> $(TARGET_DIR)$@")
>
>   clean:
>   	rm -f *.o *.a *~ $(PROGS) nwfpe/*.o fpu/*.o
>   	rm -f *.d */*.d tcg/*.o ide/*.o
> -	rm -f qemu-options.h qemu-monitor.h gdbstub-xml.c
> +	rm -f qemu-monitor.h gdbstub-xml.c
>
>   install: all
>   ifneq ($(PROGS),)
> diff --git a/arch_init.c b/arch_init.c
> new file mode 100644
> index 0000000..171e21c
> --- /dev/null
> +++ b/arch_init.c
> @@ -0,0 +1,509 @@
> +/*
> + * QEMU System Emulator
> + *
> + * Copyright (c) 2003-2008 Fabrice Bellard
> + *
> + * Permission is hereby granted, free of charge, to any person obtaining a copy
> + * of this software and associated documentation files (the
> "Software"), to deal
> + * in the Software without restriction, including without limitation the rights
> + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
> + * copies of the Software, and to permit persons to whom the Software is
> + * furnished to do so, subject to the following conditions:
> + *
> + * The above copyright notice and this permission notice shall be included in
> + * all copies or substantial portions of the Software.
> + *
> + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
> + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
> + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
> + * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING FROM,
> + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
> + * THE SOFTWARE.
> + */
> +#include<stdint.h>
> +#include<stdarg.h>
> +#ifndef _WIN32
> +#include<sys/mman.h>
> +#endif
> +#include "config.h"
> +#include "monitor.h"
> +#include "sysemu.h"
> +#include "arch_init.h"
> +#include "audio/audio.h"
> +#include "hw/pc.h"
> +#include "hw/pci.h"
> +#include "hw/audiodev.h"
> +#include "kvm.h"
> +#include "migration.h"
> +#include "net.h"
> +#include "gdbstub.h"
> +#include "hw/smbios.h"
> +
> +#ifdef TARGET_SPARC
> +int graphic_width = 1024;
> +int graphic_height = 768;
> +int graphic_depth = 8;
> +#else
> +int graphic_width = 800;
> +int graphic_height = 600;
> +int graphic_depth = 15;
> +#endif
> +
> +const char arch_config_name[] = CONFIG_QEMU_CONFDIR "/target-"
> TARGET_ARCH ".conf";
> +
> +#if defined(TARGET_ALPHA)
> +#define QEMU_ARCH QEMU_ARCH_ALPHA
> +#elif defined(TARGET_ARM)
> +#define QEMU_ARCH QEMU_ARCH_ARM
> +#elif defined(TARGET_CRIS)
> +#define QEMU_ARCH QEMU_ARCH_CRIS
> +#elif defined(TARGET_I386)
> +#define QEMU_ARCH QEMU_ARCH_I386
> +#elif defined(TARGET_M68K)
> +#define QEMU_ARCH QEMU_ARCH_M68K
> +#elif defined(TARGET_MICROBLAZE)
> +#define QEMU_ARCH QEMU_ARCH_MICROBLAZE
> +#elif defined(TARGET_MIPS)
> +#define QEMU_ARCH QEMU_ARCH_MIPS
> +#elif defined(TARGET_PPC)
> +#define QEMU_ARCH QEMU_ARCH_PPC
> +#elif defined(TARGET_S390X)
> +#define QEMU_ARCH QEMU_ARCH_S390X
> +#elif defined(TARGET_SH4)
> +#define QEMU_ARCH QEMU_ARCH_SH4
> +#elif defined(TARGET_SPARC)
> +#define QEMU_ARCH QEMU_ARCH_SPARC
> +#endif
> +
> +const uint32_t arch_type = QEMU_ARCH;
> +
> +/***********************************************************/
> +/* ram save/restore */
> +
> +#define RAM_SAVE_FLAG_FULL	0x01 /* Obsolete, not used anymore */
> +#define RAM_SAVE_FLAG_COMPRESS	0x02
> +#define RAM_SAVE_FLAG_MEM_SIZE	0x04
> +#define RAM_SAVE_FLAG_PAGE	0x08
> +#define RAM_SAVE_FLAG_EOS	0x10
> +
> +static int is_dup_page(uint8_t *page, uint8_t ch)
> +{
> +    uint32_t val = ch<<  24 | ch<<  16 | ch<<  8 | ch;
> +    uint32_t *array = (uint32_t *)page;
> +    int i;
> +
> +    for (i = 0; i<  (TARGET_PAGE_SIZE / 4); i++) {
> +        if (array[i] != val) {
> +            return 0;
> +        }
> +    }
> +
> +    return 1;
> +}
> +
> +static int ram_save_block(QEMUFile *f)
> +{
> +    static ram_addr_t current_addr = 0;
> +    ram_addr_t saved_addr = current_addr;
> +    ram_addr_t addr = 0;
> +    int found = 0;
> +
> +    while (addr<  last_ram_offset) {
> +        if (cpu_physical_memory_get_dirty(current_addr,
> MIGRATION_DIRTY_FLAG)) {
> +            uint8_t *p;
> +
> +            cpu_physical_memory_reset_dirty(current_addr,
> +                                            current_addr + TARGET_PAGE_SIZE,
> +                                            MIGRATION_DIRTY_FLAG);
> +
> +            p = qemu_get_ram_ptr(current_addr);
> +
> +            if (is_dup_page(p, *p)) {
> +                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
> +                qemu_put_byte(f, *p);
> +            } else {
> +                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
> +                qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
> +            }
> +
> +            found = 1;
> +            break;
> +        }
> +        addr += TARGET_PAGE_SIZE;
> +        current_addr = (saved_addr + addr) % last_ram_offset;
> +    }
> +
> +    return found;
> +}
> +
> +static uint64_t bytes_transferred;
> +
> +static ram_addr_t ram_save_remaining(void)
> +{
> +    ram_addr_t addr;
> +    ram_addr_t count = 0;
> +
> +    for (addr = 0; addr<  last_ram_offset; addr += TARGET_PAGE_SIZE) {
> +        if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
> +            count++;
> +        }
> +    }
> +
> +    return count;
> +}
> +
> +uint64_t ram_bytes_remaining(void)
> +{
> +    return ram_save_remaining() * TARGET_PAGE_SIZE;
> +}
> +
> +uint64_t ram_bytes_transferred(void)
> +{
> +    return bytes_transferred;
> +}
> +
> +uint64_t ram_bytes_total(void)
> +{
> +    return last_ram_offset;
> +}
> +
> +int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
> +{
> +    ram_addr_t addr;
> +    uint64_t bytes_transferred_last;
> +    double bwidth = 0;
> +    uint64_t expected_time = 0;
> +
> +    if (stage<  0) {
> +        cpu_physical_memory_set_dirty_tracking(0);
> +        return 0;
> +    }
> +
> +    if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
> +        qemu_file_set_error(f);
> +        return 0;
> +    }
> +
> +    if (stage == 1) {
> +        bytes_transferred = 0;
> +
> +        /* Make sure all dirty bits are set */
> +        for (addr = 0; addr<  last_ram_offset; addr += TARGET_PAGE_SIZE) {
> +            if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG)) {
> +                cpu_physical_memory_set_dirty(addr);
> +            }
> +        }
> +
> +        /* Enable dirty memory tracking */
> +        cpu_physical_memory_set_dirty_tracking(1);
> +
> +        qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
> +    }
> +
> +    bytes_transferred_last = bytes_transferred;
> +    bwidth = qemu_get_clock_ns(rt_clock);
> +
> +    while (!qemu_file_rate_limit(f)) {
> +        int ret;
> +
> +        ret = ram_save_block(f);
> +        bytes_transferred += ret * TARGET_PAGE_SIZE;
> +        if (ret == 0) { /* no more blocks */
> +            break;
> +        }
> +    }
> +
> +    bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
> +    bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
> +
> +    /* if we haven't transferred anything this round, force expected_time to a
> +     * a very high value, but without crashing */
> +    if (bwidth == 0) {
> +        bwidth = 0.000001;
> +    }
> +
> +    /* try transferring iterative blocks of memory */
> +    if (stage == 3) {
> +        /* flush all remaining blocks regardless of rate limiting */
> +        while (ram_save_block(f) != 0) {
> +            bytes_transferred += TARGET_PAGE_SIZE;
> +        }
> +        cpu_physical_memory_set_dirty_tracking(0);
> +    }
> +
> +    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
> +
> +    expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
> +
> +    return (stage == 2)&&  (expected_time<= migrate_max_downtime());
> +}
> +
> +int ram_load(QEMUFile *f, void *opaque, int version_id)
> +{
> +    ram_addr_t addr;
> +    int flags;
> +
> +    if (version_id != 3) {
> +        return -EINVAL;
> +    }
> +
> +    do {
> +        addr = qemu_get_be64(f);
> +
> +        flags = addr&  ~TARGET_PAGE_MASK;
> +        addr&= TARGET_PAGE_MASK;
> +
> +        if (flags&  RAM_SAVE_FLAG_MEM_SIZE) {
> +            if (addr != last_ram_offset) {
> +                return -EINVAL;
> +            }
> +        }
> +
> +        if (flags&  RAM_SAVE_FLAG_COMPRESS) {
> +            uint8_t ch = qemu_get_byte(f);
> +            memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE);
> +#ifndef _WIN32
> +            if (ch == 0&&
> +                (!kvm_enabled() || kvm_has_sync_mmu())) {
> +                madvise(qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE,
> +                        MADV_DONTNEED);
> +            }
> +#endif
> +        } else if (flags&  RAM_SAVE_FLAG_PAGE) {
> +            qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE);
> +        }
> +        if (qemu_file_has_error(f)) {
> +            return -EIO;
> +        }
> +    } while (!(flags&  RAM_SAVE_FLAG_EOS));
> +
> +    return 0;
> +}
> +
> +void qemu_service_io(void)
> +{
> +    qemu_notify_event();
> +}
> +
> +#ifdef HAS_AUDIO
> +struct soundhw soundhw[] = {
> +#ifdef HAS_AUDIO_CHOICE
> +#if defined(TARGET_I386) || defined(TARGET_MIPS)
> +    {
> +        "pcspk",
> +        "PC speaker",
> +        0,
> +        1,
> +        { .init_isa = pcspk_audio_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_SB16
> +    {
> +        "sb16",
> +        "Creative Sound Blaster 16",
> +        0,
> +        1,
> +        { .init_isa = SB16_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_CS4231A
> +    {
> +        "cs4231a",
> +        "CS4231A",
> +        0,
> +        1,
> +        { .init_isa = cs4231a_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_ADLIB
> +    {
> +        "adlib",
> +#ifdef HAS_YMF262
> +        "Yamaha YMF262 (OPL3)",
> +#else
> +        "Yamaha YM3812 (OPL2)",
> +#endif
> +        0,
> +        1,
> +        { .init_isa = Adlib_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_GUS
> +    {
> +        "gus",
> +        "Gravis Ultrasound GF1",
> +        0,
> +        1,
> +        { .init_isa = GUS_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_AC97
> +    {
> +        "ac97",
> +        "Intel 82801AA AC97 Audio",
> +        0,
> +        0,
> +        { .init_pci = ac97_init }
> +    },
> +#endif
> +
> +#ifdef CONFIG_ES1370
> +    {
> +        "es1370",
> +        "ENSONIQ AudioPCI ES1370",
> +        0,
> +        0,
> +        { .init_pci = es1370_init }
> +    },
> +#endif
> +
> +#endif /* HAS_AUDIO_CHOICE */
> +
> +    { NULL, NULL, 0, 0, { NULL } }
> +};
> +
> +void select_soundhw(const char *optarg)
> +{
> +    struct soundhw *c;
> +
> +    if (*optarg == '?') {
> +    show_valid_cards:
> +
> +        printf("Valid sound card names (comma separated):\n");
> +        for (c = soundhw; c->name; ++c) {
> +            printf ("%-11s %s\n", c->name, c->descr);
> +        }
> +        printf("\n-soundhw all will enable all of the above\n");
> +        exit(*optarg != '?');
> +    }
> +    else {
> +        size_t l;
> +        const char *p;
> +        char *e;
> +        int bad_card = 0;
> +
> +        if (!strcmp(optarg, "all")) {
> +            for (c = soundhw; c->name; ++c) {
> +                c->enabled = 1;
> +            }
> +            return;
> +        }
> +
> +        p = optarg;
> +        while (*p) {
> +            e = strchr(p, ',');
> +            l = !e ? strlen(p) : (size_t) (e - p);
> +
> +            for (c = soundhw; c->name; ++c) {
> +                if (!strncmp(c->name, p, l)&&  !c->name[l]) {
> +                    c->enabled = 1;
> +                    break;
> +                }
> +            }
> +
> +            if (!c->name) {
> +                if (l>  80) {
> +                    fprintf(stderr,
> +                            "Unknown sound card name (too big to show)\n");
> +                }
> +                else {
> +                    fprintf(stderr, "Unknown sound card name `%.*s'\n",
> +                            (int) l, p);
> +                }
> +                bad_card = 1;
> +            }
> +            p += l + (e != NULL);
> +        }
> +
> +        if (bad_card) {
> +            goto show_valid_cards;
> +        }
> +    }
> +}
> +#else
> +void select_soundhw(const char *optarg)
> +{
> +}
> +#endif
> +
> +int qemu_uuid_parse(const char *str, uint8_t *uuid)
> +{
> +    int ret;
> +
> +    if (strlen(str) != 36) {
> +        return -1;
> +    }
> +
> +    ret = sscanf(str, UUID_FMT,&uuid[0],&uuid[1],&uuid[2],&uuid[3],
> +&uuid[4],&uuid[5],&uuid[6],&uuid[7],&uuid[8],&uuid[9],
> +&uuid[10],&uuid[11],&uuid[12],&uuid[13],&uuid[14],
> +&uuid[15]);
> +
> +    if (ret != 16) {
> +        return -1;
> +    }
> +#ifdef TARGET_I386
> +    smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
> +#endif
> +    return 0;
> +}
> +
> +void do_acpitable_option(const char *optarg)
> +{
> +#ifdef TARGET_I386
> +    if (acpi_table_add(optarg)<  0) {
> +        fprintf(stderr, "Wrong acpi table provided\n");
> +        exit(1);
> +    }
> +#endif
> +}
> +
> +void do_smbios_option(const char *optarg)
> +{
> +#ifdef TARGET_I386
> +    if (smbios_entry_add(optarg)<  0) {
> +        fprintf(stderr, "Wrong smbios provided\n");
> +        exit(1);
> +    }
> +#endif
> +}
> +
> +void cpudef_init(void)
> +{
> +#if defined(cpudef_setup)
> +    cpudef_setup(); /* parse cpu definitions in target config file */
> +#endif
> +}
> +
> +int audio_available(void)
> +{
> +#ifdef HAS_AUDIO
> +    return 1;
> +#else
> +    return 0;
> +#endif
> +}
> +
> +int kvm_available(void)
> +{
> +#ifdef CONFIG_KVM
> +    return 1;
> +#else
> +    return 0;
> +#endif
> +}
> +
> +int xen_available(void)
> +{
> +#ifdef CONFIG_XEN
> +    return 1;
> +#else
> +    return 0;
> +#endif
> +}
> diff --git a/arch_init.h b/arch_init.h
> new file mode 100644
> index 0000000..682890c
> --- /dev/null
> +++ b/arch_init.h
> @@ -0,0 +1,33 @@
> +#ifndef QEMU_ARCH_INIT_H
> +#define QEMU_ARCH_INIT_H
> +
> +extern const char arch_config_name[];
> +
> +enum {
> +    QEMU_ARCH_ALL = -1,
> +    QEMU_ARCH_ALPHA = 1,
> +    QEMU_ARCH_ARM = 2,
> +    QEMU_ARCH_CRIS = 4,
> +    QEMU_ARCH_I386 = 8,
> +    QEMU_ARCH_M68K = 16,
> +    QEMU_ARCH_MICROBLAZE = 32,
> +    QEMU_ARCH_MIPS = 64,
> +    QEMU_ARCH_PPC = 128,
> +    QEMU_ARCH_S390X = 256,
> +    QEMU_ARCH_SH4 = 512,
> +    QEMU_ARCH_SPARC = 1024,
> +};
> +
> +extern const uint32_t arch_type;
> +
> +void select_soundhw(const char *optarg);
> +int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque);
> +int ram_load(QEMUFile *f, void *opaque, int version_id);
> +void do_acpitable_option(const char *optarg);
> +void do_smbios_option(const char *optarg);
> +void cpudef_init(void);
> +int audio_available(void);
> +int kvm_available(void);
> +int xen_available(void);
> +
> +#endif
> diff --git a/qemu-options.hx b/qemu-options.hx
> index e2a5ca6..719cbda 100644
> --- a/qemu-options.hx
> +++ b/qemu-options.hx
> @@ -1,8 +1,9 @@
>   HXCOMM Use DEFHEADING() to define headings in both help text and texi
>   HXCOMM Text between STEXI and ETEXI are copied to texi version and
>   HXCOMM discarded from C version
> -HXCOMM DEF(option, HAS_ARG/0, opt_enum, opt_help) is used to construct
> -HXCOMM option structures, enums and help message.
> +HXCOMM DEF(option, HAS_ARG/0, opt_enum, opt_help, arch_mask) is used to
> +HXCOMM construct option structures, enums and help message for specified
> +HXCOMM architectures.
>   HXCOMM HXCOMM can be used for comments, discarded from both texi and C
>
>   DEFHEADING(Standard options:)
> @@ -11,7 +12,7 @@ STEXI
>   ETEXI
>
>   DEF("help", 0, QEMU_OPTION_h,
> -    "-h or -help     display this help and exit\n")
> +    "-h or -help     display this help and exit\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -h
>   @findex -h
> @@ -19,7 +20,7 @@ Display help and exit
>   ETEXI
>
>   DEF("version", 0, QEMU_OPTION_version,
> -    "-version        display version information and exit\n")
> +    "-version        display version information and exit\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -version
>   @findex -version
> @@ -27,7 +28,7 @@ Display version information and exit
>   ETEXI
>
>   DEF("M", HAS_ARG, QEMU_OPTION_M,
> -    "-M machine      select emulated machine (-M ? for list)\n")
> +    "-M machine      select emulated machine (-M ? for list)\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -M @var{machine}
>   @findex -M
> @@ -35,7 +36,7 @@ Select the emulated @var{machine} (@code{-M ?} for list)
>   ETEXI
>
>   DEF("cpu", HAS_ARG, QEMU_OPTION_cpu,
> -    "-cpu cpu        select CPU (-cpu ? for list)\n")
> +    "-cpu cpu        select CPU (-cpu ? for list)\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -cpu @var{model}
>   @findex -cpu
> @@ -49,7 +50,8 @@ DEF("smp", HAS_ARG, QEMU_OPTION_smp,
>       "                offline CPUs for hotplug, etc\n"
>       "                cores= number of CPU cores on one socket\n"
>       "                threads= number of threads on one CPU core\n"
> -    "                sockets= number of discrete sockets in the system\n")
> +    "                sockets= number of discrete sockets in the system\n",
> +        QEMU_ARCH_ALL)
>   STEXI
>   @item -smp @var{n}[,cores=@var{cores}][,threads=@var{threads}][,sockets=@var{sockets}][,maxcpus=@var{maxcpus}]
>   @findex -smp
> @@ -64,7 +66,7 @@ specifies the maximum number of hotpluggable CPUs.
>   ETEXI
>
>   DEF("numa", HAS_ARG, QEMU_OPTION_numa,
> -    "-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]\n")
> +    "-numa node[,mem=size][,cpus=cpu[-cpu]][,nodeid=node]\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -numa @var{opts}
>   @findex -numa
> @@ -73,8 +75,8 @@ are split equally.
>   ETEXI
>
>   DEF("fda", HAS_ARG, QEMU_OPTION_fda,
> -    "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n")
> -DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "")
> +    "-fda/-fdb file  use 'file' as floppy disk 0/1 image\n", QEMU_ARCH_ALL)
> +DEF("fdb", HAS_ARG, QEMU_OPTION_fdb, "", QEMU_ARCH_ALL)
>   STEXI
>   @item -fda @var{file}
>   @item -fdb @var{file}
> @@ -85,11 +87,11 @@ use the host floppy by using @file{/dev/fd0} as
> filename (@pxref{host_drives}).
>   ETEXI
>
>   DEF("hda", HAS_ARG, QEMU_OPTION_hda,
> -    "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n")
> -DEF("hdb", HAS_ARG, QEMU_OPTION_hdb, "")
> +    "-hda/-hdb file  use 'file' as IDE hard disk 0/1 image\n", QEMU_ARCH_ALL)
> +DEF("hdb", HAS_ARG, QEMU_OPTION_hdb, "", QEMU_ARCH_ALL)
>   DEF("hdc", HAS_ARG, QEMU_OPTION_hdc,
> -    "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n")
> -DEF("hdd", HAS_ARG, QEMU_OPTION_hdd, "")
> +    "-hdc/-hdd file  use 'file' as IDE hard disk 2/3 image\n", QEMU_ARCH_ALL)
> +DEF("hdd", HAS_ARG, QEMU_OPTION_hdd, "", QEMU_ARCH_ALL)
>   STEXI
>   @item -hda @var{file}
>   @item -hdb @var{file}
> @@ -103,7 +105,8 @@ Use @var{file} as hard disk 0, 1, 2 or 3 image
> (@pxref{disk_images}).
>   ETEXI
>
>   DEF("cdrom", HAS_ARG, QEMU_OPTION_cdrom,
> -    "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n")
> +    "-cdrom file     use 'file' as IDE cdrom image (cdrom is ide1 master)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -cdrom @var{file}
>   @findex -cdrom
> @@ -117,7 +120,7 @@ DEF("drive", HAS_ARG, QEMU_OPTION_drive,
>       "       [,cyls=c,heads=h,secs=s[,trans=t]][,snapshot=on|off]\n"
>       "       [,cache=writethrough|writeback|none][,format=f][,serial=s]\n"
>       "       [,addr=A][,id=name][,aio=threads|native][,readonly=on|off]\n"
> -    "                use 'file' as a drive image\n")
> +    "                use 'file' as a drive image\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -drive @var{option}[,@var{option}[,@var{option}[,...]]]
>   @findex -drive
> @@ -226,7 +229,7 @@ ETEXI
>   DEF("set", HAS_ARG, QEMU_OPTION_set,
>       "-set group.id.arg=value\n"
>       "                set<arg>  parameter for item<id>  of type<group>\n"
> -    "                i.e. -set drive.$id.file=/path/to/image\n")
> +    "                i.e. -set drive.$id.file=/path/to/image\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -set
>   @findex -set
> @@ -235,7 +238,8 @@ ETEXI
>
>   DEF("global", HAS_ARG, QEMU_OPTION_global,
>       "-global driver.property=value\n"
> -    "                set a global default for a driver property\n")
> +    "                set a global default for a driver property\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -global
>   @findex -global
> @@ -243,7 +247,8 @@ TODO
>   ETEXI
>
>   DEF("mtdblock", HAS_ARG, QEMU_OPTION_mtdblock,
> -    "-mtdblock file  use 'file' as on-board Flash memory image\n")
> +    "-mtdblock file  use 'file' as on-board Flash memory image\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -mtdblock @var{file}
>   @findex -mtdblock
> @@ -251,7 +256,7 @@ Use @var{file} as on-board Flash memory image.
>   ETEXI
>
>   DEF("sd", HAS_ARG, QEMU_OPTION_sd,
> -    "-sd file        use 'file' as SecureDigital card image\n")
> +    "-sd file        use 'file' as SecureDigital card image\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -sd @var{file}
>   @findex -sd
> @@ -259,7 +264,7 @@ Use @var{file} as SecureDigital card image.
>   ETEXI
>
>   DEF("pflash", HAS_ARG, QEMU_OPTION_pflash,
> -    "-pflash file    use 'file' as a parallel flash image\n")
> +    "-pflash file    use 'file' as a parallel flash image\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -pflash @var{file}
>   @findex -pflash
> @@ -268,7 +273,8 @@ ETEXI
>
>   DEF("boot", HAS_ARG, QEMU_OPTION_boot,
>       "-boot [order=drives][,once=drives][,menu=on|off]\n"
> -    "                'drives': floppy (a), hard disk (c), CD-ROM (d),
> network (n)\n")
> +    "                'drives': floppy (a), hard disk (c), CD-ROM (d),
> network (n)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -boot [order=@var{drives}][,once=@var{drives}][,menu=on|off]
>   @findex -boot
> @@ -294,7 +300,8 @@ use is discouraged as it may be removed from
> future versions.
>   ETEXI
>
>   DEF("snapshot", 0, QEMU_OPTION_snapshot,
> -    "-snapshot       write to temporary files instead of disk image files\n")
> +    "-snapshot       write to temporary files instead of disk image files\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -snapshot
>   @findex -snapshot
> @@ -305,7 +312,7 @@ ETEXI
>
>   DEF("m", HAS_ARG, QEMU_OPTION_m,
>       "-m megs         set virtual RAM size to megs MB [default="
> -    stringify(DEFAULT_RAM_SIZE) "]\n")
> +    stringify(DEFAULT_RAM_SIZE) "]\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -m @var{megs}
>   @findex -m
> @@ -315,7 +322,7 @@ gigabytes respectively.
>   ETEXI
>
>   DEF("mem-path", HAS_ARG, QEMU_OPTION_mempath,
> -    "-mem-path FILE  provide backing storage for guest RAM\n")
> +    "-mem-path FILE  provide backing storage for guest RAM\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -mem-path @var{path}
>   Allocate guest RAM from a temporarily created file in @var{path}.
> @@ -323,7 +330,8 @@ ETEXI
>
>   #ifdef MAP_POPULATE
>   DEF("mem-prealloc", 0, QEMU_OPTION_mem_prealloc,
> -    "-mem-prealloc   preallocate guest memory (use with -mem-path)\n")
> +    "-mem-prealloc   preallocate guest memory (use with -mem-path)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -mem-prealloc
>   Preallocate memory when using -mem-path.
> @@ -331,7 +339,8 @@ ETEXI
>   #endif
>
>   DEF("k", HAS_ARG, QEMU_OPTION_k,
> -    "-k language     use keyboard layout (for example 'fr' for French)\n")
> +    "-k language     use keyboard layout (for example 'fr' for French)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -k @var{language}
>   @findex -k
> @@ -352,10 +361,9 @@ The default is @code{en-us}.
>   ETEXI
>
>
> -#ifdef HAS_AUDIO
>   DEF("audio-help", 0, QEMU_OPTION_audio_help,
> -    "-audio-help     print list of audio drivers and their options\n")
> -#endif
> +    "-audio-help     print list of audio drivers and their options\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -audio-help
>   @findex -audio-help
> @@ -363,13 +371,11 @@ Will show the audio subsystem help: list of
> drivers, tunable
>   parameters.
>   ETEXI
>
> -#ifdef HAS_AUDIO
>   DEF("soundhw", HAS_ARG, QEMU_OPTION_soundhw,
>       "-soundhw c1,... enable audio support\n"
>       "                and only specified sound cards (comma separated list)\n"
>       "                use -soundhw ? to get the list of supported cards\n"
> -    "                use -soundhw all to enable all of them\n")
> -#endif
> +    "                use -soundhw all to enable all of them\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -soundhw @var{card1}[,@var{card2},...] or -soundhw all
>   @findex -soundhw
> @@ -397,7 +403,8 @@ STEXI
>   ETEXI
>
>   DEF("usb", 0, QEMU_OPTION_usb,
> -    "-usb            enable the USB driver (will be the default soon)\n")
> +    "-usb            enable the USB driver (will be the default soon)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   USB options:
>   @table @option
> @@ -408,7 +415,8 @@ Enable the USB driver (will be the default soon)
>   ETEXI
>
>   DEF("usbdevice", HAS_ARG, QEMU_OPTION_usbdevice,
> -    "-usbdevice name add the host or guest USB device 'name'\n")
> +    "-usbdevice name add the host or guest USB device 'name'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>
>   @item -usbdevice @var{devname}
> @@ -457,7 +465,8 @@ DEF("device", HAS_ARG, QEMU_OPTION_device,
>       "                prop=value,... sets driver properties\n"
>       "                use -device ? to print all possible drivers\n"
>       "                use -device driver,? to print all possible options\n"
> -    "                use -device driver,option=? to print a help for value\n")
> +    "                use -device driver,option=? to print a help for value\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -device @var{driver}[,@var{option}[=@var{value}][,...]]
>   @findex -device
> @@ -472,7 +481,8 @@ ETEXI
>   DEF("name", HAS_ARG, QEMU_OPTION_name,
>       "-name string1[,process=string2]\n"
>       "                set the name of the guest\n"
> -    "                string1 sets the window title and string2 the
> process name (on Linux)\n")
> +    "                string1 sets the window title and string2 the
> process name (on Linux)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -name @var{name}
>   @findex -name
> @@ -484,7 +494,7 @@ ETEXI
>
>   DEF("uuid", HAS_ARG, QEMU_OPTION_uuid,
>       "-uuid %08x-%04x-%04x-%04x-%012x\n"
> -    "                specify machine UUID\n")
> +    "                specify machine UUID\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -uuid @var{uuid}
>   @findex -uuid
> @@ -504,7 +514,8 @@ STEXI
>   ETEXI
>
>   DEF("nographic", 0, QEMU_OPTION_nographic,
> -    "-nographic      disable graphical output and redirect serial
> I/Os to console\n")
> +    "-nographic      disable graphical output and redirect serial
> I/Os to console\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -nographic
>   @findex -nographic
> @@ -517,7 +528,8 @@ ETEXI
>
>   #ifdef CONFIG_CURSES
>   DEF("curses", 0, QEMU_OPTION_curses,
> -    "-curses         use a curses/ncurses interface instead of SDL\n")
> +    "-curses         use a curses/ncurses interface instead of SDL\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -curses
> @@ -529,7 +541,8 @@ ETEXI
>
>   #ifdef CONFIG_SDL
>   DEF("no-frame", 0, QEMU_OPTION_no_frame,
> -    "-no-frame       open SDL window without a frame and window decorations\n")
> +    "-no-frame       open SDL window without a frame and window decorations\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -no-frame
> @@ -541,7 +554,8 @@ ETEXI
>
>   #ifdef CONFIG_SDL
>   DEF("alt-grab", 0, QEMU_OPTION_alt_grab,
> -    "-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n")
> +    "-alt-grab       use Ctrl-Alt-Shift to grab mouse (instead of Ctrl-Alt)\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -alt-grab
> @@ -551,7 +565,8 @@ ETEXI
>
>   #ifdef CONFIG_SDL
>   DEF("ctrl-grab", 0, QEMU_OPTION_ctrl_grab,
> -    "-ctrl-grab      use Right-Ctrl to grab mouse (instead of Ctrl-Alt)\n")
> +    "-ctrl-grab      use Right-Ctrl to grab mouse (instead of Ctrl-Alt)\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -ctrl-grab
> @@ -561,7 +576,7 @@ ETEXI
>
>   #ifdef CONFIG_SDL
>   DEF("no-quit", 0, QEMU_OPTION_no_quit,
> -    "-no-quit        disable SDL window close capability\n")
> +    "-no-quit        disable SDL window close capability\n", QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -no-quit
> @@ -571,7 +586,7 @@ ETEXI
>
>   #ifdef CONFIG_SDL
>   DEF("sdl", 0, QEMU_OPTION_sdl,
> -    "-sdl            enable SDL\n")
> +    "-sdl            enable SDL\n", QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -sdl
> @@ -580,7 +595,8 @@ Enable SDL.
>   ETEXI
>
>   DEF("portrait", 0, QEMU_OPTION_portrait,
> -    "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n")
> +    "-portrait       rotate graphical output 90 deg left (only PXA LCD)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -portrait
>   @findex -portrait
> @@ -589,7 +605,7 @@ ETEXI
>
>   DEF("vga", HAS_ARG, QEMU_OPTION_vga,
>       "-vga [std|cirrus|vmware|xenfb|none]\n"
> -    "                select video card type\n")
> +    "                select video card type\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -vga @var{type}
>   @findex -vga
> @@ -615,17 +631,16 @@ Disable VGA card.
>   ETEXI
>
>   DEF("full-screen", 0, QEMU_OPTION_full_screen,
> -    "-full-screen    start in full screen\n")
> +    "-full-screen    start in full screen\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -full-screen
>   @findex -full-screen
>   Start in full screen.
>   ETEXI
>
> -#if defined(TARGET_PPC) || defined(TARGET_SPARC)
>   DEF("g", 1, QEMU_OPTION_g ,
> -    "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n")
> -#endif
> +    "-g WxH[xDEPTH]  Set the initial graphical resolution and depth\n",
> +    QEMU_ARCH_PPC | QEMU_ARCH_SPARC)
>   STEXI
>   @item -g @var{width}x@var{height}[x@var{depth}]
>   @findex -g
> @@ -633,7 +648,7 @@ Set the initial graphical resolution and depth
> (PPC, SPARC only).
>   ETEXI
>
>   DEF("vnc", HAS_ARG, QEMU_OPTION_vnc ,
> -    "-vnc display    start a VNC server on display\n")
> +    "-vnc display    start a VNC server on display\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -vnc @var{display}[,@var{option}[,@var{option}[,...]]]
>   @findex -vnc
> @@ -749,17 +764,14 @@ ETEXI
>
>   DEFHEADING()
>
> -#ifdef TARGET_I386
>   DEFHEADING(i386 target only:)
> -#endif
>   STEXI
>   @table @option
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("win2k-hack", 0, QEMU_OPTION_win2k_hack,
> -    "-win2k-hack     use it when installing Windows 2000 to avoid a
> disk full bug\n")
> -#endif
> +    "-win2k-hack     use it when installing Windows 2000 to avoid a
> disk full bug\n",
> +    QEMU_ARCH_I386)
>   STEXI
>   @item -win2k-hack
>   @findex -win2k-hack
> @@ -768,15 +780,12 @@ Windows 2000 is installed, you no longer need
> this option (this option
>   slows down the IDE transfers).
>   ETEXI
>
> -#ifdef TARGET_I386
>   HXCOMM Deprecated by -rtc
> -DEF("rtc-td-hack", 0, QEMU_OPTION_rtc_td_hack, "")
> -#endif
> +DEF("rtc-td-hack", 0, QEMU_OPTION_rtc_td_hack, "", QEMU_ARCH_I386)
>
> -#ifdef TARGET_I386
>   DEF("no-fd-bootchk", 0, QEMU_OPTION_no_fd_bootchk,
> -    "-no-fd-bootchk  disable boot signature checking for floppy disks\n")
> -#endif
> +    "-no-fd-bootchk  disable boot signature checking for floppy disks\n",
> +    QEMU_ARCH_I386)
>   STEXI
>   @item -no-fd-bootchk
>   @findex -no-fd-bootchk
> @@ -785,10 +794,8 @@ be needed to boot from old floppy disks.
>   TODO: check reference to Bochs BIOS.
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("no-acpi", 0, QEMU_OPTION_no_acpi,
> -           "-no-acpi        disable ACPI\n")
> -#endif
> +           "-no-acpi        disable ACPI\n", QEMU_ARCH_I386)
>   STEXI
>   @item -no-acpi
>   @findex -no-acpi
> @@ -797,22 +804,18 @@ it if your guest OS complains about ACPI
> problems (PC target machine
>   only).
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("no-hpet", 0, QEMU_OPTION_no_hpet,
> -    "-no-hpet        disable HPET\n")
> -#endif
> +    "-no-hpet        disable HPET\n", QEMU_ARCH_I386)
>   STEXI
>   @item -no-hpet
>   @findex -no-hpet
>   Disable HPET support.
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("balloon", HAS_ARG, QEMU_OPTION_balloon,
>       "-balloon none   disable balloon device\n"
>       "-balloon virtio[,addr=str]\n"
> -    "                enable virtio balloon device (default)\n")
> -#endif
> +    "                enable virtio balloon device (default)\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -balloon none
>   @findex -balloon
> @@ -822,18 +825,15 @@ Enable virtio balloon device (default),
> optionally with PCI address
>   @var{addr}.
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("acpitable", HAS_ARG, QEMU_OPTION_acpitable,
>       "-acpitable
> [sig=str][,rev=n][,oem_id=str][,oem_table_id=str][,oem_rev=n][,asl_compiler_id=str][,asl_compiler_rev=n][,data=file1[:file2]...]\n"
> -    "                ACPI table description\n")
> -#endif
> +    "                ACPI table description\n", QEMU_ARCH_I386)
>   STEXI
>   @item -acpitable
> [sig=@var{str}][,rev=@var{n}][,oem_id=@var{str}][,oem_table_id=@var{str}][,oem_rev=@var{n}]
> [,asl_compiler_id=@var{str}][,asl_compiler_rev=@var{n}][,data=@var{file1}[:@var{file2}]...]
>   @findex -acpitable
>   Add ACPI table with specified header fields and context from specified files.
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
>       "-smbios file=binary\n"
>       "                load SMBIOS entry from binary file\n"
> @@ -841,8 +841,7 @@ DEF("smbios", HAS_ARG, QEMU_OPTION_smbios,
>       "                specify SMBIOS type 0 fields\n"
>       "-smbios type=1[,manufacturer=str][,product=str][,version=str][,serial=str]\n"
>       "              [,uuid=uuid][,sku=str][,family=str]\n"
> -    "                specify SMBIOS type 1 fields\n")
> -#endif
> +    "                specify SMBIOS type 1 fields\n", QEMU_ARCH_I386)
>   STEXI
>   @item -smbios file=@var{binary}
>   @findex -smbios
> @@ -856,9 +855,7 @@ Specify SMBIOS type 0 fields
>   Specify SMBIOS type 1 fields
>   ETEXI
>
> -#ifdef TARGET_I386
>   DEFHEADING()
> -#endif
>   STEXI
>   @end table
>   ETEXI
> @@ -870,11 +867,11 @@ ETEXI
>
>   HXCOMM Legacy slirp options (now moved to -net user):
>   #ifdef CONFIG_SLIRP
> -DEF("tftp", HAS_ARG, QEMU_OPTION_tftp, "")
> -DEF("bootp", HAS_ARG, QEMU_OPTION_bootp, "")
> -DEF("redir", HAS_ARG, QEMU_OPTION_redir, "")
> +DEF("tftp", HAS_ARG, QEMU_OPTION_tftp, "", QEMU_ARCH_ALL)
> +DEF("bootp", HAS_ARG, QEMU_OPTION_bootp, "", QEMU_ARCH_ALL)
> +DEF("redir", HAS_ARG, QEMU_OPTION_redir, "", QEMU_ARCH_ALL)
>   #ifndef _WIN32
> -DEF("smb", HAS_ARG, QEMU_OPTION_smb, "")
> +DEF("smb", HAS_ARG, QEMU_OPTION_smb, "", QEMU_ARCH_ALL)
>   #endif
>   #endif
>
> @@ -920,7 +917,7 @@ DEF("net", HAS_ARG, QEMU_OPTION_net,
>       "-net dump[,vlan=n][,file=f][,len=n]\n"
>       "                dump traffic on vlan 'n' to file 'f' (max n
> bytes per packet)\n"
>       "-net none       use it alone to have zero network devices. If no
> -net option\n"
> -    "                is provided, the default is '-net nic -net user'\n")
> +    "                is provided, the default is '-net nic -net
> user'\n", QEMU_ARCH_ALL)
>   DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
>       "-netdev ["
>   #ifdef CONFIG_SLIRP
> @@ -930,7 +927,7 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
>   #ifdef CONFIG_VDE
>       "vde|"
>   #endif
> -    "socket],id=str[,option][,option][,...]\n")
> +    "socket],id=str[,option][,option][,...]\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -net nic[,vlan=@var{n}][,macaddr=@var{mac}][,model=@var{type}]
> [,name=@var{name}][,addr=@var{addr}][,vectors=@var{v}]
>   @findex -net
> @@ -1203,6 +1200,7 @@ DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
>   #if defined(__linux__) || defined(__FreeBSD__) || defined(__DragonFly__)
>       "-chardev parport,id=id,path=path\n"
>   #endif
> +    , QEMU_ARCH_ALL
>   )
>
>   STEXI
> @@ -1410,7 +1408,8 @@ DEF("bt", HAS_ARG, QEMU_OPTION_bt, \
>       "-bt vhci[,vlan=n]\n" \
>       "                add host computer to virtual scatternet 'n'
> using VHCI\n" \
>       "-bt device:dev[,vlan=n]\n" \
> -    "                emulate a bluetooth device 'dev' in scatternet 'n'\n")
> +    "                emulate a bluetooth device 'dev' in scatternet 'n'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @table @option
>
> @@ -1481,7 +1480,7 @@ for easier testing of various kernels.
>   ETEXI
>
>   DEF("kernel", HAS_ARG, QEMU_OPTION_kernel, \
> -    "-kernel bzImage use 'bzImage' as kernel image\n")
> +    "-kernel bzImage use 'bzImage' as kernel image\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -kernel @var{bzImage}
>   @findex -kernel
> @@ -1490,7 +1489,7 @@ or in multiboot format.
>   ETEXI
>
>   DEF("append", HAS_ARG, QEMU_OPTION_append, \
> -    "-append cmdline use 'cmdline' as kernel command line\n")
> +    "-append cmdline use 'cmdline' as kernel command line\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -append @var{cmdline}
>   @findex -append
> @@ -1498,7 +1497,7 @@ Use @var{cmdline} as kernel command line
>   ETEXI
>
>   DEF("initrd", HAS_ARG, QEMU_OPTION_initrd, \
> -           "-initrd file    use 'file' as initial ram disk\n")
> +           "-initrd file    use 'file' as initial ram disk\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -initrd @var{file}
>   @findex -initrd
> @@ -1525,7 +1524,8 @@ STEXI
>   ETEXI
>
>   DEF("serial", HAS_ARG, QEMU_OPTION_serial, \
> -    "-serial dev     redirect the serial port to char device 'dev'\n")
> +    "-serial dev     redirect the serial port to char device 'dev'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -serial @var{dev}
>   @findex -serial
> @@ -1653,7 +1653,8 @@ Three button serial mouse. Configure the guest
> to use Microsoft protocol.
>   ETEXI
>
>   DEF("parallel", HAS_ARG, QEMU_OPTION_parallel, \
> -    "-parallel dev   redirect the parallel port to char device 'dev'\n")
> +    "-parallel dev   redirect the parallel port to char device 'dev'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -parallel @var{dev}
>   @findex -parallel
> @@ -1669,7 +1670,8 @@ Use @code{-parallel none} to disable all parallel ports.
>   ETEXI
>
>   DEF("monitor", HAS_ARG, QEMU_OPTION_monitor, \
> -    "-monitor dev    redirect the monitor to char device 'dev'\n")
> +    "-monitor dev    redirect the monitor to char device 'dev'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -monitor @var{dev}
>   @findex -monitor
> @@ -1679,7 +1681,8 @@ The default device is @code{vc} in graphical
> mode and @code{stdio} in
>   non graphical mode.
>   ETEXI
>   DEF("qmp", HAS_ARG, QEMU_OPTION_qmp, \
> -    "-qmp dev        like -monitor but opens in 'control' mode\n")
> +    "-qmp dev        like -monitor but opens in 'control' mode\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -qmp @var{dev}
>   @findex -qmp
> @@ -1687,7 +1690,7 @@ Like -monitor but opens in 'control' mode.
>   ETEXI
>
>   DEF("mon", HAS_ARG, QEMU_OPTION_mon, \
> -    "-mon chardev=[name][,mode=readline|control][,default]\n")
> +    "-mon chardev=[name][,mode=readline|control][,default]\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -mon chardev=[name][,mode=readline|control][,default]
>   @findex -mon
> @@ -1695,7 +1698,8 @@ Setup monitor on chardev @var{name}.
>   ETEXI
>
>   DEF("debugcon", HAS_ARG, QEMU_OPTION_debugcon, \
> -    "-debugcon dev   redirect the debug console to char device 'dev'\n")
> +    "-debugcon dev   redirect the debug console to char device 'dev'\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -debugcon @var{dev}
>   @findex -debugcon
> @@ -1707,7 +1711,7 @@ non graphical mode.
>   ETEXI
>
>   DEF("pidfile", HAS_ARG, QEMU_OPTION_pidfile, \
> -    "-pidfile file   write PID to 'file'\n")
> +    "-pidfile file   write PID to 'file'\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -pidfile @var{file}
>   @findex -pidfile
> @@ -1716,7 +1720,7 @@ from a script.
>   ETEXI
>
>   DEF("singlestep", 0, QEMU_OPTION_singlestep, \
> -    "-singlestep     always run in singlestep mode\n")
> +    "-singlestep     always run in singlestep mode\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -singlestep
>   @findex -singlestep
> @@ -1724,7 +1728,8 @@ Run the emulation in single step mode.
>   ETEXI
>
>   DEF("S", 0, QEMU_OPTION_S, \
> -    "-S              freeze CPU at startup (use 'c' to start execution)\n")
> +    "-S              freeze CPU at startup (use 'c' to start execution)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -S
>   @findex -S
> @@ -1732,7 +1737,7 @@ Do not start CPU at startup (you must type 'c'
> in the monitor).
>   ETEXI
>
>   DEF("gdb", HAS_ARG, QEMU_OPTION_gdb, \
> -    "-gdb dev        wait for gdb connection on 'dev'\n")
> +    "-gdb dev        wait for gdb connection on 'dev'\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -gdb @var{dev}
>   @findex -gdb
> @@ -1746,7 +1751,8 @@ within gdb and establish the connection via a pipe:
>   ETEXI
>
>   DEF("s", 0, QEMU_OPTION_s, \
> -    "-s              shorthand for -gdb tcp::" DEFAULT_GDBSTUB_PORT "\n")
> +    "-s              shorthand for -gdb tcp::" DEFAULT_GDBSTUB_PORT "\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -s
>   @findex -s
> @@ -1755,7 +1761,8 @@ Shorthand for -gdb tcp::1234, i.e. open a
> gdbserver on TCP port 1234
>   ETEXI
>
>   DEF("d", HAS_ARG, QEMU_OPTION_d, \
> -    "-d item1,...    output log to /tmp/qemu.log (use -d ? for a list
> of log items)\n")
> +    "-d item1,...    output log to /tmp/qemu.log (use -d ? for a list
> of log items)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -d
>   @findex -d
> @@ -1765,7 +1772,8 @@ ETEXI
>   DEF("hdachs", HAS_ARG, QEMU_OPTION_hdachs, \
>       "-hdachs c,h,s[,t]\n" \
>       "                force hard disk 0 physical geometry and the
> optional BIOS\n" \
> -    "                translation (t=none or lba) (usually qemu can
> guess them)\n")
> +    "                translation (t=none or lba) (usually qemu can
> guess them)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -hdachs @var{c},@var{h},@var{s},[,@var{t}]
>   @findex -hdachs
> @@ -1777,7 +1785,8 @@ images.
>   ETEXI
>
>   DEF("L", HAS_ARG, QEMU_OPTION_L, \
> -    "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n")
> +    "-L path         set the directory for the BIOS, VGA BIOS and keymaps\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -L  @var{path}
>   @findex -L
> @@ -1785,17 +1794,15 @@ Set the directory for the BIOS, VGA BIOS and keymaps.
>   ETEXI
>
>   DEF("bios", HAS_ARG, QEMU_OPTION_bios, \
> -    "-bios file      set the filename for the BIOS\n")
> +    "-bios file      set the filename for the BIOS\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -bios @var{file}
>   @findex -bios
>   Set the filename for the BIOS.
>   ETEXI
>
> -#ifdef CONFIG_KVM
>   DEF("enable-kvm", 0, QEMU_OPTION_enable_kvm, \
> -    "-enable-kvm     enable KVM full virtualization support\n")
> -#endif
> +    "-enable-kvm     enable KVM full virtualization support\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -enable-kvm
>   @findex -enable-kvm
> @@ -1803,16 +1810,16 @@ Enable KVM full virtualization support. This
> option is only available
>   if KVM support is enabled when compiling.
>   ETEXI
>
> -#ifdef CONFIG_XEN
>   DEF("xen-domid", HAS_ARG, QEMU_OPTION_xen_domid,
> -    "-xen-domid id   specify xen guest domain id\n")
> +    "-xen-domid id   specify xen guest domain id\n", QEMU_ARCH_ALL)
>   DEF("xen-create", 0, QEMU_OPTION_xen_create,
>       "-xen-create     create domain using xen hypercalls, bypassing xend\n"
> -    "                warning: should not be used when xend is in use\n")
> +    "                warning: should not be used when xend is in use\n",
> +    QEMU_ARCH_ALL)
>   DEF("xen-attach", 0, QEMU_OPTION_xen_attach,
>       "-xen-attach     attach to existing xen domain\n"
> -    "                xend will use this when starting qemu\n")
> -#endif
> +    "                xend will use this when starting qemu\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -xen-domid @var{id}
>   @findex -xen-domid
> @@ -1828,7 +1835,7 @@ xend will use this when starting qemu (XEN only).
>   ETEXI
>
>   DEF("no-reboot", 0, QEMU_OPTION_no_reboot, \
> -    "-no-reboot      exit instead of rebooting\n")
> +    "-no-reboot      exit instead of rebooting\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -no-reboot
>   @findex -no-reboot
> @@ -1836,7 +1843,7 @@ Exit instead of rebooting.
>   ETEXI
>
>   DEF("no-shutdown", 0, QEMU_OPTION_no_shutdown, \
> -    "-no-shutdown    stop before shutdown\n")
> +    "-no-shutdown    stop before shutdown\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -no-shutdown
>   @findex -no-shutdown
> @@ -1847,7 +1854,8 @@ ETEXI
>
>   DEF("loadvm", HAS_ARG, QEMU_OPTION_loadvm, \
>       "-loadvm [tag|id]\n" \
> -    "                start right away with a saved state (loadvm in
> monitor)\n")
> +    "                start right away with a saved state (loadvm in
> monitor)\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -loadvm @var{file}
>   @findex -loadvm
> @@ -1856,7 +1864,7 @@ ETEXI
>
>   #ifndef _WIN32
>   DEF("daemonize", 0, QEMU_OPTION_daemonize, \
> -    "-daemonize      daemonize QEMU after initializing\n")
> +    "-daemonize      daemonize QEMU after initializing\n", QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -daemonize
> @@ -1868,7 +1876,8 @@ to cope with initialization race conditions.
>   ETEXI
>
>   DEF("option-rom", HAS_ARG, QEMU_OPTION_option_rom, \
> -    "-option-rom rom load a file, rom, into the option ROM space\n")
> +    "-option-rom rom load a file, rom, into the option ROM space\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -option-rom @var{file}
>   @findex -option-rom
> @@ -1878,7 +1887,8 @@ ETEXI
>
>   DEF("clock", HAS_ARG, QEMU_OPTION_clock, \
>       "-clock          force the use of the given methods for timer alarm.\n" \
> -    "                To see what timers are available use -clock ?\n")
> +    "                To see what timers are available use -clock ?\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -clock @var{method}
>   @findex -clock
> @@ -1887,18 +1897,13 @@ are available use -clock ?.
>   ETEXI
>
>   HXCOMM Options deprecated by -rtc
> -DEF("localtime", 0, QEMU_OPTION_localtime, "")
> -DEF("startdate", HAS_ARG, QEMU_OPTION_startdate, "")
> +DEF("localtime", 0, QEMU_OPTION_localtime, "", QEMU_ARCH_ALL)
> +DEF("startdate", HAS_ARG, QEMU_OPTION_startdate, "", QEMU_ARCH_ALL)
>
> -#ifdef TARGET_I386
>   DEF("rtc", HAS_ARG, QEMU_OPTION_rtc, \
>       "-rtc [base=utc|localtime|date][,clock=host|vm][,driftfix=none|slew]\n" \
> -    "                set the RTC base and clock, enable drift fix for
> clock ticks\n")
> -#else
> -DEF("rtc", HAS_ARG, QEMU_OPTION_rtc, \
> -    "-rtc [base=utc|localtime|date][,clock=host|vm]\n" \
> -    "                set the RTC base and clock\n")
> -#endif
> +    "                set the RTC base and clock, enable drift fix for
> clock ticks (x86 only)\n",
> +    QEMU_ARCH_ALL)
>
>   STEXI
>
> @@ -1924,7 +1929,7 @@ ETEXI
>   DEF("icount", HAS_ARG, QEMU_OPTION_icount, \
>       "-icount [N|auto]\n" \
>       "                enable virtual instruction counter with 2^N
> clock ticks per\n" \
> -    "                instruction\n")
> +    "                instruction\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -icount [@var{N}|auto]
>   @findex -icount
> @@ -1941,7 +1946,8 @@ ETEXI
>
>   DEF("watchdog", HAS_ARG, QEMU_OPTION_watchdog, \
>       "-watchdog i6300esb|ib700\n" \
> -    "                enable virtual hardware watchdog [default=none]\n")
> +    "                enable virtual hardware watchdog [default=none]\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -watchdog @var{model}
>   @findex -watchdog
> @@ -1961,7 +1967,8 @@ ETEXI
>
>   DEF("watchdog-action", HAS_ARG, QEMU_OPTION_watchdog_action, \
>       "-watchdog-action reset|shutdown|poweroff|pause|debug|none\n" \
> -    "                action when watchdog fires [default=reset]\n")
> +    "                action when watchdog fires [default=reset]\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -watchdog-action @var{action}
>
> @@ -1990,7 +1997,8 @@ Examples:
>   ETEXI
>
>   DEF("echr", HAS_ARG, QEMU_OPTION_echr, \
> -    "-echr chr       set terminal escape character instead of ctrl-a\n")
> +    "-echr chr       set terminal escape character instead of ctrl-a\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>
>   @item -echr @var{numeric_ascii_value}
> @@ -2010,7 +2018,7 @@ ETEXI
>
>   DEF("virtioconsole", HAS_ARG, QEMU_OPTION_virtiocon, \
>       "-virtioconsole c\n" \
> -    "                set virtio console\n")
> +    "                set virtio console\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -virtioconsole @var{c}
>   @findex -virtioconsole
> @@ -2022,7 +2030,7 @@ Please use @code{-device virtconsole} for the
> new way of invocation.
>   ETEXI
>
>   DEF("show-cursor", 0, QEMU_OPTION_show_cursor, \
> -    "-show-cursor    show cursor\n")
> +    "-show-cursor    show cursor\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -show-cursor
>   @findex -show-cursor
> @@ -2030,7 +2038,7 @@ Show cursor.
>   ETEXI
>
>   DEF("tb-size", HAS_ARG, QEMU_OPTION_tb_size, \
> -    "-tb-size n      set TB size\n")
> +    "-tb-size n      set TB size\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -tb-size @var{n}
>   @findex -tb-size
> @@ -2038,7 +2046,8 @@ Set TB size.
>   ETEXI
>
>   DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \
> -    "-incoming p     prepare for incoming migration, listen on port p\n")
> +    "-incoming p     prepare for incoming migration, listen on port p\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -incoming @var{port}
>   @findex -incoming
> @@ -2046,7 +2055,7 @@ Prepare for incoming migration, listen on @var{port}.
>   ETEXI
>
>   DEF("nodefaults", 0, QEMU_OPTION_nodefaults, \
> -    "-nodefaults     don't create default devices\n")
> +    "-nodefaults     don't create default devices\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -nodefaults
>   @findex -nodefaults
> @@ -2055,7 +2064,8 @@ ETEXI
>
>   #ifndef _WIN32
>   DEF("chroot", HAS_ARG, QEMU_OPTION_chroot, \
> -    "-chroot dir     chroot to dir just before starting the VM\n")
> +    "-chroot dir     chroot to dir just before starting the VM\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -chroot @var{dir}
> @@ -2066,7 +2076,8 @@ ETEXI
>
>   #ifndef _WIN32
>   DEF("runas", HAS_ARG, QEMU_OPTION_runas, \
> -    "-runas user     change to user id user just before starting the VM\n")
> +    "-runas user     change to user id user just before starting the VM\n",
> +    QEMU_ARCH_ALL)
>   #endif
>   STEXI
>   @item -runas @var{user}
> @@ -2075,29 +2086,24 @@ Immediately before starting guest execution,
> drop root privileges, switching
>   to the specified user.
>   ETEXI
>
> -#if defined(TARGET_SPARC) || defined(TARGET_PPC)
>   DEF("prom-env", HAS_ARG, QEMU_OPTION_prom_env,
>       "-prom-env variable=value\n"
> -    "                set OpenBIOS nvram variables\n")
> -#endif
> +    "                set OpenBIOS nvram variables\n",
> +    QEMU_ARCH_PPC | QEMU_ARCH_SPARC)
>   STEXI
>   @item -prom-env @var{variable}=@var{value}
>   @findex -prom-env
>   Set OpenBIOS nvram @var{variable} to given @var{value} (PPC, SPARC only).
>   ETEXI
> -#if defined(TARGET_ARM) || defined(TARGET_M68K)
>   DEF("semihosting", 0, QEMU_OPTION_semihosting,
> -    "-semihosting    semihosting mode\n")
> -#endif
> +    "-semihosting    semihosting mode\n", QEMU_ARCH_ARM | QEMU_ARCH_M68K)
>   STEXI
>   @item -semihosting
>   @findex -semihosting
>   Semihosting mode (ARM, M68K only).
>   ETEXI
> -#if defined(TARGET_ARM)
>   DEF("old-param", 0, QEMU_OPTION_old_param,
> -    "-old-param      old param mode\n")
> -#endif
> +    "-old-param      old param mode\n", QEMU_ARCH_ARM)
>   STEXI
>   @item -old-param
>   @findex -old-param (ARM)
> @@ -2105,7 +2111,7 @@ Old param mode (ARM only).
>   ETEXI
>
>   DEF("readconfig", HAS_ARG, QEMU_OPTION_readconfig,
> -    "-readconfig<file>\n")
> +    "-readconfig<file>\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -readconfig @var{file}
>   @findex -readconfig
> @@ -2113,7 +2119,7 @@ Read device configuration from @var{file}.
>   ETEXI
>   DEF("writeconfig", HAS_ARG, QEMU_OPTION_writeconfig,
>       "-writeconfig<file>\n"
> -    "                read/write config file\n")
> +    "                read/write config file\n", QEMU_ARCH_ALL)
>   STEXI
>   @item -writeconfig @var{file}
>   @findex -writeconfig
> @@ -2121,7 +2127,8 @@ Write device configuration to @var{file}.
>   ETEXI
>   DEF("nodefconfig", 0, QEMU_OPTION_nodefconfig,
>       "-nodefconfig\n"
> -    "                do not load default config files at startup\n")
> +    "                do not load default config files at startup\n",
> +    QEMU_ARCH_ALL)
>   STEXI
>   @item -nodefconfig
>   @findex -nodefconfig
> diff --git a/sysemu.h b/sysemu.h
> index 5464d35..d0effa0 100644
> --- a/sysemu.h
> +++ b/sysemu.h
> @@ -142,13 +142,9 @@ extern uint64_t node_cpumask[MAX_NODES];
>   extern const char *option_rom[MAX_OPTION_ROMS];
>   extern int nb_option_roms;
>
> -#ifdef NEED_CPU_H
> -#if defined(TARGET_SPARC) || defined(TARGET_PPC)
>   #define MAX_PROM_ENVS 128
>   extern const char *prom_envs[MAX_PROM_ENVS];
>   extern unsigned int nb_prom_envs;
> -#endif
> -#endif
>
>   typedef enum {
>       IF_NONE,
> diff --git a/vl.c b/vl.c
> index 15ab44c..7c0a825 100644
> --- a/vl.c
> +++ b/vl.c
> @@ -120,7 +120,6 @@ int main(int argc, char **argv)
>   #include "hw/usb.h"
>   #include "hw/pcmcia.h"
>   #include "hw/pc.h"
> -#include "hw/audiodev.h"
>   #include "hw/isa.h"
>   #include "hw/baum.h"
>   #include "hw/bt.h"
> @@ -153,14 +152,13 @@ int main(int argc, char **argv)
>
>   #include "disas.h"
>
> -#include "exec-all.h"
> -
>   #include "qemu_socket.h"
>
>   #include "slirp/libslirp.h"
>
>   #include "qemu-queue.h"
>   #include "cpus.h"
> +#include "arch_init.h"
>
>   //#define DEBUG_NET
>   //#define DEBUG_SLIRP
> @@ -191,15 +189,6 @@ static int rtc_utc = 1;
>   static int rtc_date_offset = -1; /* -1 means no change */
>   QEMUClock *rtc_clock;
>   int vga_interface_type = VGA_NONE;
> -#ifdef TARGET_SPARC
> -int graphic_width = 1024;
> -int graphic_height = 768;
> -int graphic_depth = 8;
> -#else
> -int graphic_width = 800;
> -int graphic_height = 600;
> -int graphic_depth = 15;
> -#endif
>   static int full_screen = 0;
>   #ifdef CONFIG_SDL
>   static int no_frame = 0;
> @@ -209,9 +198,7 @@ CharDriverState *serial_hds[MAX_SERIAL_PORTS];
>   CharDriverState *parallel_hds[MAX_PARALLEL_PORTS];
>   CharDriverState *virtcon_hds[MAX_VIRTIO_CONSOLES];
>   int win2k_install_hack = 0;
> -#ifdef TARGET_I386
>   int rtc_td_hack = 0;
> -#endif
>   int usb_enabled = 0;
>   int singlestep = 0;
>   int smp_cpus = 1;
> @@ -234,16 +221,12 @@ const char *watchdog;
>   const char *option_rom[MAX_OPTION_ROMS];
>   int nb_option_roms;
>   int semihosting_enabled = 0;
> -#ifdef TARGET_ARM
>   int old_param = 0;
> -#endif
>   const char *qemu_name;
>   int alt_grab = 0;
>   int ctrl_grab = 0;
> -#if defined(TARGET_SPARC) || defined(TARGET_PPC)
>   unsigned int nb_prom_envs = 0;
>   const char *prom_envs[MAX_PROM_ENVS];
> -#endif
>   int boot_menu;
>
>   int nb_numa_nodes;
> @@ -497,7 +480,6 @@ static void configure_rtc(QemuOpts *opts)
>               exit(1);
>           }
>       }
> -#ifdef TARGET_I386
>       value = qemu_opt_get(opts, "driftfix");
>       if (value) {
>           if (!strcmp(value, "slew")) {
> @@ -509,7 +491,6 @@ static void configure_rtc(QemuOpts *opts)
>               exit(1);
>           }
>       }
> -#endif
>   }
>
>   #ifdef _WIN32
> @@ -1669,206 +1650,6 @@ void qemu_del_wait_object(HANDLE handle,
> WaitObjectFunc *func, void *opaque)
>   #endif
>
>   /***********************************************************/
> -/* ram save/restore */
> -
> -#define RAM_SAVE_FLAG_FULL	0x01 /* Obsolete, not used anymore */
> -#define RAM_SAVE_FLAG_COMPRESS	0x02
> -#define RAM_SAVE_FLAG_MEM_SIZE	0x04
> -#define RAM_SAVE_FLAG_PAGE	0x08
> -#define RAM_SAVE_FLAG_EOS	0x10
> -
> -static int is_dup_page(uint8_t *page, uint8_t ch)
> -{
> -    uint32_t val = ch<<  24 | ch<<  16 | ch<<  8 | ch;
> -    uint32_t *array = (uint32_t *)page;
> -    int i;
> -
> -    for (i = 0; i<  (TARGET_PAGE_SIZE / 4); i++) {
> -        if (array[i] != val)
> -            return 0;
> -    }
> -
> -    return 1;
> -}
> -
> -static int ram_save_block(QEMUFile *f)
> -{
> -    static ram_addr_t current_addr = 0;
> -    ram_addr_t saved_addr = current_addr;
> -    ram_addr_t addr = 0;
> -    int found = 0;
> -
> -    while (addr<  last_ram_offset) {
> -        if (cpu_physical_memory_get_dirty(current_addr,
> MIGRATION_DIRTY_FLAG)) {
> -            uint8_t *p;
> -
> -            cpu_physical_memory_reset_dirty(current_addr,
> -                                            current_addr + TARGET_PAGE_SIZE,
> -                                            MIGRATION_DIRTY_FLAG);
> -
> -            p = qemu_get_ram_ptr(current_addr);
> -
> -            if (is_dup_page(p, *p)) {
> -                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_COMPRESS);
> -                qemu_put_byte(f, *p);
> -            } else {
> -                qemu_put_be64(f, current_addr | RAM_SAVE_FLAG_PAGE);
> -                qemu_put_buffer(f, p, TARGET_PAGE_SIZE);
> -            }
> -
> -            found = 1;
> -            break;
> -        }
> -        addr += TARGET_PAGE_SIZE;
> -        current_addr = (saved_addr + addr) % last_ram_offset;
> -    }
> -
> -    return found;
> -}
> -
> -static uint64_t bytes_transferred;
> -
> -static ram_addr_t ram_save_remaining(void)
> -{
> -    ram_addr_t addr;
> -    ram_addr_t count = 0;
> -
> -    for (addr = 0; addr<  last_ram_offset; addr += TARGET_PAGE_SIZE) {
> -        if (cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
> -            count++;
> -    }
> -
> -    return count;
> -}
> -
> -uint64_t ram_bytes_remaining(void)
> -{
> -    return ram_save_remaining() * TARGET_PAGE_SIZE;
> -}
> -
> -uint64_t ram_bytes_transferred(void)
> -{
> -    return bytes_transferred;
> -}
> -
> -uint64_t ram_bytes_total(void)
> -{
> -    return last_ram_offset;
> -}
> -
> -static int ram_save_live(Monitor *mon, QEMUFile *f, int stage, void *opaque)
> -{
> -    ram_addr_t addr;
> -    uint64_t bytes_transferred_last;
> -    double bwidth = 0;
> -    uint64_t expected_time = 0;
> -
> -    if (stage<  0) {
> -        cpu_physical_memory_set_dirty_tracking(0);
> -        return 0;
> -    }
> -
> -    if (cpu_physical_sync_dirty_bitmap(0, TARGET_PHYS_ADDR_MAX) != 0) {
> -        qemu_file_set_error(f);
> -        return 0;
> -    }
> -
> -    if (stage == 1) {
> -        bytes_transferred = 0;
> -
> -        /* Make sure all dirty bits are set */
> -        for (addr = 0; addr<  last_ram_offset; addr += TARGET_PAGE_SIZE) {
> -            if (!cpu_physical_memory_get_dirty(addr, MIGRATION_DIRTY_FLAG))
> -                cpu_physical_memory_set_dirty(addr);
> -        }
> -
> -        /* Enable dirty memory tracking */
> -        cpu_physical_memory_set_dirty_tracking(1);
> -
> -        qemu_put_be64(f, last_ram_offset | RAM_SAVE_FLAG_MEM_SIZE);
> -    }
> -
> -    bytes_transferred_last = bytes_transferred;
> -    bwidth = qemu_get_clock_ns(rt_clock);
> -
> -    while (!qemu_file_rate_limit(f)) {
> -        int ret;
> -
> -        ret = ram_save_block(f);
> -        bytes_transferred += ret * TARGET_PAGE_SIZE;
> -        if (ret == 0) /* no more blocks */
> -            break;
> -    }
> -
> -    bwidth = qemu_get_clock_ns(rt_clock) - bwidth;
> -    bwidth = (bytes_transferred - bytes_transferred_last) / bwidth;
> -
> -    /* if we haven't transferred anything this round, force expected_time to a
> -     * a very high value, but without crashing */
> -    if (bwidth == 0)
> -        bwidth = 0.000001;
> -
> -    /* try transferring iterative blocks of memory */
> -    if (stage == 3) {
> -        /* flush all remaining blocks regardless of rate limiting */
> -        while (ram_save_block(f) != 0) {
> -            bytes_transferred += TARGET_PAGE_SIZE;
> -        }
> -        cpu_physical_memory_set_dirty_tracking(0);
> -    }
> -
> -    qemu_put_be64(f, RAM_SAVE_FLAG_EOS);
> -
> -    expected_time = ram_save_remaining() * TARGET_PAGE_SIZE / bwidth;
> -
> -    return (stage == 2)&&  (expected_time<= migrate_max_downtime());
> -}
> -
> -static int ram_load(QEMUFile *f, void *opaque, int version_id)
> -{
> -    ram_addr_t addr;
> -    int flags;
> -
> -    if (version_id != 3)
> -        return -EINVAL;
> -
> -    do {
> -        addr = qemu_get_be64(f);
> -
> -        flags = addr&  ~TARGET_PAGE_MASK;
> -        addr&= TARGET_PAGE_MASK;
> -
> -        if (flags&  RAM_SAVE_FLAG_MEM_SIZE) {
> -            if (addr != last_ram_offset)
> -                return -EINVAL;
> -        }
> -
> -        if (flags&  RAM_SAVE_FLAG_COMPRESS) {
> -            uint8_t ch = qemu_get_byte(f);
> -            memset(qemu_get_ram_ptr(addr), ch, TARGET_PAGE_SIZE);
> -#ifndef _WIN32
> -            if (ch == 0&&
> -                (!kvm_enabled() || kvm_has_sync_mmu())) {
> -                madvise(qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE,
> MADV_DONTNEED);
> -            }
> -#endif
> -        } else if (flags&  RAM_SAVE_FLAG_PAGE) {
> -            qemu_get_buffer(f, qemu_get_ram_ptr(addr), TARGET_PAGE_SIZE);
> -        }
> -        if (qemu_file_has_error(f)) {
> -            return -EIO;
> -        }
> -    } while (!(flags&  RAM_SAVE_FLAG_EOS));
> -
> -    return 0;
> -}
> -
> -void qemu_service_io(void)
> -{
> -    qemu_notify_event();
> -}
> -
> -/***********************************************************/
>   /* machine registration */
>
>   static QEMUMachine *first_machine = NULL;
> @@ -2295,8 +2076,8 @@ static void version(void)
>   static void help(int exitcode)
>   {
>       const char *options_help =
> -#define DEF(option, opt_arg, opt_enum, opt_help)        \
> -           opt_help
> +#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
> +        opt_help
>   #define DEFHEADING(text) stringify(text) "\n"
>   #include "qemu-options.h"
>   #undef DEF
> @@ -2323,7 +2104,7 @@ static void help(int exitcode)
>   #define HAS_ARG 0x0001
>
>   enum {
> -#define DEF(option, opt_arg, opt_enum, opt_help)        \
> +#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
>       opt_enum,
>   #define DEFHEADING(text)
>   #include "qemu-options.h"
> @@ -2336,12 +2117,13 @@ typedef struct QEMUOption {
>       const char *name;
>       int flags;
>       int index;
> +    uint32_t arch_mask;
>   } QEMUOption;
>
>   static const QEMUOption qemu_options[] = {
> -    { "h", 0, QEMU_OPTION_h },
> -#define DEF(option, opt_arg, opt_enum, opt_help)        \
> -    { option, opt_arg, opt_enum },
> +    { "h", 0, QEMU_OPTION_h, QEMU_ARCH_ALL },
> +#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask)     \
> +    { option, opt_arg, opt_enum, arch_mask },
>   #define DEFHEADING(text)
>   #include "qemu-options.h"
>   #undef DEF
> @@ -2349,148 +2131,6 @@ static const QEMUOption qemu_options[] = {
>   #undef GEN_DOCS
>       { NULL },
>   };
> -
> -#ifdef HAS_AUDIO
> -struct soundhw soundhw[] = {
> -#ifdef HAS_AUDIO_CHOICE
> -#if defined(TARGET_I386) || defined(TARGET_MIPS)
> -    {
> -        "pcspk",
> -        "PC speaker",
> -        0,
> -        1,
> -        { .init_isa = pcspk_audio_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_SB16
> -    {
> -        "sb16",
> -        "Creative Sound Blaster 16",
> -        0,
> -        1,
> -        { .init_isa = SB16_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_CS4231A
> -    {
> -        "cs4231a",
> -        "CS4231A",
> -        0,
> -        1,
> -        { .init_isa = cs4231a_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_ADLIB
> -    {
> -        "adlib",
> -#ifdef HAS_YMF262
> -        "Yamaha YMF262 (OPL3)",
> -#else
> -        "Yamaha YM3812 (OPL2)",
> -#endif
> -        0,
> -        1,
> -        { .init_isa = Adlib_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_GUS
> -    {
> -        "gus",
> -        "Gravis Ultrasound GF1",
> -        0,
> -        1,
> -        { .init_isa = GUS_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_AC97
> -    {
> -        "ac97",
> -        "Intel 82801AA AC97 Audio",
> -        0,
> -        0,
> -        { .init_pci = ac97_init }
> -    },
> -#endif
> -
> -#ifdef CONFIG_ES1370
> -    {
> -        "es1370",
> -        "ENSONIQ AudioPCI ES1370",
> -        0,
> -        0,
> -        { .init_pci = es1370_init }
> -    },
> -#endif
> -
> -#endif /* HAS_AUDIO_CHOICE */
> -
> -    { NULL, NULL, 0, 0, { NULL } }
> -};
> -
> -static void select_soundhw (const char *optarg)
> -{
> -    struct soundhw *c;
> -
> -    if (*optarg == '?') {
> -    show_valid_cards:
> -
> -        printf ("Valid sound card names (comma separated):\n");
> -        for (c = soundhw; c->name; ++c) {
> -            printf ("%-11s %s\n", c->name, c->descr);
> -        }
> -        printf ("\n-soundhw all will enable all of the above\n");
> -        exit (*optarg != '?');
> -    }
> -    else {
> -        size_t l;
> -        const char *p;
> -        char *e;
> -        int bad_card = 0;
> -
> -        if (!strcmp (optarg, "all")) {
> -            for (c = soundhw; c->name; ++c) {
> -                c->enabled = 1;
> -            }
> -            return;
> -        }
> -
> -        p = optarg;
> -        while (*p) {
> -            e = strchr (p, ',');
> -            l = !e ? strlen (p) : (size_t) (e - p);
> -
> -            for (c = soundhw; c->name; ++c) {
> -                if (!strncmp (c->name, p, l)&&  !c->name[l]) {
> -                    c->enabled = 1;
> -                    break;
> -                }
> -            }
> -
> -            if (!c->name) {
> -                if (l>  80) {
> -                    fprintf (stderr,
> -                             "Unknown sound card name (too big to show)\n");
> -                }
> -                else {
> -                    fprintf (stderr, "Unknown sound card name `%.*s'\n",
> -                             (int) l, p);
> -                }
> -                bad_card = 1;
> -            }
> -            p += l + (e != NULL);
> -        }
> -
> -        if (bad_card)
> -            goto show_valid_cards;
> -    }
> -}
> -#endif
> -
>   static void select_vgahw (const char *p)
>   {
>       const char *opts;
> @@ -2525,7 +2165,6 @@ static void select_vgahw (const char *p)
>       }
>   }
>
> -#ifdef TARGET_I386
>   static int balloon_parse(const char *arg)
>   {
>       QemuOpts *opts;
> @@ -2550,7 +2189,6 @@ static int balloon_parse(const char *arg)
>
>       return -1;
>   }
> -#endif
>
>   #ifdef _WIN32
>   static BOOL WINAPI qemu_ctrl_handler(DWORD type)
> @@ -2560,54 +2198,6 @@ static BOOL WINAPI qemu_ctrl_handler(DWORD type)
>   }
>   #endif
>
> -int qemu_uuid_parse(const char *str, uint8_t *uuid)
> -{
> -    int ret;
> -
> -    if(strlen(str) != 36)
> -        return -1;
> -
> -    ret = sscanf(str, UUID_FMT,&uuid[0],&uuid[1],&uuid[2],&uuid[3],
> -&uuid[4],&uuid[5],&uuid[6],&uuid[7],&uuid[8],&uuid[9],
> -&uuid[10],&uuid[11],&uuid[12],&uuid[13],&uuid[14],&uuid[15]);
> -
> -    if(ret != 16)
> -        return -1;
> -
> -#ifdef TARGET_I386
> -    smbios_add_field(1, offsetof(struct smbios_type_1, uuid), 16, uuid);
> -#endif
> -
> -    return 0;
> -}
> -
> -#ifdef TARGET_I386
> -static void do_acpitable_option(const char *optarg)
> -{
> -    if (acpi_table_add(optarg)<  0) {
> -        fprintf(stderr, "Wrong acpi table provided\n");
> -        exit(1);
> -    }
> -}
> -#endif
> -
> -#ifdef TARGET_I386
> -static void do_smbios_option(const char *optarg)
> -{
> -    if (smbios_entry_add(optarg)<  0) {
> -        fprintf(stderr, "Wrong smbios provided\n");
> -        exit(1);
> -    }
> -}
> -#endif
> -
> -static void cpudef_init(void)
> -{
> -#if defined(cpudef_setup)
> -    cpudef_setup(); /* parse cpu definitions in target config file */
> -#endif
> -}
> -
>   #ifndef _WIN32
>
>   static void termsig_handler(int signal)
> @@ -3147,7 +2737,7 @@ int main(int argc, char **argv, char **envp)
>               fclose(fp);
>           }
>
> -        fname = CONFIG_QEMU_CONFDIR "/target-" TARGET_ARCH ".conf";
> +        fname = arch_config_name;
>           fp = fopen(fname, "r");
>           if (fp) {
>               if (qemu_config_parse(fp, fname) != 0) {
> @@ -3169,6 +2759,10 @@ int main(int argc, char **argv, char **envp)
>               const QEMUOption *popt;
>
>               popt = lookup_opt(argc, argv,&optarg,&optind);
> +            if (!(popt->arch_mask&  arch_type)) {
> +                printf("Option %s not supported for this target\n",
> popt->name);
> +                exit(1);
> +            }
>               switch(popt->index) {
>               case QEMU_OPTION_M:
>                   machine = find_machine(optarg);
> @@ -3372,11 +2966,9 @@ int main(int argc, char **argv, char **envp)
>               case QEMU_OPTION_fdb:
>                   drive_add(optarg, FD_ALIAS, popt->index - QEMU_OPTION_fda);
>                   break;
> -#ifdef TARGET_I386
>               case QEMU_OPTION_no_fd_bootchk:
>                   fd_bootchk = 0;
>                   break;
> -#endif
>               case QEMU_OPTION_netdev:
>                   if (net_client_parse(&qemu_netdev_opts, optarg) == -1) {
>                       exit(1);
> @@ -3408,15 +3000,21 @@ int main(int argc, char **argv, char **envp)
>               case QEMU_OPTION_bt:
>                   add_device_config(DEV_BT, optarg);
>                   break;
> -#ifdef HAS_AUDIO
>               case QEMU_OPTION_audio_help:
> +                if (!(audio_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   AUD_help ();
>                   exit (0);
>                   break;
>               case QEMU_OPTION_soundhw:
> +                if (!(audio_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   select_soundhw (optarg);
>                   break;
> -#endif
>               case QEMU_OPTION_h:
>                   help(0);
>                   break;
> @@ -3491,7 +3089,6 @@ int main(int argc, char **argv, char **envp)
>               case QEMU_OPTION_vga:
>                   select_vgahw (optarg);
>                   break;
> -#if defined(TARGET_PPC) || defined(TARGET_SPARC)
>               case QEMU_OPTION_g:
>                   {
>                       const char *p;
> @@ -3526,7 +3123,6 @@ int main(int argc, char **argv, char **envp)
>                       graphic_depth = depth;
>                   }
>                   break;
> -#endif
>               case QEMU_OPTION_echr:
>                   {
>                       char *r;
> @@ -3622,7 +3218,6 @@ int main(int argc, char **argv, char **envp)
>               case QEMU_OPTION_pidfile:
>                   pid_file = optarg;
>                   break;
> -#ifdef TARGET_I386
>               case QEMU_OPTION_win2k_hack:
>                   win2k_install_hack = 1;
>                   break;
> @@ -3635,12 +3230,13 @@ int main(int argc, char **argv, char **envp)
>               case QEMU_OPTION_smbios:
>                   do_smbios_option(optarg);
>                   break;
> -#endif
> -#ifdef CONFIG_KVM
>               case QEMU_OPTION_enable_kvm:
> +                if (!(kvm_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   kvm_allowed = 1;
>                   break;
> -#endif
>               case QEMU_OPTION_usb:
>                   usb_enabled = 1;
>                   break;
> @@ -3673,7 +3269,6 @@ int main(int argc, char **argv, char **envp)
>                   display_type = DT_VNC;
>   		vnc_display = optarg;
>   		break;
> -#ifdef TARGET_I386
>               case QEMU_OPTION_no_acpi:
>                   acpi_enabled = 0;
>                   break;
> @@ -3686,7 +3281,6 @@ int main(int argc, char **argv, char **envp)
>                       exit(1);
>                   }
>                   break;
> -#endif
>               case QEMU_OPTION_no_reboot:
>                   no_reboot = 1;
>                   break;
> @@ -3716,11 +3310,9 @@ int main(int argc, char **argv, char **envp)
>   		option_rom[nb_option_roms] = optarg;
>   		nb_option_roms++;
>   		break;
> -#if defined(TARGET_ARM) || defined(TARGET_M68K)
>               case QEMU_OPTION_semihosting:
>                   semihosting_enabled = 1;
>                   break;
> -#endif
>               case QEMU_OPTION_name:
>                   qemu_name = qemu_strdup(optarg);
>   		 {
> @@ -3736,7 +3328,6 @@ int main(int argc, char **argv, char **envp)
>   		     }	
>   		 }	
>                   break;
> -#if defined(TARGET_SPARC) || defined(TARGET_PPC)
>               case QEMU_OPTION_prom_env:
>                   if (nb_prom_envs>= MAX_PROM_ENVS) {
>                       fprintf(stderr, "Too many prom variables\n");
> @@ -3745,12 +3336,9 @@ int main(int argc, char **argv, char **envp)
>                   prom_envs[nb_prom_envs] = optarg;
>                   nb_prom_envs++;
>                   break;
> -#endif
> -#ifdef TARGET_ARM
>               case QEMU_OPTION_old_param:
>                   old_param = 1;
>                   break;
> -#endif
>               case QEMU_OPTION_clock:
>                   configure_alarms(optarg);
>                   break;
> @@ -3795,17 +3383,27 @@ int main(int argc, char **argv, char **envp)
>                   run_as = optarg;
>                   break;
>   #endif
> -#ifdef CONFIG_XEN
>               case QEMU_OPTION_xen_domid:
> +                if (!(xen_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   xen_domid = atoi(optarg);
>                   break;
>               case QEMU_OPTION_xen_create:
> +                if (!(xen_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   xen_mode = XEN_CREATE;
>                   break;
>               case QEMU_OPTION_xen_attach:
> +                if (!(xen_available())) {
> +                    printf("Option %s not supported for this
> target\n", popt->name);
> +                    exit(1);
> +                }
>                   xen_mode = XEN_ATTACH;
>                   break;
> -#endif
>               case QEMU_OPTION_readconfig:
>                   {
>                       FILE *fp;
>    

  reply	other threads:[~2010-03-31 18:47 UTC|newest]

Thread overview: 6+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2010-03-27 22:11 [Qemu-devel] [PATCH 7/7] Refactor target specific handling, compile vl.c only once Blue Swirl
2010-03-31 18:42 ` Anthony Liguori [this message]
2010-03-31 19:19   ` Blue Swirl
2010-03-31 19:23     ` Anthony Liguori
2010-03-31 19:27     ` Anthony Liguori
2010-04-01  8:14       ` [Qemu-devel] " Paolo Bonzini

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=4BB397A1.2000508@codemonkey.ws \
    --to=anthony@codemonkey.ws \
    --cc=blauwirbel@gmail.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).