From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1Nx2wg-0002Et-JA for qemu-devel@nongnu.org; Wed, 31 Mar 2010 14:47:18 -0400 Received: from [140.186.70.92] (port=53011 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1Nx2so-0001ZH-71 for qemu-devel@nongnu.org; Wed, 31 Mar 2010 14:47:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.69) (envelope-from ) id 1Nx2sI-0005ER-PR for qemu-devel@nongnu.org; Wed, 31 Mar 2010 14:42:55 -0400 Received: from mail-pw0-f45.google.com ([209.85.160.45]:50700) by eggs.gnu.org with esmtp (Exim 4.69) (envelope-from ) id 1Nx2sI-0005Dm-3o for qemu-devel@nongnu.org; Wed, 31 Mar 2010 14:42:46 -0400 Received: by pwi6 with SMTP id 6so407854pwi.4 for ; Wed, 31 Mar 2010 11:42:45 -0700 (PDT) Message-ID: <4BB397A1.2000508@codemonkey.ws> Date: Wed, 31 Mar 2010 13:42:41 -0500 From: Anthony Liguori MIME-Version: 1.0 Subject: Re: [Qemu-devel] [PATCH 7/7] Refactor target specific handling, compile vl.c only once References: In-Reply-To: Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Blue Swirl Cc: qemu-devel 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 > 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 > +#include > +#ifndef _WIN32 > +#include > +#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 parameter for item of type\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\n") > + "-readconfig\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\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; >