* target/i386: miscellaneous changes, mostly TCG-related
* fix --without-default-devices build * fix --without-default-devices qtests on s390x and arm -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmY+JWIUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroOGmwf+JKY/i7ihXvfINQIRSKaz+H7KM3Br BGv/iXj4hrRA+zflcZswwoWmPrkrXM3J5JqGG6zTqqhGne+fRKt60KBFwn+lRaMY n48icR4zOSaEcGKBOFKs9CB1JgL7SWMe+fZ8d02amYlIZ005af0d69ACenF9r/oX pTxYIrR90FdZStbF4Yl0G5CzMLBdHZd/b6bMNmbefVPv3/d2zuL7VgqLX3y3J0ee ASYkYjn8Wpda4KX9s2rvH9ENXj80Q7EqhuDvoBlyK72/2lE5aTojbUiyGB4n5AuX 5OHA+0HEpuCXXToijOeDXD1NDOk9E5DP8cEwwZfZ2gjWKjja0U6OODGLVw== =woTe -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * target/i386: miscellaneous changes, mostly TCG-related * fix --without-default-devices build * fix --without-default-devices qtests on s390x and arm # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmY+JWIUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroOGmwf+JKY/i7ihXvfINQIRSKaz+H7KM3Br # BGv/iXj4hrRA+zflcZswwoWmPrkrXM3J5JqGG6zTqqhGne+fRKt60KBFwn+lRaMY # n48icR4zOSaEcGKBOFKs9CB1JgL7SWMe+fZ8d02amYlIZ005af0d69ACenF9r/oX # pTxYIrR90FdZStbF4Yl0G5CzMLBdHZd/b6bMNmbefVPv3/d2zuL7VgqLX3y3J0ee # ASYkYjn8Wpda4KX9s2rvH9ENXj80Q7EqhuDvoBlyK72/2lE5aTojbUiyGB4n5AuX # 5OHA+0HEpuCXXToijOeDXD1NDOk9E5DP8cEwwZfZ2gjWKjja0U6OODGLVw== # =woTe # -----END PGP SIGNATURE----- # gpg: Signature made Fri 10 May 2024 03:47:14 PM CEST # gpg: using RSA key F13338574B662389866C7682BFFBD25F78C7AE83 # gpg: issuer "pbonzini@redhat.com" # gpg: Good signature from "Paolo Bonzini <bonzini@gnu.org>" [full] # gpg: aka "Paolo Bonzini <pbonzini@redhat.com>" [full] * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (27 commits) configs: disable emulators that require it if libfdt is not found hw/xtensa: require libfdt kconfig: express dependency of individual boards on libfdt kconfig: allow compiling out QEMU device tree code per target meson: move libfdt together with other dependencies meson: pick libfdt from common_ss when building target-specific files tests/qtest: arm: fix operation in a build without any boards or devices i386: select correct components for no-board build hw/i386: move rtc-reset-reinjection command out of hw/rtc hw/i386: split x86.c in multiple parts i386: pc: remove unnecessary MachineClass overrides i386: correctly select code in hw/i386 that depends on other components xen: register legacy backends via xen_backend_init xen: initialize legacy backends from xen_bus_init() tests/qtest: s390x: fix operation in a build without any boards or devices s390x: select correct components for no-board build s390: move css_migration_enabled from machine to css.c s390_flic: add migration-enabled property s390x: move s390_cpu_addr2state to target/s390x/sigp.c sh4: select correct components for no-board build ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
9360070196
@ -648,9 +648,9 @@ build-tci:
|
||||
- make check-tcg
|
||||
|
||||
# Check our reduced build configurations
|
||||
# requires libfdt: aarch64, arm, i386, loongarch64, microblaze, microblazeel,
|
||||
# mips64el, or1k, ppc, ppc64, riscv32, riscv64, rx, x86_64
|
||||
# does not build without boards: i386, s390x, sh4, sh4eb, x86_64
|
||||
# requires libfdt: aarch64, arm, loongarch64, microblaze, microblazeel,
|
||||
# or1k, ppc64, riscv32, riscv64, rx
|
||||
# fails qtest without boards: i386, x86_64
|
||||
build-without-defaults:
|
||||
extends: .native_build_job_template
|
||||
needs:
|
||||
@ -665,7 +665,8 @@ build-without-defaults:
|
||||
--disable-qom-cast-debug
|
||||
--disable-strip
|
||||
TARGETS: alpha-softmmu avr-softmmu cris-softmmu hppa-softmmu m68k-softmmu
|
||||
mips-softmmu mips64-softmmu mipsel-softmmu sparc-softmmu
|
||||
mips-softmmu mips64-softmmu mipsel-softmmu mips64el-softmmu
|
||||
ppc-softmmu s390x-softmmu sh4-softmmu sh4eb-softmmu sparc-softmmu
|
||||
sparc64-softmmu tricore-softmmu xtensa-softmmu xtensaeb-softmmu
|
||||
hexagon-linux-user i386-linux-user s390x-linux-user
|
||||
MAKE_CHECK_ARGS: check
|
||||
|
@ -23,6 +23,9 @@ config IVSHMEM
|
||||
config TPM
|
||||
bool
|
||||
|
||||
config FDT
|
||||
bool
|
||||
|
||||
config VHOST_USER
|
||||
bool
|
||||
|
||||
|
@ -3,4 +3,5 @@ TARGET_BASE_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/aarch64-core.xml gdb-xml/aarch64-fpu.xml gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml gdb-xml/aarch64-pauth.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,4 +1,5 @@
|
||||
TARGET_ARCH=arm
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/arm-core.xml gdb-xml/arm-vfp.xml gdb-xml/arm-vfp3.xml gdb-xml/arm-vfp-sysregs.xml gdb-xml/arm-neon.xml gdb-xml/arm-m-profile.xml gdb-xml/arm-m-profile-mve.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,5 +1,4 @@
|
||||
TARGET_ARCH=i386
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/i386-32bit.xml
|
||||
|
@ -2,4 +2,5 @@ TARGET_ARCH=loongarch64
|
||||
TARGET_BASE_ARCH=loongarch
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/loongarch-base32.xml gdb-xml/loongarch-base64.xml gdb-xml/loongarch-fpu.xml
|
||||
# all boards require libfdt
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,5 +1,6 @@
|
||||
TARGET_ARCH=microblaze
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_XML_FILES=gdb-xml/microblaze-core.xml gdb-xml/microblaze-stack-protect.xml
|
||||
|
@ -1,4 +1,5 @@
|
||||
TARGET_ARCH=microblaze
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_XML_FILES=gdb-xml/microblaze-core.xml gdb-xml/microblaze-stack-protect.xml
|
||||
|
@ -1,3 +1,2 @@
|
||||
TARGET_ARCH=mips64
|
||||
TARGET_BASE_ARCH=mips
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,4 +1,5 @@
|
||||
TARGET_ARCH=openrisc
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_BIG_ENDIAN=y
|
||||
# needed by boot.c and all boards
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -2,4 +2,3 @@ TARGET_ARCH=ppc
|
||||
TARGET_BIG_ENDIAN=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/power-core.xml gdb-xml/power-fpu.xml gdb-xml/power-altivec.xml gdb-xml/power-spe.xml
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -4,4 +4,5 @@ TARGET_BIG_ENDIAN=y
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/power64-core.xml gdb-xml/power-fpu.xml gdb-xml/power-altivec.xml gdb-xml/power-spe.xml gdb-xml/power-vsx.xml
|
||||
# all boards require libfdt
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -2,4 +2,5 @@ TARGET_ARCH=riscv32
|
||||
TARGET_BASE_ARCH=riscv
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/riscv-32bit-cpu.xml gdb-xml/riscv-32bit-fpu.xml gdb-xml/riscv-64bit-fpu.xml gdb-xml/riscv-32bit-virtual.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -2,4 +2,5 @@ TARGET_ARCH=riscv64
|
||||
TARGET_BASE_ARCH=riscv
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_XML_FILES= gdb-xml/riscv-64bit-cpu.xml gdb-xml/riscv-32bit-fpu.xml gdb-xml/riscv-64bit-fpu.xml gdb-xml/riscv-64bit-virtual.xml
|
||||
# needed by boot.c
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,3 +1,4 @@
|
||||
TARGET_ARCH=rx
|
||||
TARGET_XML_FILES= gdb-xml/rx-core.xml
|
||||
# all boards require libfdt
|
||||
TARGET_NEED_FDT=y
|
||||
|
@ -1,6 +1,5 @@
|
||||
TARGET_ARCH=x86_64
|
||||
TARGET_BASE_ARCH=i386
|
||||
TARGET_SUPPORTS_MTTCG=y
|
||||
TARGET_NEED_FDT=y
|
||||
TARGET_KVM_HAVE_GUEST_DEBUG=y
|
||||
TARGET_XML_FILES= gdb-xml/i386-64bit.xml
|
||||
|
2
configure
vendored
2
configure
vendored
@ -762,7 +762,7 @@ for opt do
|
||||
--*) meson_option_parse "$opt" "$optarg"
|
||||
;;
|
||||
# Pass through -Dxxxx options to meson
|
||||
-D*) meson_options="$meson_options $opt"
|
||||
-D*) meson_option_add "$opt"
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
@ -432,6 +432,14 @@ Backend ``memory`` (since 9.0)
|
||||
CPU device properties
|
||||
'''''''''''''''''''''
|
||||
|
||||
``pcommit`` on x86 (since 9.1)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
The PCOMMIT instruction was never included in any physical processor.
|
||||
It was implemented as a no-op instruction in TCG up to QEMU 9.0, but
|
||||
only with ``-cpu max`` (which does not guarantee migration compatibility
|
||||
across versions).
|
||||
|
||||
``pmu-num=n`` on RISC-V CPUs (since 8.2)
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
|
@ -513,7 +513,7 @@ static void xen_9pfs_alloc(struct XenLegacyDevice *xendev)
|
||||
xenstore_write_be_int(xendev, "max-ring-page-order", MAX_RING_ORDER);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_9pfs_ops = {
|
||||
static struct XenDevOps xen_9pfs_ops = {
|
||||
.size = sizeof(Xen9pfsDev),
|
||||
.flags = DEVOPS_FLAG_NEED_GNTDEV,
|
||||
.alloc = xen_9pfs_alloc,
|
||||
@ -522,3 +522,9 @@ struct XenDevOps xen_9pfs_ops = {
|
||||
.disconnect = xen_9pfs_disconnect,
|
||||
.free = xen_9pfs_free,
|
||||
};
|
||||
|
||||
static void xen_9pfs_register_backend(void)
|
||||
{
|
||||
xen_be_register("9pfs", &xen_9pfs_ops);
|
||||
}
|
||||
xen_backend_init(xen_9pfs_register_backend);
|
||||
|
@ -15,6 +15,7 @@ config ARM_VIRT
|
||||
select ACPI
|
||||
select ARM_SMMUV3
|
||||
select GPIO_KEY
|
||||
select DEVICE_TREE
|
||||
select FW_CFG_DMA
|
||||
select PCI_EXPRESS
|
||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||
@ -265,6 +266,7 @@ config SBSA_REF
|
||||
default y
|
||||
depends on TCG && AARCH64
|
||||
imply PCI_DEVICES
|
||||
select DEVICE_TREE
|
||||
select AHCI
|
||||
select ARM_SMMUV3
|
||||
select GPIO_KEY
|
||||
@ -347,6 +349,7 @@ config VEXPRESS
|
||||
bool
|
||||
default y
|
||||
depends on TCG && ARM
|
||||
select DEVICE_TREE
|
||||
select A9MPCORE
|
||||
select A15MPCORE
|
||||
select ARM_MPTIMER
|
||||
@ -492,6 +495,7 @@ config XLNX_ZYNQMP_ARM
|
||||
select CPU_CLUSTER
|
||||
select DDC
|
||||
select DPCD
|
||||
select DEVICE_TREE
|
||||
select SDHCI
|
||||
select SSI
|
||||
select SSI_M25P80
|
||||
@ -509,6 +513,7 @@ config XLNX_VERSAL
|
||||
depends on TCG && AARCH64
|
||||
select ARM_GIC
|
||||
select CPU_CLUSTER
|
||||
select DEVICE_TREE
|
||||
select PL011
|
||||
select CADENCE
|
||||
select VIRTIO_MMIO
|
||||
|
@ -1,5 +1,5 @@
|
||||
arm_ss = ss.source_set()
|
||||
arm_ss.add(files('boot.c'), fdt)
|
||||
arm_ss.add(files('boot.c'))
|
||||
arm_ss.add(when: 'CONFIG_ARM_VIRT', if_true: files('virt.c'))
|
||||
arm_ss.add(when: 'CONFIG_ACPI', if_true: files('virt-acpi-build.c'))
|
||||
arm_ss.add(when: 'CONFIG_DIGIC', if_true: files('digic_boards.c'))
|
||||
|
@ -4,8 +4,14 @@ config EMPTY_SLOT
|
||||
config PTIMER
|
||||
bool
|
||||
|
||||
config DEVICE_TREE
|
||||
bool
|
||||
# fail the build if libfdt not found
|
||||
depends on FDT
|
||||
|
||||
config FITLOADER
|
||||
bool
|
||||
depends on DEVICE_TREE
|
||||
|
||||
config GENERIC_LOADER
|
||||
bool
|
||||
@ -14,13 +20,14 @@ config GENERIC_LOADER
|
||||
config GUEST_LOADER
|
||||
bool
|
||||
default y
|
||||
depends on TCG
|
||||
depends on TCG && DEVICE_TREE
|
||||
|
||||
config OR_IRQ
|
||||
bool
|
||||
|
||||
config PLATFORM_BUS
|
||||
bool
|
||||
depends on DEVICE_TREE
|
||||
|
||||
config REGISTER
|
||||
bool
|
||||
|
@ -16,7 +16,7 @@ common_ss.add(files('cpu-common.c'))
|
||||
common_ss.add(files('machine-smp.c'))
|
||||
system_ss.add(when: 'CONFIG_FITLOADER', if_true: files('loader-fit.c'))
|
||||
system_ss.add(when: 'CONFIG_GENERIC_LOADER', if_true: files('generic-loader.c'))
|
||||
system_ss.add(when: ['CONFIG_GUEST_LOADER', fdt], if_true: files('guest-loader.c'))
|
||||
system_ss.add(when: 'CONFIG_GUEST_LOADER', if_true: files('guest-loader.c'))
|
||||
system_ss.add(when: 'CONFIG_OR_IRQ', if_true: files('or-irq.c'))
|
||||
system_ss.add(when: 'CONFIG_PLATFORM_BUS', if_true: files('platform-bus.c'))
|
||||
system_ss.add(when: 'CONFIG_PTIMER', if_true: files('ptimer.c'))
|
||||
|
@ -972,7 +972,7 @@ static void fb_event(struct XenLegacyDevice *xendev)
|
||||
|
||||
/* -------------------------------------------------------------------- */
|
||||
|
||||
struct XenDevOps xen_kbdmouse_ops = {
|
||||
static struct XenDevOps xen_kbdmouse_ops = {
|
||||
.size = sizeof(struct XenInput),
|
||||
.init = input_init,
|
||||
.initialise = input_initialise,
|
||||
@ -995,3 +995,9 @@ static const GraphicHwOps xenfb_ops = {
|
||||
.gfx_update = xenfb_update,
|
||||
.ui_info = xenfb_ui_info,
|
||||
};
|
||||
|
||||
static void xen_vkbd_register_backend(void)
|
||||
{
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
}
|
||||
xen_backend_init(xen_vkbd_register_backend);
|
||||
|
@ -115,7 +115,8 @@ config Q35
|
||||
config MICROVM
|
||||
bool
|
||||
default y
|
||||
depends on I386
|
||||
depends on I386 && FDT
|
||||
select DEVICE_TREE
|
||||
select SERIAL_ISA # for serial_hds_isa_init()
|
||||
select ISA_BUS
|
||||
select APIC
|
||||
|
@ -203,6 +203,7 @@ void fw_cfg_build_feature_control(MachineState *ms, FWCfgState *fw_cfg)
|
||||
fw_cfg_add_file(fw_cfg, "etc/msr_feature_control", val, sizeof(*val));
|
||||
}
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
void fw_cfg_add_acpi_dsdt(Aml *scope, FWCfgState *fw_cfg)
|
||||
{
|
||||
/*
|
||||
@ -229,3 +230,4 @@ void fw_cfg_add_acpi_dsdt(Aml *scope, FWCfgState *fw_cfg)
|
||||
aml_append(dev, aml_name_decl("_CRS", crs));
|
||||
aml_append(scope, dev);
|
||||
}
|
||||
#endif
|
||||
|
@ -1,18 +1,20 @@
|
||||
i386_ss = ss.source_set()
|
||||
i386_ss.add(files(
|
||||
'fw_cfg.c',
|
||||
'vapic.c',
|
||||
'e820_memory_layout.c',
|
||||
'monitor.c',
|
||||
'multiboot.c',
|
||||
'x86.c',
|
||||
'x86-cpu.c',
|
||||
))
|
||||
|
||||
i386_ss.add(when: 'CONFIG_APIC', if_true: files('vapic.c'))
|
||||
i386_ss.add(when: 'CONFIG_X86_IOMMU', if_true: files('x86-iommu.c'),
|
||||
if_false: files('x86-iommu-stub.c'))
|
||||
i386_ss.add(when: 'CONFIG_AMD_IOMMU', if_true: files('amd_iommu.c'),
|
||||
if_false: files('amd_iommu-stub.c'))
|
||||
i386_ss.add(when: 'CONFIG_I440FX', if_true: files('pc_piix.c'))
|
||||
i386_ss.add(when: 'CONFIG_MICROVM', if_true: files('microvm.c', 'acpi-microvm.c', 'microvm-dt.c'))
|
||||
i386_ss.add(when: 'CONFIG_MICROVM', if_true: files('x86-common.c', 'microvm.c', 'acpi-microvm.c', 'microvm-dt.c'))
|
||||
i386_ss.add(when: 'CONFIG_Q35', if_true: files('pc_q35.c'))
|
||||
i386_ss.add(when: 'CONFIG_VMMOUSE', if_true: files('vmmouse.c'))
|
||||
i386_ss.add(when: 'CONFIG_VMPORT', if_true: files('vmport.c'))
|
||||
@ -22,6 +24,7 @@ i386_ss.add(when: 'CONFIG_SGX', if_true: files('sgx-epc.c','sgx.c'),
|
||||
|
||||
i386_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi-common.c'))
|
||||
i386_ss.add(when: 'CONFIG_PC', if_true: files(
|
||||
'x86-common.c',
|
||||
'pc.c',
|
||||
'pc_sysfw.c',
|
||||
'acpi-build.c',
|
||||
|
46
hw/i386/monitor.c
Normal file
46
hw/i386/monitor.c
Normal file
@ -0,0 +1,46 @@
|
||||
/*
|
||||
* QEMU monitor
|
||||
*
|
||||
* 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 "monitor/monitor.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-misc-target.h"
|
||||
#include "hw/i386/x86.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
|
||||
#include CONFIG_DEVICES
|
||||
|
||||
void qmp_rtc_reset_reinjection(Error **errp)
|
||||
{
|
||||
X86MachineState *x86ms = X86_MACHINE(qdev_get_machine());
|
||||
|
||||
#ifdef CONFIG_MC146818RTC
|
||||
if (x86ms->rtc) {
|
||||
rtc_reset_reinjection(MC146818_RTC(x86ms->rtc));
|
||||
}
|
||||
#else
|
||||
assert(!x86ms->rtc);
|
||||
#endif
|
||||
}
|
@ -1250,7 +1250,6 @@ void pc_basic_device_init(struct PCMachineState *pcms,
|
||||
pci_create_simple(pcms->pcibus, -1, "xen-platform");
|
||||
}
|
||||
xen_bus_init();
|
||||
xen_be_init();
|
||||
}
|
||||
#endif
|
||||
|
||||
@ -1827,9 +1826,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
assert(!mc->get_hotplug_handler);
|
||||
mc->get_hotplug_handler = pc_get_hotplug_handler;
|
||||
mc->hotplug_allowed = pc_hotplug_allowed;
|
||||
mc->cpu_index_to_instance_props = x86_cpu_index_to_props;
|
||||
mc->get_default_cpu_node_id = x86_get_default_cpu_node_id;
|
||||
mc->possible_cpu_arch_ids = x86_possible_cpu_arch_ids;
|
||||
mc->auto_enable_numa_with_memhp = true;
|
||||
mc->auto_enable_numa_with_memdev = true;
|
||||
mc->has_hotpluggable_cpus = true;
|
||||
|
1007
hw/i386/x86-common.c
Normal file
1007
hw/i386/x86-common.c
Normal file
File diff suppressed because it is too large
Load Diff
97
hw/i386/x86-cpu.c
Normal file
97
hw/i386/x86-cpu.c
Normal file
@ -0,0 +1,97 @@
|
||||
/*
|
||||
* Copyright (c) 2003-2004 Fabrice Bellard
|
||||
* Copyright (c) 2019, 2024 Red Hat, 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.
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "sysemu/whpx.h"
|
||||
#include "sysemu/cpu-timers.h"
|
||||
#include "trace.h"
|
||||
|
||||
#include "hw/i386/x86.h"
|
||||
#include "target/i386/cpu.h"
|
||||
#include "hw/intc/i8259.h"
|
||||
#include "hw/irq.h"
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
/* TSC handling */
|
||||
uint64_t cpu_get_tsc(CPUX86State *env)
|
||||
{
|
||||
return cpus_get_elapsed_ticks();
|
||||
}
|
||||
|
||||
/* IRQ handling */
|
||||
static void pic_irq_request(void *opaque, int irq, int level)
|
||||
{
|
||||
CPUState *cs = first_cpu;
|
||||
X86CPU *cpu = X86_CPU(cs);
|
||||
|
||||
trace_x86_pic_interrupt(irq, level);
|
||||
if (cpu_is_apic_enabled(cpu->apic_state) && !kvm_irqchip_in_kernel() &&
|
||||
!whpx_apic_in_platform()) {
|
||||
CPU_FOREACH(cs) {
|
||||
cpu = X86_CPU(cs);
|
||||
if (apic_accept_pic_intr(cpu->apic_state)) {
|
||||
apic_deliver_pic_intr(cpu->apic_state, level);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (level) {
|
||||
cpu_interrupt(cs, CPU_INTERRUPT_HARD);
|
||||
} else {
|
||||
cpu_reset_interrupt(cs, CPU_INTERRUPT_HARD);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
qemu_irq x86_allocate_cpu_irq(void)
|
||||
{
|
||||
return qemu_allocate_irq(pic_irq_request, NULL, 0);
|
||||
}
|
||||
|
||||
int cpu_get_pic_interrupt(CPUX86State *env)
|
||||
{
|
||||
X86CPU *cpu = env_archcpu(env);
|
||||
int intno;
|
||||
|
||||
if (!kvm_irqchip_in_kernel() && !whpx_apic_in_platform()) {
|
||||
intno = apic_get_interrupt(cpu->apic_state);
|
||||
if (intno >= 0) {
|
||||
return intno;
|
||||
}
|
||||
/* read the irq from the PIC */
|
||||
if (!apic_accept_pic_intr(cpu->apic_state)) {
|
||||
return -1;
|
||||
}
|
||||
}
|
||||
|
||||
intno = pic_read_irq(isa_pic);
|
||||
return intno;
|
||||
}
|
||||
|
||||
DeviceState *cpu_get_current_apic(void)
|
||||
{
|
||||
if (current_cpu) {
|
||||
X86CPU *cpu = X86_CPU(current_cpu);
|
||||
return cpu->apic_state;
|
||||
} else {
|
||||
return NULL;
|
||||
}
|
||||
}
|
1058
hw/i386/x86.c
1058
hw/i386/x86.c
File diff suppressed because it is too large
Load Diff
29
hw/intc/ioapic-stub.c
Normal file
29
hw/intc/ioapic-stub.c
Normal file
@ -0,0 +1,29 @@
|
||||
/*
|
||||
* ioapic.c IOAPIC emulation logic
|
||||
*
|
||||
* Copyright (c) 2004-2005 Fabrice Bellard
|
||||
*
|
||||
* Split the ioapic logic from apic.c
|
||||
* Xiantao Zhang <xiantao.zhang@intel.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public
|
||||
* License along with this library; if not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "hw/intc/ioapic.h"
|
||||
|
||||
void ioapic_eoi_broadcast(int vector)
|
||||
{
|
||||
}
|
@ -20,7 +20,7 @@ system_ss.add(when: 'CONFIG_GOLDFISH_PIC', if_true: files('goldfish_pic.c'))
|
||||
system_ss.add(when: 'CONFIG_HEATHROW_PIC', if_true: files('heathrow_pic.c'))
|
||||
system_ss.add(when: 'CONFIG_I8259', if_true: files('i8259_common.c', 'i8259.c'))
|
||||
system_ss.add(when: 'CONFIG_IMX', if_true: files('imx_avic.c', 'imx_gpcv2.c'))
|
||||
system_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioapic_common.c'))
|
||||
system_ss.add(when: 'CONFIG_IOAPIC', if_true: files('ioapic_common.c'), if_false: files('ioapic-stub.c'))
|
||||
system_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_intc.c'))
|
||||
system_ss.add(when: 'CONFIG_OPENPIC', if_true: files('openpic.c'))
|
||||
system_ss.add(when: 'CONFIG_PL190', if_true: files('pl190.c'))
|
||||
|
@ -405,6 +405,8 @@ static void qemu_s390_flic_class_init(ObjectClass *oc, void *data)
|
||||
static Property s390_flic_common_properties[] = {
|
||||
DEFINE_PROP_UINT32("adapter_routes_max_batch", S390FLICState,
|
||||
adapter_routes_max_batch, ADAPTER_ROUTES_MAX_GSI),
|
||||
DEFINE_PROP_BOOL("migration-enabled", S390FLICState,
|
||||
migration_enabled, true),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
@ -457,7 +459,9 @@ type_init(qemu_s390_flic_register_types)
|
||||
|
||||
static bool adapter_info_so_needed(void *opaque)
|
||||
{
|
||||
return css_migration_enabled();
|
||||
S390FLICState *fs = S390_FLIC_COMMON(opaque);
|
||||
|
||||
return fs->migration_enabled;
|
||||
}
|
||||
|
||||
const VMStateDescription vmstate_adapter_info_so = {
|
||||
|
@ -1,7 +1,8 @@
|
||||
config LOONGARCH_VIRT
|
||||
bool
|
||||
default y
|
||||
depends on LOONGARCH64
|
||||
depends on LOONGARCH64 && FDT
|
||||
select DEVICE_TREE
|
||||
select PCI
|
||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||
imply VIRTIO_VGA
|
||||
|
@ -3,7 +3,7 @@ loongarch_ss.add(files(
|
||||
'fw_cfg.c',
|
||||
'boot.c',
|
||||
))
|
||||
loongarch_ss.add(when: 'CONFIG_LOONGARCH_VIRT', if_true: [files('virt.c'), fdt])
|
||||
loongarch_ss.add(when: 'CONFIG_LOONGARCH_VIRT', if_true: files('virt.c'))
|
||||
loongarch_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi-build.c'))
|
||||
|
||||
hw_arch += {'loongarch': loongarch_ss}
|
||||
|
@ -80,9 +80,10 @@ config MIPS_CPS
|
||||
config MIPS_BOSTON
|
||||
bool
|
||||
default y
|
||||
depends on MIPS64 && !TARGET_BIG_ENDIAN
|
||||
depends on MIPS64 && !TARGET_BIG_ENDIAN && FDT
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
select DEVICE_TREE
|
||||
select FITLOADER
|
||||
select MIPS_CPS
|
||||
select PCI_EXPRESS_XILINX
|
||||
|
@ -9,7 +9,7 @@ if 'CONFIG_TCG' in config_all_accel
|
||||
mips_ss.add(when: 'CONFIG_JAZZ', if_true: files('jazz.c'))
|
||||
mips_ss.add(when: 'CONFIG_MIPSSIM', if_true: files('mipssim.c'))
|
||||
mips_ss.add(when: 'CONFIG_FULOONG', if_true: files('fuloong2e.c'))
|
||||
mips_ss.add(when: 'CONFIG_MIPS_BOSTON', if_true: [files('boston.c'), fdt])
|
||||
mips_ss.add(when: 'CONFIG_MIPS_BOSTON', if_true: files('boston.c'))
|
||||
endif
|
||||
|
||||
hw_arch += {'mips': mips_ss}
|
||||
|
@ -2,6 +2,7 @@ config OR1K_SIM
|
||||
bool
|
||||
default y
|
||||
depends on OPENRISC
|
||||
select DEVICE_TREE
|
||||
select SERIAL
|
||||
select OPENCORES_ETH
|
||||
select OMPIC
|
||||
@ -14,6 +15,7 @@ config OR1K_VIRT
|
||||
imply PCI_DEVICES
|
||||
imply VIRTIO_VGA
|
||||
imply TEST_DEVICES
|
||||
select DEVICE_TREE
|
||||
select PCI
|
||||
select PCI_EXPRESS_GENERIC_BRIDGE
|
||||
select GOLDFISH_RTC
|
||||
|
@ -1,7 +1,7 @@
|
||||
openrisc_ss = ss.source_set()
|
||||
openrisc_ss.add(files('cputimer.c'))
|
||||
openrisc_ss.add(files('boot.c'))
|
||||
openrisc_ss.add(when: 'CONFIG_OR1K_SIM', if_true: [files('openrisc_sim.c'), fdt])
|
||||
openrisc_ss.add(when: 'CONFIG_OR1K_VIRT', if_true: [files('virt.c'), fdt])
|
||||
openrisc_ss.add(when: 'CONFIG_OR1K_SIM', if_true: files('openrisc_sim.c'))
|
||||
openrisc_ss.add(when: 'CONFIG_OR1K_VIRT', if_true: files('virt.c'))
|
||||
|
||||
hw_arch += {'openrisc': openrisc_ss}
|
||||
|
@ -1,7 +1,7 @@
|
||||
config PSERIES
|
||||
bool
|
||||
default y
|
||||
depends on PPC64
|
||||
depends on PPC64 && FDT
|
||||
imply USB_OHCI_PCI
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
@ -26,7 +26,7 @@ config SPAPR_RNG
|
||||
config POWERNV
|
||||
bool
|
||||
default y
|
||||
depends on PPC64
|
||||
depends on PPC64 && FDT
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
select ISA_IPMI_BT
|
||||
@ -52,7 +52,7 @@ config PPC405
|
||||
config PPC440
|
||||
bool
|
||||
default y
|
||||
depends on PPC
|
||||
depends on PPC && FDT
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
imply E1000_PCI
|
||||
@ -71,7 +71,7 @@ config PPC4XX
|
||||
config SAM460EX
|
||||
bool
|
||||
default y
|
||||
depends on PPC
|
||||
depends on PPC && FDT
|
||||
select PFLASH_CFI01
|
||||
select IDE_SII3112
|
||||
select M41T80
|
||||
@ -168,19 +168,19 @@ config E500
|
||||
config E500PLAT
|
||||
bool
|
||||
default y
|
||||
depends on PPC
|
||||
depends on PPC && FDT
|
||||
select E500
|
||||
|
||||
config MPC8544DS
|
||||
bool
|
||||
default y
|
||||
depends on PPC
|
||||
depends on PPC && FDT
|
||||
select E500
|
||||
|
||||
config VIRTEX
|
||||
bool
|
||||
default y
|
||||
depends on PPC
|
||||
depends on PPC && FDT
|
||||
select PPC4XX
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
@ -193,6 +193,7 @@ config FW_CFG_PPC
|
||||
bool
|
||||
|
||||
config FDT_PPC
|
||||
select DEVICE_TREE
|
||||
bool
|
||||
|
||||
config VOF
|
||||
|
@ -3,9 +3,7 @@ ppc_ss.add(files(
|
||||
'ppc.c',
|
||||
'ppc_booke.c',
|
||||
))
|
||||
ppc_ss.add(when: 'CONFIG_FDT_PPC', if_true: [files(
|
||||
'fdt.c',
|
||||
), fdt])
|
||||
ppc_ss.add(when: 'CONFIG_FDT_PPC', if_true: files('fdt.c'))
|
||||
ppc_ss.add(when: 'CONFIG_FW_CFG_PPC', if_true: files('fw_cfg.c'))
|
||||
|
||||
# IBM pSeries (sPAPR)
|
||||
|
@ -12,6 +12,7 @@ config MICROCHIP_PFSOC
|
||||
depends on RISCV64
|
||||
select CADENCE_SDHCI
|
||||
select CPU_CLUSTER
|
||||
select DEVICE_TREE
|
||||
select MCHP_PFSOC_DMC
|
||||
select MCHP_PFSOC_IOSCB
|
||||
select MCHP_PFSOC_MMUART
|
||||
@ -37,6 +38,7 @@ config RISCV_VIRT
|
||||
imply VIRTIO_VGA
|
||||
imply TEST_DEVICES
|
||||
imply TPM_TIS_SYSBUS
|
||||
select DEVICE_TREE
|
||||
select RISCV_NUMA
|
||||
select GOLDFISH_RTC
|
||||
select PCI
|
||||
@ -82,6 +84,7 @@ config SIFIVE_U
|
||||
depends on RISCV32 || RISCV64
|
||||
select CADENCE
|
||||
select CPU_CLUSTER
|
||||
select DEVICE_TREE
|
||||
select RISCV_ACLINT
|
||||
select SIFIVE_GPIO
|
||||
select SIFIVE_PDMA
|
||||
@ -99,6 +102,7 @@ config SPIKE
|
||||
bool
|
||||
default y
|
||||
depends on RISCV32 || RISCV64
|
||||
select DEVICE_TREE
|
||||
select RISCV_NUMA
|
||||
select HTIF
|
||||
select RISCV_ACLINT
|
||||
|
@ -1,5 +1,5 @@
|
||||
riscv_ss = ss.source_set()
|
||||
riscv_ss.add(files('boot.c'), fdt)
|
||||
riscv_ss.add(files('boot.c'))
|
||||
riscv_ss.add(when: 'CONFIG_RISCV_NUMA', if_true: files('numa.c'))
|
||||
riscv_ss.add(files('riscv_hart.c'))
|
||||
riscv_ss.add(when: 'CONFIG_OPENTITAN', if_true: files('opentitan.c'))
|
||||
|
@ -104,16 +104,9 @@ static void rtc_coalesced_timer_update(MC146818RtcState *s)
|
||||
}
|
||||
}
|
||||
|
||||
static QLIST_HEAD(, MC146818RtcState) rtc_devices =
|
||||
QLIST_HEAD_INITIALIZER(rtc_devices);
|
||||
|
||||
void qmp_rtc_reset_reinjection(Error **errp)
|
||||
void rtc_reset_reinjection(MC146818RtcState *rtc)
|
||||
{
|
||||
MC146818RtcState *s;
|
||||
|
||||
QLIST_FOREACH(s, &rtc_devices, link) {
|
||||
s->irq_coalesced = 0;
|
||||
}
|
||||
rtc->irq_coalesced = 0;
|
||||
}
|
||||
|
||||
static bool rtc_policy_slew_deliver_irq(MC146818RtcState *s)
|
||||
@ -941,7 +934,6 @@ static void rtc_realizefn(DeviceState *dev, Error **errp)
|
||||
object_property_add_tm(OBJECT(s), "date", rtc_get_date);
|
||||
|
||||
qdev_init_gpio_out(dev, &s->irq, 1);
|
||||
QLIST_INSERT_HEAD(&rtc_devices, s, link);
|
||||
}
|
||||
|
||||
MC146818RtcState *mc146818_rtc_init(ISABus *bus, int base_year,
|
||||
|
@ -8,5 +8,6 @@ config RX62N_MCU
|
||||
config RX_GDBSIM
|
||||
bool
|
||||
default y
|
||||
depends on RX
|
||||
depends on RX && FDT
|
||||
select DEVICE_TREE
|
||||
select RX62N_MCU
|
||||
|
@ -23,6 +23,8 @@
|
||||
#include "hw/s390x/s390-virtio-ccw.h"
|
||||
#include "hw/s390x/s390-ccw.h"
|
||||
|
||||
bool css_migration_enabled = true;
|
||||
|
||||
typedef struct CrwContainer {
|
||||
CRW crw;
|
||||
QTAILQ_ENTRY(CrwContainer) sibling;
|
||||
@ -180,7 +182,7 @@ static const VMStateDescription vmstate_orb = {
|
||||
|
||||
static bool vmstate_schdev_orb_needed(void *opaque)
|
||||
{
|
||||
return css_migration_enabled();
|
||||
return css_migration_enabled;
|
||||
}
|
||||
|
||||
static const VMStateDescription vmstate_schdev_orb = {
|
||||
@ -388,7 +390,7 @@ static int subch_dev_post_load(void *opaque, int version_id)
|
||||
css_subch_assign(s->cssid, s->ssid, s->schid, s->devno, s);
|
||||
}
|
||||
|
||||
if (css_migration_enabled()) {
|
||||
if (css_migration_enabled) {
|
||||
/* No compat voodoo to do ;) */
|
||||
return 0;
|
||||
}
|
||||
@ -412,7 +414,9 @@ static int subch_dev_post_load(void *opaque, int version_id)
|
||||
|
||||
void css_register_vmstate(void)
|
||||
{
|
||||
vmstate_register(NULL, 0, &vmstate_css, &channel_subsys);
|
||||
if (css_migration_enabled) {
|
||||
vmstate_register(NULL, 0, &vmstate_css, &channel_subsys);
|
||||
}
|
||||
}
|
||||
|
||||
IndAddr *get_indicator(hwaddr ind_addr, int len)
|
||||
|
@ -50,22 +50,6 @@
|
||||
|
||||
static Error *pv_mig_blocker;
|
||||
|
||||
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
|
||||
{
|
||||
static MachineState *ms;
|
||||
|
||||
if (!ms) {
|
||||
ms = MACHINE(qdev_get_machine());
|
||||
g_assert(ms->possible_cpus);
|
||||
}
|
||||
|
||||
/* CPU address corresponds to the core_id and the index */
|
||||
if (cpu_addr >= ms->possible_cpus->len) {
|
||||
return NULL;
|
||||
}
|
||||
return S390_CPU(ms->possible_cpus->cpus[cpu_addr].cpu);
|
||||
}
|
||||
|
||||
static S390CPU *s390x_new_cpu(const char *typename, uint32_t core_id,
|
||||
Error **errp)
|
||||
{
|
||||
@ -299,11 +283,9 @@ static void ccw_init(MachineState *machine)
|
||||
s390_enable_css_support(s390_cpu_addr2state(0));
|
||||
|
||||
ret = css_create_css_image(VIRTUAL_CSSID, true);
|
||||
|
||||
assert(ret == 0);
|
||||
if (css_migration_enabled()) {
|
||||
css_register_vmstate();
|
||||
}
|
||||
|
||||
css_register_vmstate();
|
||||
|
||||
/* Create VirtIO network adapters */
|
||||
s390_create_virtio_net(BUS(css_bus), mc->default_nic);
|
||||
@ -765,7 +747,6 @@ static void ccw_machine_class_init(ObjectClass *oc, void *data)
|
||||
|
||||
s390mc->ri_allowed = true;
|
||||
s390mc->cpu_model_allowed = true;
|
||||
s390mc->css_migration_enabled = true;
|
||||
s390mc->hpage_1m_allowed = true;
|
||||
s390mc->max_threads = 1;
|
||||
mc->init = ccw_init;
|
||||
@ -835,11 +816,6 @@ static const TypeInfo ccw_machine_info = {
|
||||
},
|
||||
};
|
||||
|
||||
bool css_migration_enabled(void)
|
||||
{
|
||||
return get_machine_class()->css_migration_enabled;
|
||||
}
|
||||
|
||||
#define DEFINE_CCW_MACHINE(suffix, verstr, latest) \
|
||||
static void ccw_machine_##suffix##_class_init(ObjectClass *oc, \
|
||||
void *data) \
|
||||
@ -1195,15 +1171,15 @@ static void ccw_machine_2_9_instance_options(MachineState *machine)
|
||||
|
||||
static void ccw_machine_2_9_class_options(MachineClass *mc)
|
||||
{
|
||||
S390CcwMachineClass *s390mc = S390_CCW_MACHINE_CLASS(mc);
|
||||
static GlobalProperty compat[] = {
|
||||
{ TYPE_S390_STATTRIB, "migration-enabled", "off", },
|
||||
{ TYPE_S390_FLIC_COMMON, "migration-enabled", "off", },
|
||||
};
|
||||
|
||||
ccw_machine_2_10_class_options(mc);
|
||||
compat_props_add(mc->compat_props, hw_compat_2_9, hw_compat_2_9_len);
|
||||
compat_props_add(mc->compat_props, compat, G_N_ELEMENTS(compat));
|
||||
s390mc->css_migration_enabled = false;
|
||||
css_migration_enabled = false;
|
||||
}
|
||||
DEFINE_CCW_MACHINE(2_9, "2.9", false);
|
||||
|
||||
|
@ -1,5 +1,5 @@
|
||||
sh4_ss = ss.source_set()
|
||||
sh4_ss.add(files(
|
||||
sh4_ss.add(when: 'CONFIG_SH7750', if_true: files(
|
||||
'sh7750.c',
|
||||
'sh7750_regnames.c',
|
||||
))
|
||||
|
@ -1083,7 +1083,7 @@ static void usbback_event(struct XenLegacyDevice *xendev)
|
||||
qemu_bh_schedule(usbif->bh);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_usb_ops = {
|
||||
static struct XenDevOps xen_usb_ops = {
|
||||
.size = sizeof(struct usbback_info),
|
||||
.flags = DEVOPS_FLAG_NEED_GNTDEV,
|
||||
.init = usbback_init,
|
||||
@ -1095,15 +1095,9 @@ struct XenDevOps xen_usb_ops = {
|
||||
.event = usbback_event,
|
||||
};
|
||||
|
||||
#else /* USBIF_SHORT_NOT_OK */
|
||||
|
||||
static int usbback_not_supported(void)
|
||||
static void xen_usb_register_backend(void)
|
||||
{
|
||||
return -EINVAL;
|
||||
xen_be_register("qusb", &xen_usb_ops);
|
||||
}
|
||||
|
||||
struct XenDevOps xen_usb_ops = {
|
||||
.backend_register = usbback_not_supported,
|
||||
};
|
||||
|
||||
xen_backend_init(xen_usb_register_backend);
|
||||
#endif
|
||||
|
@ -13,6 +13,7 @@
|
||||
#include "hw/sysbus.h"
|
||||
#include "hw/xen/xen.h"
|
||||
#include "hw/xen/xen-backend.h"
|
||||
#include "hw/xen/xen-legacy-backend.h" /* xen_be_init() */
|
||||
#include "hw/xen/xen-bus.h"
|
||||
#include "hw/xen/xen-bus-helper.h"
|
||||
#include "monitor/monitor.h"
|
||||
@ -329,6 +330,9 @@ static void xen_bus_realize(BusState *bus, Error **errp)
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/* Initialize legacy backend core & drivers */
|
||||
xen_be_init();
|
||||
|
||||
if (xs_node_scanf(xenbus->xsh, XBT_NULL, "", /* domain root node */
|
||||
"domid", NULL, "%u", &domid) == 1) {
|
||||
xenbus->backend_id = domid;
|
||||
|
@ -872,8 +872,6 @@ void xen_register_ioreq(XenIOState *state, unsigned int max_cpus,
|
||||
|
||||
xen_bus_init();
|
||||
|
||||
xen_be_init();
|
||||
|
||||
return;
|
||||
|
||||
err:
|
||||
|
@ -622,27 +622,11 @@ void xen_be_init(void)
|
||||
qbus_set_bus_hotplug_handler(xen_sysbus);
|
||||
|
||||
xen_set_dynamic_sysbus();
|
||||
|
||||
xen_be_register("vkbd", &xen_kbdmouse_ops);
|
||||
#ifdef CONFIG_VIRTFS
|
||||
xen_be_register("9pfs", &xen_9pfs_ops);
|
||||
#endif
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
xen_be_register("qusb", &xen_usb_ops);
|
||||
#endif
|
||||
}
|
||||
|
||||
int xen_be_register(const char *type, struct XenDevOps *ops)
|
||||
{
|
||||
char path[50];
|
||||
int rc;
|
||||
|
||||
if (ops->backend_register) {
|
||||
rc = ops->backend_register();
|
||||
if (rc) {
|
||||
return rc;
|
||||
}
|
||||
}
|
||||
|
||||
snprintf(path, sizeof(path), "device-model/%u/backends/%s", xen_domid,
|
||||
type);
|
||||
|
@ -34,8 +34,7 @@ static void xen_init_pv(MachineState *machine)
|
||||
{
|
||||
setup_xen_backend_ops();
|
||||
|
||||
/* Initialize backend core & drivers */
|
||||
xen_be_init();
|
||||
xen_bus_init();
|
||||
|
||||
switch (xen_mode) {
|
||||
case XEN_ATTACH:
|
||||
@ -60,8 +59,6 @@ static void xen_init_pv(MachineState *machine)
|
||||
vga_interface_created = true;
|
||||
}
|
||||
|
||||
xen_bus_init();
|
||||
|
||||
/* config cleanup hook */
|
||||
atexit(xen_config_cleanup);
|
||||
}
|
||||
|
@ -14,7 +14,8 @@ config XTENSA_VIRT
|
||||
config XTENSA_XTFPGA
|
||||
bool
|
||||
default y
|
||||
depends on XTENSA
|
||||
depends on XTENSA && FDT
|
||||
select DEVICE_TREE
|
||||
select OPENCORES_ETH
|
||||
select PFLASH_CFI01
|
||||
select SERIAL
|
||||
|
@ -356,7 +356,6 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
cur_tagptr = put_tag(cur_tagptr, BP_TAG_COMMAND_LINE,
|
||||
strlen(kernel_cmdline) + 1, kernel_cmdline);
|
||||
}
|
||||
#ifdef CONFIG_FDT
|
||||
if (dtb_filename) {
|
||||
int fdt_size;
|
||||
void *fdt = load_device_tree(dtb_filename, &fdt_size);
|
||||
@ -373,14 +372,6 @@ static void xtfpga_init(const XtfpgaBoardDesc *board, MachineState *machine)
|
||||
cur_lowmem = QEMU_ALIGN_UP(cur_lowmem + fdt_size, 4 * KiB);
|
||||
g_free(fdt);
|
||||
}
|
||||
#else
|
||||
if (dtb_filename) {
|
||||
error_report("could not load DTB '%s': "
|
||||
"FDT support is not configured in QEMU",
|
||||
dtb_filename);
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
#endif
|
||||
if (initrd_filename) {
|
||||
BpMemInfo initrd_location = { 0 };
|
||||
int initrd_size = load_ramdisk(initrd_filename, cur_lowmem,
|
||||
|
@ -21,6 +21,7 @@
|
||||
#include "exec/memory.h"
|
||||
|
||||
#include "hw/boards.h"
|
||||
#include "hw/i386/topology.h"
|
||||
#include "hw/intc/ioapic.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "qom/object.h"
|
||||
@ -109,16 +110,11 @@ struct X86MachineState {
|
||||
#define TYPE_X86_MACHINE MACHINE_TYPE_NAME("x86")
|
||||
OBJECT_DECLARE_TYPE(X86MachineState, X86MachineClass, X86_MACHINE)
|
||||
|
||||
uint32_t x86_cpu_apic_id_from_index(X86MachineState *pcms,
|
||||
void init_topo_info(X86CPUTopoInfo *topo_info, const X86MachineState *x86ms);
|
||||
uint32_t x86_cpu_apic_id_from_index(X86MachineState *x86ms,
|
||||
unsigned int cpu_index);
|
||||
|
||||
void x86_cpu_new(X86MachineState *pcms, int64_t apic_id, Error **errp);
|
||||
void x86_cpus_init(X86MachineState *pcms, int default_cpu_version);
|
||||
CpuInstanceProperties x86_cpu_index_to_props(MachineState *ms,
|
||||
unsigned cpu_index);
|
||||
int64_t x86_get_default_cpu_node_id(const MachineState *ms, int idx);
|
||||
const CPUArchIdList *x86_possible_cpu_arch_ids(MachineState *ms);
|
||||
CPUArchId *x86_find_cpu_slot(MachineState *ms, uint32_t id, int *idx);
|
||||
void x86_rtc_set_cpus_count(ISADevice *rtc, uint16_t cpus_count);
|
||||
void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
DeviceState *dev, Error **errp);
|
||||
|
@ -55,6 +55,6 @@ MC146818RtcState *mc146818_rtc_init(ISABus *bus, int base_year,
|
||||
qemu_irq intercept_irq);
|
||||
void mc146818rtc_set_cmos_data(MC146818RtcState *s, int addr, int val);
|
||||
int mc146818rtc_get_cmos_data(MC146818RtcState *s, int addr);
|
||||
void qmp_rtc_reset_reinjection(Error **errp);
|
||||
void rtc_reset_reinjection(MC146818RtcState *rtc);
|
||||
|
||||
#endif /* HW_RTC_MC146818RTC_H */
|
||||
|
@ -333,4 +333,10 @@ static inline int ccw_dstream_read_buf(CcwDataStream *cds, void *buff, int len)
|
||||
#define ccw_dstream_read(cds, v) ccw_dstream_read_buf((cds), &(v), sizeof(v))
|
||||
#define ccw_dstream_write(cds, v) ccw_dstream_write_buf((cds), &(v), sizeof(v))
|
||||
|
||||
/**
|
||||
* true if (vmstate based) migration of the channel subsystem
|
||||
* is enabled, false if it is disabled.
|
||||
*/
|
||||
extern bool css_migration_enabled;
|
||||
|
||||
#endif
|
||||
|
@ -46,7 +46,6 @@ struct S390CcwMachineClass {
|
||||
/*< public >*/
|
||||
bool ri_allowed;
|
||||
bool cpu_model_allowed;
|
||||
bool css_migration_enabled;
|
||||
bool hpage_1m_allowed;
|
||||
int max_threads;
|
||||
};
|
||||
@ -58,10 +57,4 @@ bool cpu_model_allowed(void);
|
||||
/* 1M huge page mappings allowed by the machine */
|
||||
bool hpage_1m_allowed(void);
|
||||
|
||||
/**
|
||||
* Returns true if (vmstate based) migration of the channel subsystem
|
||||
* is enabled, false if it is disabled.
|
||||
*/
|
||||
bool css_migration_enabled(void);
|
||||
|
||||
#endif
|
||||
|
@ -47,6 +47,7 @@ struct S390FLICState {
|
||||
/* to limit AdapterRoutes.num_routes for compat */
|
||||
uint32_t adapter_routes_max_batch;
|
||||
bool ais_supported;
|
||||
bool migration_enabled;
|
||||
};
|
||||
|
||||
|
||||
|
@ -66,18 +66,8 @@ static inline void xen_be_unmap_grant_ref(struct XenLegacyDevice *xendev,
|
||||
return xen_be_unmap_grant_refs(xendev, ptr, &ref, 1);
|
||||
}
|
||||
|
||||
/* actual backend drivers */
|
||||
extern struct XenDevOps xen_console_ops; /* xen_console.c */
|
||||
extern struct XenDevOps xen_kbdmouse_ops; /* xen_framebuffer.c */
|
||||
extern struct XenDevOps xen_framebuffer_ops; /* xen_framebuffer.c */
|
||||
extern struct XenDevOps xen_blkdev_ops; /* xen_disk.c */
|
||||
#ifdef CONFIG_VIRTFS
|
||||
extern struct XenDevOps xen_9pfs_ops; /* xen-9p-backend.c */
|
||||
#endif
|
||||
extern struct XenDevOps xen_netdev_ops; /* xen_nic.c */
|
||||
#ifdef CONFIG_USB_LIBUSB
|
||||
extern struct XenDevOps xen_usb_ops; /* xen-usb.c */
|
||||
#endif
|
||||
/* backend drivers not included in all machines */
|
||||
extern struct XenDevOps xen_framebuffer_ops; /* xenfb.c */
|
||||
|
||||
/* configuration (aka xenbus setup) */
|
||||
void xen_config_cleanup(void);
|
||||
|
@ -29,7 +29,6 @@ struct XenDevOps {
|
||||
const char *node);
|
||||
void (*frontend_changed)(struct XenLegacyDevice *xendev,
|
||||
const char *node);
|
||||
int (*backend_register)(void);
|
||||
};
|
||||
|
||||
struct XenLegacyDevice {
|
||||
|
@ -180,5 +180,6 @@ void hmp_ioport_write(Monitor *mon, const QDict *qdict);
|
||||
void hmp_boot_set(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_mtree(Monitor *mon, const QDict *qdict);
|
||||
void hmp_info_cryptodev(Monitor *mon, const QDict *qdict);
|
||||
void hmp_dumpdtb(Monitor *mon, const QDict *qdict);
|
||||
|
||||
#endif
|
||||
|
@ -134,7 +134,6 @@ int qemu_fdt_add_path(void *fdt, const char *path);
|
||||
} while (0)
|
||||
|
||||
void qemu_fdt_dumpdtb(void *fdt, int size);
|
||||
void hmp_dumpdtb(Monitor *mon, const QDict *qdict);
|
||||
|
||||
/**
|
||||
* qemu_fdt_setprop_sized_cells_from_array:
|
||||
|
100
meson.build
100
meson.build
@ -1858,6 +1858,34 @@ if numa.found() and not cc.links('''
|
||||
endif
|
||||
endif
|
||||
|
||||
fdt = not_found
|
||||
fdt_opt = get_option('fdt')
|
||||
if fdt_opt == 'enabled' and get_option('wrap_mode') == 'nodownload'
|
||||
fdt_opt = 'system'
|
||||
endif
|
||||
if fdt_opt in ['enabled', 'system'] or (fdt_opt == 'auto' and have_system)
|
||||
fdt = cc.find_library('fdt', required: fdt_opt == 'system')
|
||||
if fdt.found() and cc.links('''
|
||||
#include <libfdt.h>
|
||||
#include <libfdt_env.h>
|
||||
int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
|
||||
dependencies: fdt)
|
||||
fdt_opt = 'system'
|
||||
elif fdt_opt != 'system'
|
||||
fdt_opt = get_option('wrap_mode') == 'nodownload' ? 'disabled' : 'internal'
|
||||
fdt = not_found
|
||||
else
|
||||
error('system libfdt is too old (1.5.1 or newer required)')
|
||||
endif
|
||||
endif
|
||||
if fdt_opt == 'internal'
|
||||
assert(not fdt.found())
|
||||
libfdt_proj = subproject('dtc', required: true,
|
||||
default_options: ['tools=false', 'yaml=disabled',
|
||||
'python=disabled', 'default_library=static'])
|
||||
fdt = libfdt_proj.get_variable('libfdt_dep')
|
||||
endif
|
||||
|
||||
rdma = not_found
|
||||
if not get_option('rdma').auto() or have_system
|
||||
libumad = cc.find_library('ibumad', required: get_option('rdma'))
|
||||
@ -2199,6 +2227,7 @@ config_host_data.set('CONFIG_BSD', host_os in bsd_oses)
|
||||
config_host_data.set('CONFIG_CAPSTONE', capstone.found())
|
||||
config_host_data.set('CONFIG_COCOA', cocoa.found())
|
||||
config_host_data.set('CONFIG_DARWIN', host_os == 'darwin')
|
||||
config_host_data.set('CONFIG_FDT', fdt.found())
|
||||
config_host_data.set('CONFIG_FUZZ', get_option('fuzzing'))
|
||||
config_host_data.set('CONFIG_GCOV', get_option('b_coverage'))
|
||||
config_host_data.set('CONFIG_LIBUDEV', libudev.found())
|
||||
@ -2960,6 +2989,7 @@ host_kconfig = \
|
||||
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
|
||||
(opengl.found() ? ['CONFIG_OPENGL=y'] : []) + \
|
||||
(x11.found() ? ['CONFIG_X11=y'] : []) + \
|
||||
(fdt.found() ? ['CONFIG_FDT=y'] : []) + \
|
||||
(have_vhost_user ? ['CONFIG_VHOST_USER=y'] : []) + \
|
||||
(have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
|
||||
(have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
|
||||
@ -3024,14 +3054,20 @@ foreach target : target_dirs
|
||||
error('No accelerator available for target @0@'.format(target))
|
||||
endif
|
||||
|
||||
actual_target_dirs += target
|
||||
config_target += keyval.load('configs/targets' / target + '.mak')
|
||||
config_target += { 'TARGET_' + config_target['TARGET_ARCH'].to_upper(): 'y' }
|
||||
|
||||
if 'TARGET_NEED_FDT' in config_target
|
||||
fdt_required += target
|
||||
if 'TARGET_NEED_FDT' in config_target and not fdt.found()
|
||||
if default_targets
|
||||
warning('Disabling ' + target + ' due to missing libfdt')
|
||||
else
|
||||
fdt_required += target
|
||||
endif
|
||||
continue
|
||||
endif
|
||||
|
||||
actual_target_dirs += target
|
||||
|
||||
# Add default keys
|
||||
if 'TARGET_BASE_ARCH' not in config_target
|
||||
config_target += {'TARGET_BASE_ARCH': config_target['TARGET_ARCH']}
|
||||
@ -3119,6 +3155,10 @@ genh += custom_target('config-poison.h',
|
||||
command: [find_program('scripts/make-config-poison.sh'),
|
||||
target_configs_h])
|
||||
|
||||
if fdt_required.length() > 0
|
||||
error('fdt disabled but required by targets ' + ', '.join(fdt_required))
|
||||
endif
|
||||
|
||||
###############
|
||||
# Subprojects #
|
||||
###############
|
||||
@ -3129,44 +3169,6 @@ if have_system and vfio_user_server_allowed
|
||||
libvfio_user_dep = libvfio_user_proj.get_variable('libvfio_user_dep')
|
||||
endif
|
||||
|
||||
fdt = not_found
|
||||
fdt_opt = get_option('fdt')
|
||||
if fdt_required.length() > 0 or fdt_opt == 'enabled'
|
||||
if fdt_opt == 'disabled'
|
||||
error('fdt disabled but required by targets ' + ', '.join(fdt_required))
|
||||
endif
|
||||
|
||||
if fdt_opt in ['enabled', 'auto', 'system']
|
||||
if get_option('wrap_mode') == 'nodownload'
|
||||
fdt_opt = 'system'
|
||||
endif
|
||||
fdt = cc.find_library('fdt', required: fdt_opt == 'system')
|
||||
if fdt.found() and cc.links('''
|
||||
#include <libfdt.h>
|
||||
#include <libfdt_env.h>
|
||||
int main(void) { fdt_find_max_phandle(NULL, NULL); return 0; }''',
|
||||
dependencies: fdt)
|
||||
fdt_opt = 'system'
|
||||
elif fdt_opt == 'system'
|
||||
error('system libfdt requested, but it is too old (1.5.1 or newer required)')
|
||||
else
|
||||
fdt_opt = 'internal'
|
||||
fdt = not_found
|
||||
endif
|
||||
endif
|
||||
if not fdt.found()
|
||||
assert(fdt_opt == 'internal')
|
||||
libfdt_proj = subproject('dtc', required: true,
|
||||
default_options: ['tools=false', 'yaml=disabled',
|
||||
'python=disabled', 'default_library=static'])
|
||||
fdt = libfdt_proj.get_variable('libfdt_dep')
|
||||
endif
|
||||
else
|
||||
fdt_opt = 'disabled'
|
||||
endif
|
||||
|
||||
config_host_data.set('CONFIG_FDT', fdt.found())
|
||||
|
||||
vhost_user = not_found
|
||||
if host_os == 'linux' and have_vhost_user
|
||||
libvhost_user = subproject('libvhost-user')
|
||||
@ -3867,15 +3869,23 @@ foreach target : target_dirs
|
||||
|
||||
target_common = common_ss.apply(config_target, strict: false)
|
||||
objects = common_all.extract_objects(target_common.sources())
|
||||
deps = target_common.dependencies()
|
||||
arch_deps += target_common.dependencies()
|
||||
|
||||
target_specific = specific_ss.apply(config_target, strict: false)
|
||||
arch_srcs += target_specific.sources()
|
||||
arch_deps += target_specific.dependencies()
|
||||
|
||||
# allow using headers from the dependencies but do not include the sources,
|
||||
# because this emulator only needs those in "objects". For external
|
||||
# dependencies, the full dependency is included below in the executable.
|
||||
lib_deps = []
|
||||
foreach dep : arch_deps
|
||||
lib_deps += dep.partial_dependency(compile_args: true, includes: true)
|
||||
endforeach
|
||||
|
||||
lib = static_library('qemu-' + target,
|
||||
sources: arch_srcs + genh,
|
||||
dependencies: arch_deps,
|
||||
dependencies: lib_deps,
|
||||
objects: objects,
|
||||
include_directories: target_inc,
|
||||
c_args: c_args,
|
||||
@ -3923,7 +3933,7 @@ foreach target : target_dirs
|
||||
emulator = executable(exe_name, exe['sources'],
|
||||
install: true,
|
||||
c_args: c_args,
|
||||
dependencies: arch_deps + deps + exe['dependencies'],
|
||||
dependencies: arch_deps + exe['dependencies'],
|
||||
objects: lib.extract_all_objects(recursive: true),
|
||||
link_depends: [block_syms, qemu_syms],
|
||||
link_args: link_args,
|
||||
@ -4409,7 +4419,7 @@ summary_info += {'Linux AIO support': libaio}
|
||||
summary_info += {'Linux io_uring support': linux_io_uring}
|
||||
summary_info += {'ATTR/XATTR support': libattr}
|
||||
summary_info += {'RDMA support': rdma}
|
||||
summary_info += {'fdt support': fdt_opt == 'disabled' ? false : fdt_opt}
|
||||
summary_info += {'fdt support': fdt_opt == 'internal' ? 'internal' : fdt}
|
||||
summary_info += {'libcap-ng support': libcap_ng}
|
||||
summary_info += {'bpf support': libbpf}
|
||||
summary_info += {'rbd support': rbd}
|
||||
|
@ -22,6 +22,7 @@
|
||||
#include "monitor/monitor-internal.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-control.h"
|
||||
#include "qapi/qapi-commands-machine.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
#include "qemu/cutils.h"
|
||||
@ -443,3 +444,19 @@ void hmp_info_mtree(Monitor *mon, const QDict *qdict)
|
||||
|
||||
mtree_info(flatview, dispatch_tree, owner, disabled);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_FDT)
|
||||
void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
const char *filename = qdict_get_str(qdict, "filename");
|
||||
Error *local_err = NULL;
|
||||
|
||||
qmp_dumpdtb(filename, &local_err);
|
||||
|
||||
if (hmp_handle_error(mon, local_err)) {
|
||||
return;
|
||||
}
|
||||
|
||||
monitor_printf(mon, "dtb dumped to %s", filename);
|
||||
}
|
||||
#endif
|
||||
|
10
system/device_tree-stub.c
Normal file
10
system/device_tree-stub.c
Normal file
@ -0,0 +1,10 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-commands-machine.h"
|
||||
|
||||
#ifdef CONFIG_FDT
|
||||
void qmp_dumpdtb(const char *filename, Error **errp)
|
||||
{
|
||||
error_setg(errp, "This machine doesn't have a FDT");
|
||||
}
|
||||
#endif
|
@ -668,20 +668,6 @@ void qmp_dumpdtb(const char *filename, Error **errp)
|
||||
}
|
||||
}
|
||||
|
||||
void hmp_dumpdtb(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
const char *filename = qdict_get_str(qdict, "filename");
|
||||
Error *local_err = NULL;
|
||||
|
||||
qmp_dumpdtb(filename, &local_err);
|
||||
|
||||
if (hmp_handle_error(mon, local_err)) {
|
||||
return;
|
||||
}
|
||||
|
||||
info_report("dtb dumped to %s", filename);
|
||||
}
|
||||
|
||||
void qemu_fdt_randomize_seeds(void *fdt)
|
||||
{
|
||||
int noffset, poffset, len;
|
||||
|
@ -32,7 +32,9 @@ if have_tpm
|
||||
endif
|
||||
|
||||
system_ss.add(when: seccomp, if_true: files('qemu-seccomp.c'))
|
||||
system_ss.add(when: fdt, if_true: files('device_tree.c'))
|
||||
system_ss.add(when: 'CONFIG_DEVICE_TREE',
|
||||
if_true: [fdt, files('device_tree.c')],
|
||||
if_false: files('device_tree-stub.c'))
|
||||
if host_os == 'linux'
|
||||
system_ss.add(files('async-teardown.c'))
|
||||
endif
|
||||
|
@ -6,6 +6,8 @@ config ARM
|
||||
# translate.c v7m helpers under ARM_V7M.
|
||||
select ARM_V7M if TCG
|
||||
|
||||
select DEVICE_TREE # needed by boot.c
|
||||
|
||||
config AARCH64
|
||||
bool
|
||||
select ARM
|
||||
|
@ -1,5 +1,6 @@
|
||||
config I386
|
||||
bool
|
||||
select APIC
|
||||
# kvm_arch_fixup_msi_route() needs to access PCIDevice
|
||||
select PCI if KVM
|
||||
|
||||
|
@ -713,7 +713,7 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
|
||||
#endif
|
||||
#define TCG_7_0_EBX_FEATURES (CPUID_7_0_EBX_SMEP | CPUID_7_0_EBX_SMAP | \
|
||||
CPUID_7_0_EBX_BMI1 | CPUID_7_0_EBX_BMI2 | CPUID_7_0_EBX_ADX | \
|
||||
CPUID_7_0_EBX_PCOMMIT | CPUID_7_0_EBX_CLFLUSHOPT | \
|
||||
CPUID_7_0_EBX_CLFLUSHOPT | \
|
||||
CPUID_7_0_EBX_CLWB | CPUID_7_0_EBX_MPX | CPUID_7_0_EBX_FSGSBASE | \
|
||||
CPUID_7_0_EBX_ERMS | CPUID_7_0_EBX_AVX2 | CPUID_7_0_EBX_RDSEED | \
|
||||
CPUID_7_0_EBX_SHA_NI | CPUID_7_0_EBX_KERNEL_FEATURES)
|
||||
@ -1551,8 +1551,8 @@ static FeatureDep feature_dependencies[] = {
|
||||
.to = { FEAT_SVM, ~0ull },
|
||||
},
|
||||
{
|
||||
.from = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
|
||||
.to = { FEAT_7_0_ECX, CPUID_7_0_ECX_WAITPKG },
|
||||
.from = { FEAT_7_0_ECX, CPUID_7_0_ECX_WAITPKG },
|
||||
.to = { FEAT_VMX_SECONDARY_CTLS, VMX_SECONDARY_EXEC_ENABLE_USER_WAIT_PAUSE },
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -816,8 +816,6 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
#define CPUID_7_0_EBX_SMAP (1U << 20)
|
||||
/* AVX-512 Integer Fused Multiply Add */
|
||||
#define CPUID_7_0_EBX_AVX512IFMA (1U << 21)
|
||||
/* Persistent Commit */
|
||||
#define CPUID_7_0_EBX_PCOMMIT (1U << 22)
|
||||
/* Flush a Cache Line Optimized */
|
||||
#define CPUID_7_0_EBX_CLFLUSHOPT (1U << 23)
|
||||
/* Cache Line Write Back */
|
||||
|
@ -55,6 +55,10 @@
|
||||
* mask could be applied (and the original sign-extended value would be
|
||||
* optimized away by TCG) in the emitter function.
|
||||
*
|
||||
* Finally, a "nop" operand type is used for multi-byte NOPs. It accepts
|
||||
* any value of mod including 11b (unlike M) but it does not try to
|
||||
* interpret the operand (like M).
|
||||
*
|
||||
* Vector operands
|
||||
* ---------------
|
||||
*
|
||||
@ -1056,6 +1060,16 @@ static const X86OpEntry opcodes_0F[256] = {
|
||||
[0xa0] = X86_OP_ENTRYr(PUSH, FS, w),
|
||||
[0xa1] = X86_OP_ENTRYw(POP, FS, w),
|
||||
|
||||
[0x0b] = X86_OP_ENTRY0(UD), /* UD2 */
|
||||
[0x0d] = X86_OP_ENTRY1(NOP, M,v), /* 3DNow! prefetch */
|
||||
|
||||
[0x18] = X86_OP_ENTRY1(NOP, nop,v), /* prefetch/reserved NOP */
|
||||
[0x19] = X86_OP_ENTRY1(NOP, nop,v), /* reserved NOP */
|
||||
[0x1c] = X86_OP_ENTRY1(NOP, nop,v), /* reserved NOP */
|
||||
[0x1d] = X86_OP_ENTRY1(NOP, nop,v), /* reserved NOP */
|
||||
[0x1e] = X86_OP_ENTRY1(NOP, nop,v), /* reserved NOP */
|
||||
[0x1f] = X86_OP_ENTRY1(NOP, nop,v), /* NOP/reserved NOP */
|
||||
|
||||
[0x28] = X86_OP_ENTRY3(MOVDQ, V,x, None,None, W,x, vex1 p_00_66), /* MOVAPS */
|
||||
[0x29] = X86_OP_ENTRY3(MOVDQ, W,x, None,None, V,x, vex1 p_00_66), /* MOVAPS */
|
||||
[0x2A] = X86_OP_GROUP0(0F2A),
|
||||
@ -1135,6 +1149,8 @@ static const X86OpEntry opcodes_0F[256] = {
|
||||
[0xb6] = X86_OP_ENTRY3(MOV, G,v, E,b, None, None, zextT0), /* MOVZX */
|
||||
[0xb7] = X86_OP_ENTRY3(MOV, G,v, E,w, None, None, zextT0), /* MOVZX */
|
||||
|
||||
/* decoded as modrm, which is visible as a difference between page fault and #UD */
|
||||
[0xb9] = X86_OP_ENTRYr(UD, nop,v), /* UD1 */
|
||||
[0xbe] = X86_OP_ENTRY3(MOV, G,v, E,b, None, None, sextT0), /* MOVSX */
|
||||
[0xbf] = X86_OP_ENTRY3(MOV, G,v, E,w, None, None, sextT0), /* MOVSX */
|
||||
|
||||
@ -1206,7 +1222,7 @@ static const X86OpEntry opcodes_0F[256] = {
|
||||
[0xfc] = X86_OP_ENTRY3(PADDB, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xfd] = X86_OP_ENTRY3(PADDW, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
[0xfe] = X86_OP_ENTRY3(PADDD, V,x, H,x, W,x, vex4 mmx avx2_256 p_00_66),
|
||||
/* 0xff = UD0 */
|
||||
[0xff] = X86_OP_ENTRYr(UD, nop,v), /* UD0 */
|
||||
};
|
||||
|
||||
static void do_decode_0F(DisasContext *s, CPUX86State *env, X86OpEntry *entry, uint8_t *b)
|
||||
@ -1852,6 +1868,8 @@ static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode,
|
||||
if ((modrm >> 6) == 3) {
|
||||
return false;
|
||||
}
|
||||
/* fall through */
|
||||
case X86_TYPE_nop: /* modrm operand decoded but not fetched */
|
||||
get_modrm:
|
||||
decode_modrm(s, env, decode, op, type);
|
||||
break;
|
||||
@ -2397,8 +2415,8 @@ static void disas_insn(DisasContext *s, CPUState *cpu)
|
||||
switch (b) {
|
||||
case 0x00 ... 0x03: /* mostly privileged instructions */
|
||||
case 0x05 ... 0x09:
|
||||
case 0x0d: /* 3DNow! prefetch */
|
||||
case 0x18 ... 0x23: /* prefetch, MPX, mov from/to CR and DR */
|
||||
case 0x1a ... 0x1b: /* MPX */
|
||||
case 0x20 ... 0x23: /* mov from/to CR and DR */
|
||||
case 0x30 ... 0x35: /* more privileged instructions */
|
||||
case 0xa2 ... 0xa5: /* CPUID, BT, SHLD */
|
||||
case 0xaa ... 0xae: /* RSM, SHRD, grp15 */
|
||||
|
@ -50,6 +50,7 @@ typedef enum X86OpType {
|
||||
X86_TYPE_EM, /* modrm byte selects an ALU memory operand */
|
||||
X86_TYPE_WM, /* modrm byte selects an XMM/YMM memory operand */
|
||||
X86_TYPE_I_unsigned, /* Immediate, zero-extended */
|
||||
X86_TYPE_nop, /* modrm operand decoded but not loaded into s->T{0,1} */
|
||||
X86_TYPE_2op, /* 2-operand RMW instruction */
|
||||
X86_TYPE_LoBits, /* encoded in bits 0-2 of the operand + REX.B */
|
||||
X86_TYPE_0, /* Hard-coded GPRs (RAX..RDI) */
|
||||
|
@ -3517,6 +3517,11 @@ static void gen_SUB(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
prepare_update2_cc(decode, s, CC_OP_SUBB + ot);
|
||||
}
|
||||
|
||||
static void gen_UD(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_illegal_opcode(s);
|
||||
}
|
||||
|
||||
static void gen_VAESIMC(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
assert(!s->vex_l);
|
||||
|
@ -411,16 +411,6 @@ static inline MemOp mo_stacksize(DisasContext *s)
|
||||
return CODE64(s) ? MO_64 : SS32(s) ? MO_32 : MO_16;
|
||||
}
|
||||
|
||||
/* Select only size 64 else 32. Used for SSE operand sizes. */
|
||||
static inline MemOp mo_64_32(MemOp ot)
|
||||
{
|
||||
#ifdef TARGET_X86_64
|
||||
return ot == MO_64 ? MO_64 : MO_32;
|
||||
#else
|
||||
return MO_32;
|
||||
#endif
|
||||
}
|
||||
|
||||
/* Select size 8 if lsb of B is clear, else OT. Used for decoding
|
||||
byte vs word opcodes. */
|
||||
static inline MemOp mo_b_d(int b, MemOp ot)
|
||||
@ -3917,7 +3907,8 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 1);
|
||||
break;
|
||||
case 0xee: /* rdpkru */
|
||||
if (prefixes & PREFIX_LOCK) {
|
||||
if (s->prefix & (PREFIX_LOCK | PREFIX_DATA
|
||||
| PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
tcg_gen_trunc_tl_i32(s->tmp2_i32, cpu_regs[R_ECX]);
|
||||
@ -3925,7 +3916,8 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
tcg_gen_extr_i64_tl(cpu_regs[R_EAX], cpu_regs[R_EDX], s->tmp1_i64);
|
||||
break;
|
||||
case 0xef: /* wrpkru */
|
||||
if (prefixes & PREFIX_LOCK) {
|
||||
if (s->prefix & (PREFIX_LOCK | PREFIX_DATA
|
||||
| PREFIX_REPZ | PREFIX_REPNZ)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
tcg_gen_concat_tl_i64(s->tmp1_i64, cpu_regs[R_EAX],
|
||||
@ -4027,25 +4019,6 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
}
|
||||
break;
|
||||
case 0x118:
|
||||
modrm = x86_ldub_code(env, s);
|
||||
mod = (modrm >> 6) & 3;
|
||||
op = (modrm >> 3) & 7;
|
||||
switch(op) {
|
||||
case 0: /* prefetchnta */
|
||||
case 1: /* prefetchnt0 */
|
||||
case 2: /* prefetchnt0 */
|
||||
case 3: /* prefetchnt0 */
|
||||
if (mod == 3)
|
||||
goto illegal_op;
|
||||
gen_nop_modrm(env, s, modrm);
|
||||
/* nothing more to do */
|
||||
break;
|
||||
default: /* nop (multi byte) */
|
||||
gen_nop_modrm(env, s, modrm);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
case 0x11a:
|
||||
modrm = x86_ldub_code(env, s);
|
||||
if (s->flags & HF_MPX_EN_MASK) {
|
||||
@ -4237,10 +4210,6 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
}
|
||||
gen_nop_modrm(env, s, modrm);
|
||||
break;
|
||||
case 0x119: case 0x11c ... 0x11f: /* nop (multi byte) */
|
||||
modrm = x86_ldub_code(env, s);
|
||||
gen_nop_modrm(env, s, modrm);
|
||||
break;
|
||||
|
||||
case 0x120: /* mov reg, crN */
|
||||
case 0x122: /* mov crN, reg */
|
||||
@ -4487,17 +4456,7 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
}
|
||||
goto unknown_op;
|
||||
|
||||
case 0xf8: /* sfence / pcommit */
|
||||
if (prefixes & PREFIX_DATA) {
|
||||
/* pcommit */
|
||||
if (!(s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_PCOMMIT)
|
||||
|| (prefixes & PREFIX_LOCK)) {
|
||||
goto illegal_op;
|
||||
}
|
||||
break;
|
||||
}
|
||||
/* fallthru */
|
||||
case 0xf9 ... 0xff: /* sfence */
|
||||
case 0xf8 ... 0xff: /* sfence */
|
||||
if (!(s->cpuid_features & CPUID_SSE)
|
||||
|| (prefixes & PREFIX_LOCK)) {
|
||||
goto illegal_op;
|
||||
@ -4524,13 +4483,6 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
}
|
||||
break;
|
||||
|
||||
case 0x10d: /* 3DNow! prefetch(w) */
|
||||
modrm = x86_ldub_code(env, s);
|
||||
mod = (modrm >> 6) & 3;
|
||||
if (mod == 3)
|
||||
goto illegal_op;
|
||||
gen_nop_modrm(env, s, modrm);
|
||||
break;
|
||||
case 0x1aa: /* rsm */
|
||||
gen_svm_check_intercept(s, SVM_EXIT_RSM);
|
||||
if (!(s->flags & HF_SMM_MASK))
|
||||
@ -4555,12 +4507,7 @@ static void disas_insn_old(DisasContext *s, CPUState *cpu, int b)
|
||||
modrm = x86_ldub_code(env, s);
|
||||
reg = ((modrm >> 3) & 7) | REX_R(s);
|
||||
|
||||
if (s->prefix & PREFIX_DATA) {
|
||||
ot = MO_16;
|
||||
} else {
|
||||
ot = mo_64_32(dflag);
|
||||
}
|
||||
|
||||
ot = dflag;
|
||||
gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0);
|
||||
gen_extu(ot, s->T0);
|
||||
tcg_gen_mov_tl(cpu_cc_src, s->T0);
|
||||
|
@ -1,2 +1,3 @@
|
||||
config MICROBLAZE
|
||||
bool
|
||||
select DEVICE_TREE # needed by boot.c
|
||||
|
@ -1,2 +1,3 @@
|
||||
config OPENRISC
|
||||
bool
|
||||
select DEVICE_TREE # needed by boot.c
|
||||
|
@ -1,7 +1,9 @@
|
||||
config RISCV32
|
||||
bool
|
||||
select ARM_COMPATIBLE_SEMIHOSTING # for do_common_semihosting()
|
||||
select DEVICE_TREE # needed by boot.c
|
||||
|
||||
config RISCV64
|
||||
bool
|
||||
select ARM_COMPATIBLE_SEMIHOSTING # for do_common_semihosting()
|
||||
select DEVICE_TREE # needed by boot.c
|
||||
|
@ -1,2 +1,4 @@
|
||||
config S390X
|
||||
bool
|
||||
select PCI
|
||||
select S390_FLIC
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "s390x-internal.h"
|
||||
#include "hw/boards.h"
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "exec/address-spaces.h"
|
||||
@ -435,6 +436,22 @@ static int sigp_set_architecture(S390CPU *cpu, uint32_t param,
|
||||
return SIGP_CC_STATUS_STORED;
|
||||
}
|
||||
|
||||
S390CPU *s390_cpu_addr2state(uint16_t cpu_addr)
|
||||
{
|
||||
static MachineState *ms;
|
||||
|
||||
if (!ms) {
|
||||
ms = MACHINE(qdev_get_machine());
|
||||
g_assert(ms->possible_cpus);
|
||||
}
|
||||
|
||||
/* CPU address corresponds to the core_id and the index */
|
||||
if (cpu_addr >= ms->possible_cpus->len) {
|
||||
return NULL;
|
||||
}
|
||||
return S390_CPU(ms->possible_cpus->cpus[cpu_addr].cpu);
|
||||
}
|
||||
|
||||
int handle_sigp(CPUS390XState *env, uint8_t order, uint64_t r1, uint64_t r3)
|
||||
{
|
||||
uint64_t *status_reg = &env->regs[r1];
|
||||
|
@ -1,2 +1,4 @@
|
||||
config SH4
|
||||
bool
|
||||
# needed for sh_intc_get_pending_vector
|
||||
select SH_INTC
|
||||
|
@ -632,6 +632,10 @@ int main(int argc, char **argv)
|
||||
{
|
||||
g_test_init(&argc, &argv, NULL);
|
||||
|
||||
if (!qtest_has_machine("virt")) {
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (qtest_has_accel("tcg")) {
|
||||
qtest_add_data_func("/arm/query-cpu-model-expansion",
|
||||
NULL, test_query_cpu_model_expansion);
|
||||
|
@ -173,7 +173,7 @@ static void test_drive_without_dev(void)
|
||||
QTestState *qts;
|
||||
|
||||
/* Start with an empty drive */
|
||||
qts = qtest_init("-drive if=none,id=drive0");
|
||||
qts = qtest_init("-drive if=none,id=drive0 -M none");
|
||||
|
||||
/* Delete the drive */
|
||||
drive_del(qts);
|
||||
@ -192,6 +192,11 @@ static void test_after_failed_device_add(void)
|
||||
QDict *response;
|
||||
QTestState *qts;
|
||||
|
||||
if (!has_device_builtin("virtio-blk")) {
|
||||
g_test_skip("Device virtio-blk is not available");
|
||||
return;
|
||||
}
|
||||
|
||||
snprintf(driver, sizeof(driver), "virtio-blk-%s",
|
||||
qvirtio_get_dev_type());
|
||||
|
||||
|
@ -781,6 +781,12 @@ static int test_migrate_start(QTestState **from, QTestState **to,
|
||||
kvm_opts = ",dirty-ring-size=4096";
|
||||
}
|
||||
|
||||
if (!qtest_has_machine(machine_alias)) {
|
||||
g_autofree char *msg = g_strdup_printf("machine %s not supported", machine_alias);
|
||||
g_test_skip(msg);
|
||||
return -1;
|
||||
}
|
||||
|
||||
machine = resolve_machine_version(machine_alias, QEMU_ENV_SRC,
|
||||
QEMU_ENV_DST);
|
||||
|
||||
|
@ -558,6 +558,9 @@ int main(int argc, char **argv)
|
||||
}
|
||||
|
||||
if (g_str_equal(arch, "aarch64")) {
|
||||
if (!qtest_has_machine("virt")) {
|
||||
goto out;
|
||||
}
|
||||
g_string_append(args, " -machine virt");
|
||||
}
|
||||
|
||||
@ -590,5 +593,6 @@ int main(int argc, char **argv)
|
||||
aarch64_numa_cpu);
|
||||
}
|
||||
|
||||
out:
|
||||
return g_test_run();
|
||||
}
|
||||
|
@ -715,6 +715,30 @@ void test_mul(void)
|
||||
printf("%-10s A=" FMTLX " R=" FMTLX " %ld\n", #op, val, res, resz);\
|
||||
}
|
||||
|
||||
void test_xcnt(void)
|
||||
{
|
||||
TEST_BSX(tzcntw, "w", 0);
|
||||
TEST_BSX(tzcntw, "w", 0x12340128);
|
||||
TEST_BSX(lzcntw, "w", 0);
|
||||
TEST_BSX(lzcntw, "w", 0x12340128);
|
||||
TEST_BSX(popcntw, "w", 0);
|
||||
TEST_BSX(popcntw, "w", 0x12340128);
|
||||
TEST_BSX(tzcntl, "k", 0);
|
||||
TEST_BSX(tzcntl, "k", 0x00340128);
|
||||
TEST_BSX(lzcntl, "k", 0);
|
||||
TEST_BSX(lzcntl, "k", 0x00340128);
|
||||
TEST_BSX(popcntl, "k", 0);
|
||||
TEST_BSX(popcntl, "k", 0x00340128);
|
||||
#if defined(__x86_64__)
|
||||
TEST_BSX(tzcntq, "", 0);
|
||||
TEST_BSX(tzcntq, "", 0x003401281234);
|
||||
TEST_BSX(lzcntq, "", 0);
|
||||
TEST_BSX(lzcntq, "", 0x003401281234);
|
||||
TEST_BSX(popcntq, "", 0);
|
||||
TEST_BSX(popcntq, "", 0x003401281234);
|
||||
#endif
|
||||
}
|
||||
|
||||
void test_bsx(void)
|
||||
{
|
||||
TEST_BSX(bsrw, "w", 0);
|
||||
@ -2162,6 +2186,7 @@ int main(int argc, char **argv)
|
||||
func();
|
||||
}
|
||||
test_bsx();
|
||||
test_xcnt();
|
||||
test_mul();
|
||||
test_jcc();
|
||||
test_loop();
|
||||
|
Loading…
Reference in New Issue
Block a user