diff options
-rw-r--r-- | Makefile.objs | 12 | ||||
-rw-r--r-- | Makefile.target | 13 | ||||
-rw-r--r-- | arch_init.c | 509 | ||||
-rw-r--r-- | arch_init.h | 33 | ||||
-rw-r--r-- | qemu-options.hx | 309 | ||||
-rw-r--r-- | sysemu.h | 4 | ||||
-rw-r--r-- | vl.c | 476 |
7 files changed, 751 insertions, 605 deletions
diff --git a/Makefile.objs b/Makefile.objs index 50ae89039f..d8eef0a747 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 a89158ae60..36b3408ea5 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 0000000000..171e21c7de --- /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 0000000000..682890c0ec --- /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 e2a5ca6e5a..719cbda83c 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 @@ -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, @@ -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; |