mirror of
https://github.com/xemu-project/xemu.git
synced 2024-11-23 11:39:53 +00:00
* Build system fixes and cleanups
* DMA support in the multiboot option ROM * Rename default-bus-bypass-iommu * Deprecate -watchdog and cleanup -watchdog-action * HVF fix for <PAGE_SIZE regions * Support TSC scaling for AMD nested virtualization * Fix for ESP fuzzing bug -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmGBUeEUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroOh+Qf+OMRhRiv6dYjbK/5zXrx81AgxYAY3 dBUSr8v16LyrMl1U3DZWzhD+MzQsC83m/Xsh4lGxlHDWtkK9QQA5xDG95JZdY26i MGCbbjnFHISbyBQV9Y724gPfPjOOODuoFbzafSx6VLITOcyv1ye0cm7TOjOPB+tt E4c3JqTZ7g8a5yMe8ItkVhz5pPY+oVw8dxMNRp6Sup5Dbfx0DjacIwLasLsHfPL7 qBADfqB20ovHUzLjXu7oWgEd4KxJ6kiSCaJJu/KD36hg0wB8+WVP1o43j4PkczHT QjU7eZaeaTrN5Cf34ttPge6QReMi5SFNCaA9O9/HLqrQgdEtt/diZWuqjQ== =a2mC -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/bonzini/tags/for-upstream' into staging * Build system fixes and cleanups * DMA support in the multiboot option ROM * Rename default-bus-bypass-iommu * Deprecate -watchdog and cleanup -watchdog-action * HVF fix for <PAGE_SIZE regions * Support TSC scaling for AMD nested virtualization * Fix for ESP fuzzing bug # gpg: Signature made Tue 02 Nov 2021 10:57:37 AM EDT # 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] * remotes/bonzini/tags/for-upstream: (27 commits) configure: fix --audio-drv-list help message configure: Remove the check for the __thread keyword Move the l2tpv3 test from configure to meson.build meson: remove unnecessary coreaudio test program meson: remove pointless warnings meson.build: Allow to disable OSS again meson: bump submodule to 0.59.3 qtest/am53c974-test: add test for cancelling in-flight requests esp: ensure in-flight SCSI requests are always cancelled KVM: SVM: add migration support for nested TSC scaling hw/i386: fix vmmouse registration watchdog: remove select_watchdog_action vl: deprecate -watchdog watchdog: add information from -watchdog help to -device help hw/i386: Rename default_bus_bypass_iommu hvf: Avoid mapping regions < PAGE_SIZE as ram configure: do not duplicate CPU_CFLAGS into QEMU_LDFLAGS configure: remove useless NPTL probe target/i386: use DMA-enabled multiboot ROM for new-enough QEMU machine types optionrom: add a DMA-enabled multiboot ROM ... Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
commit
b1fd92137e
@ -1611,7 +1611,7 @@ microvm
|
||||
M: Sergio Lopez <slp@redhat.com>
|
||||
M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
S: Maintained
|
||||
F: docs/microvm.rst
|
||||
F: docs/system/i386/microvm.rst
|
||||
F: hw/i386/microvm.c
|
||||
F: include/hw/i386/microvm.h
|
||||
F: pc-bios/bios-microvm.bin
|
||||
|
5
Makefile
5
Makefile
@ -235,7 +235,8 @@ distclean: clean
|
||||
rm -f linux-headers/asm
|
||||
rm -Rf .sdk
|
||||
|
||||
find-src-path = find "$(SRC_PATH)/" -path "$(SRC_PATH)/meson" -prune -o \( -name "*.[chsS]" -o -name "*.[ch].inc" \)
|
||||
find-src-path = find "$(SRC_PATH)" -path "$(SRC_PATH)/meson" -prune -o \
|
||||
-type l -prune -o \( -name "*.[chsS]" -o -name "*.[ch].inc" \)
|
||||
|
||||
.PHONY: ctags
|
||||
ctags:
|
||||
@ -256,7 +257,7 @@ gtags:
|
||||
"GTAGS", "Remove old $@ files")
|
||||
$(call quiet-command, \
|
||||
(cd $(SRC_PATH) && \
|
||||
$(find-src-path) | gtags -f -), \
|
||||
$(find-src-path) -print | gtags -f -), \
|
||||
"GTAGS", "Re-index $(SRC_PATH)")
|
||||
|
||||
.PHONY: TAGS
|
||||
|
@ -122,6 +122,7 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
|
||||
MemoryRegion *area = section->mr;
|
||||
bool writeable = !area->readonly && !area->rom_device;
|
||||
hv_memory_flags_t flags;
|
||||
uint64_t page_size = qemu_real_host_page_size;
|
||||
|
||||
if (!memory_region_is_ram(area)) {
|
||||
if (writeable) {
|
||||
@ -135,6 +136,12 @@ static void hvf_set_phys_mem(MemoryRegionSection *section, bool add)
|
||||
}
|
||||
}
|
||||
|
||||
if (!QEMU_IS_ALIGNED(int128_get64(section->size), page_size) ||
|
||||
!QEMU_IS_ALIGNED(section->offset_within_address_space, page_size)) {
|
||||
/* Not page aligned, so we can not map as RAM */
|
||||
add = false;
|
||||
}
|
||||
|
||||
mem = hvf_find_overlap_slot(
|
||||
section->offset_within_address_space,
|
||||
int128_get64(section->size));
|
||||
|
113
configure
vendored
113
configure
vendored
@ -1259,45 +1259,20 @@ firmwarepath="${firmwarepath:-$datadir/qemu-firmware}"
|
||||
localedir="${localedir:-$datadir/locale}"
|
||||
|
||||
case "$cpu" in
|
||||
ppc)
|
||||
CPU_CFLAGS="-m32"
|
||||
QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
|
||||
;;
|
||||
ppc64)
|
||||
CPU_CFLAGS="-m64"
|
||||
QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
|
||||
;;
|
||||
sparc)
|
||||
CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc"
|
||||
QEMU_LDFLAGS="-m32 -mv8plus $QEMU_LDFLAGS"
|
||||
;;
|
||||
sparc64)
|
||||
CPU_CFLAGS="-m64 -mcpu=ultrasparc"
|
||||
QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
|
||||
;;
|
||||
s390)
|
||||
CPU_CFLAGS="-m31"
|
||||
QEMU_LDFLAGS="-m31 $QEMU_LDFLAGS"
|
||||
;;
|
||||
s390x)
|
||||
CPU_CFLAGS="-m64"
|
||||
QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
|
||||
;;
|
||||
i386)
|
||||
CPU_CFLAGS="-m32"
|
||||
QEMU_LDFLAGS="-m32 $QEMU_LDFLAGS"
|
||||
;;
|
||||
x86_64)
|
||||
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
|
||||
# If we truly care, we should simply detect this case at
|
||||
# runtime and generate the fallback to serial emulation.
|
||||
CPU_CFLAGS="-m64 -mcx16"
|
||||
QEMU_LDFLAGS="-m64 $QEMU_LDFLAGS"
|
||||
;;
|
||||
x32)
|
||||
CPU_CFLAGS="-mx32"
|
||||
QEMU_LDFLAGS="-mx32 $QEMU_LDFLAGS"
|
||||
;;
|
||||
ppc) CPU_CFLAGS="-m32" ;;
|
||||
ppc64) CPU_CFLAGS="-m64" ;;
|
||||
sparc) CPU_CFLAGS="-m32 -mv8plus -mcpu=ultrasparc" ;;
|
||||
sparc64) CPU_CFLAGS="-m64 -mcpu=ultrasparc" ;;
|
||||
s390) CPU_CFLAGS="-m31" ;;
|
||||
s390x) CPU_CFLAGS="-m64" ;;
|
||||
i386) CPU_CFLAGS="-m32" ;;
|
||||
x32) CPU_CFLAGS="-mx32" ;;
|
||||
|
||||
# ??? Only extremely old AMD cpus do not have cmpxchg16b.
|
||||
# If we truly care, we should simply detect this case at
|
||||
# runtime and generate the fallback to serial emulation.
|
||||
x86_64) CPU_CFLAGS="-m64 -mcx16" ;;
|
||||
|
||||
# No special flags required for other host CPUs
|
||||
esac
|
||||
|
||||
@ -1411,7 +1386,7 @@ Advanced options (experts only):
|
||||
--disable-strip disable stripping binaries
|
||||
--disable-werror disable compilation abort on warning
|
||||
--disable-stack-protector disable compiler-provided stack protection
|
||||
--audio-drv-list=LIST set audio drivers list
|
||||
--audio-drv-list=LIST set audio drivers to try if -audiodev is not used
|
||||
--block-drv-whitelist=L Same as --block-drv-rw-whitelist=L
|
||||
--block-drv-rw-whitelist=L
|
||||
set block driver read-write whitelist
|
||||
@ -1521,7 +1496,7 @@ python_version=$($python -c 'import sys; print("%d.%d.%d" % (sys.version_info[0]
|
||||
python="$python -B"
|
||||
|
||||
if test -z "$meson"; then
|
||||
if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.2; then
|
||||
if test "$explicit_python" = no && has meson && version_ge "$(meson --version)" 0.59.3; then
|
||||
meson=meson
|
||||
elif test $git_submodules_action != 'ignore' ; then
|
||||
meson=git
|
||||
@ -1745,17 +1720,6 @@ if test "$static" = "yes" ; then
|
||||
fi
|
||||
fi
|
||||
|
||||
# Unconditional check for compiler __thread support
|
||||
cat > $TMPC << EOF
|
||||
static __thread int tls_var;
|
||||
int main(void) { return tls_var; }
|
||||
EOF
|
||||
|
||||
if ! compile_prog "-Werror" "" ; then
|
||||
error_exit "Your compiler does not support the __thread specifier for " \
|
||||
"Thread-Local Storage (TLS). Please upgrade to a version that does."
|
||||
fi
|
||||
|
||||
cat > $TMPC << EOF
|
||||
|
||||
#ifdef __linux__
|
||||
@ -1767,9 +1731,11 @@ static THREAD int tls_var;
|
||||
int main(void) { return tls_var; }
|
||||
EOF
|
||||
|
||||
# Check we support --no-pie first; we will need this for building ROMs.
|
||||
# Check we support -fno-pie and -no-pie first; we will need the former for
|
||||
# building ROMs, and both for everything if --disable-pie is passed.
|
||||
if compile_prog "-Werror -fno-pie" "-no-pie"; then
|
||||
CFLAGS_NOPIE="-fno-pie"
|
||||
LDFLAGS_NOPIE="-no-pie"
|
||||
fi
|
||||
|
||||
if test "$static" = "yes"; then
|
||||
@ -1785,6 +1751,7 @@ if test "$static" = "yes"; then
|
||||
fi
|
||||
elif test "$pie" = "no"; then
|
||||
CONFIGURE_CFLAGS="$CFLAGS_NOPIE $CONFIGURE_CFLAGS"
|
||||
CONFIGURE_LDFLAGS="$LDFLAGS_NOPIE $CONFIGURE_LDFLAGS"
|
||||
elif compile_prog "-Werror -fPIE -DPIE" "-pie"; then
|
||||
CONFIGURE_CFLAGS="-fPIE -DPIE $CONFIGURE_CFLAGS"
|
||||
CONFIGURE_LDFLAGS="-pie $CONFIGURE_LDFLAGS"
|
||||
@ -1914,20 +1881,6 @@ if test -z "$want_tools"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# L2TPV3 probe
|
||||
|
||||
cat > $TMPC <<EOF
|
||||
#include <sys/socket.h>
|
||||
#include <linux/ip.h>
|
||||
int main(void) { return sizeof(struct mmsghdr); }
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
l2tpv3=yes
|
||||
else
|
||||
l2tpv3=no
|
||||
fi
|
||||
|
||||
#########################################
|
||||
# vhost interdependencies and host support
|
||||
|
||||
@ -1987,25 +1940,6 @@ if ! has "$pkg_config_exe"; then
|
||||
error_exit "pkg-config binary '$pkg_config_exe' not found"
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# NPTL probe
|
||||
|
||||
if test "$linux_user" = "yes"; then
|
||||
cat > $TMPC <<EOF
|
||||
#include <sched.h>
|
||||
#include <linux/futex.h>
|
||||
int main(void) {
|
||||
#if !defined(CLONE_SETTLS) || !defined(FUTEX_WAIT)
|
||||
#error bork
|
||||
#endif
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if ! compile_object ; then
|
||||
feature_not_found "nptl" "Install glibc and linux kernel headers."
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# xen probe
|
||||
|
||||
@ -3551,9 +3485,6 @@ if test "$slirp_smbd" = "yes" ; then
|
||||
echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
|
||||
echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
|
||||
fi
|
||||
if test "$l2tpv3" = "yes" ; then
|
||||
echo "CONFIG_L2TPV3=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$gprof" = "yes" ; then
|
||||
echo "CONFIG_GPROF=y" >> $config_host_mak
|
||||
fi
|
||||
@ -3956,6 +3887,10 @@ for rom in seabios; do
|
||||
echo "RANLIB=$ranlib" >> $config_mak
|
||||
done
|
||||
|
||||
config_mak=pc-bios/optionrom/config.mak
|
||||
echo "# Automatically generated by configure - do not modify" > $config_mak
|
||||
echo "TOPSRC_DIR=$source_path" >> $config_mak
|
||||
|
||||
if test "$skip_meson" = no; then
|
||||
cross="config-meson.cross.new"
|
||||
meson_quote() {
|
||||
|
@ -160,6 +160,11 @@ Use ``-display sdl`` instead.
|
||||
|
||||
Use ``-display curses`` instead.
|
||||
|
||||
``-watchdog`` (since 6.2)
|
||||
'''''''''''''''''''''''''
|
||||
|
||||
Use ``-device`` instead.
|
||||
|
||||
``-smp`` ("parameter=0" SMP configurations) (since 6.2)
|
||||
'''''''''''''''''''''''''''''''''''''''''''''''''''''''
|
||||
|
||||
|
@ -1105,7 +1105,7 @@ static int vtd_page_walk_one(IOMMUTLBEvent *event, vtd_page_walk_info *info)
|
||||
.translated_addr = entry->translated_addr,
|
||||
.perm = entry->perm,
|
||||
};
|
||||
DMAMap *mapped = iova_tree_find(as->iova_tree, &target);
|
||||
const DMAMap *mapped = iova_tree_find(as->iova_tree, &target);
|
||||
|
||||
if (event->type == IOMMU_NOTIFIER_UNMAP && !info->notify_unmap) {
|
||||
trace_vtd_page_walk_one_skip_unmap(entry->iova, entry->addr_mask);
|
||||
|
@ -332,7 +332,7 @@ static void microvm_memory_init(MicrovmMachineState *mms)
|
||||
rom_set_fw(fw_cfg);
|
||||
|
||||
if (machine->kernel_filename != NULL) {
|
||||
x86_load_linux(x86ms, fw_cfg, 0, true, true);
|
||||
x86_load_linux(x86ms, fw_cfg, 0, true);
|
||||
}
|
||||
|
||||
if (mms->option_roms) {
|
||||
@ -669,6 +669,7 @@ static void microvm_machine_initfn(Object *obj)
|
||||
|
||||
static void microvm_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(oc);
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
HotplugHandlerClass *hc = HOTPLUG_HANDLER_CLASS(oc);
|
||||
|
||||
@ -699,6 +700,8 @@ static void microvm_class_init(ObjectClass *oc, void *data)
|
||||
hc->unplug_request = microvm_device_unplug_request_cb;
|
||||
hc->unplug = microvm_device_unplug_cb;
|
||||
|
||||
x86mc->fwcfg_dma_enabled = true;
|
||||
|
||||
object_class_property_add(oc, MICROVM_MACHINE_PIC, "OnOffAuto",
|
||||
microvm_machine_get_pic,
|
||||
microvm_machine_set_pic,
|
||||
|
@ -143,7 +143,8 @@ static void mb_add_mod(MultibootState *s,
|
||||
s->mb_mods_count++;
|
||||
}
|
||||
|
||||
int load_multiboot(FWCfgState *fw_cfg,
|
||||
int load_multiboot(X86MachineState *x86ms,
|
||||
FWCfgState *fw_cfg,
|
||||
FILE *f,
|
||||
const char *kernel_filename,
|
||||
const char *initrd_filename,
|
||||
@ -151,6 +152,7 @@ int load_multiboot(FWCfgState *fw_cfg,
|
||||
int kernel_file_size,
|
||||
uint8_t *header)
|
||||
{
|
||||
bool multiboot_dma_enabled = X86_MACHINE_GET_CLASS(x86ms)->fwcfg_dma_enabled;
|
||||
int i, is_multiboot = 0;
|
||||
uint32_t flags = 0;
|
||||
uint32_t mh_entry_addr;
|
||||
@ -401,7 +403,11 @@ int load_multiboot(FWCfgState *fw_cfg,
|
||||
fw_cfg_add_bytes(fw_cfg, FW_CFG_INITRD_DATA, mb_bootinfo_data,
|
||||
sizeof(bootinfo));
|
||||
|
||||
option_rom[nb_option_roms].name = "multiboot.bin";
|
||||
if (multiboot_dma_enabled) {
|
||||
option_rom[nb_option_roms].name = "multiboot_dma.bin";
|
||||
} else {
|
||||
option_rom[nb_option_roms].name = "multiboot.bin";
|
||||
}
|
||||
option_rom[nb_option_roms].bootindex = 0;
|
||||
nb_option_roms++;
|
||||
|
||||
|
@ -2,8 +2,10 @@
|
||||
#define QEMU_MULTIBOOT_H
|
||||
|
||||
#include "hw/nvram/fw_cfg.h"
|
||||
#include "hw/i386/x86.h"
|
||||
|
||||
int load_multiboot(FWCfgState *fw_cfg,
|
||||
int load_multiboot(X86MachineState *x86ms,
|
||||
FWCfgState *fw_cfg,
|
||||
FILE *f,
|
||||
const char *kernel_filename,
|
||||
const char *initrd_filename,
|
||||
|
10
hw/i386/pc.c
10
hw/i386/pc.c
@ -776,12 +776,13 @@ void xen_load_linux(PCMachineState *pcms)
|
||||
rom_set_fw(fw_cfg);
|
||||
|
||||
x86_load_linux(x86ms, fw_cfg, pcmc->acpi_data_size,
|
||||
pcmc->pvh_enabled, pcmc->linuxboot_dma_enabled);
|
||||
pcmc->pvh_enabled);
|
||||
for (i = 0; i < nb_option_roms; i++) {
|
||||
assert(!strcmp(option_rom[i].name, "linuxboot.bin") ||
|
||||
!strcmp(option_rom[i].name, "linuxboot_dma.bin") ||
|
||||
!strcmp(option_rom[i].name, "pvh.bin") ||
|
||||
!strcmp(option_rom[i].name, "multiboot.bin"));
|
||||
!strcmp(option_rom[i].name, "multiboot.bin") ||
|
||||
!strcmp(option_rom[i].name, "multiboot_dma.bin"));
|
||||
rom_add_option(option_rom[i].name, option_rom[i].bootindex);
|
||||
}
|
||||
x86ms->fw_cfg = fw_cfg;
|
||||
@ -928,7 +929,7 @@ void pc_memory_init(PCMachineState *pcms,
|
||||
|
||||
if (linux_boot) {
|
||||
x86_load_linux(x86ms, fw_cfg, pcmc->acpi_data_size,
|
||||
pcmc->pvh_enabled, pcmc->linuxboot_dma_enabled);
|
||||
pcmc->pvh_enabled);
|
||||
}
|
||||
|
||||
for (i = 0; i < nb_option_roms; i++) {
|
||||
@ -1688,7 +1689,6 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
/* BIOS ACPI tables: 128K. Other BIOS datastructures: less than 4K reported
|
||||
* to be used at the moment, 32K should be enough for a while. */
|
||||
pcmc->acpi_data_size = 0x20000 + 0x8000;
|
||||
pcmc->linuxboot_dma_enabled = true;
|
||||
pcmc->pvh_enabled = true;
|
||||
pcmc->kvmclock_create_always = true;
|
||||
assert(!mc->get_hotplug_handler);
|
||||
@ -1742,7 +1742,7 @@ static void pc_machine_class_init(ObjectClass *oc, void *data)
|
||||
object_class_property_add_bool(oc, "hpet",
|
||||
pc_machine_get_hpet, pc_machine_set_hpet);
|
||||
|
||||
object_class_property_add_bool(oc, "default_bus_bypass_iommu",
|
||||
object_class_property_add_bool(oc, "default-bus-bypass-iommu",
|
||||
pc_machine_get_default_bus_bypass_iommu,
|
||||
pc_machine_set_default_bus_bypass_iommu);
|
||||
|
||||
|
@ -620,11 +620,12 @@ DEFINE_I440FX_MACHINE(v2_7, "pc-i440fx-2.7", NULL,
|
||||
|
||||
static void pc_i440fx_2_6_machine_options(MachineClass *m)
|
||||
{
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
|
||||
pc_i440fx_2_7_machine_options(m);
|
||||
pcmc->legacy_cpu_hotplug = true;
|
||||
pcmc->linuxboot_dma_enabled = false;
|
||||
x86mc->fwcfg_dma_enabled = false;
|
||||
compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
|
||||
compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
|
||||
}
|
||||
|
@ -573,11 +573,12 @@ DEFINE_Q35_MACHINE(v2_7, "pc-q35-2.7", NULL,
|
||||
|
||||
static void pc_q35_2_6_machine_options(MachineClass *m)
|
||||
{
|
||||
X86MachineClass *x86mc = X86_MACHINE_CLASS(m);
|
||||
PCMachineClass *pcmc = PC_MACHINE_CLASS(m);
|
||||
|
||||
pc_q35_2_7_machine_options(m);
|
||||
pcmc->legacy_cpu_hotplug = true;
|
||||
pcmc->linuxboot_dma_enabled = false;
|
||||
x86mc->fwcfg_dma_enabled = false;
|
||||
compat_props_add(m->compat_props, hw_compat_2_6, hw_compat_2_6_len);
|
||||
compat_props_add(m->compat_props, pc_compat_2_6, pc_compat_2_6_len);
|
||||
}
|
||||
|
@ -764,9 +764,9 @@ static bool load_elfboot(const char *kernel_filename,
|
||||
void x86_load_linux(X86MachineState *x86ms,
|
||||
FWCfgState *fw_cfg,
|
||||
int acpi_data_size,
|
||||
bool pvh_enabled,
|
||||
bool linuxboot_dma_enabled)
|
||||
bool pvh_enabled)
|
||||
{
|
||||
bool linuxboot_dma_enabled = X86_MACHINE_GET_CLASS(x86ms)->fwcfg_dma_enabled;
|
||||
uint16_t protocol;
|
||||
int setup_size, kernel_size, cmdline_size;
|
||||
int dtb_size, setup_data_offset;
|
||||
@ -814,7 +814,7 @@ void x86_load_linux(X86MachineState *x86ms,
|
||||
* PVH), so we try multiboot first since we check the multiboot magic
|
||||
* header before to load it.
|
||||
*/
|
||||
if (load_multiboot(fw_cfg, f, kernel_filename, initrd_filename,
|
||||
if (load_multiboot(x86ms, fw_cfg, f, kernel_filename, initrd_filename,
|
||||
kernel_cmdline, kernel_size, header)) {
|
||||
return;
|
||||
}
|
||||
@ -1332,6 +1332,7 @@ static void x86_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->possible_cpu_arch_ids = x86_possible_cpu_arch_ids;
|
||||
x86mc->compat_apic_id_mode = false;
|
||||
x86mc->save_tsc_khz = true;
|
||||
x86mc->fwcfg_dma_enabled = true;
|
||||
nc->nmi_monitor_handler = x86_nmi;
|
||||
|
||||
object_class_property_add(oc, X86_MACHINE_SMM, "OnOffAuto",
|
||||
|
@ -204,11 +204,6 @@ static int esp_select(ESPState *s)
|
||||
s->ti_size = 0;
|
||||
fifo8_reset(&s->fifo);
|
||||
|
||||
if (s->current_req) {
|
||||
/* Started a new command before the old one finished. Cancel it. */
|
||||
scsi_req_cancel(s->current_req);
|
||||
}
|
||||
|
||||
s->current_dev = scsi_device_find(&s->bus, 0, target, 0);
|
||||
if (!s->current_dev) {
|
||||
/* No such drive */
|
||||
@ -235,6 +230,11 @@ static uint32_t get_cmd(ESPState *s, uint32_t maxlen)
|
||||
uint32_t dmalen, n;
|
||||
int target;
|
||||
|
||||
if (s->current_req) {
|
||||
/* Started a new command before the old one finished. Cancel it. */
|
||||
scsi_req_cancel(s->current_req);
|
||||
}
|
||||
|
||||
target = s->wregs[ESP_WBUSID] & BUSID_DID;
|
||||
if (s->dma) {
|
||||
dmalen = MIN(esp_get_tc(s), maxlen);
|
||||
|
@ -273,8 +273,9 @@ static void wdt_sbsa_gwdt_class_init(ObjectClass *klass, void *data)
|
||||
dc->realize = wdt_sbsa_gwdt_realize;
|
||||
dc->reset = wdt_sbsa_gwdt_reset;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
dc->vmsd = &vmstate_sbsa_gwdt;
|
||||
dc->desc = "SBSA-compliant generic watchdog device";
|
||||
}
|
||||
|
||||
static const TypeInfo wdt_sbsa_gwdt_info = {
|
||||
|
@ -76,20 +76,6 @@ int select_watchdog(const char *p)
|
||||
return 1;
|
||||
}
|
||||
|
||||
int select_watchdog_action(const char *p)
|
||||
{
|
||||
int action;
|
||||
char *qapi_value;
|
||||
|
||||
qapi_value = g_ascii_strdown(p, -1);
|
||||
action = qapi_enum_parse(&WatchdogAction_lookup, qapi_value, -1, NULL);
|
||||
g_free(qapi_value);
|
||||
if (action < 0)
|
||||
return -1;
|
||||
qmp_watchdog_set_action(action, &error_abort);
|
||||
return 0;
|
||||
}
|
||||
|
||||
WatchdogAction get_watchdog_action(void)
|
||||
{
|
||||
return watchdog_action;
|
||||
|
@ -293,9 +293,10 @@ static void aspeed_wdt_class_init(ObjectClass *klass, void *data)
|
||||
dc->desc = "ASPEED Watchdog Controller";
|
||||
dc->realize = aspeed_wdt_realize;
|
||||
dc->reset = aspeed_wdt_reset;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
dc->vmsd = &vmstate_aspeed_wdt;
|
||||
device_class_set_props(dc, aspeed_wdt_properties);
|
||||
dc->desc = "Aspeed watchdog device";
|
||||
}
|
||||
|
||||
static const TypeInfo aspeed_wdt_info = {
|
||||
|
@ -122,9 +122,10 @@ static void wdt_diag288_class_init(ObjectClass *klass, void *data)
|
||||
dc->unrealize = wdt_diag288_unrealize;
|
||||
dc->reset = wdt_diag288_reset;
|
||||
dc->hotpluggable = false;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
dc->vmsd = &vmstate_diag288;
|
||||
diag288->handle_timer = wdt_diag288_handle_timer;
|
||||
dc->desc = "diag288 device for s390x platform";
|
||||
}
|
||||
|
||||
static const TypeInfo wdt_diag288_info = {
|
||||
|
@ -476,7 +476,8 @@ static void i6300esb_class_init(ObjectClass *klass, void *data)
|
||||
k->class_id = PCI_CLASS_SYSTEM_OTHER;
|
||||
dc->reset = i6300esb_reset;
|
||||
dc->vmsd = &vmstate_i6300esb;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
dc->desc = "Intel 6300ESB";
|
||||
}
|
||||
|
||||
static const TypeInfo i6300esb_info = {
|
||||
|
@ -140,7 +140,8 @@ static void wdt_ib700_class_init(ObjectClass *klass, void *data)
|
||||
dc->realize = wdt_ib700_realize;
|
||||
dc->reset = wdt_ib700_reset;
|
||||
dc->vmsd = &vmstate_ib700;
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
dc->desc = "iBASE 700";
|
||||
}
|
||||
|
||||
static const TypeInfo wdt_ib700_info = {
|
||||
|
@ -280,8 +280,8 @@ static void imx2_wdt_class_init(ObjectClass *klass, void *data)
|
||||
dc->realize = imx2_wdt_realize;
|
||||
dc->reset = imx2_wdt_reset;
|
||||
dc->vmsd = &vmstate_imx2_wdt;
|
||||
dc->desc = "i.MX watchdog timer";
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
dc->desc = "i.MX2 watchdog timer";
|
||||
set_bit(DEVICE_CATEGORY_WATCHDOG, dc->categories);
|
||||
}
|
||||
|
||||
static const TypeInfo imx2_wdt_info = {
|
||||
|
@ -117,9 +117,6 @@ struct PCMachineClass {
|
||||
/* generate legacy CPU hotplug AML */
|
||||
bool legacy_cpu_hotplug;
|
||||
|
||||
/* use DMA capable linuxboot option rom */
|
||||
bool linuxboot_dma_enabled;
|
||||
|
||||
/* use PVH to load kernels that support this feature */
|
||||
bool pvh_enabled;
|
||||
|
||||
|
@ -38,6 +38,8 @@ struct X86MachineClass {
|
||||
bool save_tsc_khz;
|
||||
/* Enables contiguous-apic-ID mode */
|
||||
bool compat_apic_id_mode;
|
||||
/* use DMA capable linuxboot option rom */
|
||||
bool fwcfg_dma_enabled;
|
||||
};
|
||||
|
||||
struct X86MachineState {
|
||||
@ -120,8 +122,7 @@ void x86_bios_rom_init(MachineState *ms, const char *default_firmware,
|
||||
void x86_load_linux(X86MachineState *x86ms,
|
||||
FWCfgState *fw_cfg,
|
||||
int acpi_data_size,
|
||||
bool pvh_enabled,
|
||||
bool linuxboot_dma_enabled);
|
||||
bool pvh_enabled);
|
||||
|
||||
bool x86_machine_is_smm_enabled(const X86MachineState *x86ms);
|
||||
bool x86_machine_is_acpi_enabled(const X86MachineState *x86ms);
|
||||
|
@ -26,6 +26,7 @@ typedef enum DeviceCategory {
|
||||
DEVICE_CATEGORY_SOUND,
|
||||
DEVICE_CATEGORY_MISC,
|
||||
DEVICE_CATEGORY_CPU,
|
||||
DEVICE_CATEGORY_WATCHDOG,
|
||||
DEVICE_CATEGORY_MAX
|
||||
} DeviceCategory;
|
||||
|
||||
|
@ -59,7 +59,7 @@ IOVATree *iova_tree_new(void);
|
||||
*
|
||||
* Return: 0 if succeeded, or <0 if error.
|
||||
*/
|
||||
int iova_tree_insert(IOVATree *tree, DMAMap *map);
|
||||
int iova_tree_insert(IOVATree *tree, const DMAMap *map);
|
||||
|
||||
/**
|
||||
* iova_tree_remove:
|
||||
@ -74,7 +74,7 @@ int iova_tree_insert(IOVATree *tree, DMAMap *map);
|
||||
*
|
||||
* Return: 0 if succeeded, or <0 if error.
|
||||
*/
|
||||
int iova_tree_remove(IOVATree *tree, DMAMap *map);
|
||||
int iova_tree_remove(IOVATree *tree, const DMAMap *map);
|
||||
|
||||
/**
|
||||
* iova_tree_find:
|
||||
@ -92,7 +92,7 @@ int iova_tree_remove(IOVATree *tree, DMAMap *map);
|
||||
* user is responsible to make sure the pointer is valid (say, no
|
||||
* concurrent deletion in progress).
|
||||
*/
|
||||
DMAMap *iova_tree_find(IOVATree *tree, DMAMap *map);
|
||||
const DMAMap *iova_tree_find(const IOVATree *tree, const DMAMap *map);
|
||||
|
||||
/**
|
||||
* iova_tree_find_address:
|
||||
@ -105,7 +105,7 @@ DMAMap *iova_tree_find(IOVATree *tree, DMAMap *map);
|
||||
*
|
||||
* Return: same as iova_tree_find().
|
||||
*/
|
||||
DMAMap *iova_tree_find_address(IOVATree *tree, hwaddr iova);
|
||||
const DMAMap *iova_tree_find_address(const IOVATree *tree, hwaddr iova);
|
||||
|
||||
/**
|
||||
* iova_tree_foreach:
|
||||
|
@ -37,7 +37,6 @@ typedef struct WatchdogTimerModel WatchdogTimerModel;
|
||||
|
||||
/* in hw/watchdog.c */
|
||||
int select_watchdog(const char *p);
|
||||
int select_watchdog_action(const char *action);
|
||||
WatchdogAction get_watchdog_action(void);
|
||||
void watchdog_add_model(WatchdogTimerModel *model);
|
||||
void watchdog_perform_action(void);
|
||||
|
2
meson
2
meson
@ -1 +1 @@
|
||||
Subproject commit b25d94e7c77fda05a7fdfe8afe562cf9760d69da
|
||||
Subproject commit 12f9f04ba0decfda425dbbf9a501084c153a2d18
|
30
meson.build
30
meson.build
@ -909,7 +909,7 @@ if liblzfse.found() and not cc.links('''
|
||||
endif
|
||||
|
||||
oss = not_found
|
||||
if not get_option('oss').auto() or have_system
|
||||
if have_system and not get_option('oss').disabled()
|
||||
if not cc.has_header('sys/soundcard.h')
|
||||
# not found
|
||||
elif targetos == 'netbsd'
|
||||
@ -922,8 +922,6 @@ if not get_option('oss').auto() or have_system
|
||||
if not oss.found()
|
||||
if get_option('oss').enabled()
|
||||
error('OSS not found')
|
||||
else
|
||||
warning('OSS not found, disabling')
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@ -936,8 +934,6 @@ if not get_option('dsound').auto() or (targetos == 'windows' and have_system)
|
||||
if not dsound.found()
|
||||
if get_option('dsound').enabled()
|
||||
error('DirectSound not found')
|
||||
else
|
||||
warning('DirectSound not found, disabling')
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
@ -946,22 +942,6 @@ coreaudio = not_found
|
||||
if not get_option('coreaudio').auto() or (targetos == 'darwin' and have_system)
|
||||
coreaudio = dependency('appleframeworks', modules: 'CoreAudio',
|
||||
required: get_option('coreaudio'))
|
||||
if coreaudio.found() and not cc.links('''
|
||||
#include <CoreAudio/CoreAudio.h>
|
||||
int main(void)
|
||||
{
|
||||
return (int)AudioGetCurrentHostTime();
|
||||
}''')
|
||||
coreaudio = not_found
|
||||
endif
|
||||
|
||||
if not coreaudio.found()
|
||||
if get_option('coreaudio').enabled()
|
||||
error('CoreAudio not found')
|
||||
else
|
||||
warning('CoreAudio not found, disabling')
|
||||
endif
|
||||
endif
|
||||
endif
|
||||
|
||||
opengl = not_found
|
||||
@ -1676,6 +1656,13 @@ config_host_data.set('HAVE_MLOCKALL', cc.links(gnu_source_prefix + '''
|
||||
return mlockall(MCL_FUTURE);
|
||||
}'''))
|
||||
|
||||
have_l2tpv3 = false
|
||||
if not get_option('l2tpv3').disabled() and have_system
|
||||
have_l2tpv3 = (cc.has_header_symbol('sys/socket.h', 'struct mmsghdr')
|
||||
and cc.has_header('linux/ip.h'))
|
||||
endif
|
||||
config_host_data.set('CONFIG_L2TPV3', have_l2tpv3)
|
||||
|
||||
have_netmap = false
|
||||
if not get_option('netmap').disabled() and have_system
|
||||
have_netmap = cc.compiles('''
|
||||
@ -3395,6 +3382,7 @@ summary_info += {'JACK support': jack}
|
||||
summary_info += {'brlapi support': brlapi}
|
||||
summary_info += {'vde support': vde}
|
||||
summary_info += {'netmap support': have_netmap}
|
||||
summary_info += {'l2tpv3 support': have_l2tpv3}
|
||||
summary_info += {'Linux AIO support': libaio}
|
||||
summary_info += {'Linux io_uring support': linux_io_uring}
|
||||
summary_info += {'ATTR/XATTR support': libattr}
|
||||
|
@ -141,6 +141,8 @@ option('u2f', type : 'feature', value : 'auto',
|
||||
description: 'U2F emulation support')
|
||||
option('usb_redir', type : 'feature', value : 'auto',
|
||||
description: 'libusbredir support')
|
||||
option('l2tpv3', type : 'feature', value : 'auto',
|
||||
description: 'l2tpv3 network backend support')
|
||||
option('netmap', type : 'feature', value : 'auto',
|
||||
description: 'netmap network backend support')
|
||||
option('vde', type : 'feature', value : 'auto',
|
||||
|
@ -70,6 +70,7 @@
|
||||
#include "qapi/qapi-commands-migration.h"
|
||||
#include "qapi/qapi-commands-misc.h"
|
||||
#include "qapi/qapi-commands-qom.h"
|
||||
#include "qapi/qapi-commands-run-state.h"
|
||||
#include "qapi/qapi-commands-trace.h"
|
||||
#include "qapi/qapi-commands-machine.h"
|
||||
#include "qapi/qapi-init-commands.h"
|
||||
@ -472,10 +473,18 @@ static void hmp_gdbserver(Monitor *mon, const QDict *qdict)
|
||||
|
||||
static void hmp_watchdog_action(Monitor *mon, const QDict *qdict)
|
||||
{
|
||||
const char *action = qdict_get_str(qdict, "action");
|
||||
if (select_watchdog_action(action) == -1) {
|
||||
monitor_printf(mon, "Unknown watchdog action '%s'\n", action);
|
||||
Error *err = NULL;
|
||||
WatchdogAction action;
|
||||
char *qapi_value;
|
||||
|
||||
qapi_value = g_ascii_strdown(qdict_get_str(qdict, "action"), -1);
|
||||
action = qapi_enum_parse(&WatchdogAction_lookup, qapi_value, -1, &err);
|
||||
g_free(qapi_value);
|
||||
if (err) {
|
||||
hmp_handle_error(mon, err);
|
||||
return;
|
||||
}
|
||||
qmp_watchdog_set_action(action, &error_abort);
|
||||
}
|
||||
|
||||
static void monitor_printc(Monitor *mon, int c)
|
||||
|
@ -18,7 +18,9 @@ softmmu_ss.add(files(
|
||||
|
||||
softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('filter-replay.c'))
|
||||
|
||||
softmmu_ss.add(when: 'CONFIG_L2TPV3', if_true: files('l2tpv3.c'))
|
||||
if have_l2tpv3
|
||||
softmmu_ss.add(files('l2tpv3.c'))
|
||||
endif
|
||||
softmmu_ss.add(when: slirp, if_true: files('slirp.c'))
|
||||
softmmu_ss.add(when: vde, if_true: files('vde.c'))
|
||||
if have_netmap
|
||||
|
@ -63,6 +63,7 @@ blobs = files(
|
||||
'petalogix-s3adsp1800.dtb',
|
||||
'petalogix-ml605.dtb',
|
||||
'multiboot.bin',
|
||||
'multiboot_dma.bin',
|
||||
'linuxboot.bin',
|
||||
'linuxboot_dma.bin',
|
||||
'kvmvapic.bin',
|
||||
|
BIN
pc-bios/multiboot_dma.bin
Normal file
BIN
pc-bios/multiboot_dma.bin
Normal file
Binary file not shown.
@ -1,9 +1,8 @@
|
||||
CURRENT_MAKEFILE := $(realpath $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)))
|
||||
SRC_DIR := $(dir $(CURRENT_MAKEFILE))
|
||||
TOPSRC_DIR := $(SRC_DIR)/../..
|
||||
include config.mak
|
||||
SRC_DIR := $(TOPSRC_DIR)/pc-bios/optionrom
|
||||
VPATH = $(SRC_DIR)
|
||||
|
||||
all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin
|
||||
all: multiboot.bin multiboot_dma.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin
|
||||
# Dummy command so that make thinks it has done something
|
||||
@true
|
||||
|
||||
@ -42,8 +41,6 @@ override CFLAGS += $(call cc-option, $(Wa)-32)
|
||||
LD_I386_EMULATION ?= elf_i386
|
||||
override LDFLAGS = -m $(LD_I386_EMULATION) -T $(SRC_DIR)/flat.lds
|
||||
|
||||
all: multiboot.bin linuxboot.bin linuxboot_dma.bin kvmvapic.bin pvh.bin
|
||||
|
||||
pvh.img: pvh.o pvh_main.o
|
||||
|
||||
%.o: %.S
|
||||
|
@ -68,7 +68,7 @@ run_multiboot:
|
||||
mov %eax, %es
|
||||
|
||||
/* Read the bootinfo struct into RAM */
|
||||
read_fw_blob(FW_CFG_INITRD)
|
||||
read_fw_blob_dma(FW_CFG_INITRD)
|
||||
|
||||
/* FS = bootinfo_struct */
|
||||
read_fw FW_CFG_INITRD_ADDR
|
||||
@ -188,7 +188,7 @@ prot_mode:
|
||||
movl %eax, %gs
|
||||
|
||||
/* Read the kernel and modules into RAM */
|
||||
read_fw_blob(FW_CFG_KERNEL)
|
||||
read_fw_blob_dma(FW_CFG_KERNEL)
|
||||
|
||||
/* Jump off to the kernel */
|
||||
read_fw FW_CFG_KERNEL_ENTRY
|
||||
|
2
pc-bios/optionrom/multiboot_dma.S
Normal file
2
pc-bios/optionrom/multiboot_dma.S
Normal file
@ -0,0 +1,2 @@
|
||||
#define USE_FW_CFG_DMA 1
|
||||
#include "multiboot.S"
|
@ -37,6 +37,17 @@
|
||||
#define BIOS_CFG_IOPORT_CFG 0x510
|
||||
#define BIOS_CFG_IOPORT_DATA 0x511
|
||||
|
||||
#define FW_CFG_DMA_CTL_ERROR 0x01
|
||||
#define FW_CFG_DMA_CTL_READ 0x02
|
||||
#define FW_CFG_DMA_CTL_SKIP 0x04
|
||||
#define FW_CFG_DMA_CTL_SELECT 0x08
|
||||
#define FW_CFG_DMA_CTL_WRITE 0x10
|
||||
|
||||
#define FW_CFG_DMA_SIGNATURE 0x51454d5520434647ULL /* "QEMU CFG" */
|
||||
|
||||
#define BIOS_CFG_DMA_ADDR_HIGH 0x514
|
||||
#define BIOS_CFG_DMA_ADDR_LOW 0x518
|
||||
|
||||
/* Break the translation block flow so -d cpu shows us values */
|
||||
#define DEBUG_HERE \
|
||||
jmp 1f; \
|
||||
@ -62,6 +73,61 @@
|
||||
bswap %eax
|
||||
.endm
|
||||
|
||||
|
||||
/*
|
||||
* Read data from the fw_cfg device using DMA.
|
||||
* Clobbers: %edx, %eax, ADDR, SIZE, memory[%esp-16] to memory[%esp]
|
||||
*/
|
||||
.macro read_fw_dma VAR, SIZE, ADDR
|
||||
/* Address */
|
||||
bswapl \ADDR
|
||||
pushl \ADDR
|
||||
|
||||
/* We only support 32 bit target addresses */
|
||||
xorl %eax, %eax
|
||||
pushl %eax
|
||||
mov $BIOS_CFG_DMA_ADDR_HIGH, %dx
|
||||
outl %eax, (%dx)
|
||||
|
||||
/* Size */
|
||||
bswapl \SIZE
|
||||
pushl \SIZE
|
||||
|
||||
/* Control */
|
||||
movl $(\VAR << 16) | (FW_CFG_DMA_CTL_READ | FW_CFG_DMA_CTL_SELECT), %eax
|
||||
bswapl %eax
|
||||
pushl %eax
|
||||
|
||||
movl %esp, %eax /* Address of the struct we generated */
|
||||
bswapl %eax
|
||||
mov $BIOS_CFG_DMA_ADDR_LOW, %dx
|
||||
outl %eax, (%dx) /* Initiate DMA */
|
||||
|
||||
1: mov (%esp), %eax /* Wait for completion */
|
||||
bswapl %eax
|
||||
testl $~FW_CFG_DMA_CTL_ERROR, %eax
|
||||
jnz 1b
|
||||
addl $16, %esp
|
||||
.endm
|
||||
|
||||
|
||||
/*
|
||||
* Read a blob from the fw_cfg device using DMA
|
||||
* Requires _ADDR, _SIZE and _DATA values for the parameter.
|
||||
*
|
||||
* Clobbers: %eax, %edx, %es, %ecx, %edi and adresses %esp-20 to %esp
|
||||
*/
|
||||
#ifdef USE_FW_CFG_DMA
|
||||
#define read_fw_blob_dma(var) \
|
||||
read_fw var ## _SIZE; \
|
||||
mov %eax, %ecx; \
|
||||
read_fw var ## _ADDR; \
|
||||
mov %eax, %edi ;\
|
||||
read_fw_dma var ## _DATA, %ecx, %edi
|
||||
#else
|
||||
#define read_fw_blob_dma(var) read_fw_blob(var)
|
||||
#endif
|
||||
|
||||
#define read_fw_blob_pre(var) \
|
||||
read_fw var ## _SIZE; \
|
||||
mov %eax, %ecx; \
|
||||
|
@ -150,23 +150,7 @@ def print_parse(options):
|
||||
print("}")
|
||||
|
||||
|
||||
def fixup_options(options):
|
||||
# Meson <= 0.60 does not include the choices in array options, fix that up
|
||||
for opt in options:
|
||||
if opt["name"] == "trace_backends":
|
||||
opt["choices"] = [
|
||||
"dtrace",
|
||||
"ftrace",
|
||||
"log",
|
||||
"nop",
|
||||
"simple",
|
||||
"syslog",
|
||||
"ust",
|
||||
]
|
||||
|
||||
|
||||
options = load_options(json.load(sys.stdin))
|
||||
fixup_options(options)
|
||||
print("# This file is generated by meson-buildoptions.py, do not edit!")
|
||||
print_help(options)
|
||||
print_parse(options)
|
||||
|
@ -49,6 +49,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' iconv Font glyph conversion support'
|
||||
printf "%s\n" ' jack JACK sound support'
|
||||
printf "%s\n" ' kvm KVM acceleration support'
|
||||
printf "%s\n" ' l2tpv3 l2tpv3 network backend support'
|
||||
printf "%s\n" ' libdaxctl libdaxctl support'
|
||||
printf "%s\n" ' libiscsi libiscsi userspace initiator'
|
||||
printf "%s\n" ' libnfs libnfs block device driver'
|
||||
@ -166,6 +167,8 @@ _meson_option_parse() {
|
||||
--disable-jack) printf "%s" -Djack=disabled ;;
|
||||
--enable-kvm) printf "%s" -Dkvm=enabled ;;
|
||||
--disable-kvm) printf "%s" -Dkvm=disabled ;;
|
||||
--enable-l2tpv3) printf "%s" -Dl2tpv3=enabled ;;
|
||||
--disable-l2tpv3) printf "%s" -Dl2tpv3=disabled ;;
|
||||
--enable-libdaxctl) printf "%s" -Dlibdaxctl=enabled ;;
|
||||
--disable-libdaxctl) printf "%s" -Dlibdaxctl=disabled ;;
|
||||
--enable-libiscsi) printf "%s" -Dlibiscsi=enabled ;;
|
||||
|
@ -165,6 +165,7 @@ static void qdev_print_devinfos(bool show_no_user)
|
||||
[DEVICE_CATEGORY_SOUND] = "Sound",
|
||||
[DEVICE_CATEGORY_MISC] = "Misc",
|
||||
[DEVICE_CATEGORY_CPU] = "CPU",
|
||||
[DEVICE_CATEGORY_WATCHDOG]= "Watchdog",
|
||||
[DEVICE_CATEGORY_MAX] = "Uncategorized",
|
||||
};
|
||||
GSList *list, *elt;
|
||||
|
11
softmmu/vl.c
11
softmmu/vl.c
@ -3256,6 +3256,7 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
error_report("only one watchdog option may be given");
|
||||
exit(1);
|
||||
}
|
||||
warn_report("-watchdog is deprecated; use -device instead.");
|
||||
watchdog = optarg;
|
||||
break;
|
||||
case QEMU_OPTION_action:
|
||||
@ -3264,12 +3265,12 @@ void qemu_init(int argc, char **argv, char **envp)
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case QEMU_OPTION_watchdog_action:
|
||||
if (select_watchdog_action(optarg) == -1) {
|
||||
error_report("unknown -watchdog-action parameter");
|
||||
exit(1);
|
||||
}
|
||||
case QEMU_OPTION_watchdog_action: {
|
||||
QemuOpts *opts;
|
||||
opts = qemu_opts_create(qemu_find_opts("action"), NULL, 0, &error_abort);
|
||||
qemu_opt_set(opts, "watchdog", optarg, &error_abort);
|
||||
break;
|
||||
}
|
||||
case QEMU_OPTION_parallel:
|
||||
add_device_config(DEV_PARALLEL, optarg);
|
||||
default_parallel = 0;
|
||||
|
@ -5928,6 +5928,11 @@ static void x86_cpu_reset(DeviceState *dev)
|
||||
}
|
||||
|
||||
x86_cpu_set_sgxlepubkeyhash(env);
|
||||
|
||||
if (env->features[FEAT_SVM] & CPUID_SVM_TSCSCALE) {
|
||||
env->amd_tsc_scale_msr = MSR_AMD64_TSC_RATIO_DEFAULT;
|
||||
}
|
||||
|
||||
#endif
|
||||
}
|
||||
|
||||
|
@ -499,6 +499,9 @@ typedef enum X86Seg {
|
||||
#define MSR_GSBASE 0xc0000101
|
||||
#define MSR_KERNELGSBASE 0xc0000102
|
||||
#define MSR_TSC_AUX 0xc0000103
|
||||
#define MSR_AMD64_TSC_RATIO 0xc0000104
|
||||
|
||||
#define MSR_AMD64_TSC_RATIO_DEFAULT 0x100000000ULL
|
||||
|
||||
#define MSR_VM_HSAVE_PA 0xc0010117
|
||||
|
||||
@ -1536,6 +1539,7 @@ typedef struct CPUX86State {
|
||||
uint32_t tsx_ctrl;
|
||||
|
||||
uint64_t spec_ctrl;
|
||||
uint64_t amd_tsc_scale_msr;
|
||||
uint64_t virt_ssbd;
|
||||
|
||||
/* End of state preserved by INIT (dummy marker). */
|
||||
|
@ -105,6 +105,7 @@ static bool has_msr_hv_reenlightenment;
|
||||
static bool has_msr_xss;
|
||||
static bool has_msr_umwait;
|
||||
static bool has_msr_spec_ctrl;
|
||||
static bool has_tsc_scale_msr;
|
||||
static bool has_msr_tsx_ctrl;
|
||||
static bool has_msr_virt_ssbd;
|
||||
static bool has_msr_smi_count;
|
||||
@ -2216,6 +2217,9 @@ static int kvm_get_supported_msrs(KVMState *s)
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
has_msr_spec_ctrl = true;
|
||||
break;
|
||||
case MSR_AMD64_TSC_RATIO:
|
||||
has_tsc_scale_msr = true;
|
||||
break;
|
||||
case MSR_IA32_TSX_CTRL:
|
||||
has_msr_tsx_ctrl = true;
|
||||
break;
|
||||
@ -2972,6 +2976,10 @@ static int kvm_put_msrs(X86CPU *cpu, int level)
|
||||
if (has_msr_spec_ctrl) {
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_SPEC_CTRL, env->spec_ctrl);
|
||||
}
|
||||
if (has_tsc_scale_msr) {
|
||||
kvm_msr_entry_add(cpu, MSR_AMD64_TSC_RATIO, env->amd_tsc_scale_msr);
|
||||
}
|
||||
|
||||
if (has_msr_tsx_ctrl) {
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_TSX_CTRL, env->tsx_ctrl);
|
||||
}
|
||||
@ -3377,6 +3385,10 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
if (has_msr_spec_ctrl) {
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_SPEC_CTRL, 0);
|
||||
}
|
||||
if (has_tsc_scale_msr) {
|
||||
kvm_msr_entry_add(cpu, MSR_AMD64_TSC_RATIO, 0);
|
||||
}
|
||||
|
||||
if (has_msr_tsx_ctrl) {
|
||||
kvm_msr_entry_add(cpu, MSR_IA32_TSX_CTRL, 0);
|
||||
}
|
||||
@ -3788,6 +3800,9 @@ static int kvm_get_msrs(X86CPU *cpu)
|
||||
case MSR_IA32_SPEC_CTRL:
|
||||
env->spec_ctrl = msrs[i].data;
|
||||
break;
|
||||
case MSR_AMD64_TSC_RATIO:
|
||||
env->amd_tsc_scale_msr = msrs[i].data;
|
||||
break;
|
||||
case MSR_IA32_TSX_CTRL:
|
||||
env->tsx_ctrl = msrs[i].data;
|
||||
break;
|
||||
|
@ -1280,6 +1280,27 @@ static const VMStateDescription vmstate_spec_ctrl = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static bool amd_tsc_scale_msr_needed(void *opaque)
|
||||
{
|
||||
X86CPU *cpu = opaque;
|
||||
CPUX86State *env = &cpu->env;
|
||||
|
||||
return (env->features[FEAT_SVM] & CPUID_SVM_TSCSCALE);
|
||||
}
|
||||
|
||||
static const VMStateDescription amd_tsc_scale_msr_ctrl = {
|
||||
.name = "cpu/amd_tsc_scale_msr",
|
||||
.version_id = 1,
|
||||
.minimum_version_id = 1,
|
||||
.needed = amd_tsc_scale_msr_needed,
|
||||
.fields = (VMStateField[]){
|
||||
VMSTATE_UINT64(env.amd_tsc_scale_msr, X86CPU),
|
||||
VMSTATE_END_OF_LIST()
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
static bool intel_pt_enable_needed(void *opaque)
|
||||
{
|
||||
X86CPU *cpu = opaque;
|
||||
@ -1558,6 +1579,7 @@ const VMStateDescription vmstate_x86_cpu = {
|
||||
&vmstate_pkru,
|
||||
&vmstate_pkrs,
|
||||
&vmstate_spec_ctrl,
|
||||
&amd_tsc_scale_msr_ctrl,
|
||||
&vmstate_mcg_ext_ctl,
|
||||
&vmstate_msr_intel_pt,
|
||||
&vmstate_msr_virt_ssbd,
|
||||
|
@ -189,6 +189,40 @@ static void test_cancelled_request_ok(void)
|
||||
qtest_quit(s);
|
||||
}
|
||||
|
||||
static void test_inflight_cancel_ok(void)
|
||||
{
|
||||
QTestState *s = qtest_init(
|
||||
"-device am53c974,id=scsi "
|
||||
"-device scsi-hd,drive=disk0 -drive "
|
||||
"id=disk0,if=none,file=null-co://,format=raw -nodefaults");
|
||||
qtest_outl(s, 0xcf8, 0x80001000);
|
||||
qtest_inw(s, 0xcfc);
|
||||
qtest_outl(s, 0xcf8, 0x80001010);
|
||||
qtest_outl(s, 0xcfc, 0xffffffff);
|
||||
qtest_outl(s, 0xcf8, 0x80001010);
|
||||
qtest_inl(s, 0xcfc);
|
||||
qtest_outl(s, 0xcf8, 0x80001010);
|
||||
qtest_outl(s, 0xcfc, 0xc001);
|
||||
qtest_outl(s, 0xcf8, 0x80001004);
|
||||
qtest_inw(s, 0xcfc);
|
||||
qtest_outl(s, 0xcf8, 0x80001004);
|
||||
qtest_outw(s, 0xcfc, 0x7);
|
||||
qtest_outl(s, 0xcf8, 0x80001004);
|
||||
qtest_inw(s, 0xcfc);
|
||||
qtest_inb(s, 0xc000);
|
||||
qtest_outb(s, 0xc008, 0x8);
|
||||
qtest_outw(s, 0xc00b, 0x4100);
|
||||
qtest_outb(s, 0xc009, 0x0);
|
||||
qtest_outb(s, 0xc009, 0x0);
|
||||
qtest_outw(s, 0xc00b, 0xc212);
|
||||
qtest_outl(s, 0xc042, 0x2c2c5a88);
|
||||
qtest_outw(s, 0xc00b, 0xc212);
|
||||
qtest_outw(s, 0xc00b, 0x415a);
|
||||
qtest_outl(s, 0xc03f, 0x3060303);
|
||||
qtest_outl(s, 0xc00b, 0x5afa9054);
|
||||
qtest_quit(s);
|
||||
}
|
||||
|
||||
int main(int argc, char **argv)
|
||||
{
|
||||
const char *arch = qtest_get_arch();
|
||||
@ -212,6 +246,8 @@ int main(int argc, char **argv)
|
||||
test_fifo_underflow_on_write_ok);
|
||||
qtest_add_func("am53c974/test_cancelled_request_ok",
|
||||
test_cancelled_request_ok);
|
||||
qtest_add_func("am53c974/test_inflight_cancel_ok",
|
||||
test_inflight_cancel_ok);
|
||||
}
|
||||
|
||||
return g_test_run();
|
||||
|
@ -42,14 +42,14 @@ IOVATree *iova_tree_new(void)
|
||||
return iova_tree;
|
||||
}
|
||||
|
||||
DMAMap *iova_tree_find(IOVATree *tree, DMAMap *map)
|
||||
const DMAMap *iova_tree_find(const IOVATree *tree, const DMAMap *map)
|
||||
{
|
||||
return g_tree_lookup(tree->tree, map);
|
||||
}
|
||||
|
||||
DMAMap *iova_tree_find_address(IOVATree *tree, hwaddr iova)
|
||||
const DMAMap *iova_tree_find_address(const IOVATree *tree, hwaddr iova)
|
||||
{
|
||||
DMAMap map = { .iova = iova, .size = 0 };
|
||||
const DMAMap map = { .iova = iova, .size = 0 };
|
||||
|
||||
return iova_tree_find(tree, &map);
|
||||
}
|
||||
@ -60,7 +60,7 @@ static inline void iova_tree_insert_internal(GTree *gtree, DMAMap *range)
|
||||
g_tree_insert(gtree, range, range);
|
||||
}
|
||||
|
||||
int iova_tree_insert(IOVATree *tree, DMAMap *map)
|
||||
int iova_tree_insert(IOVATree *tree, const DMAMap *map)
|
||||
{
|
||||
DMAMap *new;
|
||||
|
||||
@ -96,9 +96,9 @@ void iova_tree_foreach(IOVATree *tree, iova_tree_iterator iterator)
|
||||
g_tree_foreach(tree->tree, iova_tree_traverse, iterator);
|
||||
}
|
||||
|
||||
int iova_tree_remove(IOVATree *tree, DMAMap *map)
|
||||
int iova_tree_remove(IOVATree *tree, const DMAMap *map)
|
||||
{
|
||||
DMAMap *overlap;
|
||||
const DMAMap *overlap;
|
||||
|
||||
while ((overlap = iova_tree_find(tree, map))) {
|
||||
g_tree_remove(tree->tree, overlap);
|
||||
|
Loading…
Reference in New Issue
Block a user