* only build util/async-teardown.c when system build is requested
* target/i386: fix BQL handling of the legacy FERR interrupts * target/i386: fix memory operand size for CVTPS2PD * target/i386: Add support for AMX-COMPLEX in CPUID enumeration * compile plugins on Darwin * configure and meson cleanups * drop mkvenv support for Python 3.7 and Debian10 * add wrap file for libblkio * tweak KVM stubs -----BEGIN PGP SIGNATURE----- iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmT5t6UUHHBib256aW5p QHJlZGhhdC5jb20ACgkQv/vSX3jHroMmjwf+MpvVuq+nn+3PqGUXgnzJx5ccA5ne O9Xy8+1GdlQPzBw/tPovxXDSKn3HQtBfxObn2CCE1tu/4uHWpBA1Vksn++NHdUf2 P0yoHxGskJu5iYYTtIcNw5cH2i+AizdiXuEjhfNjqD5Y234cFoHnUApt9e3zBvVO cwGD7WpPuSb4g38hHkV6nKcx72o7b4ejDToqUVZJ2N+RkddSqB03fSdrOru0hR7x V+lay0DYdFszNDFm05LJzfDbcrHuSryGA91wtty7Fzj6QhR/HBHQCUZJxMB5PI7F Zy4Zdpu60zxtSxUqeKgIi7UhNFgMcax2Hf9QEqdc/B4ARoBbboh4q4u8kQ== =dH7/ -----END PGP SIGNATURE----- Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging * only build util/async-teardown.c when system build is requested * target/i386: fix BQL handling of the legacy FERR interrupts * target/i386: fix memory operand size for CVTPS2PD * target/i386: Add support for AMX-COMPLEX in CPUID enumeration * compile plugins on Darwin * configure and meson cleanups * drop mkvenv support for Python 3.7 and Debian10 * add wrap file for libblkio * tweak KVM stubs # -----BEGIN PGP SIGNATURE----- # # iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmT5t6UUHHBib256aW5p # QHJlZGhhdC5jb20ACgkQv/vSX3jHroMmjwf+MpvVuq+nn+3PqGUXgnzJx5ccA5ne # O9Xy8+1GdlQPzBw/tPovxXDSKn3HQtBfxObn2CCE1tu/4uHWpBA1Vksn++NHdUf2 # P0yoHxGskJu5iYYTtIcNw5cH2i+AizdiXuEjhfNjqD5Y234cFoHnUApt9e3zBvVO # cwGD7WpPuSb4g38hHkV6nKcx72o7b4ejDToqUVZJ2N+RkddSqB03fSdrOru0hR7x # V+lay0DYdFszNDFm05LJzfDbcrHuSryGA91wtty7Fzj6QhR/HBHQCUZJxMB5PI7F # Zy4Zdpu60zxtSxUqeKgIi7UhNFgMcax2Hf9QEqdc/B4ARoBbboh4q4u8kQ== # =dH7/ # -----END PGP SIGNATURE----- # gpg: Signature made Thu 07 Sep 2023 07:44:37 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] # Primary key fingerprint: 46F5 9FBD 57D6 12E7 BFD4 E2F7 7E15 100C CD36 69B1 # Subkey fingerprint: F133 3857 4B66 2389 866C 7682 BFFB D25F 78C7 AE83 * tag 'for-upstream' of https://gitlab.com/bonzini/qemu: (51 commits) docs/system/replay: do not show removed command line option subprojects: add wrap file for libblkio sysemu/kvm: Restrict kvm_pc_setup_irq_routing() to x86 targets sysemu/kvm: Restrict kvm_has_pit_state2() to x86 targets sysemu/kvm: Restrict kvm_get_apic_state() to x86 targets sysemu/kvm: Restrict kvm_arch_get_supported_cpuid/msr() to x86 targets target/i386: Restrict declarations specific to CONFIG_KVM target/i386: Allow elision of kvm_hv_vpindex_settable() target/i386: Allow elision of kvm_enable_x2apic() target/i386: Remove unused KVM stubs target/i386/cpu-sysemu: Inline kvm_apic_in_kernel() target/i386/helper: Restrict KVM declarations to system emulation hw/i386/fw_cfg: Include missing 'cpu.h' header hw/i386/pc: Include missing 'cpu.h' header hw/i386/pc: Include missing 'sysemu/tcg.h' header Revert "mkvenv: work around broken pip installations on Debian 10" mkvenv: assume presence of importlib.metadata Python: Drop support for Python 3.7 configure: remove dead code meson: list leftover CONFIG_* symbols ... Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
commit
03a3a62fbd
29
Makefile
29
Makefile
@ -164,14 +164,6 @@ ifneq ($(filter $(ninja-targets), $(ninja-cmd-goals)),)
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_PLUGIN),y)
|
||||
.PHONY: plugins
|
||||
plugins:
|
||||
$(call quiet-command,\
|
||||
$(MAKE) $(SUBDIR_MAKEFLAGS) -C contrib/plugins V="$(V)", \
|
||||
"BUILD", "example plugins")
|
||||
endif # $(CONFIG_PLUGIN)
|
||||
|
||||
else # config-host.mak does not exist
|
||||
ifneq ($(filter-out $(UNCHECKED_GOALS),$(MAKECMDGOALS)),$(if $(MAKECMDGOALS),,fail))
|
||||
$(error Please call configure before running make)
|
||||
@ -184,15 +176,20 @@ include $(SRC_PATH)/tests/Makefile.include
|
||||
|
||||
all: recurse-all
|
||||
|
||||
ROMS_RULES=$(foreach t, all clean distclean, $(addsuffix /$(t), $(ROMS)))
|
||||
.PHONY: $(ROMS_RULES)
|
||||
$(ROMS_RULES):
|
||||
SUBDIR_RULES=$(foreach t, all clean distclean, $(addsuffix /$(t), $(SUBDIRS)))
|
||||
.PHONY: $(SUBDIR_RULES)
|
||||
$(SUBDIR_RULES):
|
||||
$(call quiet-command,$(MAKE) $(SUBDIR_MAKEFLAGS) -C $(dir $@) V="$(V)" TARGET_DIR="$(dir $@)" $(notdir $@),)
|
||||
|
||||
ifneq ($(filter contrib/plugins, $(SUBDIRS)),)
|
||||
.PHONY: plugins
|
||||
plugins: contrib/plugins/all
|
||||
endif
|
||||
|
||||
.PHONY: recurse-all recurse-clean
|
||||
recurse-all: $(addsuffix /all, $(ROMS))
|
||||
recurse-clean: $(addsuffix /clean, $(ROMS))
|
||||
recurse-distclean: $(addsuffix /distclean, $(ROMS))
|
||||
recurse-all: $(addsuffix /all, $(SUBDIRS))
|
||||
recurse-clean: $(addsuffix /clean, $(SUBDIRS))
|
||||
recurse-distclean: $(addsuffix /distclean, $(SUBDIRS))
|
||||
|
||||
######################################################################
|
||||
|
||||
@ -296,7 +293,7 @@ help:
|
||||
$(call print-help,cscope,Generate cscope index)
|
||||
$(call print-help,sparse,Run sparse on the QEMU source)
|
||||
@echo ''
|
||||
ifeq ($(CONFIG_PLUGIN),y)
|
||||
ifneq ($(filter contrib/plugins, $(SUBDIRS)),)
|
||||
@echo 'Plugin targets:'
|
||||
$(call print-help,plugins,Build the example TCG plugins)
|
||||
@echo ''
|
||||
@ -316,7 +313,7 @@ endif
|
||||
@echo 'Documentation targets:'
|
||||
$(call print-help,html man,Build documentation in specified format)
|
||||
@echo ''
|
||||
ifdef CONFIG_WIN32
|
||||
ifneq ($(filter msi, $(ninja-targets)),)
|
||||
@echo 'Windows targets:'
|
||||
$(call print-help,installer,Build NSIS-based installer for QEMU)
|
||||
$(call print-help,msi,Build MSI-based installer for qemu-ga)
|
||||
|
@ -11,7 +11,9 @@ tcg_ss.add(files(
|
||||
))
|
||||
tcg_ss.add(when: 'CONFIG_USER_ONLY', if_true: files('user-exec.c'))
|
||||
tcg_ss.add(when: 'CONFIG_SYSTEM_ONLY', if_false: files('user-exec-stub.c'))
|
||||
tcg_ss.add(when: 'CONFIG_PLUGIN', if_true: [files('plugin-gen.c')])
|
||||
if get_option('plugins')
|
||||
tcg_ss.add(files('plugin-gen.c'))
|
||||
endif
|
||||
tcg_ss.add(when: libdw, if_true: files('debuginfo.c'))
|
||||
tcg_ss.add(when: 'CONFIG_LINUX', if_true: files('perf.c'))
|
||||
specific_ss.add_all(when: 'CONFIG_TCG', if_true: tcg_ss)
|
||||
|
@ -26,7 +26,7 @@ chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
|
||||
'char-win.c',
|
||||
))
|
||||
|
||||
chardev_ss = chardev_ss.apply(config_host, strict: false)
|
||||
chardev_ss = chardev_ss.apply(config_targetos, strict: false)
|
||||
|
||||
system_ss.add(files(
|
||||
'char-hmp-cmds.c',
|
||||
|
176
configure
vendored
176
configure
vendored
@ -245,10 +245,9 @@ for opt do
|
||||
esac
|
||||
done
|
||||
|
||||
|
||||
default_cflags='-O2 -g'
|
||||
git_submodules_action="update"
|
||||
git="git"
|
||||
debug_tcg="no"
|
||||
docs="auto"
|
||||
EXESUF=""
|
||||
prefix="/usr/local"
|
||||
@ -257,6 +256,7 @@ softmmu="yes"
|
||||
linux_user=""
|
||||
bsd_user=""
|
||||
plugins="$default_feature"
|
||||
subdirs=""
|
||||
ninja=""
|
||||
python=
|
||||
download="enabled"
|
||||
@ -288,7 +288,7 @@ static="no"
|
||||
# ${cross_prefix}gcc (if cross-prefix specified)
|
||||
# system compiler
|
||||
if test -z "${CC}${cross_prefix}"; then
|
||||
cc="$host_cc"
|
||||
cc="cc"
|
||||
else
|
||||
cc="${CC-${cross_prefix}gcc}"
|
||||
fi
|
||||
@ -374,45 +374,14 @@ fi
|
||||
|
||||
# OS specific
|
||||
|
||||
mingw32="no"
|
||||
bsd="no"
|
||||
linux="no"
|
||||
solaris="no"
|
||||
case $targetos in
|
||||
windows)
|
||||
mingw32="yes"
|
||||
plugins="no"
|
||||
pie="no"
|
||||
;;
|
||||
gnu/kfreebsd)
|
||||
bsd="yes"
|
||||
;;
|
||||
freebsd)
|
||||
bsd="yes"
|
||||
# needed for kinfo_getvmmap(3) in libutil.h
|
||||
;;
|
||||
dragonfly)
|
||||
bsd="yes"
|
||||
;;
|
||||
netbsd)
|
||||
bsd="yes"
|
||||
;;
|
||||
openbsd)
|
||||
bsd="yes"
|
||||
;;
|
||||
darwin)
|
||||
bsd="yes"
|
||||
darwin="yes"
|
||||
;;
|
||||
sunos)
|
||||
solaris="yes"
|
||||
;;
|
||||
haiku)
|
||||
pie="no"
|
||||
;;
|
||||
linux)
|
||||
linux="yes"
|
||||
;;
|
||||
esac
|
||||
|
||||
if test ! -z "$cpu" ; then
|
||||
@ -583,16 +552,16 @@ if test -n "$linux_arch" && ! test -d "$source_path/linux-headers/asm-$linux_arc
|
||||
fi
|
||||
|
||||
check_py_version() {
|
||||
# We require python >= 3.7.
|
||||
# We require python >= 3.8.
|
||||
# NB: a True python conditional creates a non-zero return code (Failure)
|
||||
"$1" -c 'import sys; sys.exit(sys.version_info < (3,7))'
|
||||
"$1" -c 'import sys; sys.exit(sys.version_info < (3,8))'
|
||||
}
|
||||
|
||||
first_python=
|
||||
if test -z "${PYTHON}"; then
|
||||
# A bare 'python' is traditionally python 2.x, but some distros
|
||||
# have it as python 3.x, so check in both places.
|
||||
for binary in python3 python python3.11 python3.10 python3.9 python3.8 python3.7; do
|
||||
for binary in python3 python python3.11 python3.10 python3.9 python3.8; do
|
||||
if has "$binary"; then
|
||||
python=$(command -v "$binary")
|
||||
if check_py_version "$python"; then
|
||||
@ -627,7 +596,7 @@ do
|
||||
fi
|
||||
done
|
||||
|
||||
if test "$mingw32" = "yes" ; then
|
||||
if test "$targetos" = "windows" ; then
|
||||
EXESUF=".exe"
|
||||
prefix="/qemu"
|
||||
bindir=""
|
||||
@ -758,16 +727,13 @@ for opt do
|
||||
# configure to be used by RPM and similar macros that set
|
||||
# lots of directory switches by default.
|
||||
;;
|
||||
--enable-debug-tcg) debug_tcg="yes"
|
||||
;;
|
||||
--disable-debug-tcg) debug_tcg="no"
|
||||
;;
|
||||
--enable-debug)
|
||||
# Enable debugging options that aren't excessively noisy
|
||||
debug_tcg="yes"
|
||||
meson_option_parse --enable-debug-tcg ""
|
||||
meson_option_parse --enable-debug-graph-lock ""
|
||||
meson_option_parse --enable-debug-mutex ""
|
||||
meson_option_add -Doptimization=0
|
||||
default_cflags='-O0 -g'
|
||||
;;
|
||||
--disable-tcg) tcg="disabled"
|
||||
plugins="no"
|
||||
@ -809,7 +775,7 @@ for opt do
|
||||
;;
|
||||
--enable-download) download="enabled"; git_submodules_action=update;
|
||||
;;
|
||||
--enable-plugins) if test "$mingw32" = "yes"; then
|
||||
--enable-plugins) if test "$targetos" = "windows"; then
|
||||
error_exit "TCG plugins not currently supported on Windows platforms"
|
||||
else
|
||||
plugins="yes"
|
||||
@ -871,30 +837,36 @@ fi
|
||||
default_target_list=""
|
||||
mak_wilds=""
|
||||
|
||||
if [ "$linux_user" != no ]; then
|
||||
if [ "$targetos" = linux ] && [ -n "$host_arch" ]; then
|
||||
linux_user=yes
|
||||
elif [ "$linux_user" = yes ]; then
|
||||
error_exit "linux-user not supported on this architecture"
|
||||
if [ -n "$host_arch" ] && [ -d "$source_path/common-user/host/$host_arch" ]; then
|
||||
if [ "$linux_user" != no ]; then
|
||||
if [ "$targetos" = linux ]; then
|
||||
linux_user=yes
|
||||
elif [ "$linux_user" = yes ]; then
|
||||
error_exit "linux-user not supported on this architecture"
|
||||
fi
|
||||
if [ "$linux_user" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
if [ "$bsd_user" != no ]; then
|
||||
if [ "$bsd_user" = "" ]; then
|
||||
test $targetos = freebsd && bsd_user=yes
|
||||
if [ "$bsd_user" != no ]; then
|
||||
if [ "$bsd_user" = "" ]; then
|
||||
test $targetos = freebsd && bsd_user=yes
|
||||
fi
|
||||
if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$targetos" ]; then
|
||||
error_exit "bsd-user not supported on this host OS"
|
||||
fi
|
||||
if [ "$bsd_user" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
|
||||
fi
|
||||
fi
|
||||
if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$targetos" ]; then
|
||||
error_exit "bsd-user not supported on this host OS"
|
||||
else
|
||||
if [ "$linux_user" = yes ] || [ "$bsd_user" = yes ]; then
|
||||
error_exit "user mode emulation not supported on this architecture"
|
||||
fi
|
||||
fi
|
||||
if [ "$softmmu" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-softmmu.mak"
|
||||
fi
|
||||
if [ "$linux_user" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-linux-user.mak"
|
||||
fi
|
||||
if [ "$bsd_user" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
|
||||
fi
|
||||
|
||||
for config in $mak_wilds; do
|
||||
target="$(basename "$config" .mak)"
|
||||
@ -921,8 +893,8 @@ Advanced options (experts only):
|
||||
-Dmesonoptname=val passthrough option to meson unmodified
|
||||
--cross-prefix=PREFIX use PREFIX for compile tools, PREFIX can be blank [$cross_prefix]
|
||||
--cc=CC use C compiler CC [$cc]
|
||||
--host-cc=CC use C compiler CC [$host_cc] for code run at
|
||||
build time
|
||||
--host-cc=CC when cross compiling, use C compiler CC for code run
|
||||
at build time [$host_cc]
|
||||
--cxx=CXX use C++ compiler CXX [$cxx]
|
||||
--objcc=OBJCC use Objective-C compiler OBJCC [$objcc]
|
||||
--extra-cflags=CFLAGS append extra C compiler flags CFLAGS
|
||||
@ -958,7 +930,6 @@ cat << EOF
|
||||
linux-user all linux usermode emulation targets
|
||||
bsd-user all BSD usermode emulation targets
|
||||
pie Position Independent Executables
|
||||
debug-tcg TCG debugging (default is disabled)
|
||||
|
||||
NOTE: The object files are built at the place where configure is launched
|
||||
EOF
|
||||
@ -981,7 +952,7 @@ then
|
||||
fi
|
||||
|
||||
if ! check_py_version "$python"; then
|
||||
error_exit "Cannot use '$python', Python >= 3.7 is required." \
|
||||
error_exit "Cannot use '$python', Python >= 3.8 is required." \
|
||||
"Use --python=/path/to/python to specify a supported Python." \
|
||||
"Maybe try:" \
|
||||
" openSUSE Leap 15.3+: zypper install python39" \
|
||||
@ -1074,7 +1045,7 @@ fi
|
||||
# by default. Only enable by default for git builds
|
||||
if test -z "$werror" ; then
|
||||
if test -e "$source_path/.git" && \
|
||||
{ test "$linux" = "yes" || test "$mingw32" = "yes"; }; then
|
||||
{ test "$targetos" = linux || test "$targetos" = "windows"; }; then
|
||||
werror="yes"
|
||||
else
|
||||
werror="no"
|
||||
@ -1097,6 +1068,9 @@ if test "$static" = "yes" ; then
|
||||
fi
|
||||
fi
|
||||
test "$plugins" = "" && plugins=yes
|
||||
if test "$plugins" = "yes"; then
|
||||
subdirs="$subdirs contrib/plugins"
|
||||
fi
|
||||
|
||||
cat > $TMPC << EOF
|
||||
|
||||
@ -1152,14 +1126,6 @@ else
|
||||
done
|
||||
fi
|
||||
|
||||
# see if system emulation was really requested
|
||||
case " $target_list " in
|
||||
*"-softmmu "*) softmmu=yes
|
||||
;;
|
||||
*) softmmu=no
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$tcg" = "auto"; then
|
||||
if test -z "$target_list"; then
|
||||
tcg="disabled"
|
||||
@ -1657,12 +1623,11 @@ done
|
||||
echo "# Automatically generated by configure - do not modify" > Makefile.prereqs
|
||||
|
||||
# Mac OS X ships with a broken assembler
|
||||
roms=
|
||||
if have_target i386-softmmu x86_64-softmmu && \
|
||||
test "$targetos" != "darwin" && test "$targetos" != "sunos" && \
|
||||
test "$targetos" != "haiku" && \
|
||||
probe_target_compiler i386-softmmu; then
|
||||
roms="pc-bios/optionrom"
|
||||
subdirs="$subdirs pc-bios/optionrom"
|
||||
config_mak=pc-bios/optionrom/config.mak
|
||||
echo "# Automatically generated by configure - do not modify" > $config_mak
|
||||
echo "TOPSRC_DIR=$source_path" >> $config_mak
|
||||
@ -1671,7 +1636,7 @@ fi
|
||||
|
||||
if have_target ppc-softmmu ppc64-softmmu && \
|
||||
probe_target_compiler ppc-softmmu; then
|
||||
roms="$roms pc-bios/vof"
|
||||
subdirs="$subdirs pc-bios/vof"
|
||||
config_mak=pc-bios/vof/config.mak
|
||||
echo "# Automatically generated by configure - do not modify" > $config_mak
|
||||
echo "SRC_DIR=$source_path/pc-bios/vof" >> $config_mak
|
||||
@ -1690,7 +1655,7 @@ if have_target s390x-softmmu && probe_target_compiler s390x-softmmu && \
|
||||
echo "WARNING: Your compiler does not support the z900!"
|
||||
echo " The s390-ccw bios will only work with guest CPUs >= z10."
|
||||
fi
|
||||
roms="$roms pc-bios/s390-ccw"
|
||||
subdirs="$subdirs pc-bios/s390-ccw"
|
||||
config_mak=pc-bios/s390-ccw/config-host.mak
|
||||
echo "# Automatically generated by configure - do not modify" > $config_mak
|
||||
echo "SRC_PATH=$source_path/pc-bios/s390-ccw" >> $config_mak
|
||||
@ -1709,41 +1674,15 @@ echo >> $config_host_mak
|
||||
|
||||
echo all: >> $config_host_mak
|
||||
|
||||
if test "$debug_tcg" = "yes" ; then
|
||||
echo "CONFIG_DEBUG_TCG=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$mingw32" = "yes" ; then
|
||||
echo "CONFIG_WIN32=y" >> $config_host_mak
|
||||
if test "$targetos" = "windows"; then
|
||||
echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER-QEMU}" >> $config_host_mak
|
||||
echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO-Linux}" >> $config_host_mak
|
||||
echo "QEMU_GA_VERSION=${QEMU_GA_VERSION-$(cat "$source_path"/VERSION)}" >> $config_host_mak
|
||||
else
|
||||
echo "CONFIG_POSIX=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$linux" = "yes" ; then
|
||||
echo "CONFIG_LINUX=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$darwin" = "yes" ; then
|
||||
echo "CONFIG_DARWIN=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$solaris" = "yes" ; then
|
||||
echo "CONFIG_SOLARIS=y" >> $config_host_mak
|
||||
fi
|
||||
echo "SRC_PATH=$source_path" >> $config_host_mak
|
||||
echo "TARGET_DIRS=$target_list" >> $config_host_mak
|
||||
|
||||
# XXX: suppress that
|
||||
if [ "$bsd" = "yes" ] ; then
|
||||
echo "CONFIG_BSD=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$plugins" = "yes" ; then
|
||||
echo "CONFIG_PLUGIN=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test -n "$gdb_bin"; then
|
||||
gdb_version=$($gdb_bin --version | head -n 1)
|
||||
if version_ge ${gdb_version##* } 9.1; then
|
||||
@ -1758,17 +1697,15 @@ if test "$container" != no; then
|
||||
echo "ENGINE=$container" >> $config_host_mak
|
||||
echo "RUNC=$runc" >> $config_host_mak
|
||||
fi
|
||||
echo "ROMS=$roms" >> $config_host_mak
|
||||
echo "SUBDIRS=$subdirs" >> $config_host_mak
|
||||
echo "PYTHON=$python" >> $config_host_mak
|
||||
echo "GENISOIMAGE=$genisoimage" >> $config_host_mak
|
||||
echo "MESON=$meson" >> $config_host_mak
|
||||
echo "NINJA=$ninja" >> $config_host_mak
|
||||
echo "PKG_CONFIG=${pkg_config}" >> $config_host_mak
|
||||
echo "CC=$cc" >> $config_host_mak
|
||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||
|
||||
# use included Linux headers for KVM architectures
|
||||
if test "$linux" = "yes" && test -n "$linux_arch"; then
|
||||
if test "$targetos" = "linux" && test -n "$linux_arch"; then
|
||||
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
|
||||
fi
|
||||
|
||||
@ -1789,12 +1726,21 @@ if test "$ccache_cpp2" = "yes"; then
|
||||
echo "export CCACHE_CPP2=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
# contrib/plugins configuration
|
||||
echo "# Automatically generated by configure - do not modify" > contrib/plugins/$config_host_mak
|
||||
echo "SRC_PATH=$source_path/contrib/plugins" >> contrib/plugins/$config_host_mak
|
||||
echo "PKG_CONFIG=${pkg_config}" >> contrib/plugins/$config_host_mak
|
||||
echo "CC=$cc $CPU_CFLAGS" >> contrib/plugins/$config_host_mak
|
||||
echo "CFLAGS=${CFLAGS-$default_cflags} $EXTRA_CFLAGS" >> contrib/plugins/$config_host_mak
|
||||
if test "$targetos" = darwin; then
|
||||
echo "CONFIG_DARWIN=y" >> contrib/plugins/$config_host_mak
|
||||
fi
|
||||
|
||||
# tests/tcg configuration
|
||||
(config_host_mak=tests/tcg/config-host.mak
|
||||
mkdir -p tests/tcg
|
||||
echo "# Automatically generated by configure - do not modify" > $config_host_mak
|
||||
echo "SRC_PATH=$source_path" >> $config_host_mak
|
||||
echo "HOST_CC=$host_cc" >> $config_host_mak
|
||||
|
||||
# versioned checked in the main config_host.mak above
|
||||
if test -n "$gdb_bin"; then
|
||||
@ -1887,7 +1833,6 @@ if test "$skip_meson" = no; then
|
||||
echo "windres = [$(meson_quote $windres)]" >> $cross
|
||||
echo "windmc = [$(meson_quote $windmc)]" >> $cross
|
||||
if test "$cross_compile" = "yes"; then
|
||||
cross_arg="--cross-file config-meson.cross"
|
||||
echo "[host_machine]" >> $cross
|
||||
echo "system = '$targetos'" >> $cross
|
||||
case "$cpu" in
|
||||
@ -1904,6 +1849,14 @@ if test "$skip_meson" = no; then
|
||||
else
|
||||
echo "endian = 'little'" >> $cross
|
||||
fi
|
||||
cross_arg="--cross-file config-meson.cross"
|
||||
|
||||
native="config-meson.native.new"
|
||||
echo "# Automatically generated by configure - do not modify" > $native
|
||||
echo "[binaries]" >> $native
|
||||
echo "c = [$(meson_quote $host_cc)]" >> $native
|
||||
mv $native config-meson.native
|
||||
cross_arg="$cross_arg --native-file config-meson.native"
|
||||
else
|
||||
cross_arg="--native-file config-meson.cross"
|
||||
fi
|
||||
@ -1923,6 +1876,7 @@ if test "$skip_meson" = no; then
|
||||
test "$cfi" != false && meson_option_add "-Dcfi=$cfi"
|
||||
test "$docs" != auto && meson_option_add "-Ddocs=$docs"
|
||||
test -n "${LIB_FUZZING_ENGINE+xxx}" && meson_option_add "-Dfuzzing_engine=$LIB_FUZZING_ENGINE"
|
||||
test "$plugins" = yes && meson_option_add "-Dplugins=true"
|
||||
test "$qemu_suffix" != qemu && meson_option_add "-Dqemu_suffix=$qemu_suffix"
|
||||
test "$smbd" != '' && meson_option_add "-Dsmbd=$smbd"
|
||||
test "$tcg" != enabled && meson_option_add "-Dtcg=$tcg"
|
||||
|
@ -6,11 +6,11 @@
|
||||
# programs that the main configure has already done for us.
|
||||
#
|
||||
|
||||
BUILD_DIR := $(CURDIR)/../..
|
||||
include config-host.mak
|
||||
|
||||
include $(BUILD_DIR)/config-host.mak
|
||||
TOP_SRC_PATH = $(SRC_PATH)/../..
|
||||
|
||||
VPATH += $(SRC_PATH)/contrib/plugins
|
||||
VPATH += $(SRC_PATH)
|
||||
|
||||
NAMES :=
|
||||
NAMES += execlog
|
||||
@ -26,21 +26,25 @@ SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
|
||||
|
||||
# The main QEMU uses Glib extensively so it's perfectly fine to use it
|
||||
# in plugins (which many example do).
|
||||
CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
|
||||
CFLAGS += -fPIC -Wall
|
||||
CFLAGS += $(if $(CONFIG_DEBUG_TCG), -ggdb -O0)
|
||||
CFLAGS += -I$(SRC_PATH)/include/qemu
|
||||
PLUGIN_CFLAGS := $(shell $(PKG_CONFIG) --cflags glib-2.0)
|
||||
PLUGIN_CFLAGS += -fPIC -Wall
|
||||
PLUGIN_CFLAGS += -I$(TOP_SRC_PATH)/include/qemu
|
||||
|
||||
all: $(SONAMES)
|
||||
|
||||
%.o: %.c
|
||||
$(CC) $(CFLAGS) -c -o $@ $<
|
||||
$(CC) $(CFLAGS) $(PLUGIN_CFLAGS) -c -o $@ $<
|
||||
|
||||
lib%.so: %.o
|
||||
$(CC) -shared -Wl,-soname,$@ -o $@ $^ $(LDLIBS)
|
||||
ifeq ($(CONFIG_DARWIN),y)
|
||||
$(CC) -bundle -Wl,-undefined,dynamic_lookup -o $@ $^ $(LDLIBS)
|
||||
else
|
||||
$(CC) -shared -o $@ $^ $(LDLIBS)
|
||||
endif
|
||||
|
||||
clean:
|
||||
rm -f *.o *.so *.d
|
||||
rm -Rf .libs
|
||||
|
||||
.PHONY: all clean
|
||||
.SECONDARY:
|
||||
|
@ -545,8 +545,8 @@ static void append_stats_line(GString *line, uint64_t l1_daccess,
|
||||
l1_dmiss_rate = ((double) l1_dmisses) / (l1_daccess) * 100.0;
|
||||
l1_imiss_rate = ((double) l1_imisses) / (l1_iaccess) * 100.0;
|
||||
|
||||
g_string_append_printf(line, "%-14lu %-12lu %9.4lf%% %-14lu %-12lu"
|
||||
" %9.4lf%%",
|
||||
g_string_append_printf(line, "%-14" PRIu64 " %-12" PRIu64 " %9.4lf%%"
|
||||
" %-14" PRIu64 " %-12" PRIu64 " %9.4lf%%",
|
||||
l1_daccess,
|
||||
l1_dmisses,
|
||||
l1_daccess ? l1_dmiss_rate : 0.0,
|
||||
@ -556,7 +556,8 @@ static void append_stats_line(GString *line, uint64_t l1_daccess,
|
||||
|
||||
if (use_l2) {
|
||||
l2_miss_rate = ((double) l2_misses) / (l2_access) * 100.0;
|
||||
g_string_append_printf(line, " %-12lu %-11lu %10.4lf%%",
|
||||
g_string_append_printf(line,
|
||||
" %-12" PRIu64 " %-11" PRIu64 " %10.4lf%%",
|
||||
l2_access,
|
||||
l2_misses,
|
||||
l2_access ? l2_miss_rate : 0.0);
|
||||
@ -662,8 +663,8 @@ static void log_top_insns(void)
|
||||
if (insn->symbol) {
|
||||
g_string_append_printf(rep, " (%s)", insn->symbol);
|
||||
}
|
||||
g_string_append_printf(rep, ", %ld, %s\n", insn->l1_dmisses,
|
||||
insn->disas_str);
|
||||
g_string_append_printf(rep, ", %" PRId64 ", %s\n",
|
||||
insn->l1_dmisses, insn->disas_str);
|
||||
}
|
||||
|
||||
miss_insns = g_list_sort(miss_insns, icmp);
|
||||
@ -675,8 +676,8 @@ static void log_top_insns(void)
|
||||
if (insn->symbol) {
|
||||
g_string_append_printf(rep, " (%s)", insn->symbol);
|
||||
}
|
||||
g_string_append_printf(rep, ", %ld, %s\n", insn->l1_imisses,
|
||||
insn->disas_str);
|
||||
g_string_append_printf(rep, ", %" PRId64 ", %s\n",
|
||||
insn->l1_imisses, insn->disas_str);
|
||||
}
|
||||
|
||||
if (!use_l2) {
|
||||
@ -692,8 +693,8 @@ static void log_top_insns(void)
|
||||
if (insn->symbol) {
|
||||
g_string_append_printf(rep, " (%s)", insn->symbol);
|
||||
}
|
||||
g_string_append_printf(rep, ", %ld, %s\n", insn->l2_misses,
|
||||
insn->disas_str);
|
||||
g_string_append_printf(rep, ", %" PRId64 ", %s\n",
|
||||
insn->l2_misses, insn->disas_str);
|
||||
}
|
||||
|
||||
finish:
|
||||
|
@ -48,7 +48,7 @@ static void printf_header(unsigned long count)
|
||||
uint64_t start_code = qemu_plugin_start_code();
|
||||
uint64_t end_code = qemu_plugin_end_code();
|
||||
uint64_t entry = qemu_plugin_entry_code();
|
||||
fprintf(fp, "0, 0x%lx, 0x%lx, 0x%lx, %s\n",
|
||||
fprintf(fp, "0, 0x%" PRIx64 ", 0x%" PRIx64 ", 0x%" PRIx64 ", %s\n",
|
||||
start_code, end_code, entry, path);
|
||||
fprintf(fp, "BB Table: %ld bbs\n", count);
|
||||
}
|
||||
|
@ -181,7 +181,8 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
switch (class->what) {
|
||||
case COUNT_CLASS:
|
||||
if (class->count || verbose) {
|
||||
g_string_append_printf(report, "Class: %-24s\t(%ld hits)\n",
|
||||
g_string_append_printf(report,
|
||||
"Class: %-24s\t(%" PRId64 " hits)\n",
|
||||
class->class,
|
||||
class->count);
|
||||
}
|
||||
@ -208,7 +209,8 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
i++, counts = g_list_next(counts)) {
|
||||
InsnExecCount *rec = (InsnExecCount *) counts->data;
|
||||
g_string_append_printf(report,
|
||||
"Instr: %-24s\t(%ld hits)\t(op=0x%08x/%s)\n",
|
||||
"Instr: %-24s\t(%" PRId64 " hits)"
|
||||
"\t(op=0x%08x/%s)\n",
|
||||
rec->insn,
|
||||
rec->count,
|
||||
rec->opcode,
|
||||
|
@ -134,7 +134,9 @@ static void report_divergance(ExecState *us, ExecState *them)
|
||||
|
||||
/* Output short log entry of going out of sync... */
|
||||
if (verbose || divrec.distance == 1 || diverged) {
|
||||
g_string_printf(out, "@ 0x%016lx vs 0x%016lx (%d/%d since last)\n",
|
||||
g_string_printf(out,
|
||||
"@ 0x%016" PRIx64 " vs 0x%016" PRIx64
|
||||
" (%d/%d since last)\n",
|
||||
us->pc, them->pc, g_slist_length(divergence_log),
|
||||
divrec.distance);
|
||||
qemu_plugin_outs(out->str);
|
||||
@ -144,7 +146,9 @@ static void report_divergance(ExecState *us, ExecState *them)
|
||||
int i;
|
||||
GSList *entry;
|
||||
|
||||
g_string_printf(out, "Δ insn_count @ 0x%016lx (%ld) vs 0x%016lx (%ld)\n",
|
||||
g_string_printf(out,
|
||||
"Δ insn_count @ 0x%016" PRIx64
|
||||
" (%ld) vs 0x%016" PRIx64 " (%ld)\n",
|
||||
us->pc, us->insn_count, them->pc, them->insn_count);
|
||||
|
||||
for (entry = log, i = 0;
|
||||
@ -152,7 +156,8 @@ static void report_divergance(ExecState *us, ExecState *them)
|
||||
entry = g_slist_next(entry), i++) {
|
||||
ExecInfo *prev = (ExecInfo *) entry->data;
|
||||
g_string_append_printf(out,
|
||||
" previously @ 0x%016lx/%ld (%ld insns)\n",
|
||||
" previously @ 0x%016" PRIx64 "/%" PRId64
|
||||
" (%ld insns)\n",
|
||||
prev->block->pc, prev->block->insns,
|
||||
prev->insn_count);
|
||||
}
|
||||
|
@ -460,17 +460,13 @@ Built by configure:
|
||||
|
||||
``config-host.mak``
|
||||
When configure has determined the characteristics of the build host it
|
||||
will write them to this file for use in ``Makefile`` and to a smaller
|
||||
extent ``meson.build``. These include the paths to various tools and a
|
||||
variety of ``CONFIG_*`` variables related to optionally enabled features.
|
||||
will write the paths to various tools to this file, for use in ``Makefile``
|
||||
and to a smaller extent ``meson.build``.
|
||||
|
||||
``config-host.mak`` is also used as a dependency checking mechanism. If make
|
||||
sees that the modification timestamp on configure is newer than that on
|
||||
``config-host.mak``, then configure will be re-run.
|
||||
|
||||
The variables defined here apply to all QEMU
|
||||
build outputs.
|
||||
|
||||
``config-meson.cross``
|
||||
|
||||
A Meson "cross file" (or native file) used to communicate the paths to
|
||||
|
@ -316,6 +316,6 @@ variable::
|
||||
|
||||
host_kconfig = \
|
||||
(have_tpm ? ['CONFIG_TPM=y'] : []) + \
|
||||
('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
|
||||
(targetos == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
|
||||
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
|
||||
...
|
||||
|
@ -181,7 +181,7 @@ Audio data is recorded and replay automatically. The command line for recording
|
||||
and replaying must contain identical specifications of audio hardware, e.g.:
|
||||
|
||||
.. parsed-literal::
|
||||
-soundhw ac97
|
||||
-audio pa,model=ac97
|
||||
|
||||
Serial ports
|
||||
------------
|
||||
|
@ -14,8 +14,8 @@ gdb_system_ss = ss.source_set()
|
||||
gdb_user_ss.add(files('gdbstub.c', 'user.c'))
|
||||
gdb_system_ss.add(files('gdbstub.c', 'softmmu.c'))
|
||||
|
||||
gdb_user_ss = gdb_user_ss.apply(config_host, strict: false)
|
||||
gdb_system_ss = gdb_system_ss.apply(config_host, strict: false)
|
||||
gdb_user_ss = gdb_user_ss.apply(config_targetos, strict: false)
|
||||
gdb_system_ss = gdb_system_ss.apply(config_targetos, strict: false)
|
||||
|
||||
libgdb_user = static_library('gdb_user',
|
||||
gdb_user_ss.sources() + genh,
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "kvm/kvm_i386.h"
|
||||
#include "qapi/error.h"
|
||||
#include CONFIG_DEVICES
|
||||
#include "target/i386/cpu.h"
|
||||
|
||||
struct hpet_fw_config hpet_cfg = {.count = UINT8_MAX};
|
||||
|
||||
|
@ -4053,7 +4053,7 @@ static bool vtd_decide_config(IntelIOMMUState *s, Error **errp)
|
||||
error_setg(errp, "eim=on requires accel=kvm,kernel-irqchip=split");
|
||||
return false;
|
||||
}
|
||||
if (!kvm_enable_x2apic()) {
|
||||
if (kvm_enabled() && !kvm_enable_x2apic()) {
|
||||
error_setg(errp, "eim=on requires support on the KVM side"
|
||||
"(X2APIC_API, first shipped in v4.7)");
|
||||
return false;
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "hw/timer/i8254_internal.h"
|
||||
#include "hw/qdev-properties-system.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "target/i386/kvm/kvm_i386.h"
|
||||
#include "qom/object.h"
|
||||
|
||||
#define KVM_PIT_REINJECT_BIT 0
|
||||
|
@ -16,6 +16,7 @@
|
||||
#include "hw/intc/ioapic_internal.h"
|
||||
#include "hw/intc/kvm_irqcount.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
|
||||
/* PC Utility function */
|
||||
void kvm_pc_setup_irq_routing(bool pci_enabled)
|
||||
|
@ -69,6 +69,7 @@
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/i386/acpi-build.h"
|
||||
#include "kvm/kvm-cpu.h"
|
||||
#include "target/i386/cpu.h"
|
||||
|
||||
#define MAX_IDE_BUS 2
|
||||
#define XEN_IOAPIC_NUM_PIRQS 128ULL
|
||||
|
@ -34,6 +34,7 @@
|
||||
#include "hw/loader.h"
|
||||
#include "hw/i2c/smbus_eeprom.h"
|
||||
#include "hw/rtc/mc146818rtc.h"
|
||||
#include "sysemu/tcg.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "hw/i386/kvm/clock.h"
|
||||
#include "hw/pci-host/q35.h"
|
||||
@ -57,6 +58,7 @@
|
||||
#include "hw/hyperv/vmbus-bridge.h"
|
||||
#include "hw/mem/nvdimm.h"
|
||||
#include "hw/i386/acpi-build.h"
|
||||
#include "target/i386/cpu.h"
|
||||
|
||||
/* ICH9 AHCI has 6 ports */
|
||||
#define MAX_SATA_PORTS 6
|
||||
|
@ -129,13 +129,10 @@ void x86_cpus_init(X86MachineState *x86ms, int default_cpu_version)
|
||||
ms->smp.max_cpus - 1) + 1;
|
||||
|
||||
/*
|
||||
* Can we support APIC ID 255 or higher?
|
||||
*
|
||||
* Under Xen: yes.
|
||||
* With userspace emulated lapic: no
|
||||
* With KVM's in-kernel lapic: only if X2APIC API is enabled.
|
||||
* Can we support APIC ID 255 or higher? With KVM, that requires
|
||||
* both in-kernel lapic and X2APIC userspace API.
|
||||
*/
|
||||
if (x86ms->apic_id_limit > 255 && !xen_enabled() &&
|
||||
if (x86ms->apic_id_limit > 255 && kvm_enabled() &&
|
||||
(!kvm_irqchip_in_kernel() || !kvm_enable_x2apic())) {
|
||||
error_report("current -smp configuration requires kernel "
|
||||
"irqchip and X2APIC API support.");
|
||||
@ -424,7 +421,7 @@ void x86_cpu_pre_plug(HotplugHandler *hotplug_dev,
|
||||
cpu->thread_id = topo_ids.smt_id;
|
||||
|
||||
if (hyperv_feat_enabled(cpu, HYPERV_FEAT_VPINDEX) &&
|
||||
!kvm_hv_vpindex_settable()) {
|
||||
kvm_enabled() && !kvm_hv_vpindex_settable()) {
|
||||
error_setg(errp, "kernel doesn't allow setting HyperV VP_INDEX");
|
||||
return;
|
||||
}
|
||||
|
@ -1,41 +0,0 @@
|
||||
/*
|
||||
* qemu-options.h
|
||||
*
|
||||
* Defines needed for command line argument processing.
|
||||
*
|
||||
* Copyright (c) 2003-2008 Fabrice Bellard
|
||||
* Copyright (c) 2010 Jes Sorensen <Jes.Sorensen@redhat.com>
|
||||
*
|
||||
* 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.
|
||||
*/
|
||||
|
||||
#ifndef QEMU_OPTIONS_H
|
||||
#define QEMU_OPTIONS_H
|
||||
|
||||
enum {
|
||||
|
||||
#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
|
||||
opt_enum,
|
||||
#define DEFHEADING(text)
|
||||
#define ARCHHEADING(text, arch_mask)
|
||||
|
||||
#include "qemu-options.def"
|
||||
};
|
||||
|
||||
#endif
|
@ -188,7 +188,6 @@ extern bool kvm_msi_use_devid;
|
||||
#endif /* CONFIG_KVM_IS_POSSIBLE */
|
||||
|
||||
struct kvm_run;
|
||||
struct kvm_lapic_state;
|
||||
struct kvm_irq_routing_entry;
|
||||
|
||||
typedef struct KVMCapabilityInfo {
|
||||
@ -222,7 +221,6 @@ int kvm_has_vcpu_events(void);
|
||||
int kvm_has_robust_singlestep(void);
|
||||
int kvm_has_debugregs(void);
|
||||
int kvm_max_nested_state_length(void);
|
||||
int kvm_has_pit_state2(void);
|
||||
int kvm_has_many_ioeventfds(void);
|
||||
int kvm_has_gsi_routing(void);
|
||||
int kvm_has_intx_set_mask(void);
|
||||
@ -407,8 +405,6 @@ void kvm_irqchip_add_change_notifier(Notifier *n);
|
||||
void kvm_irqchip_remove_change_notifier(Notifier *n);
|
||||
void kvm_irqchip_change_notify(void);
|
||||
|
||||
void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
|
||||
|
||||
struct kvm_guest_debug;
|
||||
struct kvm_debug_exit_arch;
|
||||
|
||||
@ -464,11 +460,6 @@ int kvm_vm_check_extension(KVMState *s, unsigned int extension);
|
||||
kvm_vcpu_ioctl(cpu, KVM_ENABLE_CAP, &cap); \
|
||||
})
|
||||
|
||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
|
||||
uint32_t index, int reg);
|
||||
uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index);
|
||||
|
||||
|
||||
void kvm_set_sigmask_len(KVMState *s, unsigned int sigmask_len);
|
||||
|
||||
int kvm_physical_memory_addr_from_host(KVMState *s, void *ram_addr,
|
||||
@ -523,7 +514,6 @@ int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
|
||||
int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n,
|
||||
qemu_irq irq);
|
||||
void kvm_irqchip_set_qemuirq_gsi(KVMState *s, qemu_irq irq, int gsi);
|
||||
void kvm_pc_setup_irq_routing(bool pci_enabled);
|
||||
void kvm_init_irq_routing(KVMState *s);
|
||||
|
||||
bool kvm_kernel_irqchip_allowed(void);
|
||||
|
@ -42,17 +42,17 @@
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
int os_parse_cmd_args(int index, const char *optarg);
|
||||
void os_set_line_buffering(void);
|
||||
void os_setup_early_signal_handling(void);
|
||||
void os_set_proc_name(const char *s);
|
||||
void os_setup_signal_handling(void);
|
||||
void os_daemonize(void);
|
||||
void os_setup_post(void);
|
||||
int os_mlock(void);
|
||||
|
||||
int os_set_daemonize(bool d);
|
||||
bool is_daemonized(void);
|
||||
void os_daemonize(void);
|
||||
bool os_set_runas(const char *optarg);
|
||||
void os_set_chroot(const char *optarg);
|
||||
void os_setup_post(void);
|
||||
int os_mlock(void);
|
||||
|
||||
/**
|
||||
* qemu_alloc_stack:
|
||||
|
@ -101,7 +101,6 @@ static inline void os_setup_signal_handling(void) {}
|
||||
static inline void os_daemonize(void) {}
|
||||
static inline void os_setup_post(void) {}
|
||||
static inline void os_set_proc_name(const char *dummy) {}
|
||||
static inline int os_parse_cmd_args(int index, const char *optarg) { return -1; }
|
||||
void os_set_line_buffering(void);
|
||||
void os_setup_early_signal_handling(void);
|
||||
|
||||
|
111
meson.build
111
meson.build
@ -674,9 +674,7 @@ endif
|
||||
tcg_arch = host_arch
|
||||
if get_option('tcg').allowed()
|
||||
if host_arch == 'unknown'
|
||||
if get_option('tcg_interpreter')
|
||||
warning('Unsupported CPU @0@, will use TCG with TCI (slow)'.format(cpu))
|
||||
else
|
||||
if not get_option('tcg_interpreter')
|
||||
error('Unsupported CPU @0@, try --enable-tcg-interpreter'.format(cpu))
|
||||
endif
|
||||
elif get_option('tcg_interpreter')
|
||||
@ -689,7 +687,6 @@ if get_option('tcg').allowed()
|
||||
endif
|
||||
if get_option('tcg_interpreter')
|
||||
tcg_arch = 'tci'
|
||||
config_host += { 'CONFIG_TCG_INTERPRETER': 'y' }
|
||||
elif host_arch == 'x86_64'
|
||||
tcg_arch = 'i386'
|
||||
elif host_arch == 'ppc64'
|
||||
@ -699,7 +696,6 @@ if get_option('tcg').allowed()
|
||||
language: all_languages)
|
||||
|
||||
accelerators += 'CONFIG_TCG'
|
||||
config_host += { 'CONFIG_TCG': 'y' }
|
||||
endif
|
||||
|
||||
if 'CONFIG_KVM' not in accelerators and get_option('kvm').enabled()
|
||||
@ -728,7 +724,7 @@ glib_cflags = []
|
||||
if enable_modules
|
||||
gmodule = dependency('gmodule-export-2.0', version: glib_req_ver, required: true,
|
||||
method: 'pkg-config')
|
||||
elif config_host.has_key('CONFIG_PLUGIN')
|
||||
elif get_option('plugins')
|
||||
gmodule = dependency('gmodule-no-export-2.0', version: glib_req_ver, required: true,
|
||||
method: 'pkg-config')
|
||||
else
|
||||
@ -2067,10 +2063,15 @@ config_host_data.set('CONFIG_MODULE_UPGRADES', get_option('module_upgrades'))
|
||||
config_host_data.set('CONFIG_ATTR', libattr.found())
|
||||
config_host_data.set('CONFIG_BDRV_WHITELIST_TOOLS', get_option('block_drv_whitelist_in_tools'))
|
||||
config_host_data.set('CONFIG_BRLAPI', brlapi.found())
|
||||
config_host_data.set('CONFIG_BSD', targetos in bsd_oses)
|
||||
config_host_data.set('CONFIG_COCOA', cocoa.found())
|
||||
config_host_data.set('CONFIG_DARWIN', targetos == 'darwin')
|
||||
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())
|
||||
config_host_data.set('CONFIG_LINUX', targetos == 'linux')
|
||||
config_host_data.set('CONFIG_POSIX', targetos != 'windows')
|
||||
config_host_data.set('CONFIG_WIN32', targetos == 'windows')
|
||||
config_host_data.set('CONFIG_LZO', lzo.found())
|
||||
config_host_data.set('CONFIG_MPATH', mpathpersist.found())
|
||||
config_host_data.set('CONFIG_BLKIO', blkio.found())
|
||||
@ -2113,6 +2114,7 @@ if numa.found()
|
||||
dependencies: numa))
|
||||
endif
|
||||
config_host_data.set('CONFIG_OPENGL', opengl.found())
|
||||
config_host_data.set('CONFIG_PLUGIN', get_option('plugins'))
|
||||
config_host_data.set('CONFIG_RBD', rbd.found())
|
||||
config_host_data.set('CONFIG_RDMA', rdma.found())
|
||||
config_host_data.set('CONFIG_SAFESTACK', get_option('safe_stack'))
|
||||
@ -2123,6 +2125,11 @@ if seccomp.found()
|
||||
config_host_data.set('CONFIG_SECCOMP_SYSRAWRC', seccomp_has_sysrawrc)
|
||||
endif
|
||||
config_host_data.set('CONFIG_SNAPPY', snappy.found())
|
||||
config_host_data.set('CONFIG_SOLARIS', targetos == 'sunos')
|
||||
if get_option('tcg').allowed()
|
||||
config_host_data.set('CONFIG_TCG', 1)
|
||||
config_host_data.set('CONFIG_TCG_INTERPRETER', tcg_arch == 'tci')
|
||||
endif
|
||||
config_host_data.set('CONFIG_TPM', have_tpm)
|
||||
config_host_data.set('CONFIG_TSAN', get_option('tsan'))
|
||||
config_host_data.set('CONFIG_USB_LIBUSB', libusb.found())
|
||||
@ -2197,6 +2204,7 @@ config_host_data.set10('CONFIG_COROUTINE_POOL', have_coroutine_pool)
|
||||
config_host_data.set('CONFIG_DEBUG_GRAPH_LOCK', get_option('debug_graph_lock'))
|
||||
config_host_data.set('CONFIG_DEBUG_MUTEX', get_option('debug_mutex'))
|
||||
config_host_data.set('CONFIG_DEBUG_STACK_USAGE', get_option('debug_stack_usage'))
|
||||
config_host_data.set('CONFIG_DEBUG_TCG', get_option('debug_tcg'))
|
||||
config_host_data.set('CONFIG_GPROF', get_option('gprof'))
|
||||
config_host_data.set('CONFIG_LIVE_BLOCK_MIGRATION', get_option('live_block_migration').allowed())
|
||||
config_host_data.set('CONFIG_QOM_CAST_DEBUG', get_option('qom_cast_debug'))
|
||||
@ -2750,12 +2758,6 @@ if targetos == 'windows' and 'cpp' in all_languages
|
||||
endif
|
||||
config_host_data.set('HAVE_VSS_SDK', have_vss_sdk)
|
||||
|
||||
foreach k, v: config_host
|
||||
if k.startswith('CONFIG_')
|
||||
config_host_data.set(k, v == 'y' ? 1 : v)
|
||||
endif
|
||||
endforeach
|
||||
|
||||
# Older versions of MinGW do not import _lock_file and _unlock_file properly.
|
||||
# This was fixed for v6.0.0 with commit b48e3ac8969d.
|
||||
if targetos == 'windows'
|
||||
@ -2794,6 +2796,18 @@ endif
|
||||
########################
|
||||
|
||||
minikconf = find_program('scripts/minikconf.py')
|
||||
config_targetos = {
|
||||
(targetos == 'windows' ? 'CONFIG_WIN32' : 'CONFIG_POSIX'): 'y'
|
||||
}
|
||||
if targetos == 'darwin'
|
||||
config_targetos += {'CONFIG_DARWIN': 'y'}
|
||||
elif targetos == 'linux'
|
||||
config_targetos += {'CONFIG_LINUX': 'y'}
|
||||
endif
|
||||
if targetos in bsd_oses
|
||||
config_targetos += {'CONFIG_BSD': 'y'}
|
||||
endif
|
||||
|
||||
config_all = {}
|
||||
config_all_devices = {}
|
||||
config_all_disas = {}
|
||||
@ -2837,7 +2851,7 @@ host_kconfig = \
|
||||
(have_vhost_vdpa ? ['CONFIG_VHOST_VDPA=y'] : []) + \
|
||||
(have_vhost_kernel ? ['CONFIG_VHOST_KERNEL=y'] : []) + \
|
||||
(have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
|
||||
('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
|
||||
(targetos == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
|
||||
(have_pvrdma ? ['CONFIG_PVRDMA=y'] : []) + \
|
||||
(multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) + \
|
||||
(vfio_user_server_allowed ? ['CONFIG_VFIO_USER_SERVER_ALLOWED=y'] : [])
|
||||
@ -2858,7 +2872,7 @@ foreach target : target_dirs
|
||||
endif
|
||||
config_target += { 'CONFIG_LINUX_USER': 'y' }
|
||||
elif target.endswith('bsd-user')
|
||||
if 'CONFIG_BSD' not in config_host
|
||||
if targetos not in bsd_oses
|
||||
if default_targets
|
||||
continue
|
||||
endif
|
||||
@ -2989,7 +3003,7 @@ target_dirs = actual_target_dirs
|
||||
# pseudo symbol replaces it.
|
||||
|
||||
config_all += config_all_devices
|
||||
config_all += config_host
|
||||
config_all += config_targetos
|
||||
config_all += config_all_disas
|
||||
config_all += {
|
||||
'CONFIG_XEN': xen.found(),
|
||||
@ -3336,7 +3350,7 @@ if enable_modules
|
||||
modulecommon = declare_dependency(link_whole: libmodulecommon, compile_args: '-DBUILD_DSO')
|
||||
endif
|
||||
|
||||
qom_ss = qom_ss.apply(config_host, strict: false)
|
||||
qom_ss = qom_ss.apply(config_targetos, strict: false)
|
||||
libqom = static_library('qom', qom_ss.sources() + genh,
|
||||
dependencies: [qom_ss.dependencies()],
|
||||
name_suffix: 'fa')
|
||||
@ -3510,7 +3524,7 @@ foreach d, list : target_modules
|
||||
foreach target : target_dirs
|
||||
if target.endswith('-softmmu')
|
||||
config_target = config_target_mak[target]
|
||||
config_target += config_host
|
||||
config_target += config_targetos
|
||||
target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
|
||||
c_args = ['-DNEED_CPU_H',
|
||||
'-DCONFIG_TARGET="@0@-config-target.h"'.format(target),
|
||||
@ -3571,7 +3585,7 @@ qemu_syms = custom_target('qemu.syms', output: 'qemu.syms',
|
||||
capture: true,
|
||||
command: [undefsym, nm, '@INPUT@'])
|
||||
|
||||
authz_ss = authz_ss.apply(config_host, strict: false)
|
||||
authz_ss = authz_ss.apply(config_targetos, strict: false)
|
||||
libauthz = static_library('authz', authz_ss.sources() + genh,
|
||||
dependencies: [authz_ss.dependencies()],
|
||||
name_suffix: 'fa',
|
||||
@ -3580,7 +3594,7 @@ libauthz = static_library('authz', authz_ss.sources() + genh,
|
||||
authz = declare_dependency(link_whole: libauthz,
|
||||
dependencies: qom)
|
||||
|
||||
crypto_ss = crypto_ss.apply(config_host, strict: false)
|
||||
crypto_ss = crypto_ss.apply(config_targetos, strict: false)
|
||||
libcrypto = static_library('crypto', crypto_ss.sources() + genh,
|
||||
dependencies: [crypto_ss.dependencies()],
|
||||
name_suffix: 'fa',
|
||||
@ -3589,7 +3603,7 @@ libcrypto = static_library('crypto', crypto_ss.sources() + genh,
|
||||
crypto = declare_dependency(link_whole: libcrypto,
|
||||
dependencies: [authz, qom])
|
||||
|
||||
io_ss = io_ss.apply(config_host, strict: false)
|
||||
io_ss = io_ss.apply(config_targetos, strict: false)
|
||||
libio = static_library('io', io_ss.sources() + genh,
|
||||
dependencies: [io_ss.dependencies()],
|
||||
link_with: libqemuutil,
|
||||
@ -3605,7 +3619,7 @@ migration = declare_dependency(link_with: libmigration,
|
||||
dependencies: [zlib, qom, io])
|
||||
system_ss.add(migration)
|
||||
|
||||
block_ss = block_ss.apply(config_host, strict: false)
|
||||
block_ss = block_ss.apply(config_targetos, strict: false)
|
||||
libblock = static_library('block', block_ss.sources() + genh,
|
||||
dependencies: block_ss.dependencies(),
|
||||
link_depends: block_syms,
|
||||
@ -3616,7 +3630,7 @@ block = declare_dependency(link_whole: [libblock],
|
||||
link_args: '@block.syms',
|
||||
dependencies: [crypto, io])
|
||||
|
||||
blockdev_ss = blockdev_ss.apply(config_host, strict: false)
|
||||
blockdev_ss = blockdev_ss.apply(config_targetos, strict: false)
|
||||
libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
|
||||
dependencies: blockdev_ss.dependencies(),
|
||||
name_suffix: 'fa',
|
||||
@ -3625,7 +3639,7 @@ libblockdev = static_library('blockdev', blockdev_ss.sources() + genh,
|
||||
blockdev = declare_dependency(link_whole: [libblockdev],
|
||||
dependencies: [block, event_loop_base])
|
||||
|
||||
qmp_ss = qmp_ss.apply(config_host, strict: false)
|
||||
qmp_ss = qmp_ss.apply(config_targetos, strict: false)
|
||||
libqmp = static_library('qmp', qmp_ss.sources() + genh,
|
||||
dependencies: qmp_ss.dependencies(),
|
||||
name_suffix: 'fa',
|
||||
@ -3640,7 +3654,7 @@ libchardev = static_library('chardev', chardev_ss.sources() + genh,
|
||||
|
||||
chardev = declare_dependency(link_whole: libchardev)
|
||||
|
||||
hwcore_ss = hwcore_ss.apply(config_host, strict: false)
|
||||
hwcore_ss = hwcore_ss.apply(config_targetos, strict: false)
|
||||
libhwcore = static_library('hwcore', sources: hwcore_ss.sources() + genh,
|
||||
name_suffix: 'fa',
|
||||
build_by_default: false)
|
||||
@ -3697,7 +3711,7 @@ foreach target : target_dirs
|
||||
'-DCONFIG_DEVICES="@0@-config-devices.h"'.format(target)]
|
||||
link_args = emulator_link_args
|
||||
|
||||
config_target += config_host
|
||||
config_target += config_targetos
|
||||
target_inc = [include_directories('target' / config_target['TARGET_BASE_ARCH'])]
|
||||
if targetos == 'linux'
|
||||
target_inc += include_directories('linux-headers', is_system: true)
|
||||
@ -3880,7 +3894,7 @@ endforeach
|
||||
|
||||
# Other build targets
|
||||
|
||||
if 'CONFIG_PLUGIN' in config_host
|
||||
if get_option('plugins')
|
||||
install_headers('include/qemu/qemu-plugin.h')
|
||||
endif
|
||||
|
||||
@ -4152,8 +4166,8 @@ if config_all.has_key('CONFIG_TCG')
|
||||
else
|
||||
summary_info += {'TCG backend': 'native (@0@)'.format(cpu)}
|
||||
endif
|
||||
summary_info += {'TCG plugins': config_host.has_key('CONFIG_PLUGIN')}
|
||||
summary_info += {'TCG debug enabled': config_host.has_key('CONFIG_DEBUG_TCG')}
|
||||
summary_info += {'TCG plugins': get_option('plugins')}
|
||||
summary_info += {'TCG debug enabled': get_option('debug_tcg')}
|
||||
endif
|
||||
summary_info += {'target list': ' '.join(target_dirs)}
|
||||
if have_system
|
||||
@ -4312,28 +4326,37 @@ summary_info += {'selinux': selinux}
|
||||
summary_info += {'libdw': libdw}
|
||||
summary(summary_info, bool_yn: true, section: 'Dependencies')
|
||||
|
||||
if not supported_cpus.contains(cpu)
|
||||
if host_arch == 'unknown'
|
||||
message()
|
||||
warning('SUPPORT FOR THIS HOST CPU WILL GO AWAY IN FUTURE RELEASES!')
|
||||
warning('UNSUPPORTED HOST CPU')
|
||||
message()
|
||||
message('CPU host architecture ' + cpu + ' support is not currently maintained.')
|
||||
message('The QEMU project intends to remove support for this host CPU in')
|
||||
message('a future release if nobody volunteers to maintain it and to')
|
||||
message('provide a build host for our continuous integration setup.')
|
||||
message('configure has succeeded and you can continue to build, but')
|
||||
message('if you care about QEMU on this platform you should contact')
|
||||
message('us upstream at qemu-devel@nongnu.org.')
|
||||
message('Support for CPU host architecture ' + cpu + ' is not currently')
|
||||
message('maintained. The QEMU project does not guarantee that QEMU will')
|
||||
message('compile or work on this host CPU. You can help by volunteering')
|
||||
message('to maintain it and providing a build host for our continuous')
|
||||
message('integration setup.')
|
||||
if get_option('tcg').allowed() and target_dirs.length() > 0
|
||||
message()
|
||||
message('configure has succeeded and you can continue to build, but')
|
||||
message('QEMU will use a slow interpreter to emulate the target CPU.')
|
||||
endif
|
||||
endif
|
||||
|
||||
if not supported_oses.contains(targetos)
|
||||
message()
|
||||
warning('WARNING: SUPPORT FOR THIS HOST OS WILL GO AWAY IN FUTURE RELEASES!')
|
||||
warning('UNSUPPORTED HOST OS')
|
||||
message()
|
||||
message('Host OS ' + targetos + 'support is not currently maintained.')
|
||||
message('The QEMU project intends to remove support for this host OS in')
|
||||
message('a future release if nobody volunteers to maintain it and to')
|
||||
message('provide a build host for our continuous integration setup.')
|
||||
message('Support for host OS ' + targetos + 'is not currently maintained.')
|
||||
message('configure has succeeded and you can continue to build, but')
|
||||
message('if you care about QEMU on this platform you should contact')
|
||||
message('us upstream at qemu-devel@nongnu.org.')
|
||||
message('the QEMU project does not guarantee that QEMU will compile or')
|
||||
message('work on this operating system. You can help by volunteering')
|
||||
message('to maintain it and providing a build host for our continuous')
|
||||
message('integration setup. This will ensure that future versions of QEMU')
|
||||
message('will keep working on ' + targetos + '.')
|
||||
endif
|
||||
|
||||
if host_arch == 'unknown' or not supported_oses.contains(targetos)
|
||||
message()
|
||||
message('If you want to help supporting QEMU on this platform, please')
|
||||
message('contact the developers at qemu-devel@nongnu.org.')
|
||||
endif
|
||||
|
@ -81,6 +81,10 @@ option('xen_pci_passthrough', type: 'feature', value: 'auto',
|
||||
description: 'Xen PCI passthrough support')
|
||||
option('tcg', type: 'feature', value: 'enabled',
|
||||
description: 'TCG support')
|
||||
option('plugins', type: 'boolean', value: false,
|
||||
description: 'TCG plugins via shared library loading')
|
||||
option('debug_tcg', type: 'boolean', value: false,
|
||||
description: 'TCG debugging')
|
||||
option('tcg_interpreter', type: 'boolean', value: false,
|
||||
description: 'TCG with bytecode interpreter (slow)')
|
||||
option('safe_stack', type: 'boolean', value: false,
|
||||
|
@ -41,15 +41,17 @@ if have_vhost_net_user
|
||||
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-user-stub.c'))
|
||||
endif
|
||||
|
||||
system_ss.add(when: 'CONFIG_LINUX', if_true: files('tap-linux.c'))
|
||||
system_ss.add(when: 'CONFIG_BSD', if_true: files('tap-bsd.c'))
|
||||
system_ss.add(when: 'CONFIG_SOLARIS', if_true: files('tap-solaris.c'))
|
||||
tap_posix = ['tap.c']
|
||||
if not config_host.has_key('CONFIG_LINUX') and not config_host.has_key('CONFIG_BSD') and not config_host.has_key('CONFIG_SOLARIS')
|
||||
tap_posix += 'tap-stub.c'
|
||||
if targetos == 'windows'
|
||||
system_ss.add(files('tap-win32.c'))
|
||||
elif targetos == 'linux'
|
||||
system_ss.add(files('tap.c', 'tap-linux.c'))
|
||||
elif targetos in bsd_oses
|
||||
system_ss.add(files('tap.c', 'tap-bsd.c'))
|
||||
elif targetos == 'solaris'
|
||||
system_ss.add(files('tap.c', 'tap-solaris.c'))
|
||||
else
|
||||
system_ss.add(files('tap.c', 'tap-stub.c'))
|
||||
endif
|
||||
system_ss.add(when: 'CONFIG_POSIX', if_true: files(tap_posix))
|
||||
system_ss.add(when: 'CONFIG_WIN32', if_true: files('tap-win32.c'))
|
||||
if have_vhost_net_vdpa
|
||||
system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-vdpa.c'), if_false: files('vhost-vdpa-stub.c'))
|
||||
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-vdpa-stub.c'))
|
||||
|
157
os-posix.c
157
os-posix.c
@ -29,33 +29,15 @@
|
||||
#include <grp.h>
|
||||
#include <libgen.h>
|
||||
|
||||
/* Needed early for CONFIG_BSD etc. */
|
||||
#include "net/slirp.h"
|
||||
#include "qemu/qemu-options.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/log.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/module.h"
|
||||
|
||||
#ifdef CONFIG_LINUX
|
||||
#include <sys/prctl.h>
|
||||
#include "qemu/async-teardown.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Must set all three of these at once.
|
||||
* Legal combinations are unset by name by uid
|
||||
*/
|
||||
static struct passwd *user_pwd; /* NULL non-NULL NULL */
|
||||
static uid_t user_uid = (uid_t)-1; /* -1 -1 >=0 */
|
||||
static gid_t user_gid = (gid_t)-1; /* -1 -1 >=0 */
|
||||
|
||||
static const char *chroot_dir;
|
||||
static int daemonize;
|
||||
static int daemon_pipe;
|
||||
|
||||
void os_setup_early_signal_handling(void)
|
||||
{
|
||||
@ -103,7 +85,22 @@ void os_set_proc_name(const char *s)
|
||||
}
|
||||
|
||||
|
||||
static bool os_parse_runas_uid_gid(const char *optarg)
|
||||
/*
|
||||
* Must set all three of these at once.
|
||||
* Legal combinations are unset by name by uid
|
||||
*/
|
||||
static struct passwd *user_pwd; /* NULL non-NULL NULL */
|
||||
static uid_t user_uid = (uid_t)-1; /* -1 -1 >=0 */
|
||||
static gid_t user_gid = (gid_t)-1; /* -1 -1 >=0 */
|
||||
|
||||
/*
|
||||
* Prepare to change user ID. optarg can be one of 3 forms:
|
||||
* - a username, in which case user ID will be changed to its uid,
|
||||
* with primary and supplementary groups set up too;
|
||||
* - a numeric uid, in which case only the uid will be set;
|
||||
* - a pair of numeric uid:gid.
|
||||
*/
|
||||
bool os_set_runas(const char *optarg)
|
||||
{
|
||||
unsigned long lv;
|
||||
const char *ep;
|
||||
@ -111,6 +108,13 @@ static bool os_parse_runas_uid_gid(const char *optarg)
|
||||
gid_t got_gid;
|
||||
int rc;
|
||||
|
||||
user_pwd = getpwnam(optarg);
|
||||
if (user_pwd) {
|
||||
user_uid = -1;
|
||||
user_gid = -1;
|
||||
return true;
|
||||
}
|
||||
|
||||
rc = qemu_strtoul(optarg, &ep, 0, &lv);
|
||||
got_uid = lv; /* overflow here is ID in C99 */
|
||||
if (rc || *ep != ':' || got_uid != lv || got_uid == (uid_t)-1) {
|
||||
@ -129,63 +133,6 @@ static bool os_parse_runas_uid_gid(const char *optarg)
|
||||
return true;
|
||||
}
|
||||
|
||||
/*
|
||||
* Parse OS specific command line options.
|
||||
* return 0 if option handled, -1 otherwise
|
||||
*/
|
||||
int os_parse_cmd_args(int index, const char *optarg)
|
||||
{
|
||||
switch (index) {
|
||||
case QEMU_OPTION_runas:
|
||||
user_pwd = getpwnam(optarg);
|
||||
if (user_pwd) {
|
||||
user_uid = -1;
|
||||
user_gid = -1;
|
||||
} else if (!os_parse_runas_uid_gid(optarg)) {
|
||||
error_report("User \"%s\" doesn't exist"
|
||||
" (and is not <uid>:<gid>)",
|
||||
optarg);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case QEMU_OPTION_chroot:
|
||||
warn_report("option is deprecated, use '-run-with chroot=...' instead");
|
||||
chroot_dir = optarg;
|
||||
break;
|
||||
case QEMU_OPTION_daemonize:
|
||||
daemonize = 1;
|
||||
break;
|
||||
#if defined(CONFIG_LINUX)
|
||||
/* deprecated */
|
||||
case QEMU_OPTION_asyncteardown:
|
||||
init_async_teardown();
|
||||
break;
|
||||
#endif
|
||||
case QEMU_OPTION_run_with: {
|
||||
const char *str;
|
||||
QemuOpts *opts = qemu_opts_parse_noisily(qemu_find_opts("run-with"),
|
||||
optarg, false);
|
||||
if (!opts) {
|
||||
exit(1);
|
||||
}
|
||||
#if defined(CONFIG_LINUX)
|
||||
if (qemu_opt_get_bool(opts, "async-teardown", false)) {
|
||||
init_async_teardown();
|
||||
}
|
||||
#endif
|
||||
str = qemu_opt_get(opts, "chroot");
|
||||
if (str) {
|
||||
chroot_dir = str;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
return -1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void change_process_uid(void)
|
||||
{
|
||||
assert((user_uid == (uid_t)-1) || user_pwd == NULL);
|
||||
@ -223,6 +170,14 @@ static void change_process_uid(void)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static const char *chroot_dir;
|
||||
|
||||
void os_set_chroot(const char *optarg)
|
||||
{
|
||||
chroot_dir = optarg;
|
||||
}
|
||||
|
||||
static void change_root(void)
|
||||
{
|
||||
if (chroot_dir) {
|
||||
@ -238,6 +193,21 @@ static void change_root(void)
|
||||
|
||||
}
|
||||
|
||||
|
||||
static int daemonize;
|
||||
static int daemon_pipe;
|
||||
|
||||
bool is_daemonized(void)
|
||||
{
|
||||
return daemonize;
|
||||
}
|
||||
|
||||
int os_set_daemonize(bool d)
|
||||
{
|
||||
daemonize = d;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void os_daemonize(void)
|
||||
{
|
||||
if (daemonize) {
|
||||
@ -331,17 +301,6 @@ void os_set_line_buffering(void)
|
||||
setvbuf(stdout, NULL, _IOLBF, 0);
|
||||
}
|
||||
|
||||
bool is_daemonized(void)
|
||||
{
|
||||
return daemonize;
|
||||
}
|
||||
|
||||
int os_set_daemonize(bool d)
|
||||
{
|
||||
daemonize = d;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int os_mlock(void)
|
||||
{
|
||||
#ifdef HAVE_MLOCKALL
|
||||
@ -357,27 +316,3 @@ int os_mlock(void)
|
||||
return -ENOSYS;
|
||||
#endif
|
||||
}
|
||||
|
||||
static QemuOptsList qemu_run_with_opts = {
|
||||
.name = "run-with",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(qemu_run_with_opts.head),
|
||||
.desc = {
|
||||
#if defined(CONFIG_LINUX)
|
||||
{
|
||||
.name = "async-teardown",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "chroot",
|
||||
.type = QEMU_OPT_STRING,
|
||||
},
|
||||
{ /* end of list */ }
|
||||
},
|
||||
};
|
||||
|
||||
static void register_runwith(void)
|
||||
{
|
||||
qemu_add_opts(&qemu_run_with_opts);
|
||||
}
|
||||
opts_init(register_runwith);
|
||||
|
@ -1,19 +0,0 @@
|
||||
#
|
||||
# NOTE: only compilable with x86 cross compile tools
|
||||
#
|
||||
include ../config-host.mak
|
||||
|
||||
DEFINES=
|
||||
|
||||
TARGETS=
|
||||
|
||||
all: $(TARGETS)
|
||||
|
||||
%.o: %.S
|
||||
$(CC) $(DEFINES) -c -o $@ $<
|
||||
|
||||
%.dtb: %.dts
|
||||
dtc -I dts -O dtb -o $@ $<
|
||||
|
||||
clean:
|
||||
rm -f $(TARGETS) *.o *~
|
@ -57,10 +57,6 @@ blobs = [
|
||||
'efi-e1000e.rom',
|
||||
'efi-vmxnet3.rom',
|
||||
'qemu-nsis.bmp',
|
||||
'bamboo.dtb',
|
||||
'canyonlands.dtb',
|
||||
'petalogix-s3adsp1800.dtb',
|
||||
'petalogix-ml605.dtb',
|
||||
'multiboot.bin',
|
||||
'multiboot_dma.bin',
|
||||
'linuxboot.bin',
|
||||
@ -84,6 +80,27 @@ blobs = [
|
||||
'vof-nvram.bin',
|
||||
]
|
||||
|
||||
dtc = find_program('dtc', required: false)
|
||||
foreach f : [
|
||||
'bamboo.dts',
|
||||
'canyonlands.dts',
|
||||
'petalogix-s3adsp1800.dts',
|
||||
'petalogix-ml605.dts',
|
||||
]
|
||||
out = fs.replace_suffix(f, '.dtb')
|
||||
if dtc.found()
|
||||
custom_target(f,
|
||||
build_by_default: have_system,
|
||||
input: files(f),
|
||||
output: out,
|
||||
install: get_option('install_blobs'),
|
||||
install_dir: qemu_datadir,
|
||||
command: [ dtc, '-I', 'dts', '-O', 'dtb', '-o', '@OUTPUT@', '@INPUT0@' ])
|
||||
else
|
||||
blobs += out
|
||||
endif
|
||||
endforeach
|
||||
|
||||
if get_option('install_blobs')
|
||||
install_data(blobs, install_dir: qemu_datadir)
|
||||
endif
|
||||
|
@ -13,8 +13,10 @@ if not enable_modules
|
||||
endif
|
||||
endif
|
||||
|
||||
specific_ss.add(when: 'CONFIG_PLUGIN', if_true: [files(
|
||||
'loader.c',
|
||||
'core.c',
|
||||
'api.c',
|
||||
), declare_dependency(link_args: plugin_ldflags)])
|
||||
if get_option('plugins')
|
||||
specific_ss.add(files(
|
||||
'loader.c',
|
||||
'core.c',
|
||||
'api.c',
|
||||
), declare_dependency(link_args: plugin_ldflags))
|
||||
endif
|
||||
|
@ -9,13 +9,13 @@ help:
|
||||
@echo "make check-minreqs:"
|
||||
@echo " Run tests in the minreqs virtual environment."
|
||||
@echo " These tests use the oldest dependencies."
|
||||
@echo " Requires: Python 3.7"
|
||||
@echo " Hint (Fedora): 'sudo dnf install python3.7'"
|
||||
@echo " Requires: Python 3.8"
|
||||
@echo " Hint (Fedora): 'sudo dnf install python3.8'"
|
||||
@echo ""
|
||||
@echo "make check-tox:"
|
||||
@echo " Run tests against multiple python versions."
|
||||
@echo " These tests use the newest dependencies."
|
||||
@echo " Requires: Python 3.7 - 3.11, and tox."
|
||||
@echo " Requires: Python 3.8 - 3.11, and tox."
|
||||
@echo " Hint (Fedora): 'sudo dnf install python3-tox python3.11'"
|
||||
@echo " The variable QEMU_TOX_EXTRA_ARGS can be use to pass extra"
|
||||
@echo " arguments to tox".
|
||||
@ -59,7 +59,7 @@ PIP_INSTALL = pip install --disable-pip-version-check
|
||||
min-venv: $(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate
|
||||
$(QEMU_MINVENV_DIR) $(QEMU_MINVENV_DIR)/bin/activate: setup.cfg tests/minreqs.txt
|
||||
@echo "VENV $(QEMU_MINVENV_DIR)"
|
||||
@python3.7 -m venv $(QEMU_MINVENV_DIR)
|
||||
@python3.8 -m venv $(QEMU_MINVENV_DIR)
|
||||
@( \
|
||||
echo "ACTIVATE $(QEMU_MINVENV_DIR)"; \
|
||||
. $(QEMU_MINVENV_DIR)/bin/activate; \
|
||||
|
@ -61,9 +61,6 @@ options:
|
||||
|
||||
"""
|
||||
|
||||
# The duplication between importlib and pkg_resources does not help
|
||||
# pylint: disable=too-many-lines
|
||||
|
||||
# Copyright (C) 2022-2023 Red Hat, Inc.
|
||||
#
|
||||
# Authors:
|
||||
@ -74,6 +71,13 @@ options:
|
||||
# later. See the COPYING file in the top-level directory.
|
||||
|
||||
import argparse
|
||||
from importlib.metadata import (
|
||||
Distribution,
|
||||
EntryPoint,
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
version,
|
||||
)
|
||||
from importlib.util import find_spec
|
||||
import logging
|
||||
import os
|
||||
@ -189,7 +193,7 @@ class QemuEnvBuilder(venv.EnvBuilder):
|
||||
):
|
||||
kwargs["with_pip"] = False
|
||||
else:
|
||||
check_ensurepip(suggest_remedy=True)
|
||||
check_ensurepip()
|
||||
|
||||
super().__init__(*args, **kwargs)
|
||||
|
||||
@ -294,7 +298,7 @@ def need_ensurepip() -> bool:
|
||||
return True
|
||||
|
||||
|
||||
def check_ensurepip(prefix: str = "", suggest_remedy: bool = False) -> None:
|
||||
def check_ensurepip() -> None:
|
||||
"""
|
||||
Check that we have ensurepip.
|
||||
|
||||
@ -305,15 +309,12 @@ def check_ensurepip(prefix: str = "", suggest_remedy: bool = False) -> None:
|
||||
"Python's ensurepip module is not found.\n"
|
||||
"It's normally part of the Python standard library, "
|
||||
"maybe your distribution packages it separately?\n"
|
||||
"(Debian puts ensurepip in its python3-venv package.)\n"
|
||||
"Either install ensurepip, or alleviate the need for it in the "
|
||||
"first place by installing pip and setuptools for "
|
||||
f"'{sys.executable}'.\n"
|
||||
"(Hint: Debian puts ensurepip in its python3-venv package.)"
|
||||
)
|
||||
if suggest_remedy:
|
||||
msg += (
|
||||
"Either install ensurepip, or alleviate the need for it in the"
|
||||
" first place by installing pip and setuptools for "
|
||||
f"'{sys.executable}'.\n"
|
||||
)
|
||||
raise Ouch(prefix + msg)
|
||||
raise Ouch(msg)
|
||||
|
||||
# ensurepip uses pyexpat, which can also go missing on us:
|
||||
if not find_spec("pyexpat"):
|
||||
@ -321,15 +322,12 @@ def check_ensurepip(prefix: str = "", suggest_remedy: bool = False) -> None:
|
||||
"Python's pyexpat module is not found.\n"
|
||||
"It's normally part of the Python standard library, "
|
||||
"maybe your distribution packages it separately?\n"
|
||||
"(NetBSD's pkgsrc debundles this to e.g. 'py310-expat'.)\n"
|
||||
"Either install pyexpat, or alleviate the need for it in the "
|
||||
"first place by installing pip and setuptools for "
|
||||
f"'{sys.executable}'.\n\n"
|
||||
"(Hint: NetBSD's pkgsrc debundles this to e.g. 'py310-expat'.)"
|
||||
)
|
||||
if suggest_remedy:
|
||||
msg += (
|
||||
"Either install pyexpat, or alleviate the need for it in the "
|
||||
"first place by installing pip and setuptools for "
|
||||
f"'{sys.executable}'.\n"
|
||||
)
|
||||
raise Ouch(prefix + msg)
|
||||
raise Ouch(msg)
|
||||
|
||||
|
||||
def make_venv( # pylint: disable=too-many-arguments
|
||||
@ -428,28 +426,13 @@ def make_venv( # pylint: disable=too-many-arguments
|
||||
print(builder.get_value("env_exe"))
|
||||
|
||||
|
||||
def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# pylint: disable=no-name-in-module
|
||||
# pylint: disable=import-error
|
||||
try:
|
||||
# First preference: Python 3.8+ stdlib
|
||||
from importlib.metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
# Second preference: Commonly available PyPI backport
|
||||
from importlib_metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
def _get_entry_points(packages: Sequence[str]) -> Iterator[str]:
|
||||
|
||||
def _generator() -> Iterator[str]:
|
||||
for package in packages:
|
||||
try:
|
||||
entry_points = distribution(package).entry_points
|
||||
entry_points: Iterator[EntryPoint] = \
|
||||
iter(distribution(package).entry_points)
|
||||
except PackageNotFoundError:
|
||||
continue
|
||||
|
||||
@ -465,24 +448,6 @@ def _gen_importlib(packages: Sequence[str]) -> Iterator[str]:
|
||||
return _generator()
|
||||
|
||||
|
||||
def _gen_pkg_resources(packages: Sequence[str]) -> Iterator[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# Bundled with setuptools; has a good chance of being available.
|
||||
import pkg_resources
|
||||
|
||||
def _generator() -> Iterator[str]:
|
||||
for package in packages:
|
||||
try:
|
||||
eps = pkg_resources.get_entry_map(package, "console_scripts")
|
||||
except pkg_resources.DistributionNotFound:
|
||||
continue
|
||||
|
||||
for entry_point in eps.values():
|
||||
yield str(entry_point)
|
||||
|
||||
return _generator()
|
||||
|
||||
|
||||
def generate_console_scripts(
|
||||
packages: Sequence[str],
|
||||
python_path: Optional[str] = None,
|
||||
@ -507,66 +472,15 @@ def generate_console_scripts(
|
||||
if not packages:
|
||||
return
|
||||
|
||||
def _get_entry_points() -> Iterator[str]:
|
||||
"""Python 3.7 compatibility shim for iterating entry points."""
|
||||
# Python 3.8+, or Python 3.7 with importlib_metadata installed.
|
||||
try:
|
||||
return _gen_importlib(packages)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
|
||||
# Python 3.7 with setuptools installed.
|
||||
try:
|
||||
return _gen_pkg_resources(packages)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
raise Ouch(
|
||||
"Neither importlib.metadata nor pkg_resources found, "
|
||||
"can't generate console script shims.\n"
|
||||
"Use Python 3.8+, or install importlib-metadata or setuptools."
|
||||
) from exc
|
||||
|
||||
maker = distlib.scripts.ScriptMaker(None, bin_path)
|
||||
maker.variants = {""}
|
||||
maker.clobber = False
|
||||
|
||||
for entry_point in _get_entry_points():
|
||||
for entry_point in _get_entry_points(packages):
|
||||
for filename in maker.make(entry_point):
|
||||
logger.debug("wrote console_script '%s'", filename)
|
||||
|
||||
|
||||
def checkpip() -> bool:
|
||||
"""
|
||||
Debian10 has a pip that's broken when used inside of a virtual environment.
|
||||
|
||||
We try to detect and correct that case here.
|
||||
"""
|
||||
try:
|
||||
# pylint: disable=import-outside-toplevel,unused-import,import-error
|
||||
# pylint: disable=redefined-outer-name
|
||||
import pip._internal # type: ignore # noqa: F401
|
||||
|
||||
logger.debug("pip appears to be working correctly.")
|
||||
return False
|
||||
except ModuleNotFoundError as exc:
|
||||
if exc.name == "pip._internal":
|
||||
# Uh, fair enough. They did say "internal".
|
||||
# Let's just assume it's fine.
|
||||
return False
|
||||
logger.warning("pip appears to be malfunctioning: %s", str(exc))
|
||||
|
||||
check_ensurepip("pip appears to be non-functional, and ")
|
||||
|
||||
logger.debug("Attempting to repair pip ...")
|
||||
subprocess.run(
|
||||
(sys.executable, "-m", "ensurepip"),
|
||||
stdout=subprocess.DEVNULL,
|
||||
check=True,
|
||||
)
|
||||
logger.debug("Pip is now (hopefully) repaired!")
|
||||
return True
|
||||
|
||||
|
||||
def pkgname_from_depspec(dep_spec: str) -> str:
|
||||
"""
|
||||
Parse package name out of a PEP-508 depspec.
|
||||
@ -584,57 +498,6 @@ def pkgname_from_depspec(dep_spec: str) -> str:
|
||||
return match.group(0)
|
||||
|
||||
|
||||
def _get_path_importlib(package: str) -> Optional[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# pylint: disable=no-name-in-module
|
||||
# pylint: disable=import-error
|
||||
try:
|
||||
# First preference: Python 3.8+ stdlib
|
||||
from importlib.metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
# Second preference: Commonly available PyPI backport
|
||||
from importlib_metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
|
||||
try:
|
||||
return str(distribution(package).locate_file("."))
|
||||
except PackageNotFoundError:
|
||||
return None
|
||||
|
||||
|
||||
def _get_path_pkg_resources(package: str) -> Optional[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# Bundled with setuptools; has a good chance of being available.
|
||||
import pkg_resources
|
||||
|
||||
try:
|
||||
return str(pkg_resources.get_distribution(package).location)
|
||||
except pkg_resources.DistributionNotFound:
|
||||
return None
|
||||
|
||||
|
||||
def _get_path(package: str) -> Optional[str]:
|
||||
try:
|
||||
return _get_path_importlib(package)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
|
||||
try:
|
||||
return _get_path_pkg_resources(package)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
raise Ouch(
|
||||
"Neither importlib.metadata nor pkg_resources found. "
|
||||
"Use Python 3.8+, or install importlib-metadata or setuptools."
|
||||
) from exc
|
||||
|
||||
|
||||
def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
|
||||
try:
|
||||
return (
|
||||
@ -644,65 +507,14 @@ def _path_is_prefix(prefix: Optional[str], path: str) -> bool:
|
||||
return False
|
||||
|
||||
|
||||
def _is_system_package(package: str) -> bool:
|
||||
path = _get_path(package)
|
||||
return path is not None and not (
|
||||
def _is_system_package(dist: Distribution) -> bool:
|
||||
path = str(dist.locate_file("."))
|
||||
return not (
|
||||
_path_is_prefix(sysconfig.get_path("purelib"), path)
|
||||
or _path_is_prefix(sysconfig.get_path("platlib"), path)
|
||||
)
|
||||
|
||||
|
||||
def _get_version_importlib(package: str) -> Optional[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# pylint: disable=no-name-in-module
|
||||
# pylint: disable=import-error
|
||||
try:
|
||||
# First preference: Python 3.8+ stdlib
|
||||
from importlib.metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
# Second preference: Commonly available PyPI backport
|
||||
from importlib_metadata import ( # type: ignore
|
||||
PackageNotFoundError,
|
||||
distribution,
|
||||
)
|
||||
|
||||
try:
|
||||
return str(distribution(package).version)
|
||||
except PackageNotFoundError:
|
||||
return None
|
||||
|
||||
|
||||
def _get_version_pkg_resources(package: str) -> Optional[str]:
|
||||
# pylint: disable=import-outside-toplevel
|
||||
# Bundled with setuptools; has a good chance of being available.
|
||||
import pkg_resources
|
||||
|
||||
try:
|
||||
return str(pkg_resources.get_distribution(package).version)
|
||||
except pkg_resources.DistributionNotFound:
|
||||
return None
|
||||
|
||||
|
||||
def _get_version(package: str) -> Optional[str]:
|
||||
try:
|
||||
return _get_version_importlib(package)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
|
||||
try:
|
||||
return _get_version_pkg_resources(package)
|
||||
except ImportError as exc:
|
||||
logger.debug("%s", str(exc))
|
||||
raise Ouch(
|
||||
"Neither importlib.metadata nor pkg_resources found. "
|
||||
"Use Python 3.8+, or install importlib-metadata or setuptools."
|
||||
) from exc
|
||||
|
||||
|
||||
def diagnose(
|
||||
dep_spec: str,
|
||||
online: bool,
|
||||
@ -728,7 +540,11 @@ def diagnose(
|
||||
bad = False
|
||||
|
||||
pkg_name = pkgname_from_depspec(dep_spec)
|
||||
pkg_version = _get_version(pkg_name)
|
||||
pkg_version: Optional[str] = None
|
||||
try:
|
||||
pkg_version = version(pkg_name)
|
||||
except PackageNotFoundError:
|
||||
pass
|
||||
|
||||
lines = []
|
||||
|
||||
@ -865,19 +681,25 @@ def _do_ensure(
|
||||
constraint = _make_version_constraint(info, False)
|
||||
matcher = distlib.version.LegacyMatcher(name + constraint)
|
||||
print(f"mkvenv: checking for {matcher}", file=sys.stderr)
|
||||
ver = _get_version(name)
|
||||
|
||||
dist: Optional[Distribution] = None
|
||||
try:
|
||||
dist = distribution(matcher.name)
|
||||
except PackageNotFoundError:
|
||||
pass
|
||||
|
||||
if (
|
||||
ver is None
|
||||
dist is None
|
||||
# Always pass installed package to pip, so that they can be
|
||||
# updated if the requested version changes
|
||||
or not _is_system_package(name)
|
||||
or not matcher.match(distlib.version.LegacyVersion(ver))
|
||||
or not _is_system_package(dist)
|
||||
or not matcher.match(distlib.version.LegacyVersion(dist.version))
|
||||
):
|
||||
absent.append(name + _make_version_constraint(info, True))
|
||||
if len(absent) == 1:
|
||||
canary = info.get("canary", None)
|
||||
else:
|
||||
logger.info("found %s %s", name, ver)
|
||||
logger.info("found %s %s", name, dist.version)
|
||||
present.append(name)
|
||||
|
||||
if present:
|
||||
@ -1015,12 +837,10 @@ def post_venv_setup() -> None:
|
||||
This is intended to be run *inside the venv* after it is created.
|
||||
"""
|
||||
logger.debug("post_venv_setup()")
|
||||
# Test for a broken pip (Debian 10 or derivative?) and fix it if needed
|
||||
if not checkpip():
|
||||
# Finally, generate a 'pip' script so the venv is usable in a normal
|
||||
# way from the CLI. This only happens when we inherited pip from a
|
||||
# parent/system-site and haven't run ensurepip in some way.
|
||||
generate_console_scripts(["pip"])
|
||||
# Generate a 'pip' script so the venv is usable in a normal
|
||||
# way from the CLI. This only happens when we inherited pip from a
|
||||
# parent/system-site and haven't run ensurepip in some way.
|
||||
generate_console_scripts(["pip"])
|
||||
|
||||
|
||||
def _add_create_subcommand(subparsers: Any) -> None:
|
||||
|
@ -14,7 +14,6 @@ classifiers =
|
||||
Natural Language :: English
|
||||
Operating System :: OS Independent
|
||||
Programming Language :: Python :: 3 :: Only
|
||||
Programming Language :: Python :: 3.7
|
||||
Programming Language :: Python :: 3.8
|
||||
Programming Language :: Python :: 3.9
|
||||
Programming Language :: Python :: 3.10
|
||||
@ -22,7 +21,7 @@ classifiers =
|
||||
Typing :: Typed
|
||||
|
||||
[options]
|
||||
python_requires = >= 3.7
|
||||
python_requires = >= 3.8
|
||||
packages =
|
||||
qemu.qmp
|
||||
qemu.machine
|
||||
@ -76,7 +75,7 @@ exclude = __pycache__,
|
||||
|
||||
[mypy]
|
||||
strict = True
|
||||
python_version = 3.7
|
||||
python_version = 3.8
|
||||
warn_unused_configs = True
|
||||
namespace_packages = True
|
||||
warn_unused_ignores = False
|
||||
@ -109,15 +108,6 @@ ignore_missing_imports = True
|
||||
[mypy-pygments]
|
||||
ignore_missing_imports = True
|
||||
|
||||
[mypy-importlib.metadata]
|
||||
ignore_missing_imports = True
|
||||
|
||||
[mypy-importlib_metadata]
|
||||
ignore_missing_imports = True
|
||||
|
||||
[mypy-pkg_resources]
|
||||
ignore_missing_imports = True
|
||||
|
||||
[mypy-distlib]
|
||||
ignore_missing_imports = True
|
||||
|
||||
@ -192,7 +182,7 @@ multi_line_output=3
|
||||
# of python available on your system to run this test.
|
||||
|
||||
[tox:tox]
|
||||
envlist = py37, py38, py39, py310, py311
|
||||
envlist = py38, py39, py310, py311
|
||||
skip_missing_interpreters = true
|
||||
|
||||
[testenv]
|
||||
|
@ -1,5 +1,5 @@
|
||||
# This file lists the ***oldest possible dependencies*** needed to run
|
||||
# "make check" successfully under ***Python 3.7***. It is used primarily
|
||||
# "make check" successfully under ***Python 3.8***. It is used primarily
|
||||
# by GitLab CI to ensure that our stated minimum versions in setup.cfg
|
||||
# are truthful and regularly validated.
|
||||
#
|
||||
|
@ -85,7 +85,7 @@ qga_ss.add(when: 'CONFIG_WIN32', if_true: files(
|
||||
'vss-win32.c'
|
||||
))
|
||||
|
||||
qga_ss = qga_ss.apply(config_host, strict: false)
|
||||
qga_ss = qga_ss.apply(config_targetos, strict: false)
|
||||
|
||||
gen_tlb = []
|
||||
qga_libs = []
|
||||
@ -180,7 +180,7 @@ test_env.set('G_TEST_BUILDDIR', meson.current_build_dir())
|
||||
# the leak detector in build-oss-fuzz Gitlab CI test. we should re-enable
|
||||
# this when an alternative is implemented or when the underlying glib
|
||||
# issue is identified/fix
|
||||
#if 'CONFIG_POSIX' in config_host
|
||||
#if targetos != 'windows'
|
||||
if false
|
||||
srcs = [files('commands-posix-ssh.c')]
|
||||
i = 0
|
||||
|
@ -29,6 +29,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' --enable-debug-mutex mutex debugging support'
|
||||
printf "%s\n" ' --enable-debug-stack-usage'
|
||||
printf "%s\n" ' measure coroutine stack usage'
|
||||
printf "%s\n" ' --enable-debug-tcg TCG debugging'
|
||||
printf "%s\n" ' --enable-fdt[=CHOICE] Whether and how to find the libfdt library'
|
||||
printf "%s\n" ' (choices: auto/disabled/enabled/internal/system)'
|
||||
printf "%s\n" ' --enable-fuzzing build fuzzing targets'
|
||||
@ -39,6 +40,7 @@ meson_options_help() {
|
||||
printf "%s\n" ' jemalloc/system/tcmalloc)'
|
||||
printf "%s\n" ' --enable-module-upgrades try to load modules from alternate paths for'
|
||||
printf "%s\n" ' upgrades'
|
||||
printf "%s\n" ' --enable-plugins TCG plugins via shared library loading'
|
||||
printf "%s\n" ' --enable-rng-none dummy RNG, avoid using /dev/(u)random and'
|
||||
printf "%s\n" ' getrandom()'
|
||||
printf "%s\n" ' --enable-safe-stack SafeStack Stack Smash Protection (requires'
|
||||
@ -275,6 +277,8 @@ _meson_option_parse() {
|
||||
--disable-debug-mutex) printf "%s" -Ddebug_mutex=false ;;
|
||||
--enable-debug-stack-usage) printf "%s" -Ddebug_stack_usage=true ;;
|
||||
--disable-debug-stack-usage) printf "%s" -Ddebug_stack_usage=false ;;
|
||||
--enable-debug-tcg) printf "%s" -Ddebug_tcg=true ;;
|
||||
--disable-debug-tcg) printf "%s" -Ddebug_tcg=false ;;
|
||||
--enable-dmg) printf "%s" -Ddmg=enabled ;;
|
||||
--disable-dmg) printf "%s" -Ddmg=disabled ;;
|
||||
--docdir=*) quote_sh "-Ddocdir=$2" ;;
|
||||
@ -395,6 +399,8 @@ _meson_option_parse() {
|
||||
--enable-pipewire) printf "%s" -Dpipewire=enabled ;;
|
||||
--disable-pipewire) printf "%s" -Dpipewire=disabled ;;
|
||||
--with-pkgversion=*) quote_sh "-Dpkgversion=$2" ;;
|
||||
--enable-plugins) printf "%s" -Dplugins=true ;;
|
||||
--disable-plugins) printf "%s" -Dplugins=false ;;
|
||||
--enable-png) printf "%s" -Dpng=enabled ;;
|
||||
--disable-png) printf "%s" -Dpng=disabled ;;
|
||||
--enable-pvrdma) printf "%s" -Dpvrdma=enabled ;;
|
||||
|
@ -1,7 +1,7 @@
|
||||
[mypy]
|
||||
strict = True
|
||||
disallow_untyped_calls = False
|
||||
python_version = 3.7
|
||||
python_version = 3.8
|
||||
|
||||
[mypy-qapi.schema]
|
||||
disallow_untyped_defs = False
|
||||
|
@ -37,3 +37,4 @@ 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_LINUX', if_true: files('async-teardown.c'))
|
||||
|
87
softmmu/vl.c
87
softmmu/vl.c
@ -49,6 +49,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/sockets.h"
|
||||
#include "qemu/accel.h"
|
||||
#include "qemu/async-teardown.h"
|
||||
#include "hw/usb.h"
|
||||
#include "hw/isa/isa.h"
|
||||
#include "hw/scsi/scsi.h"
|
||||
@ -89,7 +90,6 @@
|
||||
#include "qapi/qobject-input-visitor.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "qemu/qemu-options.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#ifdef CONFIG_VIRTFS
|
||||
#include "fsdev/qemu-fsdev.h"
|
||||
@ -747,6 +747,33 @@ static QemuOptsList qemu_smp_opts = {
|
||||
},
|
||||
};
|
||||
|
||||
#if defined(CONFIG_POSIX)
|
||||
static QemuOptsList qemu_run_with_opts = {
|
||||
.name = "run-with",
|
||||
.head = QTAILQ_HEAD_INITIALIZER(qemu_run_with_opts.head),
|
||||
.desc = {
|
||||
#if defined(CONFIG_LINUX)
|
||||
{
|
||||
.name = "async-teardown",
|
||||
.type = QEMU_OPT_BOOL,
|
||||
},
|
||||
#endif
|
||||
{
|
||||
.name = "chroot",
|
||||
.type = QEMU_OPT_STRING,
|
||||
},
|
||||
{ /* end of list */ }
|
||||
},
|
||||
};
|
||||
|
||||
#define qemu_add_run_with_opts() qemu_add_opts(&qemu_run_with_opts)
|
||||
|
||||
#else
|
||||
|
||||
#define qemu_add_run_with_opts()
|
||||
|
||||
#endif /* CONFIG_POSIX */
|
||||
|
||||
static void realtime_init(void)
|
||||
{
|
||||
if (enable_mlock) {
|
||||
@ -865,6 +892,16 @@ static void help(int exitcode)
|
||||
exit(exitcode);
|
||||
}
|
||||
|
||||
enum {
|
||||
|
||||
#define DEF(option, opt_arg, opt_enum, opt_help, arch_mask) \
|
||||
opt_enum,
|
||||
#define DEFHEADING(text)
|
||||
#define ARCHHEADING(text, arch_mask)
|
||||
|
||||
#include "qemu-options.def"
|
||||
};
|
||||
|
||||
#define HAS_ARG 0x0001
|
||||
|
||||
typedef struct QEMUOption {
|
||||
@ -2698,6 +2735,7 @@ void qemu_init(int argc, char **argv)
|
||||
qemu_add_opts(&qemu_semihosting_config_opts);
|
||||
qemu_add_opts(&qemu_fw_cfg_opts);
|
||||
qemu_add_opts(&qemu_action_opts);
|
||||
qemu_add_run_with_opts();
|
||||
module_call_init(MODULE_INIT_OPTS);
|
||||
|
||||
error_init(argv[0]);
|
||||
@ -3516,11 +3554,52 @@ void qemu_init(int argc, char **argv)
|
||||
case QEMU_OPTION_nouserconfig:
|
||||
/* Nothing to be parsed here. Especially, do not error out below. */
|
||||
break;
|
||||
default:
|
||||
if (os_parse_cmd_args(popt->index, optarg)) {
|
||||
error_report("Option not supported in this build");
|
||||
#if defined(CONFIG_POSIX)
|
||||
case QEMU_OPTION_runas:
|
||||
if (!os_set_runas(optarg)) {
|
||||
error_report("User \"%s\" doesn't exist"
|
||||
" (and is not <uid>:<gid>)",
|
||||
optarg);
|
||||
exit(1);
|
||||
}
|
||||
break;
|
||||
case QEMU_OPTION_chroot:
|
||||
warn_report("option is deprecated,"
|
||||
" use '-run-with chroot=...' instead");
|
||||
os_set_chroot(optarg);
|
||||
break;
|
||||
case QEMU_OPTION_daemonize:
|
||||
os_set_daemonize(true);
|
||||
break;
|
||||
#if defined(CONFIG_LINUX)
|
||||
/* deprecated */
|
||||
case QEMU_OPTION_asyncteardown:
|
||||
init_async_teardown();
|
||||
break;
|
||||
#endif
|
||||
case QEMU_OPTION_run_with: {
|
||||
const char *str;
|
||||
opts = qemu_opts_parse_noisily(qemu_find_opts("run-with"),
|
||||
optarg, false);
|
||||
if (!opts) {
|
||||
exit(1);
|
||||
}
|
||||
#if defined(CONFIG_LINUX)
|
||||
if (qemu_opt_get_bool(opts, "async-teardown", false)) {
|
||||
init_async_teardown();
|
||||
}
|
||||
#endif
|
||||
str = qemu_opt_get(opts, "chroot");
|
||||
if (str) {
|
||||
os_set_chroot(str);
|
||||
}
|
||||
break;
|
||||
}
|
||||
#endif /* CONFIG_POSIX */
|
||||
|
||||
default:
|
||||
error_report("Option not supported in this build");
|
||||
exit(1);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -5,7 +5,7 @@ qsd_ss.add(blockdev, chardev, qmp, qom, qemuutil, gnutls)
|
||||
subdir('qapi')
|
||||
|
||||
if have_tools
|
||||
qsd_ss = qsd_ss.apply(config_host, strict: false)
|
||||
qsd_ss = qsd_ss.apply(config_targetos, strict: false)
|
||||
qsd = executable('qemu-storage-daemon',
|
||||
qsd_ss.sources(),
|
||||
dependencies: qsd_ss.dependencies(),
|
||||
|
6
subprojects/libblkio.wrap
Normal file
6
subprojects/libblkio.wrap
Normal file
@ -0,0 +1,6 @@
|
||||
[wrap-git]
|
||||
url = https://gitlab.com/libblkio/libblkio
|
||||
revision = f84cc963a444e4cb34813b2dcfc5bf8526947dc0
|
||||
|
||||
[provide]
|
||||
blkio = libblkio_dep
|
@ -19,9 +19,9 @@
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/xen.h"
|
||||
#include "sysemu/whpx.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qapi/qapi-visit-run-state.h"
|
||||
#include "qapi/qmp/qdict.h"
|
||||
@ -253,7 +253,7 @@ APICCommonClass *apic_get_class(Error **errp)
|
||||
|
||||
/* TODO: in-kernel irqchip for hvf */
|
||||
if (kvm_enabled()) {
|
||||
if (!kvm_apic_in_kernel()) {
|
||||
if (!kvm_irqchip_in_kernel()) {
|
||||
error_setg(errp, "KVM does not support userspace APIC");
|
||||
return NULL;
|
||||
}
|
||||
|
@ -980,7 +980,7 @@ FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
|
||||
.feat_names = {
|
||||
NULL, NULL, NULL, NULL,
|
||||
"avx-vnni-int8", "avx-ne-convert", NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
"amx-complex", NULL, NULL, NULL,
|
||||
NULL, NULL, "prefetchiti", NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
NULL, NULL, NULL, NULL,
|
||||
|
@ -930,6 +930,8 @@ uint64_t x86_cpu_get_supported_feature_word(FeatureWord w,
|
||||
#define CPUID_7_1_EDX_AVX_VNNI_INT8 (1U << 4)
|
||||
/* AVX NE CONVERT Instructions */
|
||||
#define CPUID_7_1_EDX_AVX_NE_CONVERT (1U << 5)
|
||||
/* AMX COMPLEX Instructions */
|
||||
#define CPUID_7_1_EDX_AMX_COMPLEX (1U << 8)
|
||||
/* PREFETCHIT0/1 Instructions */
|
||||
#define CPUID_7_1_EDX_PREFETCHITI (1U << 14)
|
||||
|
||||
|
@ -22,10 +22,10 @@
|
||||
#include "cpu.h"
|
||||
#include "exec/exec-all.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
#include "sysemu/hw_accel.h"
|
||||
#include "monitor/monitor.h"
|
||||
#include "kvm/kvm_i386.h"
|
||||
#endif
|
||||
#include "qemu/log.h"
|
||||
#ifdef CONFIG_TCG
|
||||
|
@ -1,51 +0,0 @@
|
||||
/*
|
||||
* QEMU KVM x86 specific function stubs
|
||||
*
|
||||
* Copyright Linaro Limited 2012
|
||||
*
|
||||
* Author: Peter Maydell <peter.maydell@linaro.org>
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*
|
||||
*/
|
||||
#include "qemu/osdep.h"
|
||||
#include "cpu.h"
|
||||
#include "kvm_i386.h"
|
||||
|
||||
#ifndef __OPTIMIZE__
|
||||
bool kvm_has_smm(void)
|
||||
{
|
||||
return 1;
|
||||
}
|
||||
|
||||
bool kvm_enable_x2apic(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
/* This function is only called inside conditionals which we
|
||||
* rely on the compiler to optimize out when CONFIG_KVM is not
|
||||
* defined.
|
||||
*/
|
||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
|
||||
uint32_t index, int reg)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
#endif
|
||||
|
||||
bool kvm_hv_vpindex_settable(void)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp)
|
||||
{
|
||||
abort();
|
||||
}
|
||||
|
||||
void kvm_set_max_apic_id(uint32_t max_apic_id)
|
||||
{
|
||||
return;
|
||||
}
|
@ -154,9 +154,9 @@ static KVMMSRHandlers msr_handlers[KVM_MSR_FILTER_MAX_RANGES];
|
||||
static RateLimit bus_lock_ratelimit_ctrl;
|
||||
static int kvm_get_one_msr(X86CPU *cpu, int index, uint64_t *value);
|
||||
|
||||
int kvm_has_pit_state2(void)
|
||||
bool kvm_has_pit_state2(void)
|
||||
{
|
||||
return has_pit_state2;
|
||||
return !!has_pit_state2;
|
||||
}
|
||||
|
||||
bool kvm_has_smm(void)
|
||||
|
@ -13,8 +13,6 @@
|
||||
|
||||
#include "sysemu/kvm.h"
|
||||
|
||||
#define kvm_apic_in_kernel() (kvm_irqchip_in_kernel())
|
||||
|
||||
#ifdef CONFIG_KVM
|
||||
|
||||
#define kvm_pit_in_kernel() \
|
||||
@ -33,30 +31,40 @@
|
||||
#endif /* CONFIG_KVM */
|
||||
|
||||
bool kvm_has_smm(void);
|
||||
bool kvm_enable_x2apic(void);
|
||||
bool kvm_hv_vpindex_settable(void);
|
||||
bool kvm_has_pit_state2(void);
|
||||
|
||||
bool kvm_enable_sgx_provisioning(KVMState *s);
|
||||
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp);
|
||||
|
||||
void kvm_arch_reset_vcpu(X86CPU *cs);
|
||||
void kvm_arch_after_reset_vcpu(X86CPU *cpu);
|
||||
void kvm_arch_do_init_vcpu(X86CPU *cs);
|
||||
uint32_t kvm_arch_get_supported_cpuid(KVMState *env, uint32_t function,
|
||||
uint32_t index, int reg);
|
||||
uint64_t kvm_arch_get_supported_msr_feature(KVMState *s, uint32_t index);
|
||||
|
||||
void kvm_set_max_apic_id(uint32_t max_apic_id);
|
||||
void kvm_request_xsave_components(X86CPU *cpu, uint64_t mask);
|
||||
|
||||
#ifdef CONFIG_KVM
|
||||
|
||||
bool kvm_has_adjust_clock(void);
|
||||
bool kvm_has_adjust_clock_stable(void);
|
||||
bool kvm_has_exception_payload(void);
|
||||
void kvm_synchronize_all_tsc(void);
|
||||
void kvm_arch_reset_vcpu(X86CPU *cs);
|
||||
void kvm_arch_after_reset_vcpu(X86CPU *cpu);
|
||||
void kvm_arch_do_init_vcpu(X86CPU *cs);
|
||||
|
||||
void kvm_get_apic_state(DeviceState *d, struct kvm_lapic_state *kapic);
|
||||
void kvm_put_apicbase(X86CPU *cpu, uint64_t value);
|
||||
|
||||
bool kvm_enable_x2apic(void);
|
||||
bool kvm_has_x2apic_api(void);
|
||||
bool kvm_has_waitpkg(void);
|
||||
|
||||
bool kvm_hv_vpindex_settable(void);
|
||||
bool kvm_hyperv_expand_features(X86CPU *cpu, Error **errp);
|
||||
|
||||
uint64_t kvm_swizzle_msi_ext_dest_id(uint64_t address);
|
||||
void kvm_update_msi_routes_all(void *private, bool global,
|
||||
uint32_t index, uint32_t mask);
|
||||
|
||||
bool kvm_enable_sgx_provisioning(KVMState *s);
|
||||
void kvm_request_xsave_components(X86CPU *cpu, uint64_t mask);
|
||||
|
||||
typedef bool QEMURDMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t *val);
|
||||
typedef bool QEMUWRMSRHandler(X86CPU *cpu, uint32_t msr, uint64_t val);
|
||||
typedef struct kvm_msr_handlers {
|
||||
@ -68,6 +76,8 @@ typedef struct kvm_msr_handlers {
|
||||
bool kvm_filter_msr(KVMState *s, uint32_t msr, QEMURDMSRHandler *rdmsr,
|
||||
QEMUWRMSRHandler *wrmsr);
|
||||
|
||||
void kvm_set_max_apic_id(uint32_t max_apic_id);
|
||||
#endif /* CONFIG_KVM */
|
||||
|
||||
void kvm_pc_setup_irq_routing(bool pci_enabled);
|
||||
|
||||
#endif
|
||||
|
@ -1,5 +1,3 @@
|
||||
i386_ss.add(when: 'CONFIG_KVM', if_false: files('kvm-stub.c'))
|
||||
|
||||
i386_softmmu_kvm_ss = ss.source_set()
|
||||
|
||||
i386_softmmu_kvm_ss.add(files(
|
||||
|
@ -337,7 +337,7 @@ static const X86OpEntry opcodes_0F38_00toEF[240] = {
|
||||
[0x07] = X86_OP_ENTRY3(PHSUBSW, V,x, H,x, W,x, vex4 cpuid(SSSE3) mmx avx2_256 p_00_66),
|
||||
|
||||
[0x10] = X86_OP_ENTRY2(PBLENDVB, V,x, W,x, vex4 cpuid(SSE41) avx2_256 p_66),
|
||||
[0x13] = X86_OP_ENTRY2(VCVTPH2PS, V,x, W,ph, vex11 cpuid(F16C) p_66),
|
||||
[0x13] = X86_OP_ENTRY2(VCVTPH2PS, V,x, W,xh, vex11 cpuid(F16C) p_66),
|
||||
[0x14] = X86_OP_ENTRY2(BLENDVPS, V,x, W,x, vex4 cpuid(SSE41) p_66),
|
||||
[0x15] = X86_OP_ENTRY2(BLENDVPD, V,x, W,x, vex4 cpuid(SSE41) p_66),
|
||||
/* Listed incorrectly as type 4 */
|
||||
@ -565,7 +565,7 @@ static const X86OpEntry opcodes_0F3A[256] = {
|
||||
[0x15] = X86_OP_ENTRY3(PEXTRW, E,w, V,dq, I,b, vex5 cpuid(SSE41) zext0 p_66),
|
||||
[0x16] = X86_OP_ENTRY3(PEXTR, E,y, V,dq, I,b, vex5 cpuid(SSE41) p_66),
|
||||
[0x17] = X86_OP_ENTRY3(VEXTRACTPS, E,d, V,dq, I,b, vex5 cpuid(SSE41) p_66),
|
||||
[0x1d] = X86_OP_ENTRY3(VCVTPS2PH, W,ph, V,x, I,b, vex11 cpuid(F16C) p_66),
|
||||
[0x1d] = X86_OP_ENTRY3(VCVTPS2PH, W,xh, V,x, I,b, vex11 cpuid(F16C) p_66),
|
||||
|
||||
[0x20] = X86_OP_ENTRY4(PINSRB, V,dq, H,dq, E,b, vex5 cpuid(SSE41) zext2 p_66),
|
||||
[0x21] = X86_OP_GROUP0(VINSERTPS),
|
||||
@ -805,10 +805,20 @@ static void decode_sse_unary(DisasContext *s, CPUX86State *env, X86OpEntry *entr
|
||||
case 0x51: entry->gen = gen_VSQRT; break;
|
||||
case 0x52: entry->gen = gen_VRSQRT; break;
|
||||
case 0x53: entry->gen = gen_VRCP; break;
|
||||
case 0x5A: entry->gen = gen_VCVTfp2fp; break;
|
||||
}
|
||||
}
|
||||
|
||||
static void decode_0F5A(DisasContext *s, CPUX86State *env, X86OpEntry *entry, uint8_t *b)
|
||||
{
|
||||
static const X86OpEntry opcodes_0F5A[4] = {
|
||||
X86_OP_ENTRY2(VCVTPS2PD, V,x, W,xh, vex2), /* VCVTPS2PD */
|
||||
X86_OP_ENTRY2(VCVTPD2PS, V,x, W,x, vex2), /* VCVTPD2PS */
|
||||
X86_OP_ENTRY3(VCVTSS2SD, V,x, H,x, W,x, vex2_rep3), /* VCVTSS2SD */
|
||||
X86_OP_ENTRY3(VCVTSD2SS, V,x, H,x, W,x, vex2_rep3), /* VCVTSD2SS */
|
||||
};
|
||||
*entry = *decode_by_prefix(s, opcodes_0F5A);
|
||||
}
|
||||
|
||||
static void decode_0F5B(DisasContext *s, CPUX86State *env, X86OpEntry *entry, uint8_t *b)
|
||||
{
|
||||
static const X86OpEntry opcodes_0F5B[4] = {
|
||||
@ -891,7 +901,7 @@ static const X86OpEntry opcodes_0F[256] = {
|
||||
|
||||
[0x58] = X86_OP_ENTRY3(VADD, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
[0x59] = X86_OP_ENTRY3(VMUL, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
[0x5a] = X86_OP_GROUP3(sse_unary, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2), /* CVTPS2PD */
|
||||
[0x5a] = X86_OP_GROUP0(0F5A),
|
||||
[0x5b] = X86_OP_GROUP0(0F5B),
|
||||
[0x5c] = X86_OP_ENTRY3(VSUB, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
[0x5d] = X86_OP_ENTRY3(VMIN, V,x, H,x, W,x, vex2_rep3 p_00_66_f3_f2),
|
||||
@ -1104,7 +1114,7 @@ static bool decode_op_size(DisasContext *s, X86OpEntry *e, X86OpSize size, MemOp
|
||||
*ot = s->vex_l ? MO_256 : MO_128;
|
||||
return true;
|
||||
|
||||
case X86_SIZE_ph: /* SSE/AVX packed half precision */
|
||||
case X86_SIZE_xh: /* SSE/AVX packed half register */
|
||||
*ot = s->vex_l ? MO_128 : MO_64;
|
||||
return true;
|
||||
|
||||
|
@ -92,7 +92,7 @@ typedef enum X86OpSize {
|
||||
/* Custom */
|
||||
X86_SIZE_d64,
|
||||
X86_SIZE_f64,
|
||||
X86_SIZE_ph, /* SSE/AVX packed half precision */
|
||||
X86_SIZE_xh, /* SSE/AVX packed half register */
|
||||
} X86OpSize;
|
||||
|
||||
typedef enum X86CPUIDFeature {
|
||||
|
@ -1914,12 +1914,22 @@ static void gen_VCOMI(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
set_cc_op(s, CC_OP_EFLAGS);
|
||||
}
|
||||
|
||||
static void gen_VCVTfp2fp(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
static void gen_VCVTPD2PS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_unary_fp_sse(s, env, decode,
|
||||
gen_helper_cvtpd2ps_xmm, gen_helper_cvtps2pd_xmm,
|
||||
gen_helper_cvtpd2ps_ymm, gen_helper_cvtps2pd_ymm,
|
||||
gen_helper_cvtsd2ss, gen_helper_cvtss2sd);
|
||||
if (s->vex_l) {
|
||||
gen_helper_cvtpd2ps_ymm(cpu_env, OP_PTR0, OP_PTR2);
|
||||
} else {
|
||||
gen_helper_cvtpd2ps_xmm(cpu_env, OP_PTR0, OP_PTR2);
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_VCVTPS2PD(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
if (s->vex_l) {
|
||||
gen_helper_cvtps2pd_ymm(cpu_env, OP_PTR0, OP_PTR2);
|
||||
} else {
|
||||
gen_helper_cvtps2pd_xmm(cpu_env, OP_PTR0, OP_PTR2);
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_VCVTPS2PH(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
@ -1936,6 +1946,16 @@ static void gen_VCVTPS2PH(DisasContext *s, CPUX86State *env, X86DecodedInsn *dec
|
||||
}
|
||||
}
|
||||
|
||||
static void gen_VCVTSD2SS(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_helper_cvtsd2ss(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2);
|
||||
}
|
||||
|
||||
static void gen_VCVTSS2SD(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
gen_helper_cvtss2sd(cpu_env, OP_PTR0, OP_PTR1, OP_PTR2);
|
||||
}
|
||||
|
||||
static void gen_VCVTSI2Sx(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
|
||||
{
|
||||
int vec_len = vector_len(s, decode);
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "cpu.h"
|
||||
#include "hw/irq.h"
|
||||
|
||||
@ -31,7 +32,9 @@ void x86_register_ferr_irq(qemu_irq irq)
|
||||
void fpu_check_raise_ferr_irq(CPUX86State *env)
|
||||
{
|
||||
if (ferr_irq && !(env->hflags2 & HF2_IGNNE_MASK)) {
|
||||
qemu_mutex_lock_iothread();
|
||||
qemu_irq_raise(ferr_irq);
|
||||
qemu_mutex_unlock_iothread();
|
||||
return;
|
||||
}
|
||||
}
|
||||
@ -45,6 +48,9 @@ void cpu_clear_ignne(void)
|
||||
void cpu_set_ignne(void)
|
||||
{
|
||||
CPUX86State *env = &X86_CPU(first_cpu)->env;
|
||||
|
||||
assert(qemu_mutex_iothread_locked());
|
||||
|
||||
env->hflags2 |= HF2_IGNNE_MASK;
|
||||
/*
|
||||
* We get here in response to a write to port F0h. The chipset should
|
||||
|
@ -4619,7 +4619,11 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||
case 0x0a: /* grp d9/2 */
|
||||
switch (rm) {
|
||||
case 0: /* fnop */
|
||||
/* check exceptions (FreeBSD FPU probe) */
|
||||
/*
|
||||
* check exceptions (FreeBSD FPU probe)
|
||||
* needs to be treated as I/O because of ferr_irq
|
||||
*/
|
||||
translator_io_start(&s->base);
|
||||
gen_helper_fwait(cpu_env);
|
||||
update_fip = false;
|
||||
break;
|
||||
@ -5548,6 +5552,8 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
|
||||
(HF_MP_MASK | HF_TS_MASK)) {
|
||||
gen_exception(s, EXCP07_PREX);
|
||||
} else {
|
||||
/* needs to be treated as I/O because of ferr_irq */
|
||||
translator_io_start(&s->base);
|
||||
gen_helper_fwait(cpu_env);
|
||||
}
|
||||
break;
|
||||
|
@ -22,7 +22,7 @@ if get_option('tcg_interpreter')
|
||||
tcg_ss.add(files('tci.c'))
|
||||
endif
|
||||
|
||||
tcg_ss = tcg_ss.apply(config_host, strict: false)
|
||||
tcg_ss = tcg_ss.apply(config_targetos, strict: false)
|
||||
|
||||
libtcg_user = static_library('tcg_user',
|
||||
tcg_ss.sources() + genh,
|
||||
|
@ -73,7 +73,7 @@ $(TCG_TESTS_TARGETS:%=distclean-tcg-tests-%): distclean-tcg-tests-%:
|
||||
build-tcg: $(BUILD_TCG_TARGET_RULES)
|
||||
|
||||
.PHONY: check-tcg
|
||||
.ninja-goals.check-tcg = all $(if $(CONFIG_PLUGIN),test-plugins)
|
||||
.ninja-goals.check-tcg = all
|
||||
check-tcg: $(RUN_TCG_TARGET_RULES)
|
||||
|
||||
.PHONY: clean-tcg
|
||||
|
@ -68,7 +68,7 @@ test_deps = {
|
||||
'test-qht-par': qht_bench,
|
||||
}
|
||||
|
||||
if have_tools and have_vhost_user and 'CONFIG_LINUX' in config_host
|
||||
if have_tools and have_vhost_user and targetos == 'linux'
|
||||
executable('vhost-user-bridge',
|
||||
sources: files('vhost-user-bridge.c'),
|
||||
dependencies: [qemuutil, vhost_user])
|
||||
@ -80,10 +80,8 @@ if 'CONFIG_TCG' in config_all
|
||||
subdir('fp')
|
||||
endif
|
||||
|
||||
if get_option('tcg').allowed()
|
||||
if 'CONFIG_PLUGIN' in config_host
|
||||
subdir('plugin')
|
||||
endif
|
||||
if get_option('plugins')
|
||||
subdir('plugin')
|
||||
endif
|
||||
|
||||
subdir('unit')
|
||||
|
@ -1,4 +1,4 @@
|
||||
sysprof = dependency('sysprof-capture-4', required: false)
|
||||
sysprof = dependency('sysprof-capture-4', method: 'pkg-config', required: false)
|
||||
glib_static = dependency('glib-2.0', version: glib_req_ver, required: false,
|
||||
method: 'pkg-config', static: true)
|
||||
|
||||
|
@ -38,8 +38,8 @@ qtests_cxl = \
|
||||
# for the availability of the default NICs in the tests
|
||||
qtests_filter = \
|
||||
(get_option('default_devices') and slirp.found() ? ['test-netfilter'] : []) + \
|
||||
(get_option('default_devices') and config_host.has_key('CONFIG_POSIX') ? ['test-filter-mirror'] : []) + \
|
||||
(get_option('default_devices') and config_host.has_key('CONFIG_POSIX') ? ['test-filter-redirector'] : [])
|
||||
(get_option('default_devices') and targetos != 'windows' ? ['test-filter-mirror'] : []) + \
|
||||
(get_option('default_devices') and targetos != 'windows' ? ['test-filter-redirector'] : [])
|
||||
|
||||
qtests_i386 = \
|
||||
(slirp.found() ? ['pxe-test'] : []) + \
|
||||
@ -48,7 +48,7 @@ qtests_i386 = \
|
||||
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_ISA_IPMI_KCS') ? ['ipmi-kcs-test'] : []) + \
|
||||
(config_host.has_key('CONFIG_LINUX') and \
|
||||
(targetos == 'linux' and \
|
||||
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') and
|
||||
config_all_devices.has_key('CONFIG_IPMI_EXTERN') ? ['ipmi-bt-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-test'] : []) + \
|
||||
@ -74,7 +74,7 @@ qtests_i386 = \
|
||||
(config_all_devices.has_key('CONFIG_SB16') ? ['fuzz-sb16-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) + \
|
||||
(config_host.has_key('CONFIG_POSIX') and \
|
||||
(targetos != 'windows' and \
|
||||
config_all_devices.has_key('CONFIG_ACPI_ERST') ? ['erst-test'] : []) + \
|
||||
(config_all_devices.has_key('CONFIG_PCIE_PORT') and \
|
||||
config_all_devices.has_key('CONFIG_VIRTIO_NET') and \
|
||||
@ -275,7 +275,7 @@ if config_all_devices.has_key('CONFIG_VIRTIO_SERIAL')
|
||||
qos_test_ss.add(files('virtio-serial-test.c'))
|
||||
endif
|
||||
|
||||
if config_host.has_key('CONFIG_POSIX')
|
||||
if targetos != 'windows'
|
||||
qos_test_ss.add(files('e1000e-test.c'))
|
||||
endif
|
||||
if have_virtfs
|
||||
@ -308,7 +308,7 @@ qtests = {
|
||||
'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'],
|
||||
'migration-test': migration_files,
|
||||
'pxe-test': files('boot-sector.c'),
|
||||
'qos-test': [chardev, io, qos_test_ss.apply(config_host, strict: false).sources()],
|
||||
'qos-test': [chardev, io, qos_test_ss.apply(config_targetos, strict: false).sources()],
|
||||
'tpm-crb-swtpm-test': [io, tpmemu_files],
|
||||
'tpm-crb-test': [io, tpmemu_files],
|
||||
'tpm-tis-swtpm-test': [io, tpmemu_files, 'tpm-tis-util.c'],
|
||||
@ -321,7 +321,7 @@ qtests = {
|
||||
}
|
||||
|
||||
if vnc.found()
|
||||
gvnc = dependency('gvnc-1.0', required: false)
|
||||
gvnc = dependency('gvnc-1.0', method: 'pkg-config', required: false)
|
||||
if gvnc.found()
|
||||
qtests += {'vnc-display-test': [gvnc]}
|
||||
qtests_generic += [ 'vnc-display-test' ]
|
||||
|
@ -28,7 +28,7 @@ TESTS += test_context_save_areas.c.tst
|
||||
QEMU_OPTS += -M tricore_testboard -cpu tc27x -nographic -kernel
|
||||
|
||||
%.pS: $(ASM_TESTS_PATH)/%.S
|
||||
$(HOST_CC) -E -o $@ $<
|
||||
$(CC) -E -o $@ $<
|
||||
|
||||
%.o: %.pS
|
||||
$(AS) $(ASFLAGS) -o $@ $<
|
||||
|
@ -98,7 +98,7 @@ if have_block
|
||||
}
|
||||
if gnutls.found() and \
|
||||
tasn1.found() and \
|
||||
'CONFIG_POSIX' in config_host
|
||||
targetos != 'windows'
|
||||
tests += {
|
||||
'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',
|
||||
tasn1, crypto, gnutls],
|
||||
@ -113,7 +113,7 @@ if have_block
|
||||
if xts == 'private'
|
||||
tests += {'test-crypto-xts': [crypto, io]}
|
||||
endif
|
||||
if 'CONFIG_POSIX' in config_host
|
||||
if targetos != 'windows'
|
||||
tests += {
|
||||
'test-image-locking': [testblock],
|
||||
'test-nested-aio-poll': [testblock],
|
||||
@ -148,7 +148,7 @@ if have_system
|
||||
# are not runnable under TSan due to a known issue.
|
||||
# https://github.com/google/sanitizers/issues/1116
|
||||
if not get_option('tsan')
|
||||
if 'CONFIG_POSIX' in config_host
|
||||
if targetos != 'windows'
|
||||
tests += {
|
||||
'test-char': ['socket-helpers.c', qom, io, chardev]
|
||||
}
|
||||
|
@ -3,7 +3,6 @@ util_ss.add(files('thread-context.c'), numa)
|
||||
if not config_host_data.get('CONFIG_ATOMIC64')
|
||||
util_ss.add(files('atomic64.c'))
|
||||
endif
|
||||
util_ss.add(when: 'CONFIG_LINUX', if_true: files('async-teardown.c'))
|
||||
util_ss.add(when: 'CONFIG_POSIX', if_true: files('aio-posix.c'))
|
||||
util_ss.add(when: 'CONFIG_POSIX', if_true: files('fdmon-poll.c'))
|
||||
if config_host_data.get('CONFIG_EPOLL_CREATE1')
|
||||
|
Loading…
Reference in New Issue
Block a user