mirror of https://github.com/proxmox/mirror_qemu
Mostly bugfixes and cleanups, the most important being
"megasas: fix mapped frame size" from Peter Lieven. In addition, -realtime is marked as deprecated. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2.0.22 (GNU/Linux) iQEcBAABAgAGBQJc3rY3AAoJEL/70l94x66D91kH/21LLnL+sKmyueSM/Sek4id2 r06tHdGMdl5Od3I5uMD9gnr4AriiCZc9ybQDQ1N879wKMmQPZwcnf2GJ5DZ0wa3L jHoQO07Bg0KZGWALjXiN5PWB0DlJtXsTm0C4q4tnt6V/ueasjxouBk9/fRLRc09n QTS379X9QvPElFTv3WPfGz6kmkLq8VMmdRnSlXneB9xTyXXJbFj3zlvDCElNSgWh fZ7gnfYWB1LOC19HJxp1mJSkAUD5AgImYEK1Hmnr+BMs2sg6gypYNtp3LtE5FzmZ HSdXYFyPkQV9UyTiV1XBs3bXJbGYj5OApfXCtwo/I2JtP+LhHBA2eq1Gs3QgP98= =zSSj -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging Mostly bugfixes and cleanups, the most important being "megasas: fix mapped frame size" from Peter Lieven. In addition, -realtime is marked as deprecated. # gpg: Signature made Fri 17 May 2019 14:25:11 BST # gpg: using RSA key BFFBD25F78C7AE83 # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * remotes/bonzini/tags/for-upstream: (21 commits) hw/net/ne2000: Extract the PCI device from the chipset common code hw/char: Move multi-serial devices into separate file ioapic: allow buggy guests mishandling level-triggered interrupts to make progress build: don't build hardware objects with linux-user build: chardev is only needed for softmmu targets configure: qemu-ga is only needed with softmmu targets build: replace GENERATED_FILES by generated-files-y trace: only include trace-event-subdirs when they are needed sun4m: obey -vga none mips-fulong2e: obey -vga none hw/i386/acpi: Assert a pointer is not null BEFORE using it hw/i386/acpi: Add object_resolve_type_unambiguous to improve modularity hw/acpi/piix4: Move TYPE_PIIX4_PM to a public header memory: correct the comment to DIRTY_MEMORY_MIGRATION vl: fix -sandbox parsing crash when seccomp support is disabled hvf: Add missing break statement megasas: fix mapped frame size vl: Add missing descriptions to the VGA adapters list Declare -realtime as deprecated roms: assert if max rom size is less than the used size ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>master
commit
27cb89d1d3
43
Makefile
43
Makefile
|
@ -87,6 +87,10 @@ endif
|
||||||
|
|
||||||
include $(SRC_PATH)/rules.mak
|
include $(SRC_PATH)/rules.mak
|
||||||
|
|
||||||
|
# notempy and lor are defined in rules.mak
|
||||||
|
CONFIG_TOOLS := $(call notempty,$(TOOLS))
|
||||||
|
CONFIG_BLOCK := $(call lor,$(CONFIG_SOFTMMU),$(CONFIG_TOOLS))
|
||||||
|
|
||||||
# Create QEMU_PKGVERSION and FULL_VERSION strings
|
# Create QEMU_PKGVERSION and FULL_VERSION strings
|
||||||
# If PKGVERSION is set, use that; otherwise get version and -dirty status from git
|
# If PKGVERSION is set, use that; otherwise get version and -dirty status from git
|
||||||
QEMU_PKGVERSION := $(if $(PKGVERSION),$(PKGVERSION),$(shell \
|
QEMU_PKGVERSION := $(if $(PKGVERSION),$(PKGVERSION),$(shell \
|
||||||
|
@ -101,7 +105,7 @@ QEMU_PKGVERSION := $(if $(PKGVERSION),$(PKGVERSION),$(shell \
|
||||||
# Either "version (pkgversion)", or just "version" if pkgversion not set
|
# Either "version (pkgversion)", or just "version" if pkgversion not set
|
||||||
FULL_VERSION := $(if $(QEMU_PKGVERSION),$(VERSION) ($(QEMU_PKGVERSION)),$(VERSION))
|
FULL_VERSION := $(if $(QEMU_PKGVERSION),$(VERSION) ($(QEMU_PKGVERSION)),$(VERSION))
|
||||||
|
|
||||||
GENERATED_FILES = qemu-version.h config-host.h qemu-options.def
|
generated-files-y = qemu-version.h config-host.h qemu-options.def
|
||||||
|
|
||||||
GENERATED_QAPI_FILES = qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c
|
GENERATED_QAPI_FILES = qapi/qapi-builtin-types.h qapi/qapi-builtin-types.c
|
||||||
GENERATED_QAPI_FILES += qapi/qapi-types.h qapi/qapi-types.c
|
GENERATED_QAPI_FILES += qapi/qapi-types.h qapi/qapi-types.c
|
||||||
|
@ -121,20 +125,18 @@ GENERATED_QAPI_FILES += $(QAPI_MODULES:%=qapi/qapi-events-%.c)
|
||||||
GENERATED_QAPI_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h
|
GENERATED_QAPI_FILES += qapi/qapi-introspect.c qapi/qapi-introspect.h
|
||||||
GENERATED_QAPI_FILES += qapi/qapi-doc.texi
|
GENERATED_QAPI_FILES += qapi/qapi-doc.texi
|
||||||
|
|
||||||
GENERATED_FILES += $(GENERATED_QAPI_FILES)
|
generated-files-y += $(GENERATED_QAPI_FILES)
|
||||||
|
|
||||||
GENERATED_FILES += trace/generated-tcg-tracers.h
|
generated-files-y += trace/generated-tcg-tracers.h
|
||||||
|
|
||||||
GENERATED_FILES += trace/generated-helpers-wrappers.h
|
generated-files-y += trace/generated-helpers-wrappers.h
|
||||||
GENERATED_FILES += trace/generated-helpers.h
|
generated-files-y += trace/generated-helpers.h
|
||||||
GENERATED_FILES += trace/generated-helpers.c
|
generated-files-y += trace/generated-helpers.c
|
||||||
|
|
||||||
ifdef CONFIG_TRACE_UST
|
generated-files-$(CONFIG_TRACE_UST) += trace-ust-all.h
|
||||||
GENERATED_FILES += trace-ust-all.h
|
generated-files-$(CONFIG_TRACE_UST) += trace-ust-all.c
|
||||||
GENERATED_FILES += trace-ust-all.c
|
|
||||||
endif
|
|
||||||
|
|
||||||
GENERATED_FILES += module_block.h
|
generated-files-y += module_block.h
|
||||||
|
|
||||||
TRACE_HEADERS = trace-root.h $(trace-events-subdirs:%=%/trace.h)
|
TRACE_HEADERS = trace-root.h $(trace-events-subdirs:%=%/trace.h)
|
||||||
TRACE_SOURCES = trace-root.c $(trace-events-subdirs:%=%/trace.c)
|
TRACE_SOURCES = trace-root.c $(trace-events-subdirs:%=%/trace.c)
|
||||||
|
@ -147,10 +149,10 @@ ifdef CONFIG_TRACE_UST
|
||||||
TRACE_HEADERS += trace-ust-root.h $(trace-events-subdirs:%=%/trace-ust.h)
|
TRACE_HEADERS += trace-ust-root.h $(trace-events-subdirs:%=%/trace-ust.h)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
GENERATED_FILES += $(TRACE_HEADERS)
|
generated-files-y += $(TRACE_HEADERS)
|
||||||
GENERATED_FILES += $(TRACE_SOURCES)
|
generated-files-y += $(TRACE_SOURCES)
|
||||||
GENERATED_FILES += $(BUILD_DIR)/trace-events-all
|
generated-files-y += $(BUILD_DIR)/trace-events-all
|
||||||
GENERATED_FILES += .git-submodule-status
|
generated-files-y += .git-submodule-status
|
||||||
|
|
||||||
trace-group-name = $(shell dirname $1 | sed -e 's/[^a-zA-Z0-9]/_/g')
|
trace-group-name = $(shell dirname $1 | sed -e 's/[^a-zA-Z0-9]/_/g')
|
||||||
|
|
||||||
|
@ -281,7 +283,7 @@ KEYCODEMAP_FILES = \
|
||||||
ui/input-keymap-osx-to-qcode.c \
|
ui/input-keymap-osx-to-qcode.c \
|
||||||
$(NULL)
|
$(NULL)
|
||||||
|
|
||||||
GENERATED_FILES += $(KEYCODEMAP_FILES)
|
generated-files-$(CONFIG_SOFTMMU) += $(KEYCODEMAP_FILES)
|
||||||
|
|
||||||
ui/input-keymap-%.c: $(KEYCODEMAP_GEN) $(KEYCODEMAP_CSV) $(SRC_PATH)/ui/Makefile.objs
|
ui/input-keymap-%.c: $(KEYCODEMAP_GEN) $(KEYCODEMAP_CSV) $(SRC_PATH)/ui/Makefile.objs
|
||||||
$(call quiet-command,\
|
$(call quiet-command,\
|
||||||
|
@ -446,6 +448,7 @@ SOFTMMU_SUBDIR_RULES=$(filter %-softmmu,$(SUBDIR_RULES))
|
||||||
|
|
||||||
$(SOFTMMU_SUBDIR_RULES): $(authz-obj-y)
|
$(SOFTMMU_SUBDIR_RULES): $(authz-obj-y)
|
||||||
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
|
$(SOFTMMU_SUBDIR_RULES): $(block-obj-y)
|
||||||
|
$(SOFTMMU_SUBDIR_RULES): $(chardev-obj-y)
|
||||||
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
|
$(SOFTMMU_SUBDIR_RULES): $(crypto-obj-y)
|
||||||
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
|
$(SOFTMMU_SUBDIR_RULES): $(io-obj-y)
|
||||||
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
|
$(SOFTMMU_SUBDIR_RULES): config-all-devices.mak
|
||||||
|
@ -482,7 +485,7 @@ subdir-capstone: .git-submodule-status
|
||||||
subdir-slirp: .git-submodule-status
|
subdir-slirp: .git-submodule-status
|
||||||
$(call quiet-command,$(MAKE) -C $(SRC_PATH)/slirp BUILD_DIR="$(BUILD_DIR)/slirp" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(QEMU_CFLAGS) $(CFLAGS)" LDFLAGS="$(LDFLAGS)")
|
$(call quiet-command,$(MAKE) -C $(SRC_PATH)/slirp BUILD_DIR="$(BUILD_DIR)/slirp" CC="$(CC)" AR="$(AR)" LD="$(LD)" RANLIB="$(RANLIB)" CFLAGS="$(QEMU_CFLAGS) $(CFLAGS)" LDFLAGS="$(LDFLAGS)")
|
||||||
|
|
||||||
$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) $(chardev-obj-y) \
|
$(SUBDIR_RULES): libqemuutil.a $(common-obj-y) \
|
||||||
$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
|
$(qom-obj-y) $(crypto-aes-obj-$(CONFIG_USER_ONLY))
|
||||||
|
|
||||||
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
|
ROMSUBDIR_RULES=$(patsubst %,romsubdir-%, $(ROMS))
|
||||||
|
@ -643,10 +646,10 @@ clean:
|
||||||
rm -f fsdev/*.pod scsi/*.pod
|
rm -f fsdev/*.pod scsi/*.pod
|
||||||
rm -f qemu-img-cmds.h
|
rm -f qemu-img-cmds.h
|
||||||
rm -f ui/shader/*-vert.h ui/shader/*-frag.h
|
rm -f ui/shader/*-vert.h ui/shader/*-frag.h
|
||||||
@# May not be present in GENERATED_FILES
|
@# May not be present in generated-files-y
|
||||||
rm -f trace/generated-tracers-dtrace.dtrace*
|
rm -f trace/generated-tracers-dtrace.dtrace*
|
||||||
rm -f trace/generated-tracers-dtrace.h*
|
rm -f trace/generated-tracers-dtrace.h*
|
||||||
rm -f $(foreach f,$(GENERATED_FILES),$(f) $(f)-timestamp)
|
rm -f $(foreach f,$(generated-files-y),$(f) $(f)-timestamp)
|
||||||
rm -f qapi-gen-timestamp
|
rm -f qapi-gen-timestamp
|
||||||
rm -rf qga/qapi-generated
|
rm -rf qga/qapi-generated
|
||||||
for d in $(ALL_SUBDIRS); do \
|
for d in $(ALL_SUBDIRS); do \
|
||||||
|
@ -1062,7 +1065,7 @@ endif # CONFIG_WIN
|
||||||
# rebuilt before other object files
|
# rebuilt before other object files
|
||||||
ifneq ($(wildcard config-host.mak),)
|
ifneq ($(wildcard config-host.mak),)
|
||||||
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
|
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
|
||||||
Makefile: $(GENERATED_FILES)
|
Makefile: $(generated-files-y)
|
||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
|
|
@ -127,11 +127,20 @@ rdmacm-mux-obj-y = contrib/rdmacm-mux/
|
||||||
trace-events-subdirs =
|
trace-events-subdirs =
|
||||||
trace-events-subdirs += accel/kvm
|
trace-events-subdirs += accel/kvm
|
||||||
trace-events-subdirs += accel/tcg
|
trace-events-subdirs += accel/tcg
|
||||||
trace-events-subdirs += audio
|
trace-events-subdirs += crypto
|
||||||
|
ifeq ($(CONFIG_USER_ONLY),y)
|
||||||
|
trace-events-subdirs += linux-user
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_BLOCK),y)
|
||||||
trace-events-subdirs += authz
|
trace-events-subdirs += authz
|
||||||
trace-events-subdirs += block
|
trace-events-subdirs += block
|
||||||
|
trace-events-subdirs += io
|
||||||
|
trace-events-subdirs += nbd
|
||||||
|
trace-events-subdirs += scsi
|
||||||
|
endif
|
||||||
|
ifeq ($(CONFIG_SOFTMMU),y)
|
||||||
trace-events-subdirs += chardev
|
trace-events-subdirs += chardev
|
||||||
trace-events-subdirs += crypto
|
trace-events-subdirs += audio
|
||||||
trace-events-subdirs += hw/9pfs
|
trace-events-subdirs += hw/9pfs
|
||||||
trace-events-subdirs += hw/acpi
|
trace-events-subdirs += hw/acpi
|
||||||
trace-events-subdirs += hw/alpha
|
trace-events-subdirs += hw/alpha
|
||||||
|
@ -140,7 +149,6 @@ trace-events-subdirs += hw/audio
|
||||||
trace-events-subdirs += hw/block
|
trace-events-subdirs += hw/block
|
||||||
trace-events-subdirs += hw/block/dataplane
|
trace-events-subdirs += hw/block/dataplane
|
||||||
trace-events-subdirs += hw/char
|
trace-events-subdirs += hw/char
|
||||||
trace-events-subdirs += hw/display
|
|
||||||
trace-events-subdirs += hw/dma
|
trace-events-subdirs += hw/dma
|
||||||
trace-events-subdirs += hw/hppa
|
trace-events-subdirs += hw/hppa
|
||||||
trace-events-subdirs += hw/i2c
|
trace-events-subdirs += hw/i2c
|
||||||
|
@ -173,14 +181,13 @@ trace-events-subdirs += hw/virtio
|
||||||
trace-events-subdirs += hw/watchdog
|
trace-events-subdirs += hw/watchdog
|
||||||
trace-events-subdirs += hw/xen
|
trace-events-subdirs += hw/xen
|
||||||
trace-events-subdirs += hw/gpio
|
trace-events-subdirs += hw/gpio
|
||||||
trace-events-subdirs += io
|
|
||||||
trace-events-subdirs += linux-user
|
|
||||||
trace-events-subdirs += migration
|
trace-events-subdirs += migration
|
||||||
trace-events-subdirs += nbd
|
|
||||||
trace-events-subdirs += net
|
trace-events-subdirs += net
|
||||||
|
trace-events-subdirs += ui
|
||||||
|
endif
|
||||||
|
trace-events-subdirs += hw/display
|
||||||
trace-events-subdirs += qapi
|
trace-events-subdirs += qapi
|
||||||
trace-events-subdirs += qom
|
trace-events-subdirs += qom
|
||||||
trace-events-subdirs += scsi
|
|
||||||
trace-events-subdirs += target/arm
|
trace-events-subdirs += target/arm
|
||||||
trace-events-subdirs += target/hppa
|
trace-events-subdirs += target/hppa
|
||||||
trace-events-subdirs += target/i386
|
trace-events-subdirs += target/i386
|
||||||
|
@ -189,7 +196,6 @@ trace-events-subdirs += target/ppc
|
||||||
trace-events-subdirs += target/riscv
|
trace-events-subdirs += target/riscv
|
||||||
trace-events-subdirs += target/s390x
|
trace-events-subdirs += target/s390x
|
||||||
trace-events-subdirs += target/sparc
|
trace-events-subdirs += target/sparc
|
||||||
trace-events-subdirs += ui
|
|
||||||
trace-events-subdirs += util
|
trace-events-subdirs += util
|
||||||
|
|
||||||
trace-events-files = $(SRC_PATH)/trace-events $(trace-events-subdirs:%=$(SRC_PATH)/%/trace-events)
|
trace-events-files = $(SRC_PATH)/trace-events $(trace-events-subdirs:%=$(SRC_PATH)/%/trace-events)
|
||||||
|
|
|
@ -166,7 +166,7 @@ else
|
||||||
obj-y += hw/$(TARGET_BASE_ARCH)/
|
obj-y += hw/$(TARGET_BASE_ARCH)/
|
||||||
endif
|
endif
|
||||||
|
|
||||||
GENERATED_FILES += hmp-commands.h hmp-commands-info.h
|
generated-files-y += hmp-commands.h hmp-commands-info.h
|
||||||
|
|
||||||
endif # CONFIG_SOFTMMU
|
endif # CONFIG_SOFTMMU
|
||||||
|
|
||||||
|
@ -236,5 +236,5 @@ ifdef CONFIG_TRACE_SYSTEMTAP
|
||||||
$(INSTALL_DATA) $(QEMU_PROG)-log.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-log.stp"
|
$(INSTALL_DATA) $(QEMU_PROG)-log.stp "$(DESTDIR)$(qemu_datadir)/../systemtap/tapset/$(QEMU_PROG)-log.stp"
|
||||||
endif
|
endif
|
||||||
|
|
||||||
GENERATED_FILES += config-target.h
|
generated-files-y += config-target.h
|
||||||
Makefile: $(GENERATED_FILES)
|
Makefile: $(generated-files-y)
|
||||||
|
|
|
@ -6079,7 +6079,9 @@ fi
|
||||||
# Probe for guest agent support/options
|
# Probe for guest agent support/options
|
||||||
|
|
||||||
if [ "$guest_agent" != "no" ]; then
|
if [ "$guest_agent" != "no" ]; then
|
||||||
if [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
|
if [ "$softmmu" = no -a "$want_tools" = no ] ; then
|
||||||
|
guest_agent=no
|
||||||
|
elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
|
||||||
tools="qemu-ga $tools"
|
tools="qemu-ga $tools"
|
||||||
guest_agent=yes
|
guest_agent=yes
|
||||||
elif [ "$guest_agent" != yes ]; then
|
elif [ "$guest_agent" != yes ]; then
|
||||||
|
|
|
@ -92,8 +92,6 @@ typedef struct PIIX4PMState {
|
||||||
MemHotplugState acpi_memory_hotplug;
|
MemHotplugState acpi_memory_hotplug;
|
||||||
} PIIX4PMState;
|
} PIIX4PMState;
|
||||||
|
|
||||||
#define TYPE_PIIX4_PM "PIIX4_PM"
|
|
||||||
|
|
||||||
#define PIIX4_PM(obj) \
|
#define PIIX4_PM(obj) \
|
||||||
OBJECT_CHECK(PIIX4PMState, (obj), TYPE_PIIX4_PM)
|
OBJECT_CHECK(PIIX4PMState, (obj), TYPE_PIIX4_PM)
|
||||||
|
|
||||||
|
@ -554,17 +552,6 @@ static void piix4_pm_realize(PCIDevice *dev, Error **errp)
|
||||||
piix4_pm_add_propeties(s);
|
piix4_pm_add_propeties(s);
|
||||||
}
|
}
|
||||||
|
|
||||||
Object *piix4_pm_find(void)
|
|
||||||
{
|
|
||||||
bool ambig;
|
|
||||||
Object *o = object_resolve_path_type("", TYPE_PIIX4_PM, &ambig);
|
|
||||||
|
|
||||||
if (ambig || !o) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
|
I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
|
||||||
qemu_irq sci_irq, qemu_irq smi_irq,
|
qemu_irq sci_irq, qemu_irq smi_irq,
|
||||||
int smm_enabled, DeviceState **piix4_pm)
|
int smm_enabled, DeviceState **piix4_pm)
|
||||||
|
|
|
@ -24,6 +24,12 @@ config SERIAL_PCI
|
||||||
depends on PCI
|
depends on PCI
|
||||||
select SERIAL
|
select SERIAL
|
||||||
|
|
||||||
|
config SERIAL_PCI_MULTI
|
||||||
|
bool
|
||||||
|
default y if PCI_DEVICES
|
||||||
|
depends on PCI
|
||||||
|
select SERIAL
|
||||||
|
|
||||||
config VIRTIO_SERIAL
|
config VIRTIO_SERIAL
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
|
@ -7,6 +7,7 @@ common-obj-$(CONFIG_PL011) += pl011.o
|
||||||
common-obj-$(CONFIG_SERIAL) += serial.o
|
common-obj-$(CONFIG_SERIAL) += serial.o
|
||||||
common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o
|
common-obj-$(CONFIG_SERIAL_ISA) += serial-isa.o
|
||||||
common-obj-$(CONFIG_SERIAL_PCI) += serial-pci.o
|
common-obj-$(CONFIG_SERIAL_PCI) += serial-pci.o
|
||||||
|
common-obj-$(CONFIG_SERIAL_PCI_MULTI) += serial-pci-multi.o
|
||||||
common-obj-$(CONFIG_VIRTIO_SERIAL) += virtio-console.o
|
common-obj-$(CONFIG_VIRTIO_SERIAL) += virtio-console.o
|
||||||
common-obj-$(CONFIG_XILINX) += xilinx_uartlite.o
|
common-obj-$(CONFIG_XILINX) += xilinx_uartlite.o
|
||||||
common-obj-$(CONFIG_XEN) += xen_console.o
|
common-obj-$(CONFIG_XEN) += xen_console.o
|
||||||
|
|
|
@ -0,0 +1,208 @@
|
||||||
|
/*
|
||||||
|
* QEMU 16550A multi UART emulation
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2004 Fabrice Bellard
|
||||||
|
* Copyright (c) 2008 Citrix Systems, Inc.
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* see docs/specs/pci-serial.txt */
|
||||||
|
|
||||||
|
#include "qemu/osdep.h"
|
||||||
|
#include "qapi/error.h"
|
||||||
|
#include "hw/char/serial.h"
|
||||||
|
#include "hw/pci/pci.h"
|
||||||
|
|
||||||
|
#define PCI_SERIAL_MAX_PORTS 4
|
||||||
|
|
||||||
|
typedef struct PCIMultiSerialState {
|
||||||
|
PCIDevice dev;
|
||||||
|
MemoryRegion iobar;
|
||||||
|
uint32_t ports;
|
||||||
|
char *name[PCI_SERIAL_MAX_PORTS];
|
||||||
|
SerialState state[PCI_SERIAL_MAX_PORTS];
|
||||||
|
uint32_t level[PCI_SERIAL_MAX_PORTS];
|
||||||
|
qemu_irq *irqs;
|
||||||
|
uint8_t prog_if;
|
||||||
|
} PCIMultiSerialState;
|
||||||
|
|
||||||
|
static void multi_serial_pci_exit(PCIDevice *dev)
|
||||||
|
{
|
||||||
|
PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
|
||||||
|
SerialState *s;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < pci->ports; i++) {
|
||||||
|
s = pci->state + i;
|
||||||
|
serial_exit_core(s);
|
||||||
|
memory_region_del_subregion(&pci->iobar, &s->io);
|
||||||
|
g_free(pci->name[i]);
|
||||||
|
}
|
||||||
|
qemu_free_irqs(pci->irqs, pci->ports);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void multi_serial_irq_mux(void *opaque, int n, int level)
|
||||||
|
{
|
||||||
|
PCIMultiSerialState *pci = opaque;
|
||||||
|
int i, pending = 0;
|
||||||
|
|
||||||
|
pci->level[n] = level;
|
||||||
|
for (i = 0; i < pci->ports; i++) {
|
||||||
|
if (pci->level[i]) {
|
||||||
|
pending = 1;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pci_set_irq(&pci->dev, pending);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
|
||||||
|
{
|
||||||
|
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
||||||
|
PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
|
||||||
|
SerialState *s;
|
||||||
|
Error *err = NULL;
|
||||||
|
int i, nr_ports = 0;
|
||||||
|
|
||||||
|
switch (pc->device_id) {
|
||||||
|
case 0x0003:
|
||||||
|
nr_ports = 2;
|
||||||
|
break;
|
||||||
|
case 0x0004:
|
||||||
|
nr_ports = 4;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
assert(nr_ports > 0);
|
||||||
|
assert(nr_ports <= PCI_SERIAL_MAX_PORTS);
|
||||||
|
|
||||||
|
pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
|
||||||
|
pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
|
||||||
|
memory_region_init(&pci->iobar, OBJECT(pci), "multiserial", 8 * nr_ports);
|
||||||
|
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &pci->iobar);
|
||||||
|
pci->irqs = qemu_allocate_irqs(multi_serial_irq_mux, pci,
|
||||||
|
nr_ports);
|
||||||
|
|
||||||
|
for (i = 0; i < nr_ports; i++) {
|
||||||
|
s = pci->state + i;
|
||||||
|
s->baudbase = 115200;
|
||||||
|
serial_realize_core(s, &err);
|
||||||
|
if (err != NULL) {
|
||||||
|
error_propagate(errp, err);
|
||||||
|
multi_serial_pci_exit(dev);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
s->irq = pci->irqs[i];
|
||||||
|
pci->name[i] = g_strdup_printf("uart #%d", i + 1);
|
||||||
|
memory_region_init_io(&s->io, OBJECT(pci), &serial_io_ops, s,
|
||||||
|
pci->name[i], 8);
|
||||||
|
memory_region_add_subregion(&pci->iobar, 8 * i, &s->io);
|
||||||
|
pci->ports++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_pci_multi_serial = {
|
||||||
|
.name = "pci-serial-multi",
|
||||||
|
.version_id = 1,
|
||||||
|
.minimum_version_id = 1,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_PCI_DEVICE(dev, PCIMultiSerialState),
|
||||||
|
VMSTATE_STRUCT_ARRAY(state, PCIMultiSerialState, PCI_SERIAL_MAX_PORTS,
|
||||||
|
0, vmstate_serial, SerialState),
|
||||||
|
VMSTATE_UINT32_ARRAY(level, PCIMultiSerialState, PCI_SERIAL_MAX_PORTS),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static Property multi_2x_serial_pci_properties[] = {
|
||||||
|
DEFINE_PROP_CHR("chardev1", PCIMultiSerialState, state[0].chr),
|
||||||
|
DEFINE_PROP_CHR("chardev2", PCIMultiSerialState, state[1].chr),
|
||||||
|
DEFINE_PROP_UINT8("prog_if", PCIMultiSerialState, prog_if, 0x02),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
static Property multi_4x_serial_pci_properties[] = {
|
||||||
|
DEFINE_PROP_CHR("chardev1", PCIMultiSerialState, state[0].chr),
|
||||||
|
DEFINE_PROP_CHR("chardev2", PCIMultiSerialState, state[1].chr),
|
||||||
|
DEFINE_PROP_CHR("chardev3", PCIMultiSerialState, state[2].chr),
|
||||||
|
DEFINE_PROP_CHR("chardev4", PCIMultiSerialState, state[3].chr),
|
||||||
|
DEFINE_PROP_UINT8("prog_if", PCIMultiSerialState, prog_if, 0x02),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void multi_2x_serial_pci_class_initfn(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
|
||||||
|
pc->realize = multi_serial_pci_realize;
|
||||||
|
pc->exit = multi_serial_pci_exit;
|
||||||
|
pc->vendor_id = PCI_VENDOR_ID_REDHAT;
|
||||||
|
pc->device_id = PCI_DEVICE_ID_REDHAT_SERIAL2;
|
||||||
|
pc->revision = 1;
|
||||||
|
pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
|
||||||
|
dc->vmsd = &vmstate_pci_multi_serial;
|
||||||
|
dc->props = multi_2x_serial_pci_properties;
|
||||||
|
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void multi_4x_serial_pci_class_initfn(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
|
||||||
|
pc->realize = multi_serial_pci_realize;
|
||||||
|
pc->exit = multi_serial_pci_exit;
|
||||||
|
pc->vendor_id = PCI_VENDOR_ID_REDHAT;
|
||||||
|
pc->device_id = PCI_DEVICE_ID_REDHAT_SERIAL4;
|
||||||
|
pc->revision = 1;
|
||||||
|
pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
|
||||||
|
dc->vmsd = &vmstate_pci_multi_serial;
|
||||||
|
dc->props = multi_4x_serial_pci_properties;
|
||||||
|
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const TypeInfo multi_2x_serial_pci_info = {
|
||||||
|
.name = "pci-serial-2x",
|
||||||
|
.parent = TYPE_PCI_DEVICE,
|
||||||
|
.instance_size = sizeof(PCIMultiSerialState),
|
||||||
|
.class_init = multi_2x_serial_pci_class_initfn,
|
||||||
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static const TypeInfo multi_4x_serial_pci_info = {
|
||||||
|
.name = "pci-serial-4x",
|
||||||
|
.parent = TYPE_PCI_DEVICE,
|
||||||
|
.instance_size = sizeof(PCIMultiSerialState),
|
||||||
|
.class_init = multi_4x_serial_pci_class_initfn,
|
||||||
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void multi_serial_pci_register_types(void)
|
||||||
|
{
|
||||||
|
type_register_static(&multi_2x_serial_pci_info);
|
||||||
|
type_register_static(&multi_4x_serial_pci_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
type_init(multi_serial_pci_register_types)
|
|
@ -30,26 +30,12 @@
|
||||||
#include "hw/char/serial.h"
|
#include "hw/char/serial.h"
|
||||||
#include "hw/pci/pci.h"
|
#include "hw/pci/pci.h"
|
||||||
|
|
||||||
#define PCI_SERIAL_MAX_PORTS 4
|
|
||||||
|
|
||||||
typedef struct PCISerialState {
|
typedef struct PCISerialState {
|
||||||
PCIDevice dev;
|
PCIDevice dev;
|
||||||
SerialState state;
|
SerialState state;
|
||||||
uint8_t prog_if;
|
uint8_t prog_if;
|
||||||
} PCISerialState;
|
} PCISerialState;
|
||||||
|
|
||||||
typedef struct PCIMultiSerialState {
|
|
||||||
PCIDevice dev;
|
|
||||||
MemoryRegion iobar;
|
|
||||||
uint32_t ports;
|
|
||||||
char *name[PCI_SERIAL_MAX_PORTS];
|
|
||||||
SerialState state[PCI_SERIAL_MAX_PORTS];
|
|
||||||
uint32_t level[PCI_SERIAL_MAX_PORTS];
|
|
||||||
qemu_irq *irqs;
|
|
||||||
uint8_t prog_if;
|
|
||||||
} PCIMultiSerialState;
|
|
||||||
|
|
||||||
static void multi_serial_pci_exit(PCIDevice *dev);
|
|
||||||
|
|
||||||
static void serial_pci_realize(PCIDevice *dev, Error **errp)
|
static void serial_pci_realize(PCIDevice *dev, Error **errp)
|
||||||
{
|
{
|
||||||
|
@ -72,64 +58,6 @@ static void serial_pci_realize(PCIDevice *dev, Error **errp)
|
||||||
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
|
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void multi_serial_irq_mux(void *opaque, int n, int level)
|
|
||||||
{
|
|
||||||
PCIMultiSerialState *pci = opaque;
|
|
||||||
int i, pending = 0;
|
|
||||||
|
|
||||||
pci->level[n] = level;
|
|
||||||
for (i = 0; i < pci->ports; i++) {
|
|
||||||
if (pci->level[i]) {
|
|
||||||
pending = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
pci_set_irq(&pci->dev, pending);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void multi_serial_pci_realize(PCIDevice *dev, Error **errp)
|
|
||||||
{
|
|
||||||
PCIDeviceClass *pc = PCI_DEVICE_GET_CLASS(dev);
|
|
||||||
PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
|
|
||||||
SerialState *s;
|
|
||||||
Error *err = NULL;
|
|
||||||
int i, nr_ports = 0;
|
|
||||||
|
|
||||||
switch (pc->device_id) {
|
|
||||||
case 0x0003:
|
|
||||||
nr_ports = 2;
|
|
||||||
break;
|
|
||||||
case 0x0004:
|
|
||||||
nr_ports = 4;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
assert(nr_ports > 0);
|
|
||||||
assert(nr_ports <= PCI_SERIAL_MAX_PORTS);
|
|
||||||
|
|
||||||
pci->dev.config[PCI_CLASS_PROG] = pci->prog_if;
|
|
||||||
pci->dev.config[PCI_INTERRUPT_PIN] = 0x01;
|
|
||||||
memory_region_init(&pci->iobar, OBJECT(pci), "multiserial", 8 * nr_ports);
|
|
||||||
pci_register_bar(&pci->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &pci->iobar);
|
|
||||||
pci->irqs = qemu_allocate_irqs(multi_serial_irq_mux, pci,
|
|
||||||
nr_ports);
|
|
||||||
|
|
||||||
for (i = 0; i < nr_ports; i++) {
|
|
||||||
s = pci->state + i;
|
|
||||||
s->baudbase = 115200;
|
|
||||||
serial_realize_core(s, &err);
|
|
||||||
if (err != NULL) {
|
|
||||||
error_propagate(errp, err);
|
|
||||||
multi_serial_pci_exit(dev);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
s->irq = pci->irqs[i];
|
|
||||||
pci->name[i] = g_strdup_printf("uart #%d", i+1);
|
|
||||||
memory_region_init_io(&s->io, OBJECT(pci), &serial_io_ops, s,
|
|
||||||
pci->name[i], 8);
|
|
||||||
memory_region_add_subregion(&pci->iobar, 8 * i, &s->io);
|
|
||||||
pci->ports++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
static void serial_pci_exit(PCIDevice *dev)
|
static void serial_pci_exit(PCIDevice *dev)
|
||||||
{
|
{
|
||||||
PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
|
PCISerialState *pci = DO_UPCAST(PCISerialState, dev, dev);
|
||||||
|
@ -139,21 +67,6 @@ static void serial_pci_exit(PCIDevice *dev)
|
||||||
qemu_free_irq(s->irq);
|
qemu_free_irq(s->irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void multi_serial_pci_exit(PCIDevice *dev)
|
|
||||||
{
|
|
||||||
PCIMultiSerialState *pci = DO_UPCAST(PCIMultiSerialState, dev, dev);
|
|
||||||
SerialState *s;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < pci->ports; i++) {
|
|
||||||
s = pci->state + i;
|
|
||||||
serial_exit_core(s);
|
|
||||||
memory_region_del_subregion(&pci->iobar, &s->io);
|
|
||||||
g_free(pci->name[i]);
|
|
||||||
}
|
|
||||||
qemu_free_irqs(pci->irqs, pci->ports);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const VMStateDescription vmstate_pci_serial = {
|
static const VMStateDescription vmstate_pci_serial = {
|
||||||
.name = "pci-serial",
|
.name = "pci-serial",
|
||||||
.version_id = 1,
|
.version_id = 1,
|
||||||
|
@ -165,41 +78,12 @@ static const VMStateDescription vmstate_pci_serial = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_pci_multi_serial = {
|
|
||||||
.name = "pci-serial-multi",
|
|
||||||
.version_id = 1,
|
|
||||||
.minimum_version_id = 1,
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_PCI_DEVICE(dev, PCIMultiSerialState),
|
|
||||||
VMSTATE_STRUCT_ARRAY(state, PCIMultiSerialState, PCI_SERIAL_MAX_PORTS,
|
|
||||||
0, vmstate_serial, SerialState),
|
|
||||||
VMSTATE_UINT32_ARRAY(level, PCIMultiSerialState, PCI_SERIAL_MAX_PORTS),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static Property serial_pci_properties[] = {
|
static Property serial_pci_properties[] = {
|
||||||
DEFINE_PROP_CHR("chardev", PCISerialState, state.chr),
|
DEFINE_PROP_CHR("chardev", PCISerialState, state.chr),
|
||||||
DEFINE_PROP_UINT8("prog_if", PCISerialState, prog_if, 0x02),
|
DEFINE_PROP_UINT8("prog_if", PCISerialState, prog_if, 0x02),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
};
|
};
|
||||||
|
|
||||||
static Property multi_2x_serial_pci_properties[] = {
|
|
||||||
DEFINE_PROP_CHR("chardev1", PCIMultiSerialState, state[0].chr),
|
|
||||||
DEFINE_PROP_CHR("chardev2", PCIMultiSerialState, state[1].chr),
|
|
||||||
DEFINE_PROP_UINT8("prog_if", PCIMultiSerialState, prog_if, 0x02),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
|
||||||
|
|
||||||
static Property multi_4x_serial_pci_properties[] = {
|
|
||||||
DEFINE_PROP_CHR("chardev1", PCIMultiSerialState, state[0].chr),
|
|
||||||
DEFINE_PROP_CHR("chardev2", PCIMultiSerialState, state[1].chr),
|
|
||||||
DEFINE_PROP_CHR("chardev3", PCIMultiSerialState, state[2].chr),
|
|
||||||
DEFINE_PROP_CHR("chardev4", PCIMultiSerialState, state[3].chr),
|
|
||||||
DEFINE_PROP_UINT8("prog_if", PCIMultiSerialState, prog_if, 0x02),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void serial_pci_class_initfn(ObjectClass *klass, void *data)
|
static void serial_pci_class_initfn(ObjectClass *klass, void *data)
|
||||||
{
|
{
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
@ -215,36 +99,6 @@ static void serial_pci_class_initfn(ObjectClass *klass, void *data)
|
||||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void multi_2x_serial_pci_class_initfn(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
|
|
||||||
pc->realize = multi_serial_pci_realize;
|
|
||||||
pc->exit = multi_serial_pci_exit;
|
|
||||||
pc->vendor_id = PCI_VENDOR_ID_REDHAT;
|
|
||||||
pc->device_id = PCI_DEVICE_ID_REDHAT_SERIAL2;
|
|
||||||
pc->revision = 1;
|
|
||||||
pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
|
|
||||||
dc->vmsd = &vmstate_pci_multi_serial;
|
|
||||||
dc->props = multi_2x_serial_pci_properties;
|
|
||||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void multi_4x_serial_pci_class_initfn(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
PCIDeviceClass *pc = PCI_DEVICE_CLASS(klass);
|
|
||||||
pc->realize = multi_serial_pci_realize;
|
|
||||||
pc->exit = multi_serial_pci_exit;
|
|
||||||
pc->vendor_id = PCI_VENDOR_ID_REDHAT;
|
|
||||||
pc->device_id = PCI_DEVICE_ID_REDHAT_SERIAL4;
|
|
||||||
pc->revision = 1;
|
|
||||||
pc->class_id = PCI_CLASS_COMMUNICATION_SERIAL;
|
|
||||||
dc->vmsd = &vmstate_pci_multi_serial;
|
|
||||||
dc->props = multi_4x_serial_pci_properties;
|
|
||||||
set_bit(DEVICE_CATEGORY_INPUT, dc->categories);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo serial_pci_info = {
|
static const TypeInfo serial_pci_info = {
|
||||||
.name = "pci-serial",
|
.name = "pci-serial",
|
||||||
.parent = TYPE_PCI_DEVICE,
|
.parent = TYPE_PCI_DEVICE,
|
||||||
|
@ -256,33 +110,9 @@ static const TypeInfo serial_pci_info = {
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
static const TypeInfo multi_2x_serial_pci_info = {
|
|
||||||
.name = "pci-serial-2x",
|
|
||||||
.parent = TYPE_PCI_DEVICE,
|
|
||||||
.instance_size = sizeof(PCIMultiSerialState),
|
|
||||||
.class_init = multi_2x_serial_pci_class_initfn,
|
|
||||||
.interfaces = (InterfaceInfo[]) {
|
|
||||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
|
||||||
{ },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static const TypeInfo multi_4x_serial_pci_info = {
|
|
||||||
.name = "pci-serial-4x",
|
|
||||||
.parent = TYPE_PCI_DEVICE,
|
|
||||||
.instance_size = sizeof(PCIMultiSerialState),
|
|
||||||
.class_init = multi_4x_serial_pci_class_initfn,
|
|
||||||
.interfaces = (InterfaceInfo[]) {
|
|
||||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
|
||||||
{ },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void serial_pci_register_types(void)
|
static void serial_pci_register_types(void)
|
||||||
{
|
{
|
||||||
type_register_static(&serial_pci_info);
|
type_register_static(&serial_pci_info);
|
||||||
type_register_static(&multi_2x_serial_pci_info);
|
|
||||||
type_register_static(&multi_4x_serial_pci_info);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
type_init(serial_pci_register_types)
|
type_init(serial_pci_register_types)
|
||||||
|
|
|
@ -1025,6 +1025,7 @@ MemoryRegion *rom_add_blob(const char *name, const void *blob, size_t len,
|
||||||
rom->addr = addr;
|
rom->addr = addr;
|
||||||
rom->romsize = max_len ? max_len : len;
|
rom->romsize = max_len ? max_len : len;
|
||||||
rom->datasize = len;
|
rom->datasize = len;
|
||||||
|
g_assert(rom->romsize >= rom->datasize);
|
||||||
rom->data = g_malloc0(rom->datasize);
|
rom->data = g_malloc0(rom->datasize);
|
||||||
memcpy(rom->data, blob, len);
|
memcpy(rom->data, blob, len);
|
||||||
rom_insert(rom);
|
rom_insert(rom);
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "hw/acpi/acpi-defs.h"
|
#include "hw/acpi/acpi-defs.h"
|
||||||
#include "hw/acpi/acpi.h"
|
#include "hw/acpi/acpi.h"
|
||||||
#include "hw/acpi/cpu.h"
|
#include "hw/acpi/cpu.h"
|
||||||
|
#include "hw/acpi/piix4.h"
|
||||||
#include "hw/nvram/fw_cfg.h"
|
#include "hw/nvram/fw_cfg.h"
|
||||||
#include "hw/acpi/bios-linker-loader.h"
|
#include "hw/acpi/bios-linker-loader.h"
|
||||||
#include "hw/loader.h"
|
#include "hw/loader.h"
|
||||||
|
@ -164,16 +165,28 @@ static void init_common_fadt_data(Object *o, AcpiFadtData *data)
|
||||||
*data = fadt;
|
*data = fadt;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static Object *object_resolve_type_unambiguous(const char *typename)
|
||||||
|
{
|
||||||
|
bool ambig;
|
||||||
|
Object *o = object_resolve_path_type("", typename, &ambig);
|
||||||
|
|
||||||
|
if (ambig || !o) {
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
return o;
|
||||||
|
}
|
||||||
|
|
||||||
static void acpi_get_pm_info(AcpiPmInfo *pm)
|
static void acpi_get_pm_info(AcpiPmInfo *pm)
|
||||||
{
|
{
|
||||||
Object *piix = piix4_pm_find();
|
Object *piix = object_resolve_type_unambiguous(TYPE_PIIX4_PM);
|
||||||
Object *lpc = ich9_lpc_find();
|
Object *lpc = object_resolve_type_unambiguous(TYPE_ICH9_LPC_DEVICE);
|
||||||
Object *obj = piix ? piix : lpc;
|
Object *obj = piix ? piix : lpc;
|
||||||
QObject *o;
|
QObject *o;
|
||||||
pm->cpu_hp_io_base = 0;
|
pm->cpu_hp_io_base = 0;
|
||||||
pm->pcihp_io_base = 0;
|
pm->pcihp_io_base = 0;
|
||||||
pm->pcihp_io_len = 0;
|
pm->pcihp_io_len = 0;
|
||||||
|
|
||||||
|
assert(obj);
|
||||||
init_common_fadt_data(obj, &pm->fadt);
|
init_common_fadt_data(obj, &pm->fadt);
|
||||||
if (piix) {
|
if (piix) {
|
||||||
/* w2k requires FADT(rev1) or it won't boot, keep PC compatible */
|
/* w2k requires FADT(rev1) or it won't boot, keep PC compatible */
|
||||||
|
@ -192,7 +205,6 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
||||||
pm->fadt.flags |= 1 << ACPI_FADT_F_RESET_REG_SUP;
|
pm->fadt.flags |= 1 << ACPI_FADT_F_RESET_REG_SUP;
|
||||||
pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
|
pm->cpu_hp_io_base = ICH9_CPU_HOTPLUG_IO_BASE;
|
||||||
}
|
}
|
||||||
assert(obj);
|
|
||||||
|
|
||||||
/* The above need not be conditional on machine type because the reset port
|
/* The above need not be conditional on machine type because the reset port
|
||||||
* happens to be the same on PIIX (pc) and ICH9 (q35). */
|
* happens to be the same on PIIX (pc) and ICH9 (q35). */
|
||||||
|
@ -228,8 +240,8 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
|
||||||
|
|
||||||
static void acpi_get_misc_info(AcpiMiscInfo *info)
|
static void acpi_get_misc_info(AcpiMiscInfo *info)
|
||||||
{
|
{
|
||||||
Object *piix = piix4_pm_find();
|
Object *piix = object_resolve_type_unambiguous(TYPE_PIIX4_PM);
|
||||||
Object *lpc = ich9_lpc_find();
|
Object *lpc = object_resolve_type_unambiguous(TYPE_ICH9_LPC_DEVICE);
|
||||||
assert(!!piix != !!lpc);
|
assert(!!piix != !!lpc);
|
||||||
|
|
||||||
if (piix) {
|
if (piix) {
|
||||||
|
|
|
@ -8,10 +8,15 @@ config LM832X
|
||||||
config PCKBD
|
config PCKBD
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
select PS2
|
||||||
depends on ISA_BUS
|
depends on ISA_BUS
|
||||||
|
|
||||||
config PL050
|
config PL050
|
||||||
bool
|
bool
|
||||||
|
select PS2
|
||||||
|
|
||||||
|
config PS2
|
||||||
|
bool
|
||||||
|
|
||||||
config STELLARIS_INPUT
|
config STELLARIS_INPUT
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -3,7 +3,7 @@ common-obj-y += hid.o
|
||||||
common-obj-$(CONFIG_LM832X) += lm832x.o
|
common-obj-$(CONFIG_LM832X) += lm832x.o
|
||||||
common-obj-$(CONFIG_PCKBD) += pckbd.o
|
common-obj-$(CONFIG_PCKBD) += pckbd.o
|
||||||
common-obj-$(CONFIG_PL050) += pl050.o
|
common-obj-$(CONFIG_PL050) += pl050.o
|
||||||
common-obj-y += ps2.o
|
common-obj-$(CONFIG_PS2) += ps2.o
|
||||||
common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
|
common-obj-$(CONFIG_STELLARIS_INPUT) += stellaris_input.o
|
||||||
common-obj-$(CONFIG_TSC2005) += tsc2005.o
|
common-obj-$(CONFIG_TSC2005) += tsc2005.o
|
||||||
|
|
||||||
|
|
|
@ -139,6 +139,15 @@ static void ioapic_service(IOAPICCommonState *s)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#define SUCCESSIVE_IRQ_MAX_COUNT 10000
|
||||||
|
|
||||||
|
static void delayed_ioapic_service_cb(void *opaque)
|
||||||
|
{
|
||||||
|
IOAPICCommonState *s = opaque;
|
||||||
|
|
||||||
|
ioapic_service(s);
|
||||||
|
}
|
||||||
|
|
||||||
static void ioapic_set_irq(void *opaque, int vector, int level)
|
static void ioapic_set_irq(void *opaque, int vector, int level)
|
||||||
{
|
{
|
||||||
IOAPICCommonState *s = opaque;
|
IOAPICCommonState *s = opaque;
|
||||||
|
@ -222,13 +231,39 @@ void ioapic_eoi_broadcast(int vector)
|
||||||
}
|
}
|
||||||
for (n = 0; n < IOAPIC_NUM_PINS; n++) {
|
for (n = 0; n < IOAPIC_NUM_PINS; n++) {
|
||||||
entry = s->ioredtbl[n];
|
entry = s->ioredtbl[n];
|
||||||
if ((entry & IOAPIC_LVT_REMOTE_IRR)
|
|
||||||
&& (entry & IOAPIC_VECTOR_MASK) == vector) {
|
if ((entry & IOAPIC_VECTOR_MASK) != vector ||
|
||||||
trace_ioapic_clear_remote_irr(n, vector);
|
((entry >> IOAPIC_LVT_TRIGGER_MODE_SHIFT) & 1) != IOAPIC_TRIGGER_LEVEL) {
|
||||||
s->ioredtbl[n] = entry & ~IOAPIC_LVT_REMOTE_IRR;
|
continue;
|
||||||
if (!(entry & IOAPIC_LVT_MASKED) && (s->irr & (1 << n))) {
|
}
|
||||||
|
|
||||||
|
if (!(entry & IOAPIC_LVT_REMOTE_IRR)) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
trace_ioapic_clear_remote_irr(n, vector);
|
||||||
|
s->ioredtbl[n] = entry & ~IOAPIC_LVT_REMOTE_IRR;
|
||||||
|
|
||||||
|
if (!(entry & IOAPIC_LVT_MASKED) && (s->irr & (1 << n))) {
|
||||||
|
++s->irq_eoi[vector];
|
||||||
|
if (s->irq_eoi[vector] >= SUCCESSIVE_IRQ_MAX_COUNT) {
|
||||||
|
/*
|
||||||
|
* Real hardware does not deliver the interrupt immediately
|
||||||
|
* during eoi broadcast, and this lets a buggy guest make
|
||||||
|
* slow progress even if it does not correctly handle a
|
||||||
|
* level-triggered interrupt. Emulate this behavior if we
|
||||||
|
* detect an interrupt storm.
|
||||||
|
*/
|
||||||
|
s->irq_eoi[vector] = 0;
|
||||||
|
timer_mod_anticipate(s->delayed_ioapic_service_timer,
|
||||||
|
qemu_clock_get_ns(QEMU_CLOCK_VIRTUAL) +
|
||||||
|
NANOSECONDS_PER_SECOND / 100);
|
||||||
|
trace_ioapic_eoi_delayed_reassert(vector);
|
||||||
|
} else {
|
||||||
ioapic_service(s);
|
ioapic_service(s);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
s->irq_eoi[vector] = 0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -401,6 +436,9 @@ static void ioapic_realize(DeviceState *dev, Error **errp)
|
||||||
memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
|
memory_region_init_io(&s->io_memory, OBJECT(s), &ioapic_io_ops, s,
|
||||||
"ioapic", 0x1000);
|
"ioapic", 0x1000);
|
||||||
|
|
||||||
|
s->delayed_ioapic_service_timer =
|
||||||
|
timer_new_ns(QEMU_CLOCK_VIRTUAL, delayed_ioapic_service_cb, s);
|
||||||
|
|
||||||
qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
|
qdev_init_gpio_in(dev, ioapic_set_irq, IOAPIC_NUM_PINS);
|
||||||
|
|
||||||
ioapics[ioapic_no] = s;
|
ioapics[ioapic_no] = s;
|
||||||
|
@ -408,6 +446,14 @@ static void ioapic_realize(DeviceState *dev, Error **errp)
|
||||||
qemu_add_machine_init_done_notifier(&s->machine_done);
|
qemu_add_machine_init_done_notifier(&s->machine_done);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void ioapic_unrealize(DeviceState *dev, Error **errp)
|
||||||
|
{
|
||||||
|
IOAPICCommonState *s = IOAPIC_COMMON(dev);
|
||||||
|
|
||||||
|
timer_del(s->delayed_ioapic_service_timer);
|
||||||
|
timer_free(s->delayed_ioapic_service_timer);
|
||||||
|
}
|
||||||
|
|
||||||
static Property ioapic_properties[] = {
|
static Property ioapic_properties[] = {
|
||||||
DEFINE_PROP_UINT8("version", IOAPICCommonState, version, IOAPIC_VER_DEF),
|
DEFINE_PROP_UINT8("version", IOAPICCommonState, version, IOAPIC_VER_DEF),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
@ -419,6 +465,7 @@ static void ioapic_class_init(ObjectClass *klass, void *data)
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
|
||||||
k->realize = ioapic_realize;
|
k->realize = ioapic_realize;
|
||||||
|
k->unrealize = ioapic_unrealize;
|
||||||
/*
|
/*
|
||||||
* If APIC is in kernel, we need to update the kernel cache after
|
* If APIC is in kernel, we need to update the kernel cache after
|
||||||
* migration, otherwise first 24 gsi routes will be invalid.
|
* migration, otherwise first 24 gsi routes will be invalid.
|
||||||
|
|
|
@ -25,6 +25,7 @@ apic_mem_writel(uint64_t addr, uint32_t val) "0x%"PRIx64" = 0x%08x"
|
||||||
ioapic_set_remote_irr(int n) "set remote irr for pin %d"
|
ioapic_set_remote_irr(int n) "set remote irr for pin %d"
|
||||||
ioapic_clear_remote_irr(int n, int vector) "clear remote irr for pin %d vector %d"
|
ioapic_clear_remote_irr(int n, int vector) "clear remote irr for pin %d vector %d"
|
||||||
ioapic_eoi_broadcast(int vector) "EOI broadcast for vector %d"
|
ioapic_eoi_broadcast(int vector) "EOI broadcast for vector %d"
|
||||||
|
ioapic_eoi_delayed_reassert(int vector) "delayed reassert on EOI broadcast for vector %d"
|
||||||
ioapic_mem_read(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapic mem read addr 0x%"PRIx8" regsel: 0x%"PRIx8" size 0x%"PRIx8" retval 0x%"PRIx32
|
ioapic_mem_read(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapic mem read addr 0x%"PRIx8" regsel: 0x%"PRIx8" size 0x%"PRIx8" retval 0x%"PRIx32
|
||||||
ioapic_mem_write(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapic mem write addr 0x%"PRIx8" regsel: 0x%"PRIx8" size 0x%"PRIx8" val 0x%"PRIx32
|
ioapic_mem_write(uint8_t addr, uint8_t regsel, uint8_t size, uint32_t val) "ioapic mem write addr 0x%"PRIx8" regsel: 0x%"PRIx8" size 0x%"PRIx8" val 0x%"PRIx32
|
||||||
ioapic_set_irq(int vector, int level) "vector: %d level: %d"
|
ioapic_set_irq(int vector, int level) "vector: %d level: %d"
|
||||||
|
|
|
@ -624,17 +624,6 @@ static const MemoryRegionOps ich9_rst_cnt_ops = {
|
||||||
.endianness = DEVICE_LITTLE_ENDIAN
|
.endianness = DEVICE_LITTLE_ENDIAN
|
||||||
};
|
};
|
||||||
|
|
||||||
Object *ich9_lpc_find(void)
|
|
||||||
{
|
|
||||||
bool ambig;
|
|
||||||
Object *o = object_resolve_path_type("", TYPE_ICH9_LPC_DEVICE, &ambig);
|
|
||||||
|
|
||||||
if (ambig) {
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
return o;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ich9_lpc_get_sci_int(Object *obj, Visitor *v, const char *name,
|
static void ich9_lpc_get_sci_int(Object *obj, Visitor *v, const char *name,
|
||||||
void *opaque, Error **errp)
|
void *opaque, Error **errp)
|
||||||
{
|
{
|
||||||
|
|
|
@ -349,10 +349,12 @@ static void mips_fulong2e_init(MachineState *machine)
|
||||||
&smbus, &isa_bus);
|
&smbus, &isa_bus);
|
||||||
|
|
||||||
/* GPU */
|
/* GPU */
|
||||||
dev = DEVICE(pci_create(pci_bus, -1, "ati-vga"));
|
if (vga_interface_type != VGA_NONE) {
|
||||||
qdev_prop_set_uint32(dev, "vgamem_mb", 16);
|
dev = DEVICE(pci_create(pci_bus, -1, "ati-vga"));
|
||||||
qdev_prop_set_uint16(dev, "x-device-id", 0x5159);
|
qdev_prop_set_uint32(dev, "vgamem_mb", 16);
|
||||||
qdev_init_nofail(dev);
|
qdev_prop_set_uint16(dev, "x-device-id", 0x5159);
|
||||||
|
qdev_init_nofail(dev);
|
||||||
|
}
|
||||||
|
|
||||||
/* Populate SPD eeprom data */
|
/* Populate SPD eeprom data */
|
||||||
spd_data = spd_data_generate(DDR, ram_size, &err);
|
spd_data = spd_data_generate(DDR, ram_size, &err);
|
||||||
|
|
|
@ -1,10 +1,14 @@
|
||||||
config DP8393X
|
config DP8393X
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
config NE2000_COMMON
|
||||||
|
bool
|
||||||
|
|
||||||
config NE2000_PCI
|
config NE2000_PCI
|
||||||
bool
|
bool
|
||||||
default y if PCI_DEVICES
|
default y if PCI_DEVICES
|
||||||
depends on PCI
|
depends on PCI
|
||||||
|
select NE2000_COMMON
|
||||||
|
|
||||||
config EEPRO100_PCI
|
config EEPRO100_PCI
|
||||||
bool
|
bool
|
||||||
|
@ -51,8 +55,7 @@ config NE2000_ISA
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
depends on ISA_BUS
|
depends on ISA_BUS
|
||||||
depends on PCI # for NE2000State
|
select NE2000_COMMON
|
||||||
select NE2000_PCI
|
|
||||||
|
|
||||||
config OPENCORES_ETH
|
config OPENCORES_ETH
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
common-obj-$(CONFIG_DP8393X) += dp8393x.o
|
common-obj-$(CONFIG_DP8393X) += dp8393x.o
|
||||||
common-obj-$(CONFIG_XEN) += xen_nic.o
|
common-obj-$(CONFIG_XEN) += xen_nic.o
|
||||||
|
common-obj-$(CONFIG_NE2000_COMMON) += ne2000.o
|
||||||
|
|
||||||
# PCI network cards
|
# PCI network cards
|
||||||
common-obj-$(CONFIG_NE2000_PCI) += ne2000.o
|
common-obj-$(CONFIG_NE2000_PCI) += ne2000-pci.o
|
||||||
common-obj-$(CONFIG_EEPRO100_PCI) += eepro100.o
|
common-obj-$(CONFIG_EEPRO100_PCI) += eepro100.o
|
||||||
common-obj-$(CONFIG_PCNET_PCI) += pcnet-pci.o
|
common-obj-$(CONFIG_PCNET_PCI) += pcnet-pci.o
|
||||||
common-obj-$(CONFIG_PCNET_COMMON) += pcnet.o
|
common-obj-$(CONFIG_PCNET_COMMON) += pcnet.o
|
||||||
|
|
|
@ -0,0 +1,132 @@
|
||||||
|
/*
|
||||||
|
* QEMU NE2000 emulation (PCI bus)
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2004 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 "qemu/osdep.h"
|
||||||
|
#include "hw/pci/pci.h"
|
||||||
|
#include "ne2000.h"
|
||||||
|
#include "sysemu/sysemu.h"
|
||||||
|
|
||||||
|
typedef struct PCINE2000State {
|
||||||
|
PCIDevice dev;
|
||||||
|
NE2000State ne2000;
|
||||||
|
} PCINE2000State;
|
||||||
|
|
||||||
|
static const VMStateDescription vmstate_pci_ne2000 = {
|
||||||
|
.name = "ne2000",
|
||||||
|
.version_id = 3,
|
||||||
|
.minimum_version_id = 3,
|
||||||
|
.fields = (VMStateField[]) {
|
||||||
|
VMSTATE_PCI_DEVICE(dev, PCINE2000State),
|
||||||
|
VMSTATE_STRUCT(ne2000, PCINE2000State, 0, vmstate_ne2000, NE2000State),
|
||||||
|
VMSTATE_END_OF_LIST()
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static NetClientInfo net_ne2000_info = {
|
||||||
|
.type = NET_CLIENT_DRIVER_NIC,
|
||||||
|
.size = sizeof(NICState),
|
||||||
|
.receive = ne2000_receive,
|
||||||
|
};
|
||||||
|
|
||||||
|
static void pci_ne2000_realize(PCIDevice *pci_dev, Error **errp)
|
||||||
|
{
|
||||||
|
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
||||||
|
NE2000State *s;
|
||||||
|
uint8_t *pci_conf;
|
||||||
|
|
||||||
|
pci_conf = d->dev.config;
|
||||||
|
pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
|
||||||
|
|
||||||
|
s = &d->ne2000;
|
||||||
|
ne2000_setup_io(s, DEVICE(pci_dev), 0x100);
|
||||||
|
pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
|
||||||
|
s->irq = pci_allocate_irq(&d->dev);
|
||||||
|
|
||||||
|
qemu_macaddr_default_if_unset(&s->c.macaddr);
|
||||||
|
ne2000_reset(s);
|
||||||
|
|
||||||
|
s->nic = qemu_new_nic(&net_ne2000_info, &s->c,
|
||||||
|
object_get_typename(OBJECT(pci_dev)),
|
||||||
|
pci_dev->qdev.id, s);
|
||||||
|
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void pci_ne2000_exit(PCIDevice *pci_dev)
|
||||||
|
{
|
||||||
|
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
||||||
|
NE2000State *s = &d->ne2000;
|
||||||
|
|
||||||
|
qemu_del_nic(s->nic);
|
||||||
|
qemu_free_irq(s->irq);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void ne2000_instance_init(Object *obj)
|
||||||
|
{
|
||||||
|
PCIDevice *pci_dev = PCI_DEVICE(obj);
|
||||||
|
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
||||||
|
NE2000State *s = &d->ne2000;
|
||||||
|
|
||||||
|
device_add_bootindex_property(obj, &s->c.bootindex,
|
||||||
|
"bootindex", "/ethernet-phy@0",
|
||||||
|
&pci_dev->qdev, NULL);
|
||||||
|
}
|
||||||
|
|
||||||
|
static Property ne2000_properties[] = {
|
||||||
|
DEFINE_NIC_PROPERTIES(PCINE2000State, ne2000.c),
|
||||||
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ne2000_class_init(ObjectClass *klass, void *data)
|
||||||
|
{
|
||||||
|
DeviceClass *dc = DEVICE_CLASS(klass);
|
||||||
|
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
||||||
|
|
||||||
|
k->realize = pci_ne2000_realize;
|
||||||
|
k->exit = pci_ne2000_exit;
|
||||||
|
k->romfile = "efi-ne2k_pci.rom",
|
||||||
|
k->vendor_id = PCI_VENDOR_ID_REALTEK;
|
||||||
|
k->device_id = PCI_DEVICE_ID_REALTEK_8029;
|
||||||
|
k->class_id = PCI_CLASS_NETWORK_ETHERNET;
|
||||||
|
dc->vmsd = &vmstate_pci_ne2000;
|
||||||
|
dc->props = ne2000_properties;
|
||||||
|
set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
|
||||||
|
}
|
||||||
|
|
||||||
|
static const TypeInfo ne2000_info = {
|
||||||
|
.name = "ne2k_pci",
|
||||||
|
.parent = TYPE_PCI_DEVICE,
|
||||||
|
.instance_size = sizeof(PCINE2000State),
|
||||||
|
.class_init = ne2000_class_init,
|
||||||
|
.instance_init = ne2000_instance_init,
|
||||||
|
.interfaces = (InterfaceInfo[]) {
|
||||||
|
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
||||||
|
{ },
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
static void ne2000_register_types(void)
|
||||||
|
{
|
||||||
|
type_register_static(&ne2000_info);
|
||||||
|
}
|
||||||
|
|
||||||
|
type_init(ne2000_register_types)
|
105
hw/net/ne2000.c
105
hw/net/ne2000.c
|
@ -22,7 +22,6 @@
|
||||||
* THE SOFTWARE.
|
* THE SOFTWARE.
|
||||||
*/
|
*/
|
||||||
#include "qemu/osdep.h"
|
#include "qemu/osdep.h"
|
||||||
#include "hw/pci/pci.h"
|
|
||||||
#include "net/eth.h"
|
#include "net/eth.h"
|
||||||
#include "ne2000.h"
|
#include "ne2000.h"
|
||||||
#include "sysemu/sysemu.h"
|
#include "sysemu/sysemu.h"
|
||||||
|
@ -118,11 +117,6 @@
|
||||||
#define ENTSR_CDH 0x40 /* The collision detect "heartbeat" signal was lost. */
|
#define ENTSR_CDH 0x40 /* The collision detect "heartbeat" signal was lost. */
|
||||||
#define ENTSR_OWC 0x80 /* There was an out-of-window collision. */
|
#define ENTSR_OWC 0x80 /* There was an out-of-window collision. */
|
||||||
|
|
||||||
typedef struct PCINE2000State {
|
|
||||||
PCIDevice dev;
|
|
||||||
NE2000State ne2000;
|
|
||||||
} PCINE2000State;
|
|
||||||
|
|
||||||
void ne2000_reset(NE2000State *s)
|
void ne2000_reset(NE2000State *s)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
@ -644,17 +638,6 @@ const VMStateDescription vmstate_ne2000 = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
static const VMStateDescription vmstate_pci_ne2000 = {
|
|
||||||
.name = "ne2000",
|
|
||||||
.version_id = 3,
|
|
||||||
.minimum_version_id = 3,
|
|
||||||
.fields = (VMStateField[]) {
|
|
||||||
VMSTATE_PCI_DEVICE(dev, PCINE2000State),
|
|
||||||
VMSTATE_STRUCT(ne2000, PCINE2000State, 0, vmstate_ne2000, NE2000State),
|
|
||||||
VMSTATE_END_OF_LIST()
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
static uint64_t ne2000_read(void *opaque, hwaddr addr,
|
static uint64_t ne2000_read(void *opaque, hwaddr addr,
|
||||||
unsigned size)
|
unsigned size)
|
||||||
{
|
{
|
||||||
|
@ -711,91 +694,3 @@ void ne2000_setup_io(NE2000State *s, DeviceState *dev, unsigned size)
|
||||||
{
|
{
|
||||||
memory_region_init_io(&s->io, OBJECT(dev), &ne2000_ops, s, "ne2000", size);
|
memory_region_init_io(&s->io, OBJECT(dev), &ne2000_ops, s, "ne2000", size);
|
||||||
}
|
}
|
||||||
|
|
||||||
static NetClientInfo net_ne2000_info = {
|
|
||||||
.type = NET_CLIENT_DRIVER_NIC,
|
|
||||||
.size = sizeof(NICState),
|
|
||||||
.receive = ne2000_receive,
|
|
||||||
};
|
|
||||||
|
|
||||||
static void pci_ne2000_realize(PCIDevice *pci_dev, Error **errp)
|
|
||||||
{
|
|
||||||
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
|
||||||
NE2000State *s;
|
|
||||||
uint8_t *pci_conf;
|
|
||||||
|
|
||||||
pci_conf = d->dev.config;
|
|
||||||
pci_conf[PCI_INTERRUPT_PIN] = 1; /* interrupt pin A */
|
|
||||||
|
|
||||||
s = &d->ne2000;
|
|
||||||
ne2000_setup_io(s, DEVICE(pci_dev), 0x100);
|
|
||||||
pci_register_bar(&d->dev, 0, PCI_BASE_ADDRESS_SPACE_IO, &s->io);
|
|
||||||
s->irq = pci_allocate_irq(&d->dev);
|
|
||||||
|
|
||||||
qemu_macaddr_default_if_unset(&s->c.macaddr);
|
|
||||||
ne2000_reset(s);
|
|
||||||
|
|
||||||
s->nic = qemu_new_nic(&net_ne2000_info, &s->c,
|
|
||||||
object_get_typename(OBJECT(pci_dev)), pci_dev->qdev.id, s);
|
|
||||||
qemu_format_nic_info_str(qemu_get_queue(s->nic), s->c.macaddr.a);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void pci_ne2000_exit(PCIDevice *pci_dev)
|
|
||||||
{
|
|
||||||
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
|
||||||
NE2000State *s = &d->ne2000;
|
|
||||||
|
|
||||||
qemu_del_nic(s->nic);
|
|
||||||
qemu_free_irq(s->irq);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void ne2000_instance_init(Object *obj)
|
|
||||||
{
|
|
||||||
PCIDevice *pci_dev = PCI_DEVICE(obj);
|
|
||||||
PCINE2000State *d = DO_UPCAST(PCINE2000State, dev, pci_dev);
|
|
||||||
NE2000State *s = &d->ne2000;
|
|
||||||
|
|
||||||
device_add_bootindex_property(obj, &s->c.bootindex,
|
|
||||||
"bootindex", "/ethernet-phy@0",
|
|
||||||
&pci_dev->qdev, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static Property ne2000_properties[] = {
|
|
||||||
DEFINE_NIC_PROPERTIES(PCINE2000State, ne2000.c),
|
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ne2000_class_init(ObjectClass *klass, void *data)
|
|
||||||
{
|
|
||||||
DeviceClass *dc = DEVICE_CLASS(klass);
|
|
||||||
PCIDeviceClass *k = PCI_DEVICE_CLASS(klass);
|
|
||||||
|
|
||||||
k->realize = pci_ne2000_realize;
|
|
||||||
k->exit = pci_ne2000_exit;
|
|
||||||
k->romfile = "efi-ne2k_pci.rom",
|
|
||||||
k->vendor_id = PCI_VENDOR_ID_REALTEK;
|
|
||||||
k->device_id = PCI_DEVICE_ID_REALTEK_8029;
|
|
||||||
k->class_id = PCI_CLASS_NETWORK_ETHERNET;
|
|
||||||
dc->vmsd = &vmstate_pci_ne2000;
|
|
||||||
dc->props = ne2000_properties;
|
|
||||||
set_bit(DEVICE_CATEGORY_NETWORK, dc->categories);
|
|
||||||
}
|
|
||||||
|
|
||||||
static const TypeInfo ne2000_info = {
|
|
||||||
.name = "ne2k_pci",
|
|
||||||
.parent = TYPE_PCI_DEVICE,
|
|
||||||
.instance_size = sizeof(PCINE2000State),
|
|
||||||
.class_init = ne2000_class_init,
|
|
||||||
.instance_init = ne2000_instance_init,
|
|
||||||
.interfaces = (InterfaceInfo[]) {
|
|
||||||
{ INTERFACE_CONVENTIONAL_PCI_DEVICE },
|
|
||||||
{ },
|
|
||||||
},
|
|
||||||
};
|
|
||||||
|
|
||||||
static void ne2000_register_types(void)
|
|
||||||
{
|
|
||||||
type_register_static(&ne2000_info);
|
|
||||||
}
|
|
||||||
|
|
||||||
type_init(ne2000_register_types)
|
|
||||||
|
|
|
@ -477,7 +477,7 @@ static MegasasCmd *megasas_enqueue_frame(MegasasState *s,
|
||||||
{
|
{
|
||||||
PCIDevice *pcid = PCI_DEVICE(s);
|
PCIDevice *pcid = PCI_DEVICE(s);
|
||||||
MegasasCmd *cmd = NULL;
|
MegasasCmd *cmd = NULL;
|
||||||
int frame_size = MFI_FRAME_SIZE * 16;
|
int frame_size = MEGASAS_MAX_SGE * sizeof(union mfi_sgl);
|
||||||
hwaddr frame_size_p = frame_size;
|
hwaddr frame_size_p = frame_size;
|
||||||
unsigned long index;
|
unsigned long index;
|
||||||
|
|
||||||
|
|
|
@ -850,7 +850,6 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
|
||||||
uint32_t initrd_size;
|
uint32_t initrd_size;
|
||||||
DriveInfo *fd[MAX_FD];
|
DriveInfo *fd[MAX_FD];
|
||||||
FWCfgState *fw_cfg;
|
FWCfgState *fw_cfg;
|
||||||
unsigned int num_vsimms;
|
|
||||||
DeviceState *dev;
|
DeviceState *dev;
|
||||||
SysBusDevice *s;
|
SysBusDevice *s;
|
||||||
|
|
||||||
|
@ -909,8 +908,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
|
||||||
error_report("Unsupported depth: %d", graphic_depth);
|
error_report("Unsupported depth: %d", graphic_depth);
|
||||||
exit (1);
|
exit (1);
|
||||||
}
|
}
|
||||||
num_vsimms = 0;
|
if (vga_interface_type != VGA_NONE) {
|
||||||
if (num_vsimms == 0) {
|
|
||||||
if (vga_interface_type == VGA_CG3) {
|
if (vga_interface_type == VGA_CG3) {
|
||||||
if (graphic_depth != 8) {
|
if (graphic_depth != 8) {
|
||||||
error_report("Unsupported depth: %d", graphic_depth);
|
error_report("Unsupported depth: %d", graphic_depth);
|
||||||
|
@ -945,7 +943,7 @@ static void sun4m_hw_init(const struct sun4m_hwdef *hwdef,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = num_vsimms; i < MAX_VSIMMS; i++) {
|
for (i = 0; i < MAX_VSIMMS; i++) {
|
||||||
/* vsimm registers probed by OBP */
|
/* vsimm registers probed by OBP */
|
||||||
if (hwdef->vsimm[i].reg_base) {
|
if (hwdef->vsimm[i].reg_base) {
|
||||||
empty_slot_init(hwdef->vsimm[i].reg_base, 0x2000);
|
empty_slot_init(hwdef->vsimm[i].reg_base, 0x2000);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#ifndef HW_ACPI_PIIX4_H
|
#ifndef HW_ACPI_PIIX4_H
|
||||||
#define HW_ACPI_PIIX4_H
|
#define HW_ACPI_PIIX4_H
|
||||||
|
|
||||||
Object *piix4_pm_find(void);
|
#define TYPE_PIIX4_PM "PIIX4_PM"
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -81,8 +81,6 @@ typedef struct ICH9LPCState {
|
||||||
qemu_irq gsi[GSI_NUM_PINS];
|
qemu_irq gsi[GSI_NUM_PINS];
|
||||||
} ICH9LPCState;
|
} ICH9LPCState;
|
||||||
|
|
||||||
Object *ich9_lpc_find(void);
|
|
||||||
|
|
||||||
#define Q35_MASK(bit, ms_bit, ls_bit) \
|
#define Q35_MASK(bit, ms_bit, ls_bit) \
|
||||||
((uint##bit##_t)(((1ULL << ((ms_bit) + 1)) - 1) & ~((1ULL << ls_bit) - 1)))
|
((uint##bit##_t)(((1ULL << ((ms_bit) + 1)) - 1) & ~((1ULL << ls_bit) - 1)))
|
||||||
|
|
||||||
|
|
|
@ -96,6 +96,7 @@ typedef struct IOAPICCommonClass {
|
||||||
SysBusDeviceClass parent_class;
|
SysBusDeviceClass parent_class;
|
||||||
|
|
||||||
DeviceRealize realize;
|
DeviceRealize realize;
|
||||||
|
DeviceUnrealize unrealize;
|
||||||
void (*pre_save)(IOAPICCommonState *s);
|
void (*pre_save)(IOAPICCommonState *s);
|
||||||
void (*post_load)(IOAPICCommonState *s);
|
void (*post_load)(IOAPICCommonState *s);
|
||||||
} IOAPICCommonClass;
|
} IOAPICCommonClass;
|
||||||
|
@ -111,6 +112,8 @@ struct IOAPICCommonState {
|
||||||
uint8_t version;
|
uint8_t version;
|
||||||
uint64_t irq_count[IOAPIC_NUM_PINS];
|
uint64_t irq_count[IOAPIC_NUM_PINS];
|
||||||
int irq_level[IOAPIC_NUM_PINS];
|
int irq_level[IOAPIC_NUM_PINS];
|
||||||
|
int irq_eoi[IOAPIC_NUM_PINS];
|
||||||
|
QEMUTimer *delayed_ioapic_service_timer;
|
||||||
};
|
};
|
||||||
|
|
||||||
void ioapic_reset_common(DeviceState *dev);
|
void ioapic_reset_common(DeviceState *dev);
|
||||||
|
|
4
memory.c
4
memory.c
|
@ -2584,7 +2584,7 @@ void memory_global_dirty_log_start(void)
|
||||||
|
|
||||||
MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
|
MEMORY_LISTENER_CALL_GLOBAL(log_global_start, Forward);
|
||||||
|
|
||||||
/* Refresh DIRTY_LOG_MIGRATION bit. */
|
/* Refresh DIRTY_MEMORY_MIGRATION bit. */
|
||||||
memory_region_transaction_begin();
|
memory_region_transaction_begin();
|
||||||
memory_region_update_pending = true;
|
memory_region_update_pending = true;
|
||||||
memory_region_transaction_commit();
|
memory_region_transaction_commit();
|
||||||
|
@ -2594,7 +2594,7 @@ static void memory_global_dirty_log_do_stop(void)
|
||||||
{
|
{
|
||||||
global_dirty_log = false;
|
global_dirty_log = false;
|
||||||
|
|
||||||
/* Refresh DIRTY_LOG_MIGRATION bit. */
|
/* Refresh DIRTY_MEMORY_MIGRATION bit. */
|
||||||
memory_region_transaction_begin();
|
memory_region_transaction_begin();
|
||||||
memory_region_update_pending = true;
|
memory_region_update_pending = true;
|
||||||
memory_region_transaction_commit();
|
memory_region_transaction_commit();
|
||||||
|
|
|
@ -72,6 +72,11 @@ backend settings instead of environment variables. To ease migration to
|
||||||
the new format, the ``-audiodev-help'' option can be used to convert
|
the new format, the ``-audiodev-help'' option can be used to convert
|
||||||
the current values of the environment variables to ``-audiodev'' options.
|
the current values of the environment variables to ``-audiodev'' options.
|
||||||
|
|
||||||
|
@subsection -realtime (since 4.1)
|
||||||
|
|
||||||
|
The @code{-realtime mlock=on|off} argument has been replaced by the
|
||||||
|
@code{-overcommit mem-lock=on|off} argument.
|
||||||
|
|
||||||
@section QEMU Machine Protocol (QMP) commands
|
@section QEMU Machine Protocol (QMP) commands
|
||||||
|
|
||||||
@subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0)
|
@subsection block-dirty-bitmap-add "autoload" parameter (since 2.12.0)
|
||||||
|
|
|
@ -708,6 +708,7 @@ int hvf_vcpu_exec(CPUState *cpu)
|
||||||
!(idtvec_info & VMCS_IDT_VEC_VALID)) {
|
!(idtvec_info & VMCS_IDT_VEC_VALID)) {
|
||||||
cpu->halted = 1;
|
cpu->halted = 1;
|
||||||
ret = EXCP_HLT;
|
ret = EXCP_HLT;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
ret = EXCP_INTERRUPT;
|
ret = EXCP_INTERRUPT;
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -12,7 +12,7 @@ obj-$(call lnot,$(CONFIG_TCG)) += tcg-stub.o
|
||||||
feat-src = $(SRC_PATH)/target/$(TARGET_BASE_ARCH)/
|
feat-src = $(SRC_PATH)/target/$(TARGET_BASE_ARCH)/
|
||||||
feat-dst = $(BUILD_DIR)/$(TARGET_DIR)
|
feat-dst = $(BUILD_DIR)/$(TARGET_DIR)
|
||||||
ifneq ($(MAKECMDGOALS),clean)
|
ifneq ($(MAKECMDGOALS),clean)
|
||||||
GENERATED_FILES += $(feat-dst)gen-features.h
|
generated-files-y += $(feat-dst)gen-features.h
|
||||||
endif
|
endif
|
||||||
|
|
||||||
$(feat-dst)gen-features.h: $(feat-dst)gen-features.h-timestamp
|
$(feat-dst)gen-features.h: $(feat-dst)gen-features.h-timestamp
|
||||||
|
|
|
@ -45,7 +45,7 @@ SYSEMU_TARGET_LIST := $(subst -softmmu.mak,,$(notdir \
|
||||||
|
|
||||||
check-unit-y += tests/check-qdict$(EXESUF)
|
check-unit-y += tests/check-qdict$(EXESUF)
|
||||||
check-unit-y += tests/check-block-qdict$(EXESUF)
|
check-unit-y += tests/check-block-qdict$(EXESUF)
|
||||||
check-unit-y += tests/test-char$(EXESUF)
|
check-unit-$(CONFIG_SOFTMMU) += tests/test-char$(EXESUF)
|
||||||
check-unit-y += tests/check-qnum$(EXESUF)
|
check-unit-y += tests/check-qnum$(EXESUF)
|
||||||
check-unit-y += tests/check-qstring$(EXESUF)
|
check-unit-y += tests/check-qstring$(EXESUF)
|
||||||
check-unit-y += tests/check-qlist$(EXESUF)
|
check-unit-y += tests/check-qlist$(EXESUF)
|
||||||
|
@ -61,21 +61,21 @@ check-unit-y += tests/test-string-input-visitor$(EXESUF)
|
||||||
check-unit-y += tests/test-string-output-visitor$(EXESUF)
|
check-unit-y += tests/test-string-output-visitor$(EXESUF)
|
||||||
check-unit-y += tests/test-qmp-event$(EXESUF)
|
check-unit-y += tests/test-qmp-event$(EXESUF)
|
||||||
check-unit-y += tests/test-opts-visitor$(EXESUF)
|
check-unit-y += tests/test-opts-visitor$(EXESUF)
|
||||||
check-unit-y += tests/test-coroutine$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-coroutine$(EXESUF)
|
||||||
check-unit-y += tests/test-visitor-serialization$(EXESUF)
|
check-unit-y += tests/test-visitor-serialization$(EXESUF)
|
||||||
check-unit-y += tests/test-iov$(EXESUF)
|
check-unit-y += tests/test-iov$(EXESUF)
|
||||||
check-unit-y += tests/test-aio$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-aio$(EXESUF)
|
||||||
check-unit-y += tests/test-aio-multithread$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-aio-multithread$(EXESUF)
|
||||||
check-unit-y += tests/test-throttle$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-throttle$(EXESUF)
|
||||||
check-unit-y += tests/test-thread-pool$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-thread-pool$(EXESUF)
|
||||||
check-unit-y += tests/test-hbitmap$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-hbitmap$(EXESUF)
|
||||||
check-unit-y += tests/test-bdrv-drain$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-bdrv-drain$(EXESUF)
|
||||||
check-unit-y += tests/test-bdrv-graph-mod$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-bdrv-graph-mod$(EXESUF)
|
||||||
check-unit-y += tests/test-blockjob$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-blockjob$(EXESUF)
|
||||||
check-unit-y += tests/test-blockjob-txn$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-blockjob-txn$(EXESUF)
|
||||||
check-unit-y += tests/test-block-backend$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-block-backend$(EXESUF)
|
||||||
check-unit-y += tests/test-block-iothread$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-block-iothread$(EXESUF)
|
||||||
check-unit-y += tests/test-image-locking$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-image-locking$(EXESUF)
|
||||||
check-unit-y += tests/test-x86-cpuid$(EXESUF)
|
check-unit-y += tests/test-x86-cpuid$(EXESUF)
|
||||||
# all code tested by test-x86-cpuid is inside topology.h
|
# all code tested by test-x86-cpuid is inside topology.h
|
||||||
ifeq ($(CONFIG_SOFTMMU),y)
|
ifeq ($(CONFIG_SOFTMMU),y)
|
||||||
|
@ -101,40 +101,40 @@ check-unit-y += tests/check-qom-interface$(EXESUF)
|
||||||
check-unit-y += tests/check-qom-proplist$(EXESUF)
|
check-unit-y += tests/check-qom-proplist$(EXESUF)
|
||||||
check-unit-y += tests/test-qemu-opts$(EXESUF)
|
check-unit-y += tests/test-qemu-opts$(EXESUF)
|
||||||
check-unit-y += tests/test-keyval$(EXESUF)
|
check-unit-y += tests/test-keyval$(EXESUF)
|
||||||
check-unit-y += tests/test-write-threshold$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-write-threshold$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-hash$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-hash$(EXESUF)
|
||||||
check-speed-y += tests/benchmark-crypto-hash$(EXESUF)
|
check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hash$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-hmac$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-hmac$(EXESUF)
|
||||||
check-speed-y += tests/benchmark-crypto-hmac$(EXESUF)
|
check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-hmac$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-cipher$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-cipher$(EXESUF)
|
||||||
check-speed-y += tests/benchmark-crypto-cipher$(EXESUF)
|
check-speed-$(CONFIG_BLOCK) += tests/benchmark-crypto-cipher$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-secret$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-secret$(EXESUF)
|
||||||
check-unit-$(CONFIG_GNUTLS) += tests/test-crypto-tlscredsx509$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-crypto-tlscredsx509$(EXESUF)
|
||||||
check-unit-$(CONFIG_GNUTLS) += tests/test-crypto-tlssession$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-crypto-tlssession$(EXESUF)
|
||||||
ifneq (,$(findstring qemu-ga,$(TOOLS)))
|
ifneq (,$(findstring qemu-ga,$(TOOLS)))
|
||||||
check-unit-$(call land,$(CONFIG_LINUX),$(CONFIG_VIRTIO_SERIAL)) += tests/test-qga$(EXESUF)
|
check-unit-$(call land,$(CONFIG_LINUX),$(CONFIG_VIRTIO_SERIAL)) += tests/test-qga$(EXESUF)
|
||||||
endif
|
endif
|
||||||
check-unit-y += tests/test-timed-average$(EXESUF)
|
check-unit-y += tests/test-timed-average$(EXESUF)
|
||||||
check-unit-$(CONFIG_INOTIFY1) += tests/test-util-filemonitor$(EXESUF)
|
check-unit-$(CONFIG_INOTIFY1) += tests/test-util-filemonitor$(EXESUF)
|
||||||
check-unit-y += tests/test-util-sockets$(EXESUF)
|
check-unit-y += tests/test-util-sockets$(EXESUF)
|
||||||
check-unit-y += tests/test-authz-simple$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-authz-simple$(EXESUF)
|
||||||
check-unit-y += tests/test-authz-list$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-authz-list$(EXESUF)
|
||||||
check-unit-y += tests/test-authz-listfile$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-authz-listfile$(EXESUF)
|
||||||
check-unit-$(CONFIG_AUTH_PAM) += tests/test-authz-pam$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_AUTH_PAM)) += tests/test-authz-pam$(EXESUF)
|
||||||
check-unit-y += tests/test-io-task$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-io-task$(EXESUF)
|
||||||
check-unit-y += tests/test-io-channel-socket$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-socket$(EXESUF)
|
||||||
check-unit-y += tests/test-io-channel-file$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-file$(EXESUF)
|
||||||
check-unit-$(CONFIG_GNUTLS) += tests/test-io-channel-tls$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_GNUTLS)) += tests/test-io-channel-tls$(EXESUF)
|
||||||
check-unit-y += tests/test-io-channel-command$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-command$(EXESUF)
|
||||||
check-unit-y += tests/test-io-channel-buffer$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-io-channel-buffer$(EXESUF)
|
||||||
check-unit-y += tests/test-base64$(EXESUF)
|
check-unit-y += tests/test-base64$(EXESUF)
|
||||||
check-unit-$(if $(CONFIG_NETTLE),y,$(CONFIG_GCRYPT)) += tests/test-crypto-pbkdf$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(if $(CONFIG_NETTLE),y,$(CONFIG_GCRYPT))) += tests/test-crypto-pbkdf$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-ivgen$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-ivgen$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-afsplit$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-afsplit$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-xts$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-xts$(EXESUF)
|
||||||
check-unit-y += tests/test-crypto-block$(EXESUF)
|
check-unit-$(CONFIG_BLOCK) += tests/test-crypto-block$(EXESUF)
|
||||||
check-unit-y += tests/test-logging$(EXESUF)
|
check-unit-y += tests/test-logging$(EXESUF)
|
||||||
check-unit-$(CONFIG_REPLICATION) += tests/test-replication$(EXESUF)
|
check-unit-$(call land,$(CONFIG_BLOCK),$(CONFIG_REPLICATION)) += tests/test-replication$(EXESUF)
|
||||||
check-unit-y += tests/test-bufferiszero$(EXESUF)
|
check-unit-y += tests/test-bufferiszero$(EXESUF)
|
||||||
check-unit-y += tests/test-uuid$(EXESUF)
|
check-unit-y += tests/test-uuid$(EXESUF)
|
||||||
check-unit-y += tests/ptimer-test$(EXESUF)
|
check-unit-y += tests/ptimer-test$(EXESUF)
|
||||||
|
@ -468,19 +468,19 @@ qapi-schema += unknown-expr-key.json
|
||||||
|
|
||||||
check-qapi-schema-y := $(addprefix tests/qapi-schema/, $(qapi-schema))
|
check-qapi-schema-y := $(addprefix tests/qapi-schema/, $(qapi-schema))
|
||||||
|
|
||||||
GENERATED_FILES += tests/test-qapi-types.h \
|
generated-files-y += tests/test-qapi-types.h
|
||||||
tests/include/test-qapi-types-sub-module.h \
|
generated-files-y += tests/include/test-qapi-types-sub-module.h
|
||||||
tests/test-qapi-types-sub-sub-module.h \
|
generated-files-y += tests/test-qapi-types-sub-sub-module.h
|
||||||
tests/test-qapi-visit.h \
|
generated-files-y += tests/test-qapi-visit.h
|
||||||
tests/include/test-qapi-visit-sub-module.h \
|
generated-files-y += tests/include/test-qapi-visit-sub-module.h
|
||||||
tests/test-qapi-visit-sub-sub-module.h \
|
generated-files-y += tests/test-qapi-visit-sub-sub-module.h
|
||||||
tests/test-qapi-commands.h \
|
generated-files-y += tests/test-qapi-commands.h
|
||||||
tests/include/test-qapi-commands-sub-module.h \
|
generated-files-y += tests/include/test-qapi-commands-sub-module.h
|
||||||
tests/test-qapi-commands-sub-sub-module.h \
|
generated-files-y += tests/test-qapi-commands-sub-sub-module.h
|
||||||
tests/test-qapi-events.h \
|
generated-files-y += tests/test-qapi-events.h
|
||||||
tests/include/test-qapi-events-sub-module.h \
|
generated-files-y += tests/include/test-qapi-events-sub-module.h
|
||||||
tests/test-qapi-events-sub-sub-module.h \
|
generated-files-y += tests/test-qapi-events-sub-sub-module.h
|
||||||
tests/test-qapi-introspect.h
|
generated-files-y += tests/test-qapi-introspect.h
|
||||||
|
|
||||||
QEMU_CFLAGS += -I$(SRC_PATH)/tests
|
QEMU_CFLAGS += -I$(SRC_PATH)/tests
|
||||||
|
|
||||||
|
@ -496,11 +496,11 @@ test-qapi-obj-y = tests/test-qapi-types.o \
|
||||||
tests/test-qapi-visit-sub-sub-module.o \
|
tests/test-qapi-visit-sub-sub-module.o \
|
||||||
tests/test-qapi-introspect.o \
|
tests/test-qapi-introspect.o \
|
||||||
$(test-qom-obj-y)
|
$(test-qom-obj-y)
|
||||||
benchmark-crypto-obj-y = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y)
|
benchmark-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y)
|
||||||
test-crypto-obj-y = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y)
|
test-crypto-obj-$(CONFIG_BLOCK) = $(authz-obj-y) $(crypto-obj-y) $(test-qom-obj-y)
|
||||||
test-io-obj-y = $(io-obj-y) $(test-crypto-obj-y)
|
test-io-obj-$(CONFIG_BLOCK) = $(io-obj-y) $(test-crypto-obj-y)
|
||||||
test-authz-obj-y = $(test-qom-obj-y) $(authz-obj-y)
|
test-authz-obj-$(CONFIG_BLOCK) = $(test-qom-obj-y) $(authz-obj-y)
|
||||||
test-block-obj-y = $(block-obj-y) $(test-io-obj-y) tests/iothread.o
|
test-block-obj-$(CONFIG_BLOCK) = $(block-obj-y) $(test-io-obj-y) tests/iothread.o
|
||||||
|
|
||||||
tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y)
|
tests/check-qnum$(EXESUF): tests/check-qnum.o $(test-util-obj-y)
|
||||||
tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
|
tests/check-qstring$(EXESUF): tests/check-qstring.o $(test-util-obj-y)
|
||||||
|
|
22
vl.c
22
vl.c
|
@ -2018,6 +2018,7 @@ typedef struct VGAInterfaceInfo {
|
||||||
static const VGAInterfaceInfo vga_interfaces[VGA_TYPE_MAX] = {
|
static const VGAInterfaceInfo vga_interfaces[VGA_TYPE_MAX] = {
|
||||||
[VGA_NONE] = {
|
[VGA_NONE] = {
|
||||||
.opt_name = "none",
|
.opt_name = "none",
|
||||||
|
.name = "no graphic card",
|
||||||
},
|
},
|
||||||
[VGA_STD] = {
|
[VGA_STD] = {
|
||||||
.opt_name = "std",
|
.opt_name = "std",
|
||||||
|
@ -2056,6 +2057,7 @@ static const VGAInterfaceInfo vga_interfaces[VGA_TYPE_MAX] = {
|
||||||
},
|
},
|
||||||
[VGA_XENFB] = {
|
[VGA_XENFB] = {
|
||||||
.opt_name = "xenfb",
|
.opt_name = "xenfb",
|
||||||
|
.name = "Xen paravirtualized framebuffer",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3894,17 +3896,19 @@ int main(int argc, char **argv, char **envp)
|
||||||
qtest_log = optarg;
|
qtest_log = optarg;
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_sandbox:
|
case QEMU_OPTION_sandbox:
|
||||||
#ifdef CONFIG_SECCOMP
|
olist = qemu_find_opts("sandbox");
|
||||||
opts = qemu_opts_parse_noisily(qemu_find_opts("sandbox"),
|
if (!olist) {
|
||||||
optarg, true);
|
#ifndef CONFIG_SECCOMP
|
||||||
|
error_report("-sandbox support is not enabled "
|
||||||
|
"in this QEMU binary");
|
||||||
|
#endif
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
opts = qemu_opts_parse_noisily(olist, optarg, true);
|
||||||
if (!opts) {
|
if (!opts) {
|
||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
error_report("-sandbox support is not enabled "
|
|
||||||
"in this QEMU binary");
|
|
||||||
exit(1);
|
|
||||||
#endif
|
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_add_fd:
|
case QEMU_OPTION_add_fd:
|
||||||
#ifndef _WIN32
|
#ifndef _WIN32
|
||||||
|
@ -3927,6 +3931,8 @@ int main(int argc, char **argv, char **envp)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case QEMU_OPTION_realtime:
|
case QEMU_OPTION_realtime:
|
||||||
|
warn_report("'-realtime mlock=...' is deprecated, please use "
|
||||||
|
"'-overcommit mem-lock=...' instead");
|
||||||
opts = qemu_opts_parse_noisily(qemu_find_opts("realtime"),
|
opts = qemu_opts_parse_noisily(qemu_find_opts("realtime"),
|
||||||
optarg, false);
|
optarg, false);
|
||||||
if (!opts) {
|
if (!opts) {
|
||||||
|
|
Loading…
Reference in New Issue