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;
>
next prev parent 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).