* configure: use a native non-cross compiler for linux-user

* meson: cleanups
 * target/i386: miscellaneous cleanups and optimizations
 * target/i386: implement CMPccXADD
 * target/i386: the sgx_epc_get_section stub is reachable
 * esp: check for NULL result from scsi_device_find()
 -----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmWRImYUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroNd7AgAgcyJGiMfUkXqhefplpm06RDXQIa8
 FuoJqPb21lO75DQKfaFRAc4xGLagjJROMJGHMm9HvMu2VlwvOydkQlfFRspENxQ/
 5XzGdb/X0A7HA/mwUfnMB1AZx0Vs32VI5IBSc6acc9fmgeZ84XQEoM3KBQHUik7X
 mSkE4eltR9gJ+4IaGo4voZtK+YoVD8nEcuqmnKihSPWizev0FsZ49aNMtaYa9qC/
 Xs3kiQd/zPibHDHJu0ulFsNZgxtUcvlLHTCf8gO4dHWxCFLXGubMush83McpRtNB
 Qoh6cTLH+PBXfrxMR3zmTZMNvo8Euls3s07Y8TkNP4vdIIE/kMeMDW1wJw==
 =mq30
 -----END PGP SIGNATURE-----

Merge tag 'for-upstream' of https://gitlab.com/bonzini/qemu into staging

* configure: use a native non-cross compiler for linux-user
* meson: cleanups
* target/i386: miscellaneous cleanups and optimizations
* target/i386: implement CMPccXADD
* target/i386: the sgx_epc_get_section stub is reachable
* esp: check for NULL result from scsi_device_find()

# -----BEGIN PGP SIGNATURE-----
#
# iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmWRImYUHHBib256aW5p
# QHJlZGhhdC5jb20ACgkQv/vSX3jHroNd7AgAgcyJGiMfUkXqhefplpm06RDXQIa8
# FuoJqPb21lO75DQKfaFRAc4xGLagjJROMJGHMm9HvMu2VlwvOydkQlfFRspENxQ/
# 5XzGdb/X0A7HA/mwUfnMB1AZx0Vs32VI5IBSc6acc9fmgeZ84XQEoM3KBQHUik7X
# mSkE4eltR9gJ+4IaGo4voZtK+YoVD8nEcuqmnKihSPWizev0FsZ49aNMtaYa9qC/
# Xs3kiQd/zPibHDHJu0ulFsNZgxtUcvlLHTCf8gO4dHWxCFLXGubMush83McpRtNB
# Qoh6cTLH+PBXfrxMR3zmTZMNvo8Euls3s07Y8TkNP4vdIIE/kMeMDW1wJw==
# =mq30
# -----END PGP SIGNATURE-----
# gpg: Signature made Sun 31 Dec 2023 08:12:22 GMT
# 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: (46 commits)
  meson.build: report graphics backends separately
  configure, meson: rename targetos to host_os
  meson: rename config_all
  meson: remove CONFIG_ALL
  meson: remove config_targetos
  meson: remove CONFIG_POSIX and CONFIG_WIN32 from config_targetos
  meson: remove OS definitions from config_targetos
  meson: always probe u2f and canokey if the option is enabled
  meson: move subdirs to "Collect sources" section
  meson: move config-host.h definitions together
  meson: move CFI detection code with other compiler flags
  meson: keep subprojects together
  meson: move accelerator dependency checks together
  meson: move option validation together
  meson: move program checks together
  meson: add more sections to main meson.build
  configure: unify again the case arms in probe_target_compiler
  configure: remove unnecessary subshell
  Makefile: clean qemu-iotests output
  meson: use version_compare() to compare version
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2024-01-04 19:55:19 +00:00
commit 05470c3979
69 changed files with 1188 additions and 950 deletions

View File

@ -202,6 +202,7 @@ clean: recurse-clean
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \ ! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
-exec rm {} + -exec rm {} +
rm -f TAGS cscope.* *~ */*~ rm -f TAGS cscope.* *~ */*~
@$(MAKE) -Ctests/qemu-iotests clean
VERSION = $(shell cat $(SRC_PATH)/VERSION) VERSION = $(shell cat $(SRC_PATH)/VERSION)

View File

@ -17,7 +17,9 @@ if get_option('plugins')
tcg_ss.add(files('plugin-gen.c')) tcg_ss.add(files('plugin-gen.c'))
endif endif
tcg_ss.add(when: libdw, if_true: files('debuginfo.c')) tcg_ss.add(when: libdw, if_true: files('debuginfo.c'))
tcg_ss.add(when: 'CONFIG_LINUX', if_true: files('perf.c')) if host_os == 'linux'
tcg_ss.add(files('perf.c'))
endif
specific_ss.add_all(when: 'CONFIG_TCG', if_true: tcg_ss) specific_ss.add_all(when: 'CONFIG_TCG', if_true: tcg_ss)
specific_ss.add(when: ['CONFIG_SYSTEM_ONLY', 'CONFIG_TCG'], if_true: files( specific_ss.add(when: ['CONFIG_SYSTEM_ONLY', 'CONFIG_TCG'], if_true: files(

View File

@ -10,9 +10,13 @@ system_ss.add([files(
'confidential-guest-support.c', 'confidential-guest-support.c',
), numa]) ), numa])
system_ss.add(when: 'CONFIG_POSIX', if_true: files('rng-random.c')) if host_os != 'windows'
system_ss.add(when: 'CONFIG_POSIX', if_true: files('hostmem-file.c')) system_ss.add(files('rng-random.c'))
system_ss.add(when: 'CONFIG_LINUX', if_true: files('hostmem-memfd.c')) system_ss.add(files('hostmem-file.c'))
endif
if host_os == 'linux'
system_ss.add(files('hostmem-memfd.c'))
endif
if keyutils.found() if keyutils.found()
system_ss.add(keyutils, files('cryptodev-lkcf.c')) system_ss.add(keyutils, files('cryptodev-lkcf.c'))
endif endif

View File

@ -88,10 +88,15 @@ if get_option('parallels').allowed()
block_ss.add(files('parallels.c', 'parallels-ext.c')) block_ss.add(files('parallels.c', 'parallels-ext.c'))
endif endif
block_ss.add(when: 'CONFIG_WIN32', if_true: files('file-win32.c', 'win32-aio.c')) if host_os == 'windows'
block_ss.add(when: 'CONFIG_POSIX', if_true: [files('file-posix.c'), coref, iokit]) block_ss.add(files('file-win32.c', 'win32-aio.c'))
else
block_ss.add(files('file-posix.c'), coref, iokit)
endif
block_ss.add(when: libiscsi, if_true: files('iscsi-opts.c')) block_ss.add(when: libiscsi, if_true: files('iscsi-opts.c'))
block_ss.add(when: 'CONFIG_LINUX', if_true: files('nvme.c')) if host_os == 'linux'
block_ss.add(files('nvme.c'))
endif
if get_option('replication').allowed() if get_option('replication').allowed()
block_ss.add(files('replication.c')) block_ss.add(files('replication.c'))
endif endif

View File

@ -24,6 +24,6 @@ kvm = cc.find_library('kvm', required: true)
bsd_user_ss.add(elf, procstat, kvm) bsd_user_ss.add(elf, procstat, kvm)
# Pull in the OS-specific build glue, if any # Pull in the OS-specific build glue, if any
subdir(targetos) subdir(host_os)
specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss) specific_ss.add_all(when: 'CONFIG_BSD_USER', if_true: bsd_user_ss)

View File

@ -12,21 +12,23 @@ chardev_ss.add(files(
'char-udp.c', 'char-udp.c',
'char.c', 'char.c',
)) ))
chardev_ss.add(when: 'CONFIG_POSIX', if_true: [files( if host_os == 'windows'
'char-fd.c', chardev_ss.add(files(
'char-pty.c',
), util])
if targetos in ['linux', 'gnu/kfreebsd', 'freebsd', 'dragonfly']
chardev_ss.add(files('char-parallel.c'))
endif
chardev_ss.add(when: 'CONFIG_WIN32', if_true: files(
'char-console.c', 'char-console.c',
'char-win-stdio.c', 'char-win-stdio.c',
'char-win.c', 'char-win.c',
)) ))
else
chardev_ss.add(files(
'char-fd.c',
'char-pty.c',
), util)
if host_os in ['linux', 'gnu/kfreebsd', 'freebsd', 'dragonfly']
chardev_ss.add(files('char-parallel.c'))
endif
endif
chardev_ss = chardev_ss.apply(config_targetos, strict: false) chardev_ss = chardev_ss.apply({})
system_ss.add(files( system_ss.add(files(
'char-hmp-cmds.c', 'char-hmp-cmds.c',

159
configure vendored
View File

@ -334,30 +334,30 @@ EOF
} }
if check_define __linux__ ; then if check_define __linux__ ; then
targetos=linux host_os=linux
elif check_define _WIN32 ; then elif check_define _WIN32 ; then
targetos=windows host_os=windows
elif check_define __OpenBSD__ ; then elif check_define __OpenBSD__ ; then
targetos=openbsd host_os=openbsd
elif check_define __sun__ ; then elif check_define __sun__ ; then
targetos=sunos host_os=sunos
elif check_define __HAIKU__ ; then elif check_define __HAIKU__ ; then
targetos=haiku host_os=haiku
elif check_define __FreeBSD__ ; then elif check_define __FreeBSD__ ; then
targetos=freebsd host_os=freebsd
elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then elif check_define __FreeBSD_kernel__ && check_define __GLIBC__; then
targetos=gnu/kfreebsd host_os=gnu/kfreebsd
elif check_define __DragonFly__ ; then elif check_define __DragonFly__ ; then
targetos=dragonfly host_os=dragonfly
elif check_define __NetBSD__; then elif check_define __NetBSD__; then
targetos=netbsd host_os=netbsd
elif check_define __APPLE__; then elif check_define __APPLE__; then
targetos=darwin host_os=darwin
else else
# This is a fatal error, but don't report it yet, because we # This is a fatal error, but don't report it yet, because we
# might be going to just print the --help text, or it might # might be going to just print the --help text, or it might
# be the result of a missing compiler. # be the result of a missing compiler.
targetos=bogus host_os=bogus
fi fi
if test ! -z "$cpu" ; then if test ! -z "$cpu" ; then
@ -573,13 +573,13 @@ do
fi fi
done done
if test "$targetos" = "windows" ; then if test "$host_os" = "windows" ; then
EXESUF=".exe" EXESUF=".exe"
fi fi
meson_option_build_array() { meson_option_build_array() {
printf '[' printf '['
(if test "$targetos" = windows; then (if test "$host_os" = windows; then
IFS=\; IFS=\;
else else
IFS=: IFS=:
@ -802,7 +802,7 @@ mak_wilds=""
if [ -n "$host_arch" ] && [ -d "$source_path/common-user/host/$host_arch" ]; then if [ -n "$host_arch" ] && [ -d "$source_path/common-user/host/$host_arch" ]; then
if [ "$linux_user" != no ]; then if [ "$linux_user" != no ]; then
if [ "$targetos" = linux ]; then if [ "$host_os" = linux ]; then
linux_user=yes linux_user=yes
elif [ "$linux_user" = yes ]; then elif [ "$linux_user" = yes ]; then
error_exit "linux-user not supported on this architecture" error_exit "linux-user not supported on this architecture"
@ -813,9 +813,9 @@ if [ -n "$host_arch" ] && [ -d "$source_path/common-user/host/$host_arch" ]; the
fi fi
if [ "$bsd_user" != no ]; then if [ "$bsd_user" != no ]; then
if [ "$bsd_user" = "" ]; then if [ "$bsd_user" = "" ]; then
test $targetos = freebsd && bsd_user=yes test $host_os = freebsd && bsd_user=yes
fi fi
if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$targetos" ]; then if [ "$bsd_user" = yes ] && ! [ -d "$source_path/bsd-user/$host_os" ]; then
error_exit "bsd-user not supported on this host OS" error_exit "bsd-user not supported on this host OS"
fi fi
if [ "$bsd_user" = "yes" ]; then if [ "$bsd_user" = "yes" ]; then
@ -998,7 +998,7 @@ if test -z "$ninja"; then
fi fi
fi fi
if test "$targetos" = "bogus"; then if test "$host_os" = "bogus"; then
# Now that we know that we're not printing the help and that # Now that we know that we're not printing the help and that
# the compiler works (so the results of the check_defines we used # the compiler works (so the results of the check_defines we used
# to identify the OS are reliable), if we didn't recognize the # to identify the OS are reliable), if we didn't recognize the
@ -1007,7 +1007,7 @@ if test "$targetos" = "bogus"; then
fi fi
# test for any invalid configuration combinations # test for any invalid configuration combinations
if test "$targetos" = "windows" && ! has "$dlltool"; then if test "$host_os" = "windows" && ! has "$dlltool"; then
if test "$plugins" = "yes"; then if test "$plugins" = "yes"; then
error_exit "TCG plugins requires dlltool to build on Windows platforms" error_exit "TCG plugins requires dlltool to build on Windows platforms"
fi fi
@ -1041,7 +1041,7 @@ static THREAD int tls_var;
int main(void) { return tls_var; } int main(void) { return tls_var; }
EOF EOF
if test "$targetos" = windows || test "$targetos" = haiku; then if test "$host_os" = windows || test "$host_os" = haiku; then
if test "$pie" = "yes"; then if test "$pie" = "yes"; then
error_exit "PIE not available due to missing OS support" error_exit "PIE not available due to missing OS support"
fi fi
@ -1231,6 +1231,7 @@ probe_target_compiler() {
got_cross_cc=no got_cross_cc=no
container_image= container_image=
container_hosts= container_hosts=
container_cross_prefix=
container_cross_cc= container_cross_cc=
container_cross_ar= container_cross_ar=
container_cross_as= container_cross_as=
@ -1272,16 +1273,33 @@ probe_target_compiler() {
test "$container" != no || continue test "$container" != no || continue
test "$host" = "$cpu" || continue test "$host" = "$cpu" || continue
case $target_arch in case $target_arch in
# debian-all-test-cross architectures
hppa|m68k|mips|riscv64|sparc64)
container_image=debian-all-test-cross
;;
mips64)
container_image=debian-all-test-cross
container_cross_prefix=mips64-linux-gnuabi64-
;;
ppc|ppc64|ppc64le)
container_image=debian-all-test-cross
container_cross_prefix=powerpc${target_arch#ppc}-linux-gnu-
;;
# debian-legacy-test-cross architectures (need Debian 11)
# - libc6.1-dev-alpha-cross: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1054412
# - sh4-linux-user: binaries don't run with bookworm compiler
alpha|sh4)
container_image=debian-legacy-test-cross
;;
# architectures with individual containers
aarch64) aarch64)
# We don't have any bigendian build tools so we only use this for AArch64 # We don't have any bigendian build tools so we only use this for AArch64
container_image=debian-arm64-cross container_image=debian-arm64-cross
container_cross_prefix=aarch64-linux-gnu-
container_cross_cc=${container_cross_prefix}gcc
;;
alpha)
container_image=debian-legacy-test-cross
container_cross_prefix=alpha-linux-gnu-
container_cross_cc=${container_cross_prefix}gcc
;; ;;
arm) arm)
# We don't have any bigendian build tools so we only use this for ARM # We don't have any bigendian build tools so we only use this for ARM
@ -1290,18 +1308,11 @@ probe_target_compiler() {
;; ;;
cris) cris)
container_image=fedora-cris-cross container_image=fedora-cris-cross
container_cross_prefix=cris-linux-gnu-
;; ;;
hexagon) hexagon)
container_image=debian-hexagon-cross
container_cross_prefix=hexagon-unknown-linux-musl- container_cross_prefix=hexagon-unknown-linux-musl-
container_cross_cc=${container_cross_prefix}clang container_cross_cc=${container_cross_prefix}clang
;; ;;
hppa)
container_image=debian-all-test-cross
container_cross_prefix=hppa-linux-gnu-
container_cross_cc=${container_cross_prefix}gcc
;;
i386) i386)
container_image=debian-i686-cross container_image=debian-i686-cross
container_cross_prefix=i686-linux-gnu- container_cross_prefix=i686-linux-gnu-
@ -1310,59 +1321,19 @@ probe_target_compiler() {
container_image=debian-loongarch-cross container_image=debian-loongarch-cross
container_cross_prefix=loongarch64-unknown-linux-gnu- container_cross_prefix=loongarch64-unknown-linux-gnu-
;; ;;
m68k)
container_image=debian-all-test-cross
container_cross_prefix=m68k-linux-gnu-
container_cross_cc=${container_cross_prefix}gcc
;;
microblaze) microblaze)
container_image=debian-microblaze-cross
container_cross_prefix=microblaze-linux-musl- container_cross_prefix=microblaze-linux-musl-
;; ;;
mips64el) mips64el)
container_image=debian-mips64el-cross container_image=debian-mips64el-cross
container_cross_prefix=mips64el-linux-gnuabi64- container_cross_prefix=mips64el-linux-gnuabi64-
;; ;;
mips64)
container_image=debian-all-test-cross
container_cross_prefix=mips64-linux-gnuabi64-
;;
mips)
container_image=debian-all-test-cross
container_cross_prefix=mips-linux-gnu-
;;
nios2)
container_image=debian-nios2-cross
container_cross_prefix=nios2-linux-gnu-
;;
ppc)
container_image=debian-all-test-cross
container_cross_prefix=powerpc-linux-gnu-
container_cross_cc=${container_cross_prefix}gcc
;;
ppc64|ppc64le)
container_image=debian-all-test-cross
container_cross_prefix=powerpc${target_arch#ppc}-linux-gnu-
;;
riscv64)
container_image=debian-all-test-cross
container_cross_prefix=riscv64-linux-gnu-
;;
sh4)
container_image=debian-legacy-test-cross
container_cross_prefix=sh4-linux-gnu-
;;
sparc64)
container_image=debian-all-test-cross
container_cross_prefix=sparc64-linux-gnu-
;;
tricore) tricore)
container_image=debian-tricore-cross container_image=debian-tricore-cross
container_cross_prefix=tricore- container_cross_prefix=tricore-
;; ;;
x86_64) x86_64)
container_image=debian-amd64-cross container_image=debian-amd64-cross
container_cross_prefix=x86_64-linux-gnu-
;; ;;
xtensa*) xtensa*)
container_image=debian-xtensa-cross container_image=debian-xtensa-cross
@ -1370,12 +1341,10 @@ probe_target_compiler() {
# default to the dc232b cpu # default to the dc232b cpu
container_cross_prefix=/opt/2020.07/xtensa-dc232b-elf/bin/xtensa-dc232b-elf- container_cross_prefix=/opt/2020.07/xtensa-dc232b-elf/bin/xtensa-dc232b-elf-
;; ;;
*)
# Debian and GNU architecture names usually match
container_image=debian-$target_arch-cross
container_cross_prefix=$target_arch-linux-gnu-
;;
esac esac
# Debian and GNU architecture names usually match
: ${container_image:=debian-$target_arch-cross}
: ${container_cross_prefix:=$target_arch-linux-gnu-}
: ${container_cross_cc:=${container_cross_prefix}gcc} : ${container_cross_cc:=${container_cross_prefix}gcc}
: ${container_cross_ar:=${container_cross_prefix}ar} : ${container_cross_ar:=${container_cross_prefix}ar}
: ${container_cross_as:=${container_cross_prefix}as} : ${container_cross_as:=${container_cross_prefix}as}
@ -1387,8 +1356,8 @@ probe_target_compiler() {
done done
try=cross try=cross
# For softmmu/roms we might be able to use the host compiler # For softmmu/roms also look for a bi-endian or multilib-enabled host compiler
if [ "${1%softmmu}" != "$1" ]; then if [ "${1%softmmu}" != "$1" ] || test "$target_arch" = "$cpu"; then
case "$target_arch:$cpu" in case "$target_arch:$cpu" in
aarch64_be:aarch64 | \ aarch64_be:aarch64 | \
armeb:arm | \ armeb:arm | \
@ -1559,7 +1528,7 @@ LINKS="$LINKS pc-bios/s390-ccw/Makefile"
LINKS="$LINKS pc-bios/vof/Makefile" LINKS="$LINKS pc-bios/vof/Makefile"
LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit LINKS="$LINKS .gdbinit scripts" # scripts needed by relative path in .gdbinit
LINKS="$LINKS tests/avocado tests/data" LINKS="$LINKS tests/avocado tests/data"
LINKS="$LINKS tests/qemu-iotests/check" LINKS="$LINKS tests/qemu-iotests/check tests/qemu-iotests/Makefile"
LINKS="$LINKS python" LINKS="$LINKS python"
LINKS="$LINKS contrib/plugins/Makefile " LINKS="$LINKS contrib/plugins/Makefile "
for f in $LINKS ; do for f in $LINKS ; do
@ -1572,8 +1541,8 @@ echo "# Automatically generated by configure - do not modify" > Makefile.prereqs
# Mac OS X ships with a broken assembler # Mac OS X ships with a broken assembler
if have_target i386-softmmu x86_64-softmmu && \ if have_target i386-softmmu x86_64-softmmu && \
test "$targetos" != "darwin" && test "$targetos" != "sunos" && \ test "$host_os" != "darwin" && test "$host_os" != "sunos" && \
test "$targetos" != "haiku" && \ test "$host_os" != "haiku" && \
probe_target_compiler i386-softmmu; then probe_target_compiler i386-softmmu; then
subdirs="$subdirs pc-bios/optionrom" subdirs="$subdirs pc-bios/optionrom"
config_mak=pc-bios/optionrom/config.mak config_mak=pc-bios/optionrom/config.mak
@ -1637,7 +1606,7 @@ echo "NINJA=$ninja" >> $config_host_mak
echo "EXESUF=$EXESUF" >> $config_host_mak echo "EXESUF=$EXESUF" >> $config_host_mak
# use included Linux headers for KVM architectures # use included Linux headers for KVM architectures
if test "$targetos" = "linux" && test -n "$linux_arch"; then if test "$host_os" = "linux" && test -n "$linux_arch"; then
symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm symlink "$source_path/linux-headers/asm-$linux_arch" linux-headers/asm
fi fi
@ -1660,21 +1629,20 @@ echo "SRC_PATH=$source_path/contrib/plugins" >> contrib/plugins/$config_host_mak
echo "PKG_CONFIG=${pkg_config}" >> 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 "CC=$cc $CPU_CFLAGS" >> contrib/plugins/$config_host_mak
echo "CFLAGS=${CFLAGS-$default_cflags} $EXTRA_CFLAGS" >> contrib/plugins/$config_host_mak echo "CFLAGS=${CFLAGS-$default_cflags} $EXTRA_CFLAGS" >> contrib/plugins/$config_host_mak
if test "$targetos" = windows; then if test "$host_os" = windows; then
echo "DLLTOOL=$dlltool" >> contrib/plugins/$config_host_mak echo "DLLTOOL=$dlltool" >> contrib/plugins/$config_host_mak
fi fi
if test "$targetos" = darwin; then if test "$host_os" = darwin; then
echo "CONFIG_DARWIN=y" >> contrib/plugins/$config_host_mak echo "CONFIG_DARWIN=y" >> contrib/plugins/$config_host_mak
fi fi
if test "$targetos" = windows; then if test "$host_os" = windows; then
echo "CONFIG_WIN32=y" >> contrib/plugins/$config_host_mak echo "CONFIG_WIN32=y" >> contrib/plugins/$config_host_mak
fi fi
# tests/tcg configuration # tests/tcg configuration
(config_host_mak=tests/tcg/config-host.mak
mkdir -p tests/tcg mkdir -p tests/tcg
echo "# Automatically generated by configure - do not modify" > $config_host_mak echo "# Automatically generated by configure - do not modify" > tests/tcg/$config_host_mak
echo "SRC_PATH=$source_path" >> $config_host_mak echo "SRC_PATH=$source_path" >> tests/tcg/$config_host_mak
tcg_tests_targets= tcg_tests_targets=
for target in $target_list; do for target in $target_list; do
@ -1717,9 +1685,8 @@ for target in $target_list; do
done done
if test "$tcg" = "enabled"; then if test "$tcg" = "enabled"; then
echo "TCG_TESTS_TARGETS=$tcg_tests_targets" >> config-host.mak echo "TCG_TESTS_TARGETS=$tcg_tests_targets" >> $config_host_mak
fi fi
)
if test "$skip_meson" = no; then if test "$skip_meson" = no; then
cross="config-meson.cross.new" cross="config-meson.cross.new"
@ -1748,7 +1715,7 @@ if test "$skip_meson" = no; then
echo "# environment defaults, can still be overridden on " >> $cross echo "# environment defaults, can still be overridden on " >> $cross
echo "# the command line" >> $cross echo "# the command line" >> $cross
if test -e "$source_path/.git" && \ if test -e "$source_path/.git" && \
{ test "$targetos" = linux || test "$targetos" = "windows"; }; then { test "$host_os" = linux || test "$host_os" = "windows"; }; then
echo 'werror = true' >> $cross echo 'werror = true' >> $cross
fi fi
echo "[project options]" >> $cross echo "[project options]" >> $cross
@ -1785,7 +1752,7 @@ if test "$skip_meson" = no; then
echo "windmc = [$(meson_quote $windmc)]" >> $cross echo "windmc = [$(meson_quote $windmc)]" >> $cross
if test "$cross_compile" = "yes"; then if test "$cross_compile" = "yes"; then
echo "[host_machine]" >> $cross echo "[host_machine]" >> $cross
echo "system = '$targetos'" >> $cross echo "system = '$host_os'" >> $cross
case "$cpu" in case "$cpu" in
i386) i386)
echo "cpu_family = 'x86'" >> $cross echo "cpu_family = 'x86'" >> $cross
@ -1811,8 +1778,8 @@ if test "$skip_meson" = no; then
fi fi
mv $cross config-meson.cross mv $cross config-meson.cross
meson_add_machine_file config-meson.cross meson_add_machine_file config-meson.cross
if test -f "$source_path/configs/meson/$targetos.txt"; then if test -f "$source_path/configs/meson/$host_os.txt"; then
meson_add_machine_file $source_path/configs/meson/$targetos.txt meson_add_machine_file $source_path/configs/meson/$host_os.txt
fi fi
rm -rf meson-private meson-info meson-logs rm -rf meson-private meson-info meson-logs

View File

@ -1,4 +1,4 @@
executable('ivshmem-client', files('ivshmem-client.c', 'main.c'), genh, executable('ivshmem-client', files('ivshmem-client.c', 'main.c'), genh,
dependencies: glib, dependencies: glib,
build_by_default: targetos == 'linux', build_by_default: host_os == 'linux',
install: false) install: false)

View File

@ -1,4 +1,4 @@
executable('ivshmem-server', files('ivshmem-server.c', 'main.c'), genh, executable('ivshmem-server', files('ivshmem-server.c', 'main.c'), genh,
dependencies: [qemuutil, rt], dependencies: [qemuutil, rt],
build_by_default: targetos == 'linux', build_by_default: host_os == 'linux',
install: false) install: false)

View File

@ -1,4 +1,4 @@
executable('vhost-user-blk', files('vhost-user-blk.c'), executable('vhost-user-blk', files('vhost-user-blk.c'),
dependencies: [qemuutil, vhost_user], dependencies: [qemuutil, vhost_user],
build_by_default: targetos == 'linux', build_by_default: host_os == 'linux',
install: false) install: false)

View File

@ -1,4 +1,4 @@
executable('vhost-user-input', files('main.c'), executable('vhost-user-input', files('main.c'),
dependencies: [qemuutil, vhost_user], dependencies: [qemuutil, vhost_user],
build_by_default: targetos == 'linux', build_by_default: host_os == 'linux',
install: false) install: false)

View File

@ -1,6 +1,6 @@
if libiscsi.found() if libiscsi.found()
executable('vhost-user-scsi', files('vhost-user-scsi.c'), executable('vhost-user-scsi', files('vhost-user-scsi.c'),
dependencies: [qemuutil, libiscsi, vhost_user], dependencies: [qemuutil, libiscsi, vhost_user],
build_by_default: targetos == 'linux', build_by_default: host_os == 'linux',
install: false) install: false)
endif endif

View File

@ -256,21 +256,6 @@ Target-independent emulator sourcesets:
``system_ss`` only in system emulators, ``user_ss`` only in user-mode ``system_ss`` only in system emulators, ``user_ss`` only in user-mode
emulators. emulators.
Target-independent sourcesets must exercise particular care when using
``if_false`` rules. The ``if_false`` rule will be used correctly when linking
emulator binaries; however, when *compiling* target-independent files
into .o files, Meson may need to pick *both* the ``if_true`` and
``if_false`` sides to cater for targets that want either side. To
achieve that, you can add a special rule using the ``CONFIG_ALL``
symbol::
# Some targets have CONFIG_ACPI, some don't, so this is not enough
system_ss.add(when: 'CONFIG_ACPI', if_true: files('acpi.c'),
if_false: files('acpi-stub.c'))
# This is required as well:
system_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c'))
Target-dependent emulator sourcesets: Target-dependent emulator sourcesets:
In the target-dependent set lives CPU emulation, some device emulation and In the target-dependent set lives CPU emulation, some device emulation and
much glue code. This sometimes also has to be compiled multiple times, much glue code. This sometimes also has to be compiled multiple times,

View File

@ -316,6 +316,6 @@ variable::
host_kconfig = \ host_kconfig = \
(have_tpm ? ['CONFIG_TPM=y'] : []) + \ (have_tpm ? ['CONFIG_TPM=y'] : []) + \
(targetos == 'linux' ? ['CONFIG_LINUX=y'] : []) + \ (host_os == 'linux' ? ['CONFIG_LINUX=y'] : []) + \
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \ (have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
... ...

View File

@ -1,13 +1,13 @@
fsdev_ss = ss.source_set() fsdev_ss = ss.source_set()
fsdev_ss.add(files('qemu-fsdev-opts.c', 'qemu-fsdev-throttle.c')) fsdev_ss.add(files('qemu-fsdev-opts.c', 'qemu-fsdev-throttle.c'))
fsdev_ss.add(when: 'CONFIG_ALL', if_true: files('qemu-fsdev-dummy.c'))
fsdev_ss.add(when: ['CONFIG_FSDEV_9P'], if_true: files( fsdev_ss.add(when: ['CONFIG_FSDEV_9P'], if_true: files(
'9p-iov-marshal.c', '9p-iov-marshal.c',
'9p-marshal.c', '9p-marshal.c',
'qemu-fsdev.c', 'qemu-fsdev.c',
), if_false: files('qemu-fsdev-dummy.c')) ), if_false: files('qemu-fsdev-dummy.c'))
system_ss.add_all(when: 'CONFIG_LINUX', if_true: fsdev_ss) if host_os in ['linux', 'darwin']
system_ss.add_all(when: 'CONFIG_DARWIN', if_true: fsdev_ss) system_ss.add_all(fsdev_ss)
endif
if have_virtfs_proxy_helper if have_virtfs_proxy_helper
executable('virtfs-proxy-helper', executable('virtfs-proxy-helper',

View File

@ -14,8 +14,8 @@ gdb_system_ss = ss.source_set()
gdb_user_ss.add(files('gdbstub.c', 'user.c')) gdb_user_ss.add(files('gdbstub.c', 'user.c'))
gdb_system_ss.add(files('gdbstub.c', 'system.c')) gdb_system_ss.add(files('gdbstub.c', 'system.c'))
gdb_user_ss = gdb_user_ss.apply(config_targetos, strict: false) gdb_user_ss = gdb_user_ss.apply({})
gdb_system_ss = gdb_system_ss.apply(config_targetos, strict: false) gdb_system_ss = gdb_system_ss.apply({})
libgdb_user = static_library('gdb_user', libgdb_user = static_library('gdb_user',
gdb_user_ss.sources() + genh, gdb_user_ss.sources() + genh,

View File

@ -13,8 +13,11 @@ fs_ss.add(files(
'coth.c', 'coth.c',
'coxattr.c', 'coxattr.c',
)) ))
fs_ss.add(when: 'CONFIG_LINUX', if_true: files('9p-util-linux.c')) if host_os == 'darwin'
fs_ss.add(when: 'CONFIG_DARWIN', if_true: files('9p-util-darwin.c')) fs_ss.add(files('9p-util-darwin.c'))
elif host_os == 'linux'
fs_ss.add(files('9p-util-linux.c'))
endif
fs_ss.add(when: 'CONFIG_XEN_BUS', if_true: files('xen-9p-backend.c')) fs_ss.add(when: 'CONFIG_XEN_BUS', if_true: files('xen-9p-backend.c'))
system_ss.add_all(when: 'CONFIG_FSDEV_9P', if_true: fs_ss) system_ss.add_all(when: 'CONFIG_FSDEV_9P', if_true: fs_ss)

View File

@ -33,9 +33,4 @@ endif
system_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c', 'acpi_interface.c')) system_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c', 'acpi_interface.c'))
system_ss.add(when: 'CONFIG_ACPI_PCI_BRIDGE', if_false: files('pci-bridge-stub.c')) system_ss.add(when: 'CONFIG_ACPI_PCI_BRIDGE', if_false: files('pci-bridge-stub.c'))
system_ss.add_all(when: 'CONFIG_ACPI', if_true: acpi_ss) system_ss.add_all(when: 'CONFIG_ACPI', if_true: acpi_ss)
system_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c', 'aml-build-stub.c',
'acpi-x86-stub.c', 'ipmi-stub.c', 'ghes-stub.c',
'acpi-mem-hotplug-stub.c', 'acpi-cpu-hotplug-stub.c',
'acpi-pci-hotplug-stub.c', 'acpi-nvdimm-stub.c',
'cxl-stub.c', 'pci-bridge-stub.c'))
system_ss.add(files('acpi-qmp-cmds.c')) system_ss.add(files('acpi-qmp-cmds.c'))

View File

@ -11,5 +11,3 @@ system_ss.add(when: 'CONFIG_CXL',
if_false: files( if_false: files(
'cxl-host-stubs.c', 'cxl-host-stubs.c',
)) ))
system_ss.add(when: 'CONFIG_ALL', if_true: files('cxl-host-stubs.c'))

View File

@ -69,8 +69,11 @@ if config_all_devices.has_key('CONFIG_VIRTIO_GPU')
virtio_gpu_ss = ss.source_set() virtio_gpu_ss = ss.source_set()
virtio_gpu_ss.add(when: 'CONFIG_VIRTIO_GPU', virtio_gpu_ss.add(when: 'CONFIG_VIRTIO_GPU',
if_true: [files('virtio-gpu-base.c', 'virtio-gpu.c'), pixman]) if_true: [files('virtio-gpu-base.c', 'virtio-gpu.c'), pixman])
virtio_gpu_ss.add(when: 'CONFIG_LINUX', if_true: files('virtio-gpu-udmabuf.c'), if host_os == 'linux'
if_false: files('virtio-gpu-udmabuf-stubs.c')) virtio_gpu_ss.add(files('virtio-gpu-udmabuf.c'))
else
virtio_gpu_ss.add(files('virtio-gpu-udmabuf-stubs.c'))
endif
virtio_gpu_ss.add(when: 'CONFIG_VHOST_USER_GPU', if_true: files('vhost-user-gpu.c')) virtio_gpu_ss.add(when: 'CONFIG_VHOST_USER_GPU', if_true: files('vhost-user-gpu.c'))
hw_display_modules += {'virtio-gpu': virtio_gpu_ss} hw_display_modules += {'virtio-gpu': virtio_gpu_ss}
@ -140,5 +143,4 @@ endif
system_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_lcdc.c')) system_ss.add(when: 'CONFIG_OMAP', if_true: files('omap_lcdc.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-vga-stub.c'))
modules += { 'hw-display': hw_display_modules } modules += { 'hw-display': hw_display_modules }

View File

@ -34,5 +34,5 @@ void pc_machine_init_sgx_epc(PCMachineState *pcms)
bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size) bool sgx_epc_get_section(int section_nr, uint64_t *addr, uint64_t *size)
{ {
g_assert_not_reached(); return true;
} }

View File

@ -5,7 +5,6 @@ mem_ss.add(when: 'CONFIG_NPCM7XX', if_true: files('npcm7xx_mc.c'))
mem_ss.add(when: 'CONFIG_NVDIMM', if_true: files('nvdimm.c')) mem_ss.add(when: 'CONFIG_NVDIMM', if_true: files('nvdimm.c'))
mem_ss.add(when: 'CONFIG_CXL_MEM_DEVICE', if_true: files('cxl_type3.c')) mem_ss.add(when: 'CONFIG_CXL_MEM_DEVICE', if_true: files('cxl_type3.c'))
system_ss.add(when: 'CONFIG_CXL_MEM_DEVICE', if_false: files('cxl_type3_stubs.c')) system_ss.add(when: 'CONFIG_CXL_MEM_DEVICE', if_false: files('cxl_type3_stubs.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('cxl_type3_stubs.c'))
system_ss.add_all(when: 'CONFIG_MEM_DEVICE', if_true: mem_ss) system_ss.add_all(when: 'CONFIG_MEM_DEVICE', if_true: mem_ss)

View File

@ -5,7 +5,7 @@ mips_ss.add(when: 'CONFIG_LOONGSON3V', if_true: files('loongson3_bootp.c', 'loon
mips_ss.add(when: 'CONFIG_MALTA', if_true: files('malta.c')) mips_ss.add(when: 'CONFIG_MALTA', if_true: files('malta.c'))
mips_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('cps.c')) mips_ss.add(when: 'CONFIG_MIPS_CPS', if_true: files('cps.c'))
if 'CONFIG_TCG' in config_all if 'CONFIG_TCG' in config_all_accel
mips_ss.add(when: 'CONFIG_JAZZ', if_true: files('jazz.c')) mips_ss.add(when: 'CONFIG_JAZZ', if_true: files('jazz.c'))
mips_ss.add(when: 'CONFIG_MIPSSIM', if_true: files('mipssim.c')) mips_ss.add(when: 'CONFIG_MIPSSIM', if_true: files('mipssim.c'))
mips_ss.add(when: 'CONFIG_FULOONG', if_true: files('fuloong2e.c')) mips_ss.add(when: 'CONFIG_FULOONG', if_true: files('fuloong2e.c'))

View File

@ -50,7 +50,6 @@ specific_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('virtio-net.c'))
if have_vhost_net if have_vhost_net
system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost_net.c'), if_false: files('vhost_net-stub.c')) system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost_net.c'), if_false: files('vhost_net-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost_net-stub.c'))
else else
system_ss.add(files('vhost_net-stub.c')) system_ss.add(files('vhost_net-stub.c'))
endif endif
@ -69,7 +68,6 @@ system_ss.add(when: 'CONFIG_ROCKER', if_true: files(
'rocker/rocker_of_dpa.c', 'rocker/rocker_of_dpa.c',
'rocker/rocker_world.c', 'rocker/rocker_world.c',
), if_false: files('rocker/qmp-norocker.c')) ), if_false: files('rocker/qmp-norocker.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('rocker/qmp-norocker.c'))
system_ss.add(files('rocker/rocker-hmp-cmds.c')) system_ss.add(files('rocker/rocker-hmp-cmds.c'))
subdir('can') subdir('can')

View File

@ -13,5 +13,3 @@ pci_ss.add(when: 'CONFIG_CXL', if_true: files('cxl_root_port.c', 'cxl_upstream.c
pci_ss.add(when: 'CONFIG_SIMBA', if_true: files('simba.c')) pci_ss.add(when: 'CONFIG_SIMBA', if_true: files('simba.c'))
system_ss.add_all(when: 'CONFIG_PCI', if_true: pci_ss) system_ss.add_all(when: 'CONFIG_PCI', if_true: pci_ss)
system_ss.add(when: 'CONFIG_ALL', if_true: files('pci_expander_bridge_stubs.c'))

View File

@ -20,4 +20,3 @@ system_ss.add(when: 'CONFIG_PCI_EXPRESS', if_true: files('pcie_port.c', 'pcie_ho
system_ss.add_all(when: 'CONFIG_PCI', if_true: pci_ss) system_ss.add_all(when: 'CONFIG_PCI', if_true: pci_ss)
system_ss.add(when: 'CONFIG_PCI', if_false: files('pci-stub.c')) system_ss.add(when: 'CONFIG_PCI', if_false: files('pci-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('pci-stub.c'))

View File

@ -34,9 +34,11 @@ ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_TCG'], if_true: files(
'spapr_softmmu.c', 'spapr_softmmu.c',
)) ))
ppc_ss.add(when: 'CONFIG_SPAPR_RNG', if_true: files('spapr_rng.c')) ppc_ss.add(when: 'CONFIG_SPAPR_RNG', if_true: files('spapr_rng.c'))
ppc_ss.add(when: ['CONFIG_PSERIES', 'CONFIG_LINUX'], if_true: files( if host_os == 'linux'
ppc_ss.add(when: 'CONFIG_PSERIES', if_true: files(
'spapr_pci_vfio.c', 'spapr_pci_vfio.c',
)) ))
endif
# IBM PowerNV # IBM PowerNV
ppc_ss.add(when: 'CONFIG_POWERNV', if_true: files( ppc_ss.add(when: 'CONFIG_POWERNV', if_true: files(

View File

@ -11,7 +11,6 @@ remote_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('iommu.c'))
remote_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_true: libvfio_user_dep) remote_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_true: libvfio_user_dep)
remote_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_true: files('vfio-user-obj.c'), remote_ss.add(when: 'CONFIG_VFIO_USER_SERVER', if_true: files('vfio-user-obj.c'),
if_false: files('vfio-user-obj-stub.c')) if_false: files('vfio-user-obj-stub.c'))
remote_ss.add(when: 'CONFIG_ALL', if_true: files('vfio-user-obj-stub.c'))
specific_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('memory.c')) specific_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('memory.c'))
specific_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('proxy-memory-listener.c')) specific_ss.add(when: 'CONFIG_MULTIPROCESS', if_true: files('proxy-memory-listener.c'))

View File

@ -292,6 +292,15 @@ static void do_command_phase(ESPState *s)
esp_fifo_pop_buf(&s->cmdfifo, buf, cmdlen); esp_fifo_pop_buf(&s->cmdfifo, buf, cmdlen);
current_lun = scsi_device_find(&s->bus, 0, s->current_dev->id, s->lun); current_lun = scsi_device_find(&s->bus, 0, s->current_dev->id, s->lun);
if (!current_lun) {
/* No such drive */
s->rregs[ESP_RSTAT] = 0;
s->rregs[ESP_RINTR] = INTR_DC;
s->rregs[ESP_RSEQ] = SEQ_0;
esp_raise_irq(s);
return;
}
s->current_req = scsi_req_new(current_lun, 0, s->lun, buf, cmdlen, s); s->current_req = scsi_req_new(current_lun, 0, s->lun, buf, cmdlen, s);
datalen = scsi_req_enqueue(s->current_req); datalen = scsi_req_enqueue(s->current_req);
s->ti_size = datalen; s->ti_size = datalen;

View File

@ -6,8 +6,3 @@ smbios_ss.add(when: 'CONFIG_IPMI',
system_ss.add_all(when: 'CONFIG_SMBIOS', if_true: smbios_ss) system_ss.add_all(when: 'CONFIG_SMBIOS', if_true: smbios_ss)
system_ss.add(when: 'CONFIG_SMBIOS', if_false: files('smbios-stub.c')) system_ss.add(when: 'CONFIG_SMBIOS', if_false: files('smbios-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files(
'smbios-stub.c',
'smbios_type_38-stub.c',
))

View File

@ -44,7 +44,9 @@ system_ss.add(when: 'CONFIG_USB_STORAGE_UAS', if_true: files('dev-uas.c'))
system_ss.add(when: 'CONFIG_USB_AUDIO', if_true: files('dev-audio.c')) system_ss.add(when: 'CONFIG_USB_AUDIO', if_true: files('dev-audio.c'))
system_ss.add(when: 'CONFIG_USB_SERIAL', if_true: files('dev-serial.c')) system_ss.add(when: 'CONFIG_USB_SERIAL', if_true: files('dev-serial.c'))
system_ss.add(when: 'CONFIG_USB_NETWORK', if_true: files('dev-network.c')) system_ss.add(when: 'CONFIG_USB_NETWORK', if_true: files('dev-network.c'))
system_ss.add(when: ['CONFIG_POSIX', 'CONFIG_USB_STORAGE_MTP'], if_true: files('dev-mtp.c')) if host_os != 'windows'
system_ss.add(when: 'CONFIG_USB_STORAGE_MTP', if_true: files('dev-mtp.c'))
endif
# smartcard # smartcard
system_ss.add(when: 'CONFIG_USB_SMARTCARD', if_true: files('dev-smartcard-reader.c')) system_ss.add(when: 'CONFIG_USB_SMARTCARD', if_true: files('dev-smartcard-reader.c'))
@ -58,7 +60,9 @@ endif
# U2F # U2F
system_ss.add(when: 'CONFIG_USB_U2F', if_true: files('u2f.c')) system_ss.add(when: 'CONFIG_USB_U2F', if_true: files('u2f.c'))
system_ss.add(when: ['CONFIG_LINUX', 'CONFIG_USB_U2F'], if_true: [libudev, files('u2f-passthru.c')]) if host_os == 'linux'
system_ss.add(when: 'CONFIG_USB_U2F', if_true: [libudev, files('u2f-passthru.c')])
endif
if u2f.found() if u2f.found()
system_ss.add(when: 'CONFIG_USB_U2F', if_true: [u2f, files('u2f-emulated.c')]) system_ss.add(when: 'CONFIG_USB_U2F', if_true: [u2f, files('u2f-emulated.c')])
endif endif

View File

@ -74,8 +74,6 @@ specific_virtio_ss.add_all(when: 'CONFIG_VIRTIO_PCI', if_true: virtio_pci_ss)
system_ss.add_all(when: 'CONFIG_VIRTIO', if_true: system_virtio_ss) system_ss.add_all(when: 'CONFIG_VIRTIO', if_true: system_virtio_ss)
system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('vhost-stub.c')) system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('vhost-stub.c'))
system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('virtio-stub.c')) system_ss.add(when: 'CONFIG_VIRTIO', if_false: files('virtio-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('virtio-stub.c'))
system_ss.add(files('virtio-hmp-cmds.c')) system_ss.add(files('virtio-hmp-cmds.c'))
specific_ss.add_all(when: 'CONFIG_VIRTIO', if_true: specific_virtio_ss) specific_ss.add_all(when: 'CONFIG_VIRTIO', if_true: specific_virtio_ss)

File diff suppressed because it is too large Load Diff

View File

@ -101,7 +101,7 @@ option('cfi_debug', type: 'boolean', value: false,
description: 'Verbose errors in case of CFI violation') description: 'Verbose errors in case of CFI violation')
option('multiprocess', type: 'feature', value: 'auto', option('multiprocess', type: 'feature', value: 'auto',
description: 'Out of process device emulation support') description: 'Out of process device emulation support')
option('relocatable', type : 'boolean', value : 'true', option('relocatable', type : 'boolean', value : true,
description: 'toggle relocatable install') description: 'toggle relocatable install')
option('vfio_user_server', type: 'feature', value: 'disabled', option('vfio_user_server', type: 'feature', value: 'disabled',
description: 'vfio-user server support') description: 'vfio-user server support')

View File

@ -1,5 +1,7 @@
can_ss = ss.source_set() can_ss = ss.source_set()
can_ss.add(files('can_core.c', 'can_host.c')) can_ss.add(files('can_core.c', 'can_host.c'))
can_ss.add(when: 'CONFIG_LINUX', if_true: files('can_socketcan.c')) if host_os == 'linux'
can_ss.add(files('can_socketcan.c'))
endif
system_ss.add_all(when: 'CONFIG_CAN_BUS', if_true: can_ss) system_ss.add_all(when: 'CONFIG_CAN_BUS', if_true: can_ss)

View File

@ -41,23 +41,21 @@ system_ss.add(when: libxdp, if_true: files('af-xdp.c'))
if have_vhost_net_user if have_vhost_net_user
system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-user.c'), if_false: files('vhost-user-stub.c')) system_ss.add(when: 'CONFIG_VIRTIO_NET', if_true: files('vhost-user.c'), if_false: files('vhost-user-stub.c'))
system_ss.add(when: 'CONFIG_ALL', if_true: files('vhost-user-stub.c'))
endif endif
if targetos == 'windows' if host_os == 'windows'
system_ss.add(files('tap-win32.c')) system_ss.add(files('tap-win32.c'))
elif targetos == 'linux' elif host_os == 'linux'
system_ss.add(files('tap.c', 'tap-linux.c')) system_ss.add(files('tap.c', 'tap-linux.c'))
elif targetos in bsd_oses elif host_os in bsd_oses
system_ss.add(files('tap.c', 'tap-bsd.c')) system_ss.add(files('tap.c', 'tap-bsd.c'))
elif targetos == 'sunos' elif host_os == 'sunos'
system_ss.add(files('tap.c', 'tap-solaris.c')) system_ss.add(files('tap.c', 'tap-solaris.c'))
else else
system_ss.add(files('tap.c', 'tap-stub.c')) system_ss.add(files('tap.c', 'tap-stub.c'))
endif endif
if have_vhost_net_vdpa 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_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'))
endif endif
vmnet_files = files( vmnet_files = files(

View File

@ -1,7 +1,7 @@
plugin_ldflags = [] plugin_ldflags = []
# Modules need more symbols than just those in plugins/qemu-plugins.symbols # Modules need more symbols than just those in plugins/qemu-plugins.symbols
if not enable_modules if not enable_modules
if targetos == 'darwin' if host_os == 'darwin'
configure_file( configure_file(
input: files('qemu-plugins.symbols'), input: files('qemu-plugins.symbols'),
output: 'qemu-plugins-ld64.symbols', output: 'qemu-plugins-ld64.symbols',
@ -14,7 +14,7 @@ if not enable_modules
endif endif
if get_option('plugins') if get_option('plugins')
if targetos == 'windows' if host_os == 'windows'
dlltool = find_program('dlltool', required: true) dlltool = find_program('dlltool', required: true)
# Generate a .lib file for plugins to link against. # Generate a .lib file for plugins to link against.

View File

@ -7,7 +7,7 @@ if not have_ga
endif endif
have_qga_vss = get_option('qga_vss') \ have_qga_vss = get_option('qga_vss') \
.require(targetos == 'windows', .require(host_os == 'windows',
error_message: 'VSS support requires Windows') \ error_message: 'VSS support requires Windows') \
.require('cpp' in all_languages, .require('cpp' in all_languages,
error_message: 'VSS support requires a C++ compiler') \ error_message: 'VSS support requires a C++ compiler') \
@ -67,29 +67,31 @@ qga_ss.add(files(
'main.c', 'main.c',
'cutils.c', 'cutils.c',
)) ))
qga_ss.add(when: 'CONFIG_POSIX', if_true: files( if host_os == 'windows'
'channel-posix.c', qga_ss.add(files(
'commands-posix.c',
'commands-posix-ssh.c',
))
qga_ss.add(when: 'CONFIG_LINUX', if_true: files(
'commands-linux.c',
))
qga_ss.add(when: 'CONFIG_BSD', if_true: files(
'commands-bsd.c',
))
qga_ss.add(when: 'CONFIG_WIN32', if_true: files(
'channel-win32.c', 'channel-win32.c',
'commands-win32.c', 'commands-win32.c',
'service-win32.c', 'service-win32.c',
'vss-win32.c' 'vss-win32.c'
)) ))
else
qga_ss.add(files(
'channel-posix.c',
'commands-posix.c',
'commands-posix-ssh.c',
))
if host_os == 'linux'
qga_ss.add(files('commands-linux.c'))
elif host_os in bsd_oses
qga_ss.add(files('commands-bsd.c'))
endif
endif
qga_ss = qga_ss.apply(config_targetos, strict: false) qga_ss = qga_ss.apply({})
gen_tlb = [] gen_tlb = []
qga_libs = [] qga_libs = []
if targetos == 'windows' if host_os == 'windows'
qga_libs += ['-lws2_32', '-lwinmm', '-lpowrprof', '-lwtsapi32', '-lwininet', '-liphlpapi', '-lnetapi32', qga_libs += ['-lws2_32', '-lwinmm', '-lpowrprof', '-lwtsapi32', '-lwininet', '-liphlpapi', '-lnetapi32',
'-lsetupapi', '-lcfgmgr32'] '-lsetupapi', '-lcfgmgr32']
if have_qga_vss if have_qga_vss
@ -99,7 +101,7 @@ if targetos == 'windows'
endif endif
qga_objs = [] qga_objs = []
if targetos == 'windows' if host_os == 'windows'
windmc = find_program('windmc', required: true) windmc = find_program('windmc', required: true)
windres = find_program('windres', required: true) windres = find_program('windres', required: true)
@ -121,7 +123,7 @@ qga = executable('qemu-ga', qga_ss.sources() + qga_objs,
install: true) install: true)
all_qga += qga all_qga += qga
if targetos == 'windows' if host_os == 'windows'
qemu_ga_msi_arch = { qemu_ga_msi_arch = {
'x86': ['-D', 'Arch=32'], 'x86': ['-D', 'Arch=32'],
'x86_64': ['-a', 'x64', '-D', 'Arch=64'] 'x86_64': ['-a', 'x64', '-D', 'Arch=64']
@ -140,7 +142,7 @@ if targetos == 'windows'
qemu_ga_msi_vss = ['-D', 'InstallVss'] qemu_ga_msi_vss = ['-D', 'InstallVss']
deps += qga_vss deps += qga_vss
endif endif
if glib.version() < '2.73.2' if glib.version().version_compare('<2.73.2')
libpcre = 'libpcre1' libpcre = 'libpcre1'
else else
libpcre = 'libpcre2' libpcre = 'libpcre2'
@ -183,7 +185,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 # 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 # this when an alternative is implemented or when the underlying glib
# issue is identified/fix # issue is identified/fix
#if targetos != 'windows' #if host_os != 'windows'
if false if false
srcs = [files('commands-posix-ssh.c')] srcs = [files('commands-posix-ssh.c')]
i = 0 i = 0

View File

@ -1,4 +1,6 @@
block_ss.add(files('utils.c')) block_ss.add(files('utils.c'))
block_ss.add(when: 'CONFIG_LINUX', if host_os == 'linux'
if_true: files('pr-manager.c', 'pr-manager-helper.c'), block_ss.add(files('pr-manager.c', 'pr-manager-helper.c'))
if_false: files('pr-manager-stub.c')) else
block_ss.add(files('pr-manager-stub.c'))
endif

View File

@ -5,7 +5,7 @@ qsd_ss.add(blockdev, chardev, qmp, qom, qemuutil, gnutls)
subdir('qapi') subdir('qapi')
if have_tools if have_tools
qsd_ss = qsd_ss.apply(config_targetos, strict: false) qsd_ss = qsd_ss.apply({})
qsd = executable('qemu-storage-daemon', qsd = executable('qemu-storage-daemon',
qsd_ss.sources(), qsd_ss.sources(),
dependencies: qsd_ss.dependencies(), dependencies: qsd_ss.dependencies(),

View File

@ -33,4 +33,6 @@ endif
system_ss.add(when: seccomp, if_true: files('qemu-seccomp.c')) 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: fdt, if_true: files('device_tree.c'))
system_ss.add(when: 'CONFIG_LINUX', if_true: files('async-teardown.c')) if host_os == 'linux'
system_ss.add(files('async-teardown.c'))
endif

View File

@ -28,7 +28,7 @@ arm_system_ss.add(files(
subdir('hvf') subdir('hvf')
if 'CONFIG_TCG' in config_all if 'CONFIG_TCG' in config_all_accel
subdir('tcg') subdir('tcg')
else else
arm_ss.add(files('tcg-stubs.c')) arm_ss.add(files('tcg-stubs.c'))

View File

@ -738,7 +738,7 @@ void x86_cpu_vendor_words2str(char *dst, uint32_t vendor1,
#define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES) #define TCG_7_0_EDX_FEATURES (CPUID_7_0_EDX_FSRM | CPUID_7_0_EDX_KERNEL_FEATURES)
#define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \ #define TCG_7_1_EAX_FEATURES (CPUID_7_1_EAX_FZRM | CPUID_7_1_EAX_FSRS | \
CPUID_7_1_EAX_FSRC) CPUID_7_1_EAX_FSRC | CPUID_7_1_EAX_CMPCCXADD)
#define TCG_7_1_EDX_FEATURES 0 #define TCG_7_1_EDX_FEATURES 0
#define TCG_7_2_EDX_FEATURES 0 #define TCG_7_2_EDX_FEATURES 0
#define TCG_APM_FEATURES 0 #define TCG_APM_FEATURES 0

View File

@ -1285,6 +1285,7 @@ typedef enum {
CC_OP_NB, CC_OP_NB,
} CCOp; } CCOp;
QEMU_BUILD_BUG_ON(CC_OP_NB >= 128);
typedef struct SegmentCache { typedef struct SegmentCache {
uint32_t selector; uint32_t selector;
@ -2344,13 +2345,13 @@ void cpu_x86_inject_mce(Monitor *mon, X86CPU *cpu, int bank,
uint64_t status, uint64_t mcg_status, uint64_t addr, uint64_t status, uint64_t mcg_status, uint64_t addr,
uint64_t misc, int flags); uint64_t misc, int flags);
uint32_t cpu_cc_compute_all(CPUX86State *env1, int op); uint32_t cpu_cc_compute_all(CPUX86State *env1);
static inline uint32_t cpu_compute_eflags(CPUX86State *env) static inline uint32_t cpu_compute_eflags(CPUX86State *env)
{ {
uint32_t eflags = env->eflags; uint32_t eflags = env->eflags;
if (tcg_enabled()) { if (tcg_enabled()) {
eflags |= cpu_cc_compute_all(env, CC_OP) | (env->df & DF_MASK); eflags |= cpu_cc_compute_all(env) | (env->df & DF_MASK);
} }
return eflags; return eflags;
} }

View File

@ -220,9 +220,9 @@ target_ulong helper_cc_compute_all(target_ulong dst, target_ulong src1,
} }
} }
uint32_t cpu_cc_compute_all(CPUX86State *env, int op) uint32_t cpu_cc_compute_all(CPUX86State *env)
{ {
return helper_cc_compute_all(CC_DST, CC_SRC, CC_SRC2, op); return helper_cc_compute_all(CC_DST, CC_SRC, CC_SRC2, CC_OP);
} }
target_ulong helper_cc_compute_c(target_ulong dst, target_ulong src1, target_ulong helper_cc_compute_c(target_ulong dst, target_ulong src1,
@ -335,7 +335,7 @@ target_ulong helper_read_eflags(CPUX86State *env)
{ {
uint32_t eflags; uint32_t eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
eflags |= (env->df & DF_MASK); eflags |= (env->df & DF_MASK);
eflags |= env->eflags & ~(VM_MASK | RF_MASK); eflags |= env->eflags & ~(VM_MASK | RF_MASK);
return eflags; return eflags;

View File

@ -26,6 +26,13 @@
* size (X86_SIZE_*) codes used in the manual. There are a few differences * size (X86_SIZE_*) codes used in the manual. There are a few differences
* though. * though.
* *
* Operand sizes
* -------------
*
* The manual lists d64 ("cannot encode 32-bit size in 64-bit mode") and f64
* ("cannot encode 16-bit or 32-bit size in 64-bit mode") as modifiers of the
* "v" or "z" sizes. The decoder simply makes them separate operand sizes.
*
* Vector operands * Vector operands
* --------------- * ---------------
* *
@ -44,6 +51,11 @@
* if the difference is expressed via prefixes. Individual instructions * if the difference is expressed via prefixes. Individual instructions
* are separated by prefix in the generator functions. * are separated by prefix in the generator functions.
* *
* There is a custom size "xh" used to address half of a SSE/AVX operand.
* This points to a 64-bit operand for SSE operations, 128-bit operand
* for 256-bit AVX operands, etc. It is used for conversion operations
* such as VCVTPH2PS or VCVTSS2SD.
*
* There are a couple cases in which instructions (e.g. MOVD) write the * There are a couple cases in which instructions (e.g. MOVD) write the
* whole XMM or MM register but are established incorrectly in the manual * whole XMM or MM register but are established incorrectly in the manual
* as "d" or "q". These have to be fixed for the decoder to work correctly. * as "d" or "q". These have to be fixed for the decoder to work correctly.
@ -139,10 +151,13 @@
#define cpuid(feat) .cpuid = X86_FEAT_##feat, #define cpuid(feat) .cpuid = X86_FEAT_##feat,
#define xchg .special = X86_SPECIAL_Locked, #define xchg .special = X86_SPECIAL_Locked,
#define lock .special = X86_SPECIAL_HasLock,
#define mmx .special = X86_SPECIAL_MMX, #define mmx .special = X86_SPECIAL_MMX,
#define zext0 .special = X86_SPECIAL_ZExtOp0, #define op0_Rd .special = X86_SPECIAL_Op0_Rd,
#define zext2 .special = X86_SPECIAL_ZExtOp2, #define op2_Ry .special = X86_SPECIAL_Op2_Ry,
#define avx_movx .special = X86_SPECIAL_AVXExtMov, #define avx_movx .special = X86_SPECIAL_AVXExtMov,
#define sextT0 .special = X86_SPECIAL_SExtT0,
#define zextT0 .special = X86_SPECIAL_ZExtT0,
#define vex1 .vex_class = 1, #define vex1 .vex_class = 1,
#define vex1_rep3 .vex_class = 1, .vex_special = X86_VEX_REPScalar, #define vex1_rep3 .vex_class = 1, .vex_special = X86_VEX_REPScalar,
@ -523,6 +538,28 @@ static const X86OpEntry opcodes_0F38_00toEF[240] = {
[0xdd] = X86_OP_ENTRY3(VAESENCLAST, V,x, H,x, W,x, vex4 cpuid(AES) p_66), [0xdd] = X86_OP_ENTRY3(VAESENCLAST, V,x, H,x, W,x, vex4 cpuid(AES) p_66),
[0xde] = X86_OP_ENTRY3(VAESDEC, V,x, H,x, W,x, vex4 cpuid(AES) p_66), [0xde] = X86_OP_ENTRY3(VAESDEC, V,x, H,x, W,x, vex4 cpuid(AES) p_66),
[0xdf] = X86_OP_ENTRY3(VAESDECLAST, V,x, H,x, W,x, vex4 cpuid(AES) p_66), [0xdf] = X86_OP_ENTRY3(VAESDECLAST, V,x, H,x, W,x, vex4 cpuid(AES) p_66),
/*
* REG selects srcdest2 operand, VEX.vvvv selects src3. VEX class not found
* in manual, assumed to be 13 from the VEX.L0 constraint.
*/
[0xe0] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe1] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe2] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe3] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe4] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe5] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe6] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe7] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe8] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xe9] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xea] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xeb] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xec] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xed] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xee] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
[0xef] = X86_OP_ENTRY3(CMPccXADD, M,y, G,y, B,y, vex13 xchg chk(o64) cpuid(CMPCCXADD) p_66),
}; };
/* five rows for no prefix, 66, F3, F2, 66+F2 */ /* five rows for no prefix, 66, F3, F2, 66+F2 */
@ -558,8 +595,8 @@ static const X86OpEntry opcodes_0F38_F0toFF[16][5] = {
[5] = { [5] = {
X86_OP_ENTRY3(BZHI, G,y, E,y, B,y, vex13 cpuid(BMI1)), X86_OP_ENTRY3(BZHI, G,y, E,y, B,y, vex13 cpuid(BMI1)),
{}, {},
X86_OP_ENTRY3(PEXT, G,y, B,y, E,y, vex13 cpuid(BMI2)), X86_OP_ENTRY3(PEXT, G,y, B,y, E,y, vex13 zextT0 cpuid(BMI2)),
X86_OP_ENTRY3(PDEP, G,y, B,y, E,y, vex13 cpuid(BMI2)), X86_OP_ENTRY3(PDEP, G,y, B,y, E,y, vex13 zextT0 cpuid(BMI2)),
{}, {},
}, },
[6] = { [6] = {
@ -570,10 +607,10 @@ static const X86OpEntry opcodes_0F38_F0toFF[16][5] = {
{}, {},
}, },
[7] = { [7] = {
X86_OP_ENTRY3(BEXTR, G,y, E,y, B,y, vex13 cpuid(BMI1)), X86_OP_ENTRY3(BEXTR, G,y, E,y, B,y, vex13 zextT0 cpuid(BMI1)),
X86_OP_ENTRY3(SHLX, G,y, E,y, B,y, vex13 cpuid(BMI1)), X86_OP_ENTRY3(SHLX, G,y, E,y, B,y, vex13 cpuid(BMI1)),
X86_OP_ENTRY3(SARX, G,y, E,y, B,y, vex13 cpuid(BMI1)), X86_OP_ENTRY3(SARX, G,y, E,y, B,y, vex13 sextT0 cpuid(BMI1)),
X86_OP_ENTRY3(SHRX, G,y, E,y, B,y, vex13 cpuid(BMI1)), X86_OP_ENTRY3(SHRX, G,y, E,y, B,y, vex13 zextT0 cpuid(BMI1)),
{}, {},
}, },
}; };
@ -619,13 +656,13 @@ static const X86OpEntry opcodes_0F3A[256] = {
[0x05] = X86_OP_ENTRY3(VPERMILPD_i, V,x, W,x, I,b, vex6 chk(W0) cpuid(AVX) p_66), [0x05] = X86_OP_ENTRY3(VPERMILPD_i, V,x, W,x, I,b, vex6 chk(W0) cpuid(AVX) p_66),
[0x06] = X86_OP_ENTRY4(VPERM2x128, V,qq, H,qq, W,qq, vex6 chk(W0) cpuid(AVX) p_66), [0x06] = X86_OP_ENTRY4(VPERM2x128, V,qq, H,qq, W,qq, vex6 chk(W0) cpuid(AVX) p_66),
[0x14] = X86_OP_ENTRY3(PEXTRB, E,b, V,dq, I,b, vex5 cpuid(SSE41) zext0 p_66), [0x14] = X86_OP_ENTRY3(PEXTRB, E,b, V,dq, I,b, vex5 cpuid(SSE41) op0_Rd p_66),
[0x15] = X86_OP_ENTRY3(PEXTRW, E,w, V,dq, I,b, vex5 cpuid(SSE41) zext0 p_66), [0x15] = X86_OP_ENTRY3(PEXTRW, E,w, V,dq, I,b, vex5 cpuid(SSE41) op0_Rd p_66),
[0x16] = X86_OP_ENTRY3(PEXTR, E,y, V,dq, I,b, vex5 cpuid(SSE41) 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), [0x17] = X86_OP_ENTRY3(VEXTRACTPS, E,d, V,dq, I,b, vex5 cpuid(SSE41) p_66),
[0x1d] = X86_OP_ENTRY3(VCVTPS2PH, W,xh, V,x, I,b, vex11 chk(W0) cpuid(F16C) p_66), [0x1d] = X86_OP_ENTRY3(VCVTPS2PH, W,xh, V,x, I,b, vex11 chk(W0) cpuid(F16C) p_66),
[0x20] = X86_OP_ENTRY4(PINSRB, V,dq, H,dq, E,b, vex5 cpuid(SSE41) zext2 p_66), [0x20] = X86_OP_ENTRY4(PINSRB, V,dq, H,dq, E,b, vex5 cpuid(SSE41) op2_Ry p_66),
[0x21] = X86_OP_GROUP0(VINSERTPS), [0x21] = X86_OP_GROUP0(VINSERTPS),
[0x22] = X86_OP_ENTRY4(PINSR, V,dq, H,dq, E,y, vex5 cpuid(SSE41) p_66), [0x22] = X86_OP_ENTRY4(PINSR, V,dq, H,dq, E,y, vex5 cpuid(SSE41) p_66),
@ -1091,10 +1128,6 @@ static int decode_modrm(DisasContext *s, CPUX86State *env, X86DecodedInsn *decod
{ {
int modrm = get_modrm(s, env); int modrm = get_modrm(s, env);
if ((modrm >> 6) == 3) { if ((modrm >> 6) == 3) {
if (s->prefix & PREFIX_LOCK) {
decode->e.gen = gen_illegal;
return 0xff;
}
op->n = (modrm & 7); op->n = (modrm & 7);
if (type != X86_TYPE_Q && type != X86_TYPE_N) { if (type != X86_TYPE_Q && type != X86_TYPE_N) {
op->n |= REX_B(s); op->n |= REX_B(s);
@ -1201,6 +1234,8 @@ static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode,
case X86_TYPE_None: /* Implicit or absent */ case X86_TYPE_None: /* Implicit or absent */
case X86_TYPE_A: /* Implicit */ case X86_TYPE_A: /* Implicit */
case X86_TYPE_F: /* EFLAGS/RFLAGS */ case X86_TYPE_F: /* EFLAGS/RFLAGS */
case X86_TYPE_X: /* string source */
case X86_TYPE_Y: /* string destination */
break; break;
case X86_TYPE_B: /* VEX.vvvv selects a GPR */ case X86_TYPE_B: /* VEX.vvvv selects a GPR */
@ -1316,43 +1351,15 @@ static bool decode_op(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode,
} }
case X86_TYPE_I: /* Immediate */ case X86_TYPE_I: /* Immediate */
op->unit = X86_OP_IMM;
decode->immediate = insn_get_signed(env, s, op->ot);
break;
case X86_TYPE_J: /* Relative offset for a jump */ case X86_TYPE_J: /* Relative offset for a jump */
op->unit = X86_OP_IMM; op->unit = X86_OP_IMM;
decode->immediate = insn_get_signed(env, s, op->ot); decode->immediate = insn_get_signed(env, s, op->ot);
decode->immediate += s->pc - s->cs_base;
if (s->dflag == MO_16) {
decode->immediate &= 0xffff;
} else if (!CODE64(s)) {
decode->immediate &= 0xffffffffu;
}
break; break;
case X86_TYPE_L: /* The upper 4 bits of the immediate select a 128-bit register */ case X86_TYPE_L: /* The upper 4 bits of the immediate select a 128-bit register */
op->n = insn_get(env, s, op->ot) >> 4; op->n = insn_get(env, s, op->ot) >> 4;
break; break;
case X86_TYPE_X: /* string source */
op->n = -1;
decode->mem = (AddressParts) {
.def_seg = R_DS,
.base = R_ESI,
.index = -1,
};
break;
case X86_TYPE_Y: /* string destination */
op->n = -1;
decode->mem = (AddressParts) {
.def_seg = R_ES,
.base = R_EDI,
.index = -1,
};
break;
case X86_TYPE_2op: case X86_TYPE_2op:
*op = decode->op[0]; *op = decode->op[0];
break; break;
@ -1518,6 +1525,9 @@ static bool has_cpuid_feature(DisasContext *s, X86CPUIDFeature cpuid)
return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_AVX2); return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_AVX2);
case X86_FEAT_SHA_NI: case X86_FEAT_SHA_NI:
return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_SHA_NI); return (s->cpuid_7_0_ebx_features & CPUID_7_0_EBX_SHA_NI);
case X86_FEAT_CMPCCXADD:
return (s->cpuid_7_1_eax_features & CPUID_7_1_EAX_CMPCCXADD);
} }
g_assert_not_reached(); g_assert_not_reached();
} }
@ -1677,6 +1687,7 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
bool first = true; bool first = true;
X86DecodedInsn decode; X86DecodedInsn decode;
X86DecodeFunc decode_func = decode_root; X86DecodeFunc decode_func = decode_root;
uint8_t cc_live;
s->has_modrm = false; s->has_modrm = false;
@ -1830,6 +1841,7 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
} }
memset(&decode, 0, sizeof(decode)); memset(&decode, 0, sizeof(decode));
decode.cc_op = -1;
decode.b = b; decode.b = b;
if (!decode_insn(s, env, decode_func, &decode)) { if (!decode_insn(s, env, decode_func, &decode)) {
goto illegal_op; goto illegal_op;
@ -1869,19 +1881,22 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
if (decode.op[0].has_ea) { if (decode.op[0].has_ea) {
s->prefix |= PREFIX_LOCK; s->prefix |= PREFIX_LOCK;
} }
decode.e.special = X86_SPECIAL_HasLock;
/* fallthrough */
case X86_SPECIAL_HasLock:
break; break;
case X86_SPECIAL_ZExtOp0: case X86_SPECIAL_Op0_Rd:
assert(decode.op[0].unit == X86_OP_INT); assert(decode.op[0].unit == X86_OP_INT);
if (!decode.op[0].has_ea) { if (!decode.op[0].has_ea) {
decode.op[0].ot = MO_32; decode.op[0].ot = MO_32;
} }
break; break;
case X86_SPECIAL_ZExtOp2: case X86_SPECIAL_Op2_Ry:
assert(decode.op[2].unit == X86_OP_INT); assert(decode.op[2].unit == X86_OP_INT);
if (!decode.op[2].has_ea) { if (!decode.op[2].has_ea) {
decode.op[2].ot = MO_32; decode.op[2].ot = s->dflag == MO_16 ? MO_32 : s->dflag;
} }
break; break;
@ -1893,10 +1908,22 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
} }
break; break;
case X86_SPECIAL_SExtT0:
case X86_SPECIAL_ZExtT0:
/* Handled in gen_load. */
assert(decode.op[1].unit == X86_OP_INT);
break;
default: default:
break; break;
} }
if (s->prefix & PREFIX_LOCK) {
if (decode.e.special != X86_SPECIAL_HasLock || !decode.op[0].has_ea) {
goto illegal_op;
}
}
if (!validate_vex(s, &decode)) { if (!validate_vex(s, &decode)) {
return; return;
} }
@ -1940,9 +1967,6 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
gen_load_ea(s, &decode.mem, decode.e.vex_class == 12); gen_load_ea(s, &decode.mem, decode.e.vex_class == 12);
} }
if (s->prefix & PREFIX_LOCK) { if (s->prefix & PREFIX_LOCK) {
if (decode.op[0].unit != X86_OP_INT || !decode.op[0].has_ea) {
goto illegal_op;
}
gen_load(s, &decode, 2, s->T1); gen_load(s, &decode, 2, s->T1);
decode.e.gen(s, env, &decode); decode.e.gen(s, env, &decode);
} else { } else {
@ -1956,6 +1980,38 @@ static void disas_insn_new(DisasContext *s, CPUState *cpu, int b)
decode.e.gen(s, env, &decode); decode.e.gen(s, env, &decode);
gen_writeback(s, &decode, 0, s->T0); gen_writeback(s, &decode, 0, s->T0);
} }
/*
* Write back flags after last memory access. Some newer ALU instructions, as
* well as SSE instructions, write flags in the gen_* function, but that can
* cause incorrect tracking of CC_OP for instructions that write to both memory
* and flags.
*/
if (decode.cc_op != -1) {
if (decode.cc_dst) {
tcg_gen_mov_tl(cpu_cc_dst, decode.cc_dst);
}
if (decode.cc_src) {
tcg_gen_mov_tl(cpu_cc_src, decode.cc_src);
}
if (decode.cc_src2) {
tcg_gen_mov_tl(cpu_cc_src2, decode.cc_src2);
}
if (decode.cc_op == CC_OP_DYNAMIC) {
tcg_gen_mov_i32(cpu_cc_op, decode.cc_op_dynamic);
}
set_cc_op(s, decode.cc_op);
cc_live = cc_op_live[decode.cc_op];
} else {
cc_live = 0;
}
if (decode.cc_op != CC_OP_DYNAMIC) {
assert(!decode.cc_op_dynamic);
assert(!!decode.cc_dst == !!(cc_live & USES_CC_DST));
assert(!!decode.cc_src == !!(cc_live & USES_CC_SRC));
assert(!!decode.cc_src2 == !!(cc_live & USES_CC_SRC2));
}
return; return;
gp_fault: gp_fault:
gen_exception_gpf(s); gen_exception_gpf(s);

View File

@ -104,6 +104,7 @@ typedef enum X86CPUIDFeature {
X86_FEAT_AVX2, X86_FEAT_AVX2,
X86_FEAT_BMI1, X86_FEAT_BMI1,
X86_FEAT_BMI2, X86_FEAT_BMI2,
X86_FEAT_CMPCCXADD,
X86_FEAT_F16C, X86_FEAT_F16C,
X86_FEAT_FMA, X86_FEAT_FMA,
X86_FEAT_MOVBE, X86_FEAT_MOVBE,
@ -158,15 +159,27 @@ typedef enum X86InsnCheck {
typedef enum X86InsnSpecial { typedef enum X86InsnSpecial {
X86_SPECIAL_None, X86_SPECIAL_None,
/* Accepts LOCK prefix; LOCKed operations do not load or writeback operand 0 */
X86_SPECIAL_HasLock,
/* Always locked if it has a memory operand (XCHG) */ /* Always locked if it has a memory operand (XCHG) */
X86_SPECIAL_Locked, X86_SPECIAL_Locked,
/* /*
* Register operand 0/2 is zero extended to 32 bits. Rd/Mb or Rd/Mw * Rd/Mb or Rd/Mw in the manual: register operand 0 is treated as 32 bits
* in the manual. * (and writeback zero-extends it to 64 bits if applicable). PREFIX_DATA
* does not trigger 16-bit writeback and, as a side effect, high-byte
* registers are never used.
*/ */
X86_SPECIAL_ZExtOp0, X86_SPECIAL_Op0_Rd,
X86_SPECIAL_ZExtOp2,
/*
* Ry/Mb in the manual (PINSRB). However, the high bits are never used by
* the instruction in either the register or memory cases; the *real* effect
* of this modifier is that high-byte registers are never used, even without
* a REX prefix. Therefore, PINSRW does not need it despite having Ry/Mw.
*/
X86_SPECIAL_Op2_Ry,
/* /*
* Register operand 2 is extended to full width, while a memory operand * Register operand 2 is extended to full width, while a memory operand
@ -179,6 +192,10 @@ typedef enum X86InsnSpecial {
* become P/P/Q/N, and size "x" becomes "q". * become P/P/Q/N, and size "x" becomes "q".
*/ */
X86_SPECIAL_MMX, X86_SPECIAL_MMX,
/* When loaded into s->T0, register operand 1 is zero/sign extended. */
X86_SPECIAL_SExtT0,
X86_SPECIAL_ZExtT0,
} X86InsnSpecial; } X86InsnSpecial;
/* /*
@ -267,6 +284,10 @@ struct X86DecodedInsn {
target_ulong immediate; target_ulong immediate;
AddressParts mem; AddressParts mem;
TCGv cc_dst, cc_src, cc_src2;
TCGv_i32 cc_op_dynamic;
int8_t cc_op;
uint8_t b; uint8_t b;
}; };

View File

@ -55,11 +55,6 @@ static void gen_NM_exception(DisasContext *s)
gen_exception(s, EXCP07_PREX); gen_exception(s, EXCP07_PREX);
} }
static void gen_illegal(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{
gen_illegal_opcode(s);
}
static void gen_load_ea(DisasContext *s, AddressParts *mem, bool is_vsib) static void gen_load_ea(DisasContext *s, AddressParts *mem, bool is_vsib)
{ {
TCGv ea = gen_lea_modrm_1(s, *mem, is_vsib); TCGv ea = gen_lea_modrm_1(s, *mem, is_vsib);
@ -237,9 +232,30 @@ static void gen_load(DisasContext *s, X86DecodedInsn *decode, int opn, TCGv v)
break; break;
case X86_OP_INT: case X86_OP_INT:
if (op->has_ea) { if (op->has_ea) {
gen_op_ld_v(s, op->ot, v, s->A0); if (v == s->T0 && decode->e.special == X86_SPECIAL_SExtT0) {
gen_op_ld_v(s, op->ot | MO_SIGN, v, s->A0);
} else { } else {
gen_op_mov_v_reg(s, op->ot, v, op->n); gen_op_ld_v(s, op->ot, v, s->A0);
}
} else if (op->ot == MO_8 && byte_reg_is_xH(s, op->n)) {
if (v == s->T0 && decode->e.special == X86_SPECIAL_SExtT0) {
tcg_gen_sextract_tl(v, cpu_regs[op->n - 4], 8, 8);
} else {
tcg_gen_extract_tl(v, cpu_regs[op->n - 4], 8, 8);
}
} else if (op->ot < MO_TL && v == s->T0 &&
(decode->e.special == X86_SPECIAL_SExtT0 ||
decode->e.special == X86_SPECIAL_ZExtT0)) {
if (decode->e.special == X86_SPECIAL_SExtT0) {
tcg_gen_ext_tl(v, cpu_regs[op->n], op->ot | MO_SIGN);
} else {
tcg_gen_ext_tl(v, cpu_regs[op->n], op->ot);
}
} else {
tcg_gen_mov_tl(v, cpu_regs[op->n]);
} }
break; break;
case X86_OP_IMM: case X86_OP_IMM:
@ -323,6 +339,19 @@ static inline int vector_len(DisasContext *s, X86DecodedInsn *decode)
return s->vex_l ? 32 : 16; return s->vex_l ? 32 : 16;
} }
static void prepare_update1_cc(X86DecodedInsn *decode, DisasContext *s, CCOp op)
{
decode->cc_dst = s->T0;
decode->cc_op = op;
}
static void prepare_update2_cc(X86DecodedInsn *decode, DisasContext *s, CCOp op)
{
decode->cc_src = s->T1;
decode->cc_dst = s->T0;
decode->cc_op = op;
}
static void gen_store_sse(DisasContext *s, X86DecodedInsn *decode, int src_ofs) static void gen_store_sse(DisasContext *s, X86DecodedInsn *decode, int src_ofs)
{ {
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
@ -1011,6 +1040,7 @@ static void gen_##uname(DisasContext *s, CPUX86State *env, X86DecodedInsn *decod
VSIB_AVX(VPGATHERD, vpgatherd) VSIB_AVX(VPGATHERD, vpgatherd)
VSIB_AVX(VPGATHERQ, vpgatherq) VSIB_AVX(VPGATHERQ, vpgatherq)
/* ADCX/ADOX do not have memory operands and can use set_cc_op. */
static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_op) static void gen_ADCOX(DisasContext *s, CPUX86State *env, MemOp ot, int cc_op)
{ {
int opposite_cc_op; int opposite_cc_op;
@ -1073,8 +1103,7 @@ static void gen_ANDN(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
tcg_gen_andc_tl(s->T0, s->T1, s->T0); tcg_gen_andc_tl(s->T0, s->T1, s->T0);
gen_op_update1_cc(s); prepare_update1_cc(decode, s, CC_OP_LOGICB + ot);
set_cc_op(s, CC_OP_LOGICB + ot);
} }
static void gen_BEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_BEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
@ -1089,9 +1118,6 @@ static void gen_BEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
* Shifts larger than operand size get zeros. * Shifts larger than operand size get zeros.
*/ */
tcg_gen_ext8u_tl(s->A0, s->T1); tcg_gen_ext8u_tl(s->A0, s->T1);
if (TARGET_LONG_BITS == 64 && ot == MO_32) {
tcg_gen_ext32u_tl(s->T0, s->T0);
}
tcg_gen_shr_tl(s->T0, s->T0, s->A0); tcg_gen_shr_tl(s->T0, s->T0, s->A0);
tcg_gen_movcond_tl(TCG_COND_LEU, s->T0, s->A0, bound, s->T0, zero); tcg_gen_movcond_tl(TCG_COND_LEU, s->T0, s->A0, bound, s->T0, zero);
@ -1105,10 +1131,10 @@ static void gen_BEXTR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
tcg_gen_movcond_tl(TCG_COND_LEU, s->T1, s->A0, bound, s->T1, zero); tcg_gen_movcond_tl(TCG_COND_LEU, s->T1, s->A0, bound, s->T1, zero);
tcg_gen_andc_tl(s->T0, s->T0, s->T1); tcg_gen_andc_tl(s->T0, s->T0, s->T1);
gen_op_update1_cc(s); prepare_update1_cc(decode, s, CC_OP_LOGICB + ot);
set_cc_op(s, CC_OP_LOGICB + ot);
} }
/* BLSI do not have memory operands and can use set_cc_op. */
static void gen_BLSI(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_BLSI(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
@ -1120,6 +1146,7 @@ static void gen_BLSI(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
set_cc_op(s, CC_OP_BMILGB + ot); set_cc_op(s, CC_OP_BMILGB + ot);
} }
/* BLSMSK do not have memory operands and can use set_cc_op. */
static void gen_BLSMSK(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_BLSMSK(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
@ -1131,6 +1158,7 @@ static void gen_BLSMSK(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode
set_cc_op(s, CC_OP_BMILGB + ot); set_cc_op(s, CC_OP_BMILGB + ot);
} }
/* BLSR do not have memory operands and can use set_cc_op. */
static void gen_BLSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_BLSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
@ -1151,18 +1179,119 @@ static void gen_BZHI(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
tcg_gen_ext8u_tl(s->T1, s->T1); tcg_gen_ext8u_tl(s->T1, s->T1);
tcg_gen_shl_tl(s->A0, mone, s->T1);
tcg_gen_movcond_tl(TCG_COND_LEU, s->A0, s->T1, bound, s->A0, zero);
tcg_gen_andc_tl(s->T0, s->T0, s->A0);
/* /*
* Note that since we're using BMILG (in order to get O * Note that since we're using BMILG (in order to get O
* cleared) we need to store the inverse into C. * cleared) we need to store the inverse into C.
*/ */
tcg_gen_setcond_tl(TCG_COND_LEU, cpu_cc_src, s->T1, bound); tcg_gen_setcond_tl(TCG_COND_LEU, s->T1, s->T1, bound);
prepare_update2_cc(decode, s, CC_OP_BMILGB + ot);
}
tcg_gen_shl_tl(s->A0, mone, s->T1); static void gen_CMPccXADD(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
tcg_gen_movcond_tl(TCG_COND_LEU, s->A0, s->T1, bound, s->A0, zero); {
tcg_gen_andc_tl(s->T0, s->T0, s->A0); TCGLabel *label_top = gen_new_label();
TCGLabel *label_bottom = gen_new_label();
TCGv oldv = tcg_temp_new();
TCGv newv = tcg_temp_new();
TCGv cmpv = tcg_temp_new();
TCGCond cond;
gen_op_update1_cc(s); TCGv cmp_lhs, cmp_rhs;
set_cc_op(s, CC_OP_BMILGB + ot); MemOp ot, ot_full;
int jcc_op = (decode->b >> 1) & 7;
static const TCGCond cond_table[8] = {
[JCC_O] = TCG_COND_LT, /* test sign bit by comparing against 0 */
[JCC_B] = TCG_COND_LTU,
[JCC_Z] = TCG_COND_EQ,
[JCC_BE] = TCG_COND_LEU,
[JCC_S] = TCG_COND_LT, /* test sign bit by comparing against 0 */
[JCC_P] = TCG_COND_EQ, /* even parity - tests low bit of popcount */
[JCC_L] = TCG_COND_LT,
[JCC_LE] = TCG_COND_LE,
};
cond = cond_table[jcc_op];
if (decode->b & 1) {
cond = tcg_invert_cond(cond);
}
ot = decode->op[0].ot;
ot_full = ot | MO_LE;
if (jcc_op >= JCC_S) {
/*
* Sign-extend values before subtracting for S, P (zero/sign extension
* does not matter there) L, LE and their inverses.
*/
ot_full |= MO_SIGN;
}
/*
* cmpv will be moved to cc_src *after* cpu_regs[] is written back, so use
* tcg_gen_ext_tl instead of gen_ext_tl.
*/
tcg_gen_ext_tl(cmpv, cpu_regs[decode->op[1].n], ot_full);
/*
* Cmpxchg loop starts here.
* - s->T1: addition operand (from decoder)
* - s->A0: dest address (from decoder)
* - s->cc_srcT: memory operand (lhs for comparison)
* - cmpv: rhs for comparison
*/
gen_set_label(label_top);
gen_op_ld_v(s, ot_full, s->cc_srcT, s->A0);
tcg_gen_sub_tl(s->T0, s->cc_srcT, cmpv);
/* Compute the comparison result by hand, to avoid clobbering cc_*. */
switch (jcc_op) {
case JCC_O:
/* (src1 ^ src2) & (src1 ^ dst). newv is only used here for a moment */
tcg_gen_xor_tl(newv, s->cc_srcT, s->T0);
tcg_gen_xor_tl(s->tmp0, s->cc_srcT, cmpv);
tcg_gen_and_tl(s->tmp0, s->tmp0, newv);
tcg_gen_sextract_tl(s->tmp0, s->tmp0, 0, 8 << ot);
cmp_lhs = s->tmp0, cmp_rhs = tcg_constant_tl(0);
break;
case JCC_P:
tcg_gen_ext8u_tl(s->tmp0, s->T0);
tcg_gen_ctpop_tl(s->tmp0, s->tmp0);
tcg_gen_andi_tl(s->tmp0, s->tmp0, 1);
cmp_lhs = s->tmp0, cmp_rhs = tcg_constant_tl(0);
break;
case JCC_S:
tcg_gen_sextract_tl(s->tmp0, s->T0, 0, 8 << ot);
cmp_lhs = s->tmp0, cmp_rhs = tcg_constant_tl(0);
break;
default:
cmp_lhs = s->cc_srcT, cmp_rhs = cmpv;
break;
}
/* Compute new value: if condition does not hold, just store back s->cc_srcT */
tcg_gen_add_tl(newv, s->cc_srcT, s->T1);
tcg_gen_movcond_tl(cond, newv, cmp_lhs, cmp_rhs, newv, s->cc_srcT);
tcg_gen_atomic_cmpxchg_tl(oldv, s->A0, s->cc_srcT, newv, s->mem_index, ot_full);
/* Exit unconditionally if cmpxchg succeeded. */
tcg_gen_brcond_tl(TCG_COND_EQ, oldv, s->cc_srcT, label_bottom);
/* Try again if there was actually a store to make. */
tcg_gen_brcond_tl(cond, cmp_lhs, cmp_rhs, label_top);
gen_set_label(label_bottom);
/* Store old value to registers only after a successful store. */
gen_writeback(s, decode, 1, s->cc_srcT);
decode->cc_dst = s->T0;
decode->cc_src = cmpv;
decode->cc_op = CC_OP_SUBB + ot;
} }
static void gen_CRC32(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_CRC32(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
@ -1242,9 +1371,7 @@ static void gen_LDMXCSR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decod
static void gen_MASKMOV(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_MASKMOV(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
tcg_gen_mov_tl(s->A0, cpu_regs[R_EDI]); gen_lea_v_seg(s, s->aflag, cpu_regs[R_EDI], R_DS, s->override);
gen_extu(s->aflag, s->A0);
gen_add_A0_ds_seg(s);
if (s->prefix & PREFIX_DATA) { if (s->prefix & PREFIX_DATA) {
gen_helper_maskmov_xmm(tcg_env, OP_PTR1, OP_PTR2, s->A0); gen_helper_maskmov_xmm(tcg_env, OP_PTR1, OP_PTR2, s->A0);
@ -1355,7 +1482,8 @@ static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
/* low part of result in VEX.vvvv, high in MODRM */ /* low part of result in VEX.vvvv, high in MODRM */
switch (ot) { switch (ot) {
default: case MO_32:
#ifdef TARGET_X86_64
tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0);
tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T1); tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T1);
tcg_gen_mulu2_i32(s->tmp2_i32, s->tmp3_i32, tcg_gen_mulu2_i32(s->tmp2_i32, s->tmp3_i32,
@ -1363,13 +1491,15 @@ static void gen_MULX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
tcg_gen_extu_i32_tl(cpu_regs[s->vex_v], s->tmp2_i32); tcg_gen_extu_i32_tl(cpu_regs[s->vex_v], s->tmp2_i32);
tcg_gen_extu_i32_tl(s->T0, s->tmp3_i32); tcg_gen_extu_i32_tl(s->T0, s->tmp3_i32);
break; break;
#ifdef TARGET_X86_64
case MO_64:
tcg_gen_mulu2_i64(cpu_regs[s->vex_v], s->T0, s->T0, s->T1);
break;
#endif
}
case MO_64:
#endif
tcg_gen_mulu2_tl(cpu_regs[s->vex_v], s->T0, s->T0, s->T1);
break;
default:
g_assert_not_reached();
}
} }
static void gen_PALIGNR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_PALIGNR(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
@ -1432,19 +1562,11 @@ static void gen_PCMPISTRM(DisasContext *s, CPUX86State *env, X86DecodedInsn *dec
static void gen_PDEP(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_PDEP(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[1].ot;
if (ot < MO_64) {
tcg_gen_ext32u_tl(s->T0, s->T0);
}
gen_helper_pdep(s->T0, s->T0, s->T1); gen_helper_pdep(s->T0, s->T0, s->T1);
} }
static void gen_PEXT(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_PEXT(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[1].ot;
if (ot < MO_64) {
tcg_gen_ext32u_tl(s->T0, s->T0);
}
gen_helper_pext(s->T0, s->T0, s->T1); gen_helper_pext(s->T0, s->T0, s->T1);
} }
@ -1772,14 +1894,24 @@ static void gen_PSLLDQ_i(DisasContext *s, CPUX86State *env, X86DecodedInsn *deco
static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode) static void gen_RORX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
{ {
MemOp ot = decode->op[0].ot; MemOp ot = decode->op[0].ot;
int b = decode->immediate; int mask = ot == MO_64 ? 63 : 31;
int b = decode->immediate & mask;
if (ot == MO_64) { switch (ot) {
tcg_gen_rotri_tl(s->T0, s->T0, b & 63); case MO_32:
} else { #ifdef TARGET_X86_64
tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0); tcg_gen_trunc_tl_i32(s->tmp2_i32, s->T0);
tcg_gen_rotri_i32(s->tmp2_i32, s->tmp2_i32, b & 31); tcg_gen_rotri_i32(s->tmp2_i32, s->tmp2_i32, b);
tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32); tcg_gen_extu_i32_tl(s->T0, s->tmp2_i32);
break;
case MO_64:
#endif
tcg_gen_rotri_tl(s->T0, s->T0, b);
break;
default:
g_assert_not_reached();
} }
} }
@ -1790,9 +1922,6 @@ static void gen_SARX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
mask = ot == MO_64 ? 63 : 31; mask = ot == MO_64 ? 63 : 31;
tcg_gen_andi_tl(s->T1, s->T1, mask); tcg_gen_andi_tl(s->T1, s->T1, mask);
if (ot != MO_64) {
tcg_gen_ext32s_tl(s->T0, s->T0);
}
tcg_gen_sar_tl(s->T0, s->T0, s->T1); tcg_gen_sar_tl(s->T0, s->T0, s->T1);
} }
@ -1867,9 +1996,6 @@ static void gen_SHRX(DisasContext *s, CPUX86State *env, X86DecodedInsn *decode)
mask = ot == MO_64 ? 63 : 31; mask = ot == MO_64 ? 63 : 31;
tcg_gen_andi_tl(s->T1, s->T1, mask); tcg_gen_andi_tl(s->T1, s->T1, mask);
if (ot != MO_64) {
tcg_gen_ext32u_tl(s->T0, s->T0);
}
tcg_gen_shr_tl(s->T0, s->T0, s->T1); tcg_gen_shr_tl(s->T0, s->T0, s->T1);
} }

View File

@ -28,7 +28,7 @@
G_NORETURN void helper_raise_interrupt(CPUX86State *env, int intno, G_NORETURN void helper_raise_interrupt(CPUX86State *env, int intno,
int next_eip_addend) int next_eip_addend)
{ {
raise_interrupt(env, intno, 1, 0, next_eip_addend); raise_interrupt(env, intno, next_eip_addend);
} }
G_NORETURN void helper_raise_exception(CPUX86State *env, int exception_index) G_NORETURN void helper_raise_exception(CPUX86State *env, int exception_index)
@ -112,10 +112,9 @@ void raise_interrupt2(CPUX86State *env, int intno,
/* shortcuts to generate exceptions */ /* shortcuts to generate exceptions */
G_NORETURN void raise_interrupt(CPUX86State *env, int intno, int is_int, G_NORETURN void raise_interrupt(CPUX86State *env, int intno, int next_eip_addend)
int error_code, int next_eip_addend)
{ {
raise_interrupt2(env, intno, is_int, error_code, next_eip_addend, 0); raise_interrupt2(env, intno, 1, 0, next_eip_addend, 0);
} }
G_NORETURN void raise_exception_err(CPUX86State *env, int exception_index, G_NORETURN void raise_exception_err(CPUX86State *env, int exception_index,

View File

@ -484,9 +484,8 @@ void helper_fcomi_ST0_FT0(CPUX86State *env)
FloatRelation ret; FloatRelation ret;
ret = floatx80_compare(ST0, FT0, &env->fp_status); ret = floatx80_compare(ST0, FT0, &env->fp_status);
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env) & ~(CC_Z | CC_P | CC_C);
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; CC_SRC = eflags | fcomi_ccval[ret + 1];
CC_SRC = eflags;
merge_exception_flags(env, old_flags); merge_exception_flags(env, old_flags);
} }
@ -497,9 +496,8 @@ void helper_fucomi_ST0_FT0(CPUX86State *env)
FloatRelation ret; FloatRelation ret;
ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status); ret = floatx80_compare_quiet(ST0, FT0, &env->fp_status);
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env) & ~(CC_Z | CC_P | CC_C);
eflags = (eflags & ~(CC_Z | CC_P | CC_C)) | fcomi_ccval[ret + 1]; CC_SRC = eflags | fcomi_ccval[ret + 1];
CC_SRC = eflags;
merge_exception_flags(env, old_flags); merge_exception_flags(env, old_flags);
} }

View File

@ -65,8 +65,7 @@ G_NORETURN void raise_exception_err(CPUX86State *env, int exception_index,
int error_code); int error_code);
G_NORETURN void raise_exception_err_ra(CPUX86State *env, int exception_index, G_NORETURN void raise_exception_err_ra(CPUX86State *env, int exception_index,
int error_code, uintptr_t retaddr); int error_code, uintptr_t retaddr);
G_NORETURN void raise_interrupt(CPUX86State *nenv, int intno, int is_int, G_NORETURN void raise_interrupt(CPUX86State *nenv, int intno, int next_eip_addend);
int error_code, int next_eip_addend);
G_NORETURN void handle_unaligned_access(CPUX86State *env, vaddr vaddr, G_NORETURN void handle_unaligned_access(CPUX86State *env, vaddr vaddr,
MMUAccessType access_type, MMUAccessType access_type,
uintptr_t retaddr); uintptr_t retaddr);

View File

@ -190,7 +190,7 @@ void helper_aaa(CPUX86State *env)
int al, ah, af; int al, ah, af;
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
af = eflags & CC_A; af = eflags & CC_A;
al = env->regs[R_EAX] & 0xff; al = env->regs[R_EAX] & 0xff;
ah = (env->regs[R_EAX] >> 8) & 0xff; ah = (env->regs[R_EAX] >> 8) & 0xff;
@ -214,7 +214,7 @@ void helper_aas(CPUX86State *env)
int al, ah, af; int al, ah, af;
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
af = eflags & CC_A; af = eflags & CC_A;
al = env->regs[R_EAX] & 0xff; al = env->regs[R_EAX] & 0xff;
ah = (env->regs[R_EAX] >> 8) & 0xff; ah = (env->regs[R_EAX] >> 8) & 0xff;
@ -237,7 +237,7 @@ void helper_daa(CPUX86State *env)
int old_al, al, af, cf; int old_al, al, af, cf;
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
cf = eflags & CC_C; cf = eflags & CC_C;
af = eflags & CC_A; af = eflags & CC_A;
old_al = al = env->regs[R_EAX] & 0xff; old_al = al = env->regs[R_EAX] & 0xff;
@ -264,7 +264,7 @@ void helper_das(CPUX86State *env)
int al, al1, af, cf; int al, al1, af, cf;
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
cf = eflags & CC_C; cf = eflags & CC_C;
af = eflags & CC_A; af = eflags & CC_A;
al = env->regs[R_EAX] & 0xff; al = env->regs[R_EAX] & 0xff;

View File

@ -41,9 +41,9 @@ void helper_into(CPUX86State *env, int next_eip_addend)
{ {
int eflags; int eflags;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
if (eflags & CC_O) { if (eflags & CC_O) {
raise_interrupt(env, EXCP04_INTO, 1, 0, next_eip_addend); raise_interrupt(env, EXCP04_INTO, next_eip_addend);
} }
} }

View File

@ -2230,7 +2230,7 @@ target_ulong helper_lsl(CPUX86State *env, target_ulong selector1)
int rpl, dpl, cpl, type; int rpl, dpl, cpl, type;
selector = selector1 & 0xffff; selector = selector1 & 0xffff;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
if ((selector & 0xfffc) == 0) { if ((selector & 0xfffc) == 0) {
goto fail; goto fail;
} }
@ -2277,7 +2277,7 @@ target_ulong helper_lar(CPUX86State *env, target_ulong selector1)
int rpl, dpl, cpl, type; int rpl, dpl, cpl, type;
selector = selector1 & 0xffff; selector = selector1 & 0xffff;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
if ((selector & 0xfffc) == 0) { if ((selector & 0xfffc) == 0) {
goto fail; goto fail;
} }
@ -2326,7 +2326,7 @@ void helper_verr(CPUX86State *env, target_ulong selector1)
int rpl, dpl, cpl; int rpl, dpl, cpl;
selector = selector1 & 0xffff; selector = selector1 & 0xffff;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
if ((selector & 0xfffc) == 0) { if ((selector & 0xfffc) == 0) {
goto fail; goto fail;
} }
@ -2364,7 +2364,7 @@ void helper_verw(CPUX86State *env, target_ulong selector1)
int rpl, dpl, cpl; int rpl, dpl, cpl;
selector = selector1 & 0xffff; selector = selector1 & 0xffff;
eflags = cpu_cc_compute_all(env, CC_OP); eflags = cpu_cc_compute_all(env);
if ((selector & 0xfffc) == 0) { if ((selector & 0xfffc) == 0) {
goto fail; goto fail;
} }

View File

@ -122,6 +122,7 @@ typedef struct DisasContext {
int cpuid_ext3_features; int cpuid_ext3_features;
int cpuid_7_0_ebx_features; int cpuid_7_0_ebx_features;
int cpuid_7_0_ecx_features; int cpuid_7_0_ecx_features;
int cpuid_7_1_eax_features;
int cpuid_xsave_features; int cpuid_xsave_features;
/* TCG local temps */ /* TCG local temps */
@ -522,9 +523,9 @@ void gen_op_add_reg_im(DisasContext *s, MemOp size, int reg, int32_t val)
gen_op_mov_reg_v(s, size, reg, s->tmp0); gen_op_mov_reg_v(s, size, reg, s->tmp0);
} }
static inline void gen_op_add_reg_T0(DisasContext *s, MemOp size, int reg) static inline void gen_op_add_reg(DisasContext *s, MemOp size, int reg, TCGv val)
{ {
tcg_gen_add_tl(s->tmp0, cpu_regs[reg], s->T0); tcg_gen_add_tl(s->tmp0, cpu_regs[reg], val);
gen_op_mov_reg_v(s, size, reg, s->tmp0); gen_op_mov_reg_v(s, size, reg, s->tmp0);
} }
@ -635,17 +636,17 @@ static TCGv eip_cur_tl(DisasContext *s)
} }
} }
/* Compute SEG:REG into A0. SEG is selected from the override segment /* Compute SEG:REG into DEST. SEG is selected from the override segment
(OVR_SEG) and the default segment (DEF_SEG). OVR_SEG may be -1 to (OVR_SEG) and the default segment (DEF_SEG). OVR_SEG may be -1 to
indicate no override. */ indicate no override. */
static void gen_lea_v_seg(DisasContext *s, MemOp aflag, TCGv a0, static void gen_lea_v_seg_dest(DisasContext *s, MemOp aflag, TCGv dest, TCGv a0,
int def_seg, int ovr_seg) int def_seg, int ovr_seg)
{ {
switch (aflag) { switch (aflag) {
#ifdef TARGET_X86_64 #ifdef TARGET_X86_64
case MO_64: case MO_64:
if (ovr_seg < 0) { if (ovr_seg < 0) {
tcg_gen_mov_tl(s->A0, a0); tcg_gen_mov_tl(dest, a0);
return; return;
} }
break; break;
@ -656,14 +657,14 @@ static void gen_lea_v_seg(DisasContext *s, MemOp aflag, TCGv a0,
ovr_seg = def_seg; ovr_seg = def_seg;
} }
if (ovr_seg < 0) { if (ovr_seg < 0) {
tcg_gen_ext32u_tl(s->A0, a0); tcg_gen_ext32u_tl(dest, a0);
return; return;
} }
break; break;
case MO_16: case MO_16:
/* 16 bit address */ /* 16 bit address */
tcg_gen_ext16u_tl(s->A0, a0); tcg_gen_ext16u_tl(dest, a0);
a0 = s->A0; a0 = dest;
if (ovr_seg < 0) { if (ovr_seg < 0) {
if (ADDSEG(s)) { if (ADDSEG(s)) {
ovr_seg = def_seg; ovr_seg = def_seg;
@ -680,17 +681,23 @@ static void gen_lea_v_seg(DisasContext *s, MemOp aflag, TCGv a0,
TCGv seg = cpu_seg_base[ovr_seg]; TCGv seg = cpu_seg_base[ovr_seg];
if (aflag == MO_64) { if (aflag == MO_64) {
tcg_gen_add_tl(s->A0, a0, seg); tcg_gen_add_tl(dest, a0, seg);
} else if (CODE64(s)) { } else if (CODE64(s)) {
tcg_gen_ext32u_tl(s->A0, a0); tcg_gen_ext32u_tl(dest, a0);
tcg_gen_add_tl(s->A0, s->A0, seg); tcg_gen_add_tl(dest, dest, seg);
} else { } else {
tcg_gen_add_tl(s->A0, a0, seg); tcg_gen_add_tl(dest, a0, seg);
tcg_gen_ext32u_tl(s->A0, s->A0); tcg_gen_ext32u_tl(dest, dest);
} }
} }
} }
static void gen_lea_v_seg(DisasContext *s, MemOp aflag, TCGv a0,
int def_seg, int ovr_seg)
{
gen_lea_v_seg_dest(s, aflag, s->A0, a0, def_seg, ovr_seg);
}
static inline void gen_string_movl_A0_ESI(DisasContext *s) static inline void gen_string_movl_A0_ESI(DisasContext *s)
{ {
gen_lea_v_seg(s, s->aflag, cpu_regs[R_ESI], R_DS, s->override); gen_lea_v_seg(s, s->aflag, cpu_regs[R_ESI], R_DS, s->override);
@ -701,10 +708,12 @@ static inline void gen_string_movl_A0_EDI(DisasContext *s)
gen_lea_v_seg(s, s->aflag, cpu_regs[R_EDI], R_ES, -1); gen_lea_v_seg(s, s->aflag, cpu_regs[R_EDI], R_ES, -1);
} }
static inline void gen_op_movl_T0_Dshift(DisasContext *s, MemOp ot) static inline TCGv gen_compute_Dshift(DisasContext *s, MemOp ot)
{ {
tcg_gen_ld32s_tl(s->T0, tcg_env, offsetof(CPUX86State, df)); TCGv dshift = tcg_temp_new();
tcg_gen_shli_tl(s->T0, s->T0, ot); tcg_gen_ld32s_tl(dshift, tcg_env, offsetof(CPUX86State, df));
tcg_gen_shli_tl(dshift, dshift, ot);
return dshift;
}; };
static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign) static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign)
@ -712,6 +721,9 @@ static TCGv gen_ext_tl(TCGv dst, TCGv src, MemOp size, bool sign)
if (size == MO_TL) { if (size == MO_TL) {
return src; return src;
} }
if (!dst) {
dst = tcg_temp_new();
}
tcg_gen_ext_tl(dst, src, size | (sign ? MO_SIGN : 0)); tcg_gen_ext_tl(dst, src, size | (sign ? MO_SIGN : 0));
return dst; return dst;
} }
@ -728,9 +740,9 @@ static void gen_exts(MemOp ot, TCGv reg)
static void gen_op_j_ecx(DisasContext *s, TCGCond cond, TCGLabel *label1) static void gen_op_j_ecx(DisasContext *s, TCGCond cond, TCGLabel *label1)
{ {
tcg_gen_mov_tl(s->tmp0, cpu_regs[R_ECX]); TCGv tmp = gen_ext_tl(NULL, cpu_regs[R_ECX], s->aflag, false);
gen_extu(s->aflag, s->tmp0);
tcg_gen_brcondi_tl(cond, s->tmp0, 0, label1); tcg_gen_brcondi_tl(cond, tmp, 0, label1);
} }
static inline void gen_op_jz_ecx(DisasContext *s, TCGLabel *label1) static inline void gen_op_jz_ecx(DisasContext *s, TCGLabel *label1)
@ -812,13 +824,16 @@ static bool gen_check_io(DisasContext *s, MemOp ot, TCGv_i32 port,
static void gen_movs(DisasContext *s, MemOp ot) static void gen_movs(DisasContext *s, MemOp ot)
{ {
TCGv dshift;
gen_string_movl_A0_ESI(s); gen_string_movl_A0_ESI(s);
gen_op_ld_v(s, ot, s->T0, s->A0); gen_op_ld_v(s, ot, s->T0, s->A0);
gen_string_movl_A0_EDI(s); gen_string_movl_A0_EDI(s);
gen_op_st_v(s, ot, s->T0, s->A0); gen_op_st_v(s, ot, s->T0, s->A0);
gen_op_movl_T0_Dshift(s, ot);
gen_op_add_reg_T0(s, s->aflag, R_ESI); dshift = gen_compute_Dshift(s, ot);
gen_op_add_reg_T0(s, s->aflag, R_EDI); gen_op_add_reg(s, s->aflag, R_ESI, dshift);
gen_op_add_reg(s, s->aflag, R_EDI, dshift);
} }
static void gen_op_update1_cc(DisasContext *s) static void gen_op_update1_cc(DisasContext *s)
@ -851,22 +866,22 @@ static void gen_op_update_neg_cc(DisasContext *s)
tcg_gen_movi_tl(s->cc_srcT, 0); tcg_gen_movi_tl(s->cc_srcT, 0);
} }
/* compute all eflags to cc_src */ /* compute all eflags to reg */
static void gen_compute_eflags(DisasContext *s) static void gen_mov_eflags(DisasContext *s, TCGv reg)
{ {
TCGv zero, dst, src1, src2; TCGv dst, src1, src2;
TCGv_i32 cc_op;
int live, dead; int live, dead;
if (s->cc_op == CC_OP_EFLAGS) { if (s->cc_op == CC_OP_EFLAGS) {
tcg_gen_mov_tl(reg, cpu_cc_src);
return; return;
} }
if (s->cc_op == CC_OP_CLR) { if (s->cc_op == CC_OP_CLR) {
tcg_gen_movi_tl(cpu_cc_src, CC_Z | CC_P); tcg_gen_movi_tl(reg, CC_Z | CC_P);
set_cc_op(s, CC_OP_EFLAGS);
return; return;
} }
zero = NULL;
dst = cpu_cc_dst; dst = cpu_cc_dst;
src1 = cpu_cc_src; src1 = cpu_cc_src;
src2 = cpu_cc_src2; src2 = cpu_cc_src2;
@ -875,7 +890,7 @@ static void gen_compute_eflags(DisasContext *s)
live = cc_op_live[s->cc_op] & ~USES_CC_SRCT; live = cc_op_live[s->cc_op] & ~USES_CC_SRCT;
dead = live ^ (USES_CC_DST | USES_CC_SRC | USES_CC_SRC2); dead = live ^ (USES_CC_DST | USES_CC_SRC | USES_CC_SRC2);
if (dead) { if (dead) {
zero = tcg_constant_tl(0); TCGv zero = tcg_constant_tl(0);
if (dead & USES_CC_DST) { if (dead & USES_CC_DST) {
dst = zero; dst = zero;
} }
@ -887,8 +902,18 @@ static void gen_compute_eflags(DisasContext *s)
} }
} }
gen_update_cc_op(s); if (s->cc_op != CC_OP_DYNAMIC) {
gen_helper_cc_compute_all(cpu_cc_src, dst, src1, src2, cpu_cc_op); cc_op = tcg_constant_i32(s->cc_op);
} else {
cc_op = cpu_cc_op;
}
gen_helper_cc_compute_all(reg, dst, src1, src2, cc_op);
}
/* compute all eflags to cc_src */
static void gen_compute_eflags(DisasContext *s)
{
gen_mov_eflags(s, cpu_cc_src);
set_cc_op(s, CC_OP_EFLAGS); set_cc_op(s, CC_OP_EFLAGS);
} }
@ -1020,6 +1045,9 @@ static CCPrepare gen_prepare_eflags_o(DisasContext *s, TCGv reg)
case CC_OP_CLR: case CC_OP_CLR:
case CC_OP_POPCNT: case CC_OP_POPCNT:
return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 }; return (CCPrepare) { .cond = TCG_COND_NEVER, .mask = -1 };
case CC_OP_MULB ... CC_OP_MULQ:
return (CCPrepare) { .cond = TCG_COND_NE,
.reg = cpu_cc_src, .mask = -1 };
default: default:
gen_compute_eflags(s); gen_compute_eflags(s);
return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src, return (CCPrepare) { .cond = TCG_COND_NE, .reg = cpu_cc_src,
@ -1126,10 +1154,9 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int b, TCGv reg)
if (reg == cpu_cc_src) { if (reg == cpu_cc_src) {
reg = s->tmp0; reg = s->tmp0;
} }
tcg_gen_shri_tl(reg, cpu_cc_src, 4); /* CC_O -> CC_S */ tcg_gen_addi_tl(reg, cpu_cc_src, CC_O - CC_S);
tcg_gen_xor_tl(reg, reg, cpu_cc_src);
cc = (CCPrepare) { .cond = TCG_COND_NE, .reg = reg, cc = (CCPrepare) { .cond = TCG_COND_NE, .reg = reg,
.mask = CC_S }; .mask = CC_O };
break; break;
default: default:
case JCC_LE: case JCC_LE:
@ -1137,10 +1164,9 @@ static CCPrepare gen_prepare_cc(DisasContext *s, int b, TCGv reg)
if (reg == cpu_cc_src) { if (reg == cpu_cc_src) {
reg = s->tmp0; reg = s->tmp0;
} }
tcg_gen_shri_tl(reg, cpu_cc_src, 4); /* CC_O -> CC_S */ tcg_gen_addi_tl(reg, cpu_cc_src, CC_O - CC_S);
tcg_gen_xor_tl(reg, reg, cpu_cc_src);
cc = (CCPrepare) { .cond = TCG_COND_NE, .reg = reg, cc = (CCPrepare) { .cond = TCG_COND_NE, .reg = reg,
.mask = CC_S | CC_Z }; .mask = CC_O | CC_Z };
break; break;
} }
break; break;
@ -1239,11 +1265,9 @@ static TCGLabel *gen_jz_ecx_string(DisasContext *s)
static void gen_stos(DisasContext *s, MemOp ot) static void gen_stos(DisasContext *s, MemOp ot)
{ {
gen_op_mov_v_reg(s, MO_32, s->T0, R_EAX);
gen_string_movl_A0_EDI(s); gen_string_movl_A0_EDI(s);
gen_op_st_v(s, ot, s->T0, s->A0); gen_op_st_v(s, ot, s->T0, s->A0);
gen_op_movl_T0_Dshift(s, ot); gen_op_add_reg(s, s->aflag, R_EDI, gen_compute_Dshift(s, ot));
gen_op_add_reg_T0(s, s->aflag, R_EDI);
} }
static void gen_lods(DisasContext *s, MemOp ot) static void gen_lods(DisasContext *s, MemOp ot)
@ -1251,28 +1275,33 @@ static void gen_lods(DisasContext *s, MemOp ot)
gen_string_movl_A0_ESI(s); gen_string_movl_A0_ESI(s);
gen_op_ld_v(s, ot, s->T0, s->A0); gen_op_ld_v(s, ot, s->T0, s->A0);
gen_op_mov_reg_v(s, ot, R_EAX, s->T0); gen_op_mov_reg_v(s, ot, R_EAX, s->T0);
gen_op_movl_T0_Dshift(s, ot); gen_op_add_reg(s, s->aflag, R_ESI, gen_compute_Dshift(s, ot));
gen_op_add_reg_T0(s, s->aflag, R_ESI);
} }
static void gen_scas(DisasContext *s, MemOp ot) static void gen_scas(DisasContext *s, MemOp ot)
{ {
gen_string_movl_A0_EDI(s); gen_string_movl_A0_EDI(s);
gen_op_ld_v(s, ot, s->T1, s->A0); gen_op_ld_v(s, ot, s->T1, s->A0);
gen_op(s, OP_CMPL, ot, R_EAX); tcg_gen_mov_tl(cpu_cc_src, s->T1);
gen_op_movl_T0_Dshift(s, ot); tcg_gen_mov_tl(s->cc_srcT, s->T0);
gen_op_add_reg_T0(s, s->aflag, R_EDI); tcg_gen_sub_tl(cpu_cc_dst, s->T0, s->T1);
set_cc_op(s, CC_OP_SUBB + ot);
gen_op_add_reg(s, s->aflag, R_EDI, gen_compute_Dshift(s, ot));
} }
static void gen_cmps(DisasContext *s, MemOp ot) static void gen_cmps(DisasContext *s, MemOp ot)
{ {
TCGv dshift;
gen_string_movl_A0_EDI(s); gen_string_movl_A0_EDI(s);
gen_op_ld_v(s, ot, s->T1, s->A0); gen_op_ld_v(s, ot, s->T1, s->A0);
gen_string_movl_A0_ESI(s); gen_string_movl_A0_ESI(s);
gen_op(s, OP_CMPL, ot, OR_TMP0); gen_op(s, OP_CMPL, ot, OR_TMP0);
gen_op_movl_T0_Dshift(s, ot);
gen_op_add_reg_T0(s, s->aflag, R_ESI); dshift = gen_compute_Dshift(s, ot);
gen_op_add_reg_T0(s, s->aflag, R_EDI); gen_op_add_reg(s, s->aflag, R_ESI, dshift);
gen_op_add_reg(s, s->aflag, R_EDI, dshift);
} }
static void gen_bpt_io(DisasContext *s, TCGv_i32 t_port, int ot) static void gen_bpt_io(DisasContext *s, TCGv_i32 t_port, int ot)
@ -1300,8 +1329,7 @@ static void gen_ins(DisasContext *s, MemOp ot)
tcg_gen_andi_i32(s->tmp2_i32, s->tmp2_i32, 0xffff); tcg_gen_andi_i32(s->tmp2_i32, s->tmp2_i32, 0xffff);
gen_helper_in_func(ot, s->T0, s->tmp2_i32); gen_helper_in_func(ot, s->T0, s->tmp2_i32);
gen_op_st_v(s, ot, s->T0, s->A0); gen_op_st_v(s, ot, s->T0, s->A0);
gen_op_movl_T0_Dshift(s, ot); gen_op_add_reg(s, s->aflag, R_EDI, gen_compute_Dshift(s, ot));
gen_op_add_reg_T0(s, s->aflag, R_EDI);
gen_bpt_io(s, s->tmp2_i32, ot); gen_bpt_io(s, s->tmp2_i32, ot);
} }
@ -1314,8 +1342,7 @@ static void gen_outs(DisasContext *s, MemOp ot)
tcg_gen_andi_i32(s->tmp2_i32, s->tmp2_i32, 0xffff); tcg_gen_andi_i32(s->tmp2_i32, s->tmp2_i32, 0xffff);
tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T0); tcg_gen_trunc_tl_i32(s->tmp3_i32, s->T0);
gen_helper_out_func(ot, s->tmp2_i32, s->tmp3_i32); gen_helper_out_func(ot, s->tmp2_i32, s->tmp3_i32);
gen_op_movl_T0_Dshift(s, ot); gen_op_add_reg(s, s->aflag, R_ESI, gen_compute_Dshift(s, ot));
gen_op_add_reg_T0(s, s->aflag, R_ESI);
gen_bpt_io(s, s->tmp2_i32, ot); gen_bpt_io(s, s->tmp2_i32, ot);
} }
@ -2474,14 +2501,10 @@ static void gen_jcc(DisasContext *s, int b, int diff)
gen_jmp_rel(s, s->dflag, diff, 0); gen_jmp_rel(s, s->dflag, diff, 0);
} }
static void gen_cmovcc1(CPUX86State *env, DisasContext *s, MemOp ot, int b, static void gen_cmovcc1(DisasContext *s, int b, TCGv dest, TCGv src)
int modrm, int reg)
{ {
CCPrepare cc; CCPrepare cc = gen_prepare_cc(s, b, s->T1);
gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0);
cc = gen_prepare_cc(s, b, s->T1);
if (cc.mask != -1) { if (cc.mask != -1) {
TCGv t0 = tcg_temp_new(); TCGv t0 = tcg_temp_new();
tcg_gen_andi_tl(t0, cc.reg, cc.mask); tcg_gen_andi_tl(t0, cc.reg, cc.mask);
@ -2491,9 +2514,7 @@ static void gen_cmovcc1(CPUX86State *env, DisasContext *s, MemOp ot, int b,
cc.reg2 = tcg_constant_tl(cc.imm); cc.reg2 = tcg_constant_tl(cc.imm);
} }
tcg_gen_movcond_tl(cc.cond, s->T0, cc.reg, cc.reg2, tcg_gen_movcond_tl(cc.cond, dest, cc.reg, cc.reg2, src, dest);
s->T0, cpu_regs[reg]);
gen_op_mov_reg_v(s, ot, reg, s->T0);
} }
static inline void gen_op_movl_T0_seg(DisasContext *s, X86Seg seg_reg) static inline void gen_op_movl_T0_seg(DisasContext *s, X86Seg seg_reg)
@ -2560,7 +2581,7 @@ static void gen_push_v(DisasContext *s, TCGv val)
if (!CODE64(s)) { if (!CODE64(s)) {
if (ADDSEG(s)) { if (ADDSEG(s)) {
new_esp = s->tmp4; new_esp = tcg_temp_new();
tcg_gen_mov_tl(new_esp, s->A0); tcg_gen_mov_tl(new_esp, s->A0);
} }
gen_lea_v_seg(s, a_ot, s->A0, R_SS, -1); gen_lea_v_seg(s, a_ot, s->A0, R_SS, -1);
@ -2575,8 +2596,8 @@ static MemOp gen_pop_T0(DisasContext *s)
{ {
MemOp d_ot = mo_pushpop(s, s->dflag); MemOp d_ot = mo_pushpop(s, s->dflag);
gen_lea_v_seg(s, mo_stacksize(s), cpu_regs[R_ESP], R_SS, -1); gen_lea_v_seg_dest(s, mo_stacksize(s), s->T0, cpu_regs[R_ESP], R_SS, -1);
gen_op_ld_v(s, d_ot, s->T0, s->A0); gen_op_ld_v(s, d_ot, s->T0, s->T0);
return d_ot; return d_ot;
} }
@ -4182,7 +4203,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
tcg_gen_mov_tl(s->A0, cpu_regs[R_EBX]); tcg_gen_mov_tl(s->A0, cpu_regs[R_EBX]);
tcg_gen_ext8u_tl(s->T0, cpu_regs[R_EAX]); tcg_gen_ext8u_tl(s->T0, cpu_regs[R_EAX]);
tcg_gen_add_tl(s->A0, s->A0, s->T0); tcg_gen_add_tl(s->A0, s->A0, s->T0);
gen_extu(s->aflag, s->A0);
gen_add_A0_ds_seg(s); gen_add_A0_ds_seg(s);
gen_op_ld_v(s, MO_8, s->T0, s->A0); gen_op_ld_v(s, MO_8, s->T0, s->A0);
gen_op_mov_reg_v(s, MO_8, R_EAX, s->T0); gen_op_mov_reg_v(s, MO_8, R_EAX, s->T0);
@ -4930,6 +4950,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
case 0xaa: /* stosS */ case 0xaa: /* stosS */
case 0xab: case 0xab:
ot = mo_b_d(b, dflag); ot = mo_b_d(b, dflag);
gen_op_mov_v_reg(s, MO_32, s->T0, R_EAX);
if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) { if (prefixes & (PREFIX_REPZ | PREFIX_REPNZ)) {
gen_repz_stos(s, ot); gen_repz_stos(s, ot);
} else { } else {
@ -4948,6 +4969,7 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
case 0xae: /* scasS */ case 0xae: /* scasS */
case 0xaf: case 0xaf:
ot = mo_b_d(b, dflag); ot = mo_b_d(b, dflag);
gen_op_mov_v_reg(s, MO_32, s->T0, R_EAX);
if (prefixes & PREFIX_REPNZ) { if (prefixes & PREFIX_REPNZ) {
gen_repz_scas(s, ot, 1); gen_repz_scas(s, ot, 1);
} else if (prefixes & PREFIX_REPZ) { } else if (prefixes & PREFIX_REPZ) {
@ -5201,7 +5223,9 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
ot = dflag; ot = dflag;
modrm = x86_ldub_code(env, s); modrm = x86_ldub_code(env, s);
reg = ((modrm >> 3) & 7) | REX_R(s); reg = ((modrm >> 3) & 7) | REX_R(s);
gen_cmovcc1(env, s, ot, b, modrm, reg); gen_ldst_modrm(env, s, modrm, ot, OR_TMP0, 0);
gen_cmovcc1(s, b ^ 1, s->T0, cpu_regs[reg]);
gen_op_mov_reg_v(s, ot, reg, s->T0);
break; break;
/************************/ /************************/
@ -5834,7 +5858,6 @@ static bool disas_insn(DisasContext *s, CPUState *cpu)
gen_update_cc_op(s); gen_update_cc_op(s);
gen_update_eip_cur(s); gen_update_eip_cur(s);
tcg_gen_mov_tl(s->A0, cpu_regs[R_EAX]); tcg_gen_mov_tl(s->A0, cpu_regs[R_EAX]);
gen_extu(s->aflag, s->A0);
gen_add_A0_ds_seg(s); gen_add_A0_ds_seg(s);
gen_helper_monitor(tcg_env, s->A0); gen_helper_monitor(tcg_env, s->A0);
break; break;
@ -6941,6 +6964,7 @@ static void i386_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cpu)
dc->cpuid_ext3_features = env->features[FEAT_8000_0001_ECX]; dc->cpuid_ext3_features = env->features[FEAT_8000_0001_ECX];
dc->cpuid_7_0_ebx_features = env->features[FEAT_7_0_EBX]; dc->cpuid_7_0_ebx_features = env->features[FEAT_7_0_EBX];
dc->cpuid_7_0_ecx_features = env->features[FEAT_7_0_ECX]; dc->cpuid_7_0_ecx_features = env->features[FEAT_7_0_ECX];
dc->cpuid_7_1_eax_features = env->features[FEAT_7_1_EAX];
dc->cpuid_xsave_features = env->features[FEAT_XSAVE]; dc->cpuid_xsave_features = env->features[FEAT_XSAVE];
dc->jmp_opt = !((cflags & CF_NO_GOTO_TB) || dc->jmp_opt = !((cflags & CF_NO_GOTO_TB) ||
(flags & (HF_TF_MASK | HF_INHIBIT_IRQ_MASK))); (flags & (HF_TF_MASK | HF_INHIBIT_IRQ_MASK)));

View File

@ -12,7 +12,7 @@ if have_system
subdir('sysemu') subdir('sysemu')
endif endif
if 'CONFIG_TCG' in config_all if 'CONFIG_TCG' in config_all_accel
subdir('tcg') subdir('tcg')
endif endif

View File

@ -22,7 +22,7 @@ if get_option('tcg_interpreter')
tcg_ss.add(files('tci.c')) tcg_ss.add(files('tci.c'))
endif endif
tcg_ss = tcg_ss.apply(config_targetos, strict: false) tcg_ss = tcg_ss.apply({})
libtcg_user = static_library('tcg_user', libtcg_user = static_library('tcg_user',
tcg_ss.sources() + genh, tcg_ss.sources() + genh,

View File

@ -3,7 +3,7 @@ qht_bench = executable('qht-bench',
sources: 'qht-bench.c', sources: 'qht-bench.c',
dependencies: [qemuutil]) dependencies: [qemuutil])
qtree_bench = executable('qtree-bench', executable('qtree-bench',
sources: 'qtree-bench.c', sources: 'qtree-bench.c',
dependencies: [qemuutil]) dependencies: [qemuutil])

View File

@ -1,9 +1,9 @@
if 'CONFIG_TCG' not in config_all if 'CONFIG_TCG' not in config_all_accel
subdir_done() subdir_done()
endif endif
# There are namespace pollution issues on Windows, due to osdep.h # There are namespace pollution issues on Windows, due to osdep.h
# bringing in Windows headers that define a FLOAT128 type. # bringing in Windows headers that define a FLOAT128 type.
if targetos == 'windows' if host_os == 'windows'
subdir_done() subdir_done()
endif endif

View File

@ -68,7 +68,7 @@ test_deps = {
'test-qht-par': qht_bench, 'test-qht-par': qht_bench,
} }
if have_tools and have_vhost_user and targetos == 'linux' if have_tools and have_vhost_user and host_os == 'linux'
executable('vhost-user-bridge', executable('vhost-user-bridge',
sources: files('vhost-user-bridge.c'), sources: files('vhost-user-bridge.c'),
dependencies: [qemuutil, vhost_user]) dependencies: [qemuutil, vhost_user])
@ -76,7 +76,7 @@ endif
subdir('decode') subdir('decode')
if 'CONFIG_TCG' in config_all if 'CONFIG_TCG' in config_all_accel
subdir('fp') subdir('fp')
endif endif

View File

@ -1,7 +1,7 @@
t = [] t = []
if get_option('plugins') if get_option('plugins')
foreach i : ['bb', 'empty', 'insn', 'mem', 'syscall'] foreach i : ['bb', 'empty', 'insn', 'mem', 'syscall']
if targetos == 'windows' if host_os == 'windows'
t += shared_module(i, files(i + '.c') + '../../contrib/plugins/win32_linker.c', t += shared_module(i, files(i + '.c') + '../../contrib/plugins/win32_linker.c',
include_directories: '../../include/qemu', include_directories: '../../include/qemu',
link_depends: [win32_qemu_plugin_api_lib], link_depends: [win32_qemu_plugin_api_lib],

View File

@ -1,4 +1,4 @@
if not have_tools or targetos == 'windows' if not have_tools or host_os == 'windows'
subdir_done() subdir_done()
endif endif

View File

@ -38,8 +38,8 @@ qtests_cxl = \
# for the availability of the default NICs in the tests # for the availability of the default NICs in the tests
qtests_filter = \ qtests_filter = \
(get_option('default_devices') and slirp.found() ? ['test-netfilter'] : []) + \ (get_option('default_devices') and slirp.found() ? ['test-netfilter'] : []) + \
(get_option('default_devices') and targetos != 'windows' ? ['test-filter-mirror'] : []) + \ (get_option('default_devices') and host_os != 'windows' ? ['test-filter-mirror'] : []) + \
(get_option('default_devices') and targetos != 'windows' ? ['test-filter-redirector'] : []) (get_option('default_devices') and host_os != 'windows' ? ['test-filter-redirector'] : [])
qtests_i386 = \ qtests_i386 = \
(slirp.found() ? ['pxe-test'] : []) + \ (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_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \ (config_all_devices.has_key('CONFIG_SGA') ? ['boot-serial-test'] : []) + \
(config_all_devices.has_key('CONFIG_ISA_IPMI_KCS') ? ['ipmi-kcs-test'] : []) + \ (config_all_devices.has_key('CONFIG_ISA_IPMI_KCS') ? ['ipmi-kcs-test'] : []) + \
(targetos == 'linux' and \ (host_os == 'linux' and \
config_all_devices.has_key('CONFIG_ISA_IPMI_BT') 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_IPMI_EXTERN') ? ['ipmi-bt-test'] : []) + \
(config_all_devices.has_key('CONFIG_WDT_IB700') ? ['wdt_ib700-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_SB16') ? ['fuzz-sb16-test'] : []) + \
(config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \ (config_all_devices.has_key('CONFIG_SDHCI_PCI') ? ['fuzz-sdcard-test'] : []) + \
(config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) + \ (config_all_devices.has_key('CONFIG_ESP_PCI') ? ['am53c974-test'] : []) + \
(targetos != 'windows' and \ (host_os != 'windows' and \
config_all_devices.has_key('CONFIG_ACPI_ERST') ? ['erst-test'] : []) + \ 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_PCIE_PORT') and \
config_all_devices.has_key('CONFIG_VIRTIO_NET') and \ config_all_devices.has_key('CONFIG_VIRTIO_NET') and \
@ -155,8 +155,8 @@ qtests_ppc = \
qtests_filter + \ qtests_filter + \
(config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \ (config_all_devices.has_key('CONFIG_ISA_TESTDEV') ? ['endianness-test'] : []) + \
(config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \ (config_all_devices.has_key('CONFIG_M48T59') ? ['m48t59-test'] : []) + \
(config_all.has_key('CONFIG_TCG') ? ['prom-env-test'] : []) + \ (config_all_accel.has_key('CONFIG_TCG') ? ['prom-env-test'] : []) + \
(config_all.has_key('CONFIG_TCG') ? ['boot-serial-test'] : []) + \ (config_all_accel.has_key('CONFIG_TCG') ? ['boot-serial-test'] : []) + \
['boot-order-test'] ['boot-order-test']
qtests_ppc64 = \ qtests_ppc64 = \
@ -213,12 +213,12 @@ qtests_arm = \
# TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional # TODO: once aarch64 TCG is fixed on ARM 32 bit host, make bios-tables-test unconditional
qtests_aarch64 = \ qtests_aarch64 = \
(cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \ (cpu != 'arm' and unpack_edk2_blobs ? ['bios-tables-test'] : []) + \
(config_all.has_key('CONFIG_TCG') and config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? \ (config_all_accel.has_key('CONFIG_TCG') and config_all_devices.has_key('CONFIG_TPM_TIS_SYSBUS') ? \
['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \ ['tpm-tis-device-test', 'tpm-tis-device-swtpm-test'] : []) + \
(config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \ (config_all_devices.has_key('CONFIG_XLNX_ZYNQMP_ARM') ? ['xlnx-can-test', 'fuzz-xlnx-dp-test'] : []) + \
(config_all_devices.has_key('CONFIG_XLNX_VERSAL') ? ['xlnx-canfd-test', 'xlnx-versal-trng-test'] : []) + \ (config_all_devices.has_key('CONFIG_XLNX_VERSAL') ? ['xlnx-canfd-test', 'xlnx-versal-trng-test'] : []) + \
(config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test'] : []) + \ (config_all_devices.has_key('CONFIG_RASPI') ? ['bcm2835-dma-test'] : []) + \
(config_all.has_key('CONFIG_TCG') and \ (config_all_accel.has_key('CONFIG_TCG') and \
config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test'] : []) + \ config_all_devices.has_key('CONFIG_TPM_TIS_I2C') ? ['tpm-tis-i2c-test'] : []) + \
['arm-cpu-features', ['arm-cpu-features',
'numa-test', 'numa-test',
@ -277,7 +277,7 @@ if config_all_devices.has_key('CONFIG_VIRTIO_SERIAL')
qos_test_ss.add(files('virtio-serial-test.c')) qos_test_ss.add(files('virtio-serial-test.c'))
endif endif
if targetos != 'windows' if host_os != 'windows'
qos_test_ss.add(files('e1000e-test.c')) qos_test_ss.add(files('e1000e-test.c'))
endif endif
if have_virtfs if have_virtfs
@ -310,7 +310,7 @@ qtests = {
'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'], 'ivshmem-test': [rt, '../../contrib/ivshmem-server/ivshmem-server.c'],
'migration-test': migration_files, 'migration-test': migration_files,
'pxe-test': files('boot-sector.c'), 'pxe-test': files('boot-sector.c'),
'qos-test': [chardev, io, qos_test_ss.apply(config_targetos, strict: false).sources()], 'qos-test': [chardev, io, qos_test_ss.apply({}).sources()],
'tpm-crb-swtpm-test': [io, tpmemu_files], 'tpm-crb-swtpm-test': [io, tpmemu_files],
'tpm-crb-test': [io, tpmemu_files], 'tpm-crb-test': [io, tpmemu_files],
'tpm-tis-swtpm-test': [io, tpmemu_files, 'tpm-tis-util.c'], 'tpm-tis-swtpm-test': [io, tpmemu_files, 'tpm-tis-util.c'],

View File

@ -13,7 +13,7 @@ config-cc.mak: Makefile
I386_SRCS=$(notdir $(wildcard $(I386_SRC)/*.c)) I386_SRCS=$(notdir $(wildcard $(I386_SRC)/*.c))
ALL_X86_TESTS=$(I386_SRCS:.c=) ALL_X86_TESTS=$(I386_SRCS:.c=)
SKIP_I386_TESTS=test-i386-ssse3 test-avx test-3dnow test-mmx SKIP_I386_TESTS=test-i386-ssse3 test-avx test-3dnow test-mmx test-flags
X86_64_TESTS:=$(filter test-i386-adcox test-i386-bmi2 $(SKIP_I386_TESTS), $(ALL_X86_TESTS)) X86_64_TESTS:=$(filter test-i386-adcox test-i386-bmi2 $(SKIP_I386_TESTS), $(ALL_X86_TESTS))
test-i386-sse-exceptions: CFLAGS += -msse4.1 -mfpmath=sse test-i386-sse-exceptions: CFLAGS += -msse4.1 -mfpmath=sse

View File

@ -0,0 +1,37 @@
#define _GNU_SOURCE
#include <sys/mman.h>
#include <signal.h>
#include <stdio.h>
#include <assert.h>
volatile unsigned long flags;
volatile unsigned long flags_after;
int *addr;
void sigsegv(int sig, siginfo_t *info, ucontext_t *uc)
{
flags = uc->uc_mcontext.gregs[REG_EFL];
mprotect(addr, 4096, PROT_READ|PROT_WRITE);
}
int main()
{
struct sigaction sa = { .sa_handler = (void *)sigsegv, .sa_flags = SA_SIGINFO };
sigaction(SIGSEGV, &sa, NULL);
/* fault in the page then protect it */
addr = mmap (NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANON, -1, 0);
*addr = 0x1234;
mprotect(addr, 4096, PROT_READ);
asm("# set flags to all ones \n"
"mov $-1, %%eax \n"
"movq addr, %%rdi \n"
"sahf \n"
"sub %%eax, (%%rdi) \n"
"pushf \n"
"pop flags_after(%%rip) \n" : : : "eax", "edi", "memory");
/* OF can have any value before the SUB instruction. */
assert((flags & 0xff) == 0xd7 && (flags_after & 0x8ff) == 0x17);
}

View File

@ -100,7 +100,7 @@ if have_block
} }
if gnutls.found() and \ if gnutls.found() and \
tasn1.found() and \ tasn1.found() and \
targetos != 'windows' host_os != 'windows'
tests += { tests += {
'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c', 'test-crypto-tlscredsx509': ['crypto-tls-x509-helpers.c', 'pkix_asn1_tab.c',
tasn1, crypto, gnutls], tasn1, crypto, gnutls],
@ -115,7 +115,7 @@ if have_block
if xts == 'private' if xts == 'private'
tests += {'test-crypto-xts': [crypto, io]} tests += {'test-crypto-xts': [crypto, io]}
endif endif
if targetos != 'windows' if host_os != 'windows'
tests += { tests += {
'test-image-locking': [testblock], 'test-image-locking': [testblock],
'test-nested-aio-poll': [testblock], 'test-nested-aio-poll': [testblock],
@ -150,7 +150,7 @@ if have_system
# are not runnable under TSan due to a known issue. # are not runnable under TSan due to a known issue.
# https://github.com/google/sanitizers/issues/1116 # https://github.com/google/sanitizers/issues/1116
if not get_option('tsan') if not get_option('tsan')
if targetos != 'windows' if host_os != 'windows'
tests += { tests += {
'test-char': ['socket-helpers.c', qom, io, chardev] 'test-char': ['socket-helpers.c', qom, io, chardev]
} }
@ -162,7 +162,7 @@ if have_system
endif endif
endif endif
if have_ga and targetos == 'linux' if have_ga and host_os == 'linux'
tests += {'test-qga': ['../qtest/libqmp.c']} tests += {'test-qga': ['../qtest/libqmp.c']}
test_deps += {'test-qga': qga} test_deps += {'test-qga': qga}
endif endif

View File

@ -71,7 +71,7 @@
:dbus:iface:`org.qemu.Display1.Listener` interface. :dbus:iface:`org.qemu.Display1.Listener` interface.
--> -->
<method name="RegisterListener"> <method name="RegisterListener">
<?if $(env.TARGETOS) == windows?> <?if $(env.HOST_OS) == windows?>
<arg type="ay" name="listener" direction="in"> <arg type="ay" name="listener" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/> <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg> </arg>
@ -370,7 +370,7 @@
</arg> </arg>
</method> </method>
<?if $(env.TARGETOS) != windows?> <?if $(env.HOST_OS) != windows?>
<!-- <!--
ScanoutDMABUF: ScanoutDMABUF:
@dmabuf: the DMABUF file descriptor. @dmabuf: the DMABUF file descriptor.
@ -694,7 +694,7 @@
:dbus:iface:`org.qemu.Display1.AudioOutListener` interface. :dbus:iface:`org.qemu.Display1.AudioOutListener` interface.
--> -->
<method name="RegisterOutListener"> <method name="RegisterOutListener">
<?if $(env.TARGETOS) == windows?> <?if $(env.HOST_OS) == windows?>
<arg type="ay" name="listener" direction="in"> <arg type="ay" name="listener" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/> <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg> </arg>
@ -715,7 +715,7 @@
:dbus:iface:`org.qemu.Display1.AudioInListener` interface. :dbus:iface:`org.qemu.Display1.AudioInListener` interface.
--> -->
<method name="RegisterInListener"> <method name="RegisterInListener">
<?if $(env.TARGETOS) == windows?> <?if $(env.HOST_OS) == windows?>
<arg type="ay" name="listener" direction="in"> <arg type="ay" name="listener" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/> <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg> </arg>
@ -976,7 +976,7 @@
The current handler, if any, will be replaced. The current handler, if any, will be replaced.
--> -->
<method name="Register"> <method name="Register">
<?if $(env.TARGETOS) == windows?> <?if $(env.HOST_OS) == windows?>
<arg type="ay" name="listener" direction="in"> <arg type="ay" name="listener" direction="in">
<annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/> <annotation name="org.gtk.GDBus.C.ForceGVariant" value="true"/>
</arg> </arg>

View File

@ -25,10 +25,9 @@ endif
system_ss.add([spice_headers, files('spice-module.c')]) system_ss.add([spice_headers, files('spice-module.c')])
system_ss.add(when: spice_protocol, if_true: files('vdagent.c')) system_ss.add(when: spice_protocol, if_true: files('vdagent.c'))
system_ss.add(when: 'CONFIG_LINUX', if_true: files( if host_os == 'linux'
'input-linux.c', system_ss.add(files('input-linux.c', 'udmabuf.c'))
'udmabuf.c', endif
))
system_ss.add(when: cocoa, if_true: files('cocoa.m')) system_ss.add(when: cocoa, if_true: files('cocoa.m'))
vnc_ss = ss.source_set() vnc_ss = ss.source_set()
@ -76,7 +75,7 @@ endif
if dbus_display if dbus_display
dbus_ss = ss.source_set() dbus_ss = ss.source_set()
env = environment() env = environment()
env.set('TARGETOS', targetos) env.set('HOST_OS', host_os)
xml = custom_target('dbus-display preprocess', xml = custom_target('dbus-display preprocess',
input: 'dbus-display1.xml', input: 'dbus-display1.xml',
output: 'dbus-display1.xml', output: 'dbus-display1.xml',
@ -106,7 +105,9 @@ if dbus_display
endif endif
if gtk.found() if gtk.found()
system_ss.add(when: 'CONFIG_WIN32', if_true: files('win32-kbd-hook.c')) if host_os == 'windows'
system_ss.add(files('win32-kbd-hook.c'))
endif
gtk_ss = ss.source_set() gtk_ss = ss.source_set()
gtk_ss.add(gtk, vte, pixman, files('gtk.c')) gtk_ss.add(gtk, vte, pixman, files('gtk.c'))
@ -120,7 +121,9 @@ if gtk.found()
endif endif
if sdl.found() if sdl.found()
system_ss.add(when: 'CONFIG_WIN32', if_true: files('win32-kbd-hook.c')) if host_os == 'windows'
system_ss.add(files('win32-kbd-hook.c'))
endif
sdl_ss = ss.source_set() sdl_ss = ss.source_set()
sdl_ss.add(sdl, sdl_image, pixman, glib, files( sdl_ss.add(sdl, sdl_image, pixman, glib, files(

View File

@ -3,28 +3,31 @@ util_ss.add(files('thread-context.c'), numa)
if not config_host_data.get('CONFIG_ATOMIC64') if not config_host_data.get('CONFIG_ATOMIC64')
util_ss.add(files('atomic64.c')) util_ss.add(files('atomic64.c'))
endif endif
util_ss.add(when: 'CONFIG_POSIX', if_true: files('aio-posix.c')) if host_os != 'windows'
util_ss.add(when: 'CONFIG_POSIX', if_true: files('fdmon-poll.c')) util_ss.add(files('aio-posix.c'))
util_ss.add(files('fdmon-poll.c'))
if config_host_data.get('CONFIG_EPOLL_CREATE1') if config_host_data.get('CONFIG_EPOLL_CREATE1')
util_ss.add(files('fdmon-epoll.c')) util_ss.add(files('fdmon-epoll.c'))
endif endif
util_ss.add(when: linux_io_uring, if_true: files('fdmon-io_uring.c')) util_ss.add(files('compatfd.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('compatfd.c')) util_ss.add(files('event_notifier-posix.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('event_notifier-posix.c')) util_ss.add(files('mmap-alloc.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('mmap-alloc.c'))
freebsd_dep = [] freebsd_dep = []
if targetos == 'freebsd' if host_os == 'freebsd'
freebsd_dep = util freebsd_dep = util
endif endif
util_ss.add(when: 'CONFIG_POSIX', if_true: [files('oslib-posix.c'), freebsd_dep]) util_ss.add(files('oslib-posix.c'), freebsd_dep)
util_ss.add(when: 'CONFIG_POSIX', if_true: files('qemu-thread-posix.c')) util_ss.add(files('qemu-thread-posix.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('memfd.c')) util_ss.add(files('memfd.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: files('aio-win32.c')) util_ss.add(files('drm.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: files('event_notifier-win32.c')) else
util_ss.add(when: 'CONFIG_WIN32', if_true: files('oslib-win32.c')) util_ss.add(files('aio-win32.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: files('qemu-thread-win32.c')) util_ss.add(files('event_notifier-win32.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: winmm) util_ss.add(files('oslib-win32.c'))
util_ss.add(when: 'CONFIG_WIN32', if_true: pathcch) util_ss.add(files('qemu-thread-win32.c'))
util_ss.add(winmm, pathcch)
endif
util_ss.add(when: linux_io_uring, if_true: files('fdmon-io_uring.c'))
if glib_has_gslice if glib_has_gslice
util_ss.add(files('qtree.c')) util_ss.add(files('qtree.c'))
endif endif
@ -56,7 +59,6 @@ util_ss.add(files('reserved-region.c'))
util_ss.add(files('stats64.c')) util_ss.add(files('stats64.c'))
util_ss.add(files('systemd.c')) util_ss.add(files('systemd.c'))
util_ss.add(files('transactions.c')) util_ss.add(files('transactions.c'))
util_ss.add(when: 'CONFIG_POSIX', if_true: files('drm.c'))
util_ss.add(files('guest-random.c')) util_ss.add(files('guest-random.c'))
util_ss.add(files('yank.c')) util_ss.add(files('yank.c'))
util_ss.add(files('int128.c')) util_ss.add(files('int128.c'))
@ -71,7 +73,9 @@ endif
if have_system if have_system
util_ss.add(files('crc-ccitt.c')) util_ss.add(files('crc-ccitt.c'))
util_ss.add(when: gio, if_true: files('dbus.c')) util_ss.add(when: gio, if_true: files('dbus.c'))
util_ss.add(when: 'CONFIG_LINUX', if_true: files('userfaultfd.c')) if host_os == 'linux'
util_ss.add(files('userfaultfd.c'))
endif
endif endif
if have_block or have_ga if have_block or have_ga
@ -92,9 +96,6 @@ if have_block
util_ss.add(files('iova-tree.c')) util_ss.add(files('iova-tree.c'))
util_ss.add(files('iov.c', 'uri.c')) util_ss.add(files('iov.c', 'uri.c'))
util_ss.add(files('nvdimm-utils.c')) util_ss.add(files('nvdimm-utils.c'))
util_ss.add(when: 'CONFIG_LINUX', if_true: [
files('vhost-user-server.c'), vhost_user
])
util_ss.add(files('block-helpers.c')) util_ss.add(files('block-helpers.c'))
util_ss.add(files('qemu-coroutine-sleep.c')) util_ss.add(files('qemu-coroutine-sleep.c'))
util_ss.add(files('qemu-co-shared-resource.c')) util_ss.add(files('qemu-co-shared-resource.c'))
@ -107,8 +108,11 @@ if have_block
else else
util_ss.add(files('filemonitor-stub.c')) util_ss.add(files('filemonitor-stub.c'))
endif endif
util_ss.add(when: 'CONFIG_LINUX', if_true: files('vfio-helpers.c')) if host_os == 'linux'
util_ss.add(when: 'CONFIG_LINUX', if_true: files('chardev_open.c')) util_ss.add(files('vhost-user-server.c'), vhost_user)
util_ss.add(files('vfio-helpers.c'))
util_ss.add(files('chardev_open.c'))
endif
endif endif
if cpu == 'aarch64' if cpu == 'aarch64'