* fix --enable-fuzzing linker failures (Alexander)

* target/i386: Add bus lock debug exception support (Chenyi)
 * update documentation for preferred boolean option syntax (Daniel)
 * make SCSI io_timeout configurable (Hannes)
 * fix handling of guest recoverable SCSI errors (myself)
 * misc fixes (Pavel, Zheng Zhan Liang, Zihao)
 * fix installation of binaries with entitlements (Akihiko)
 -----BEGIN PGP SIGNATURE-----
 
 iQFIBAABCAAyFiEE8TM4V0tmI4mGbHaCv/vSX3jHroMFAmA3tzQUHHBib256aW5p
 QHJlZGhhdC5jb20ACgkQv/vSX3jHroMsngf+OkbgTDouxq3qnn1K89n6j2wKlAj0
 qPP+57o1sv5u5MjX0BkawXCMJfvTKJaOt/Cs8S0FaPTehfR5H0T2tL76KZBEdlEP
 /+V3EC0Qmd1S47LKIOuDkV15szvnccyjpgwaL7Osjb0Eh0SxeXd4pBTc3yYtkacu
 zb/srZ63U2iJZr93QwGmEJjuW57WNym6QWXF3Mrg9PFXybkXFTGumB2vZMlQc+MN
 RWPTUKZKAiIr/HfdvpIETXY+HzJhylvIQ8OVWtM3XDorl48OWcOat/jyeNEVYgG3
 o+gxIRnfvIL+42GkmUFbOKLzT5SV6p9EYYGLTuE1kU7nc6HWoD0CdPxA3A==
 =UBVO
 -----END PGP SIGNATURE-----

Merge remote-tracking branch 'remotes/bonzini-gitlab/tags/for-upstream' into staging

* fix --enable-fuzzing linker failures (Alexander)
* target/i386: Add bus lock debug exception support (Chenyi)
* update documentation for preferred boolean option syntax (Daniel)
* make SCSI io_timeout configurable (Hannes)
* fix handling of guest recoverable SCSI errors (myself)
* misc fixes (Pavel, Zheng Zhan Liang, Zihao)
* fix installation of binaries with entitlements (Akihiko)

# gpg: Signature made Thu 25 Feb 2021 14:41:56 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

* remotes/bonzini-gitlab/tags/for-upstream: (29 commits)
  tcg/i386: rdpmc: fix the the condtions
  chardev: do not use short form boolean options in non-QemuOpts character device descriptions
  vl: deprecate -writeconfig
  target/i386: Add bus lock debug exception support
  qom/object.c: Fix typo
  target/i386: update to show preferred boolean syntax for -cpu
  docs: update to show preferred boolean syntax for -cpu
  docs: update to show preferred boolean syntax for -vnc
  docs: update to show preferred boolean syntax for -chardev
  qemu-options: update to show preferred boolean syntax for -vnc
  qemu-options: update to show preferred boolean syntax for -incoming
  qemu-options: update to show preferred boolean syntax for -netdev
  qemu-options: update to show preferred boolean syntax for -spice
  qemu-options: update to show preferred boolean syntax for -chardev
  gdbstub: use preferred boolean option syntax
  char: don't fail when client is not connected
  scsi: drop 'result' argument from command_complete callback
  scsi-disk: pass guest recoverable errors through even for rerror=stop
  scsi-disk: pass SCSI status to scsi_handle_rw_error
  scsi: introduce scsi_sense_from_errno()
  ...

Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
Peter Maydell 2021-03-02 15:17:45 +00:00
commit 07dbfdd290
50 changed files with 406 additions and 322 deletions

View File

@ -387,6 +387,9 @@ static ssize_t tcp_chr_recv(Chardev *chr, char *buf, size_t len)
static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond) static GSource *tcp_chr_add_watch(Chardev *chr, GIOCondition cond)
{ {
SocketChardev *s = SOCKET_CHARDEV(chr); SocketChardev *s = SOCKET_CHARDEV(chr);
if (!s->ioc) {
return NULL;
}
return qio_channel_create_watch(s->ioc, cond); return qio_channel_create_watch(s->ioc, cond);
} }
@ -449,7 +452,7 @@ static char *qemu_chr_socket_address(SocketChardev *s, const char *prefix)
qemu_chr_socket_protocol(s), qemu_chr_socket_protocol(s),
s->addr->u.inet.host, s->addr->u.inet.host,
s->addr->u.inet.port, s->addr->u.inet.port,
s->is_listen ? ",server" : ""); s->is_listen ? ",server=on" : "");
break; break;
case SOCKET_ADDRESS_TYPE_UNIX: case SOCKET_ADDRESS_TYPE_UNIX:
{ {
@ -467,12 +470,12 @@ static char *qemu_chr_socket_address(SocketChardev *s, const char *prefix)
return g_strdup_printf("%sunix:%s%s%s%s", prefix, sa->path, return g_strdup_printf("%sunix:%s%s%s%s", prefix, sa->path,
abstract, tight, abstract, tight,
s->is_listen ? ",server" : ""); s->is_listen ? ",server=on" : "");
break; break;
} }
case SOCKET_ADDRESS_TYPE_FD: case SOCKET_ADDRESS_TYPE_FD:
return g_strdup_printf("%sfd:%s%s", prefix, s->addr->u.fd.str, return g_strdup_printf("%sfd:%s%s", prefix, s->addr->u.fd.str,
s->is_listen ? ",server" : ""); s->is_listen ? ",server=on" : "");
break; break;
case SOCKET_ADDRESS_TYPE_VSOCK: case SOCKET_ADDRESS_TYPE_VSOCK:
return g_strdup_printf("%svsock:%s:%s", prefix, return g_strdup_printf("%svsock:%s:%s", prefix,
@ -604,7 +607,7 @@ static char *qemu_chr_compute_filename(SocketChardev *s)
case AF_UNIX: case AF_UNIX:
return g_strdup_printf("unix:%s%s", return g_strdup_printf("unix:%s%s",
((struct sockaddr_un *)(ss))->sun_path, ((struct sockaddr_un *)(ss))->sun_path,
s->is_listen ? ",server" : ""); s->is_listen ? ",server=on" : "");
#endif #endif
case AF_INET6: case AF_INET6:
left = "["; left = "[";
@ -618,7 +621,7 @@ static char *qemu_chr_compute_filename(SocketChardev *s)
return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s", return g_strdup_printf("%s:%s%s%s:%s%s <-> %s%s%s:%s",
qemu_chr_socket_protocol(s), qemu_chr_socket_protocol(s),
left, shost, right, sserv, left, shost, right, sserv,
s->is_listen ? ",server" : "", s->is_listen ? ",server=on" : "",
left, phost, right, pserv); left, phost, right, pserv);
default: default:

24
configure vendored
View File

@ -463,7 +463,7 @@ skip_meson=no
gettext="auto" gettext="auto"
fuse="auto" fuse="auto"
fuse_lseek="auto" fuse_lseek="auto"
multiprocess="no" multiprocess="auto"
malloc_trim="auto" malloc_trim="auto"
@ -798,7 +798,6 @@ Linux)
linux="yes" linux="yes"
linux_user="yes" linux_user="yes"
vhost_user=${default_feature:-yes} vhost_user=${default_feature:-yes}
multiprocess=${default_feature:-yes}
;; ;;
esac esac
@ -1558,9 +1557,9 @@ for opt do
;; ;;
--disable-fuse-lseek) fuse_lseek="disabled" --disable-fuse-lseek) fuse_lseek="disabled"
;; ;;
--enable-multiprocess) multiprocess="yes" --enable-multiprocess) multiprocess="enabled"
;; ;;
--disable-multiprocess) multiprocess="no" --disable-multiprocess) multiprocess="disabled"
;; ;;
*) *)
echo "ERROR: unknown option $opt" echo "ERROR: unknown option $opt"
@ -1914,7 +1913,7 @@ disabled with --disable-FEATURE, default is enabled if available
libdaxctl libdaxctl support libdaxctl libdaxctl support
fuse FUSE block device export fuse FUSE block device export
fuse-lseek SEEK_HOLE/SEEK_DATA support for FUSE exports fuse-lseek SEEK_HOLE/SEEK_DATA support for FUSE exports
multiprocess Multiprocess QEMU support multiprocess Out of process device emulation support
NOTE: The object files are built at the place where configure is launched NOTE: The object files are built at the place where configure is launched
EOF EOF
@ -6089,14 +6088,21 @@ fi
if test "$have_mlockall" = "yes" ; then if test "$have_mlockall" = "yes" ; then
echo "HAVE_MLOCKALL=y" >> $config_host_mak echo "HAVE_MLOCKALL=y" >> $config_host_mak
fi fi
if test "$multiprocess" = "yes" ; then
echo "CONFIG_MULTIPROCESS_ALLOWED=y" >> $config_host_mak
fi
if test "$fuzzing" = "yes" ; then if test "$fuzzing" = "yes" ; then
# If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the # If LIB_FUZZING_ENGINE is set, assume we are running on OSS-Fuzz, and the
# needed CFLAGS have already been provided # needed CFLAGS have already been provided
if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then if test -z "${LIB_FUZZING_ENGINE+xxx}" ; then
# Add CFLAGS to tell clang to add fuzzer-related instrumentation to all the
# compiled code.
QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link" QEMU_CFLAGS="$QEMU_CFLAGS -fsanitize=fuzzer-no-link"
# To build non-fuzzer binaries with --enable-fuzzing, link everything with
# fsanitize=fuzzer-no-link. Otherwise, the linker will be unable to bind
# the fuzzer-related callbacks added by instrumentation.
QEMU_LDFLAGS="$QEMU_LDFLAGS -fsanitize=fuzzer-no-link"
# For the actual fuzzer binaries, we need to link against the libfuzzer
# library. Provide the flags for doing this in FUZZ_EXE_LDFLAGS. The meson
# rule for the fuzzer adds these to the link_args. They need to be
# configurable, to support OSS-Fuzz
FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer" FUZZ_EXE_LDFLAGS="-fsanitize=fuzzer"
else else
FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE" FUZZ_EXE_LDFLAGS="$LIB_FUZZING_ENGINE"
@ -6424,7 +6430,7 @@ NINJA=$ninja $meson setup \
-Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \ -Dzstd=$zstd -Dseccomp=$seccomp -Dvirtfs=$virtfs -Dcap_ng=$cap_ng \
-Dattr=$attr -Ddefault_devices=$default_devices \ -Dattr=$attr -Ddefault_devices=$default_devices \
-Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \ -Ddocs=$docs -Dsphinx_build=$sphinx_build -Dinstall_blobs=$blobs \
-Dvhost_user_blk_server=$vhost_user_blk_server \ -Dvhost_user_blk_server=$vhost_user_blk_server -Dmultiprocess=$multiprocess \
-Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \ -Dfuse=$fuse -Dfuse_lseek=$fuse_lseek -Dguest_agent_msi=$guest_agent_msi \
$(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \ $(if test "$default_features" = no; then echo "-Dauto_features=disabled"; fi) \
-Dtcg_interpreter=$tcg_interpreter \ -Dtcg_interpreter=$tcg_interpreter \

View File

@ -158,15 +158,15 @@ instance.
# imagefolder="/mnt/vms/colo-test-primary" # imagefolder="/mnt/vms/colo-test-primary"
# qemu-system-x86_64 -enable-kvm -cpu qemu64,+kvmclock -m 512 -smp 1 -qmp stdio \ # qemu-system-x86_64 -enable-kvm -cpu qemu64,kvmclock=on -m 512 -smp 1 -qmp stdio \
-device piix3-usb-uhci -device usb-tablet -name primary \ -device piix3-usb-uhci -device usb-tablet -name primary \
-netdev tap,id=hn0,vhost=off,helper=/usr/lib/qemu/qemu-bridge-helper \ -netdev tap,id=hn0,vhost=off,helper=/usr/lib/qemu/qemu-bridge-helper \
-device rtl8139,id=e0,netdev=hn0 \ -device rtl8139,id=e0,netdev=hn0 \
-chardev socket,id=mirror0,host=0.0.0.0,port=9003,server,nowait \ -chardev socket,id=mirror0,host=0.0.0.0,port=9003,server=on,wait=off \
-chardev socket,id=compare1,host=0.0.0.0,port=9004,server,wait \ -chardev socket,id=compare1,host=0.0.0.0,port=9004,server=on,wait=on \
-chardev socket,id=compare0,host=127.0.0.1,port=9001,server,nowait \ -chardev socket,id=compare0,host=127.0.0.1,port=9001,server=on,wait=off \
-chardev socket,id=compare0-0,host=127.0.0.1,port=9001 \ -chardev socket,id=compare0-0,host=127.0.0.1,port=9001 \
-chardev socket,id=compare_out,host=127.0.0.1,port=9005,server,nowait \ -chardev socket,id=compare_out,host=127.0.0.1,port=9005,server=on,wait=off \
-chardev socket,id=compare_out0,host=127.0.0.1,port=9005 \ -chardev socket,id=compare_out0,host=127.0.0.1,port=9005 \
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 \ -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 \
-object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out \ -object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out \
@ -189,7 +189,7 @@ any IP's here, except for the $primary_ip variable.
# qemu-img create -f qcow2 $imagefolder/secondary-hidden.qcow2 10G # qemu-img create -f qcow2 $imagefolder/secondary-hidden.qcow2 10G
# qemu-system-x86_64 -enable-kvm -cpu qemu64,+kvmclock -m 512 -smp 1 -qmp stdio \ # qemu-system-x86_64 -enable-kvm -cpu qemu64,kvmclock=on -m 512 -smp 1 -qmp stdio \
-device piix3-usb-uhci -device usb-tablet -name secondary \ -device piix3-usb-uhci -device usb-tablet -name secondary \
-netdev tap,id=hn0,vhost=off,helper=/usr/lib/qemu/qemu-bridge-helper \ -netdev tap,id=hn0,vhost=off,helper=/usr/lib/qemu/qemu-bridge-helper \
-device rtl8139,id=e0,netdev=hn0 \ -device rtl8139,id=e0,netdev=hn0 \

View File

@ -109,7 +109,8 @@ NSS. Registration can be done from Firefox or the command line:
on the host specify the ccid-card-passthru device with a suitable chardev: on the host specify the ccid-card-passthru device with a suitable chardev:
qemu -chardev socket,server,host=0.0.0.0,port=2001,id=ccid,nowait -usb -device usb-ccid -device ccid-card-passthru,chardev=ccid qemu -chardev socket,server=on,host=0.0.0.0,port=2001,id=ccid,wait=off \
-usb -device usb-ccid -device ccid-card-passthru,chardev=ccid
on the client run vscclient, built when you built QEMU: on the client run vscclient, built when you built QEMU:
@ -125,7 +126,8 @@ Follow instructions as per #4, except run QEMU and vscclient as follows:
Run qemu as per #5, and run vscclient from the "fake-smartcard" Run qemu as per #5, and run vscclient from the "fake-smartcard"
directory as follows: directory as follows:
qemu -chardev socket,server,host=0.0.0.0,port=2001,id=ccid,nowait -usb -device usb-ccid -device ccid-card-passthru,chardev=ccid qemu -chardev socket,server=on,host=0.0.0.0,port=2001,id=ccid,wait=off \
-usb -device usb-ccid -device ccid-card-passthru,chardev=ccid
vscclient -e "db=\"sql:$PWD\" use_hw=no soft=(,Test,CAC,,id-cert,signing-cert,encryption-cert)" <qemu-host> 2001 vscclient -e "db=\"sql:$PWD\" use_hw=no soft=(,Test,CAC,,id-cert,signing-cert,encryption-cert)" <qemu-host> 2001

View File

@ -164,11 +164,11 @@ clearly describe the usage.
Primary(ip:3.3.3.3): Primary(ip:3.3.3.3):
-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66 -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
-chardev socket,id=mirror0,host=3.3.3.3,port=9003,server,nowait -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
-chardev socket,id=compare1,host=3.3.3.3,port=9004,server,nowait -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
-chardev socket,id=compare0,host=3.3.3.3,port=9001,server,nowait -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
-chardev socket,id=compare0-0,host=3.3.3.3,port=9001 -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
-chardev socket,id=compare_out,host=3.3.3.3,port=9005,server,nowait -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
-chardev socket,id=compare_out0,host=3.3.3.3,port=9005 -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
-object iothread,id=iothread1 -object iothread,id=iothread1
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0
@ -190,11 +190,11 @@ If you want to use virtio-net-pci or other driver with vnet_header:
Primary(ip:3.3.3.3): Primary(ip:3.3.3.3):
-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66 -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
-chardev socket,id=mirror0,host=3.3.3.3,port=9003,server,nowait -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
-chardev socket,id=compare1,host=3.3.3.3,port=9004,server,nowait -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
-chardev socket,id=compare0,host=3.3.3.3,port=9001,server,nowait -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
-chardev socket,id=compare0-0,host=3.3.3.3,port=9001 -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
-chardev socket,id=compare_out,host=3.3.3.3,port=9005,server,nowait -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
-chardev socket,id=compare_out0,host=3.3.3.3,port=9005 -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0,vnet_hdr_support -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0,vnet_hdr_support
-object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out,vnet_hdr_support -object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out,vnet_hdr_support

View File

@ -39,7 +39,7 @@ shown here.
First, QEMU should be started like this: First, QEMU should be started like this:
# qemu-system-TARGET [...] \ # qemu-system-TARGET [...] \
-chardev socket,id=qmp,port=4444,host=localhost,server \ -chardev socket,id=qmp,port=4444,host=localhost,server=on \
-mon chardev=qmp,mode=control,pretty=on -mon chardev=qmp,mode=control,pretty=on
Then, in a different terminal: Then, in a different terminal:

View File

@ -129,7 +129,7 @@
# "-machine smm=on". (On the "pc-q35-*" machine types of # "-machine smm=on". (On the "pc-q35-*" machine types of
# the @i386 emulation target, @requires-smm presents # the @i386 emulation target, @requires-smm presents
# further CPU requirements; one combination known to work # further CPU requirements; one combination known to work
# is "-cpu coreduo,-nx".) If the firmware is marked as # is "-cpu coreduo,nx=off".) If the firmware is marked as
# both @secure-boot and @requires-smm, then write # both @secure-boot and @requires-smm, then write
# accesses to the pflash chip (NVRAM) that holds the UEFI # accesses to the pflash chip (NVRAM) that holds the UEFI
# variable store must be restricted to code that executes # variable store must be restricted to code that executes

View File

@ -133,7 +133,7 @@ socket::
-M q35 -nodefaults -m 512 \ -M q35 -nodefaults -m 512 \
-blockdev node-name=node-A,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./a.qcow2 \ -blockdev node-name=node-A,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./a.qcow2 \
-device virtio-blk,drive=node-A,id=virtio0 \ -device virtio-blk,drive=node-A,id=virtio0 \
-monitor stdio -qmp unix:/tmp/qmp-sock,server,nowait -monitor stdio -qmp unix:/tmp/qmp-sock,server=on,wait=off
The ``-blockdev`` command-line option, used above, is available from The ``-blockdev`` command-line option, used above, is available from
QEMU 2.9 onwards. In the above invocation, notice the ``node-name`` QEMU 2.9 onwards. In the above invocation, notice the ``node-name``
@ -698,7 +698,7 @@ it could be located elsewhere)::
-M q35 -nodefaults -m 512 \ -M q35 -nodefaults -m 512 \
-blockdev node-name=node-TargetDisk,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./target-disk.qcow2 \ -blockdev node-name=node-TargetDisk,driver=qcow2,file.driver=file,file.node-name=file,file.filename=./target-disk.qcow2 \
-device virtio-blk,drive=node-TargetDisk,id=virtio0 \ -device virtio-blk,drive=node-TargetDisk,id=virtio0 \
-S -monitor stdio -qmp unix:./qmp-sock2,server,nowait \ -S -monitor stdio -qmp unix:./qmp-sock2,server=on,wait=off \
-incoming tcp:localhost:6666 -incoming tcp:localhost:6666
Given the disk image chain on source QEMU:: Given the disk image chain on source QEMU::

View File

@ -26,7 +26,7 @@ Usage
You can use the -qmp option to enable QMP. For example, the following You can use the -qmp option to enable QMP. For example, the following
makes QMP available on localhost port 4444: makes QMP available on localhost port 4444:
$ qemu [...] -qmp tcp:localhost:4444,server,nowait $ qemu [...] -qmp tcp:localhost:4444,server=on,wait=off
However, for more flexibility and to make use of more options, the -mon However, for more flexibility and to make use of more options, the -mon
command-line option should be used. For instance, the following example command-line option should be used. For instance, the following example
@ -34,7 +34,7 @@ creates one HMP instance (human monitor) on stdio and one QMP instance
on localhost port 4444: on localhost port 4444:
$ qemu [...] -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \ $ qemu [...] -chardev stdio,id=mon0 -mon chardev=mon0,mode=readline \
-chardev socket,id=mon1,host=localhost,port=4444,server,nowait \ -chardev socket,id=mon1,host=localhost,port=4444,server=on,wait=off \
-mon chardev=mon1,mode=control,pretty=on -mon chardev=mon1,mode=control,pretty=on
Please, refer to QEMU's manpage for more information. Please, refer to QEMU's manpage for more information.

View File

@ -14,7 +14,7 @@ vCPU hotplug
$ qemu-system-x86_64 -display none -no-user-config -m 2048 \ $ qemu-system-x86_64 -display none -no-user-config -m 2048 \
-nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \ -nodefaults -monitor stdio -machine pc,accel=kvm,usb=off \
-smp 1,maxcpus=2 -cpu IvyBridge-IBRS \ -smp 1,maxcpus=2 -cpu IvyBridge-IBRS \
-qmp unix:/tmp/qmp-sock,server,nowait -qmp unix:/tmp/qmp-sock,server=on,wait=off
(2) Run 'qmp-shell' (located in the source tree, under: "scripts/qmp/) (2) Run 'qmp-shell' (located in the source tree, under: "scripts/qmp/)
to connect to the just-launched QEMU:: to connect to the just-launched QEMU::

View File

@ -364,7 +364,7 @@ Host passthrough with feature customization:
.. parsed-literal:: .. parsed-literal::
|qemu_system| -cpu host,-vmx,... |qemu_system| -cpu host,vmx=off,...
Named CPU models: Named CPU models:
@ -376,7 +376,7 @@ Named CPU models with feature customization:
.. parsed-literal:: .. parsed-literal::
|qemu_system| -cpu Westmere,+pcid,... |qemu_system| -cpu Westmere,pcid=on,...
Libvirt guest XML Libvirt guest XML
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^

View File

@ -146,6 +146,13 @@ library enabled as a cryptography provider.
Neither the ``nettle`` library, or the built-in cryptography provider are Neither the ``nettle`` library, or the built-in cryptography provider are
supported on FIPS enabled hosts. supported on FIPS enabled hosts.
``-writeconfig`` (since 6.0)
'''''''''''''''''''''''''''''
The ``-writeconfig`` option is not able to serialize the entire contents
of the QEMU command line. It is thus considered a failed experiment
and deprecated, with no current replacement.
QEMU Machine Protocol (QMP) commands QEMU Machine Protocol (QMP) commands
------------------------------------ ------------------------------------

View File

@ -24,7 +24,7 @@ Example configuration
* Add a ``tn3270`` chardev and a ``x-terminal3270`` to the QEMU command line:: * Add a ``tn3270`` chardev and a ``x-terminal3270`` to the QEMU command line::
-chardev socket,id=ch0,host=0.0.0.0,port=2300,nowait,server,tn3270 -chardev socket,id=ch0,host=0.0.0.0,port=2300,wait=off,server=on,tn3270=on
-device x-terminal3270,chardev=ch0,devno=fe.0.000a,id=terminal0 -device x-terminal3270,chardev=ch0,devno=fe.0.000a,id=terminal0
* Start the guest. In the guest, use ``chccwdev -e 0.0.000a`` to enable * Start the guest. In the guest, use ``chccwdev -e 0.0.000a`` to enable

View File

@ -24,7 +24,7 @@ AVR cpu
- Continuous non interrupted execution with serial output into telnet window:: - Continuous non interrupted execution with serial output into telnet window::
qemu-system-avr -M mega2560 -bios demo.elf -nographic \ qemu-system-avr -M mega2560 -bios demo.elf -nographic \
-serial tcp::5678,server,nowait -serial tcp::5678,server=on,wait=off
and then in another shell:: and then in another shell::

View File

@ -44,7 +44,7 @@ the password all clients will be rejected.
.. parsed-literal:: .. parsed-literal::
|qemu_system| [...OPTIONS...] -vnc :1,password -monitor stdio |qemu_system| [...OPTIONS...] -vnc :1,password=on -monitor stdio
(qemu) change vnc password (qemu) change vnc password
Password: ******** Password: ********
(qemu) (qemu)
@ -104,7 +104,7 @@ authentication to provide two layers of authentication for clients.
|qemu_system| [...OPTIONS...] \ |qemu_system| [...OPTIONS...] \
-object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \ -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \
-vnc :1,tls-creds=tls0,password -monitor stdio -vnc :1,tls-creds=tls0,password=on -monitor stdio
(qemu) change vnc password (qemu) change vnc password
Password: ******** Password: ********
(qemu) (qemu)
@ -128,7 +128,7 @@ can be launched with:
.. parsed-literal:: .. parsed-literal::
|qemu_system| [...OPTIONS...] -vnc :1,sasl -monitor stdio |qemu_system| [...OPTIONS...] -vnc :1,sasl=on -monitor stdio
.. _vnc_005fsec_005fcertificate_005fsasl: .. _vnc_005fsec_005fcertificate_005fsasl:
@ -146,7 +146,7 @@ x509 options:
|qemu_system| [...OPTIONS...] \ |qemu_system| [...OPTIONS...] \
-object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \ -object tls-creds-x509,id=tls0,dir=/etc/pki/qemu,endpoint=server,verify-peer=on \
-vnc :1,tls-creds=tls0,sasl -monitor stdio -vnc :1,tls-creds=tls0,sasl=on -monitor stdio
.. _vnc_005fsetup_005fsasl: .. _vnc_005fsetup_005fsasl:

View File

@ -69,7 +69,7 @@ Standard options:
a description of character device properties. A common character device a description of character device properties. A common character device
definition configures a UNIX domain socket:: definition configures a UNIX domain socket::
--chardev socket,id=char1,path=/tmp/qmp.sock,server,nowait --chardev socket,id=char1,path=/tmp/qmp.sock,server=on,wait=off
.. option:: --export [type=]nbd,id=<id>,node-name=<node-name>[,name=<export-name>][,writable=on|off][,bitmap=<name>] .. option:: --export [type=]nbd,id=<id>,node-name=<node-name>[,name=<export-name>][,writable=on|off][,bitmap=<name>]
--export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=unix,addr.path=<socket-path>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>] --export [type=]vhost-user-blk,id=<id>,node-name=<node-name>,addr.type=unix,addr.path=<socket-path>[,writable=on|off][,logical-block-size=<block-size>][,num-queues=<num-queues>]
@ -124,7 +124,7 @@ Launch the daemon with QMP monitor socket ``qmp.sock`` so clients can execute
QMP commands:: QMP commands::
$ qemu-storage-daemon \ $ qemu-storage-daemon \
--chardev socket,path=qmp.sock,server,nowait,id=char1 \ --chardev socket,path=qmp.sock,server=on,wait=off,id=char1 \
--monitor chardev=char1 --monitor chardev=char1
Export raw image file ``disk.img`` over NBD UNIX domain socket ``nbd.sock``:: Export raw image file ``disk.img`` over NBD UNIX domain socket ``nbd.sock``::

View File

@ -3505,7 +3505,7 @@ int gdbserver_start(const char *device)
if (strstart(device, "tcp:", NULL)) { if (strstart(device, "tcp:", NULL)) {
/* enforce required TCP attributes */ /* enforce required TCP attributes */
snprintf(gdbstub_device_name, sizeof(gdbstub_device_name), snprintf(gdbstub_device_name, sizeof(gdbstub_device_name),
"%s,nowait,nodelay,server", device); "%s,wait=off,delay=off,server=on", device);
device = gdbstub_device_name; device = gdbstub_device_name;
} }
#ifndef _WIN32 #ifndef _WIN32

View File

@ -329,13 +329,12 @@ static const VMStateDescription vmstate_esp_pci_scsi = {
} }
}; };
static void esp_pci_command_complete(SCSIRequest *req, uint32_t status, static void esp_pci_command_complete(SCSIRequest *req, size_t resid)
size_t resid)
{ {
ESPState *s = req->hba_private; ESPState *s = req->hba_private;
PCIESPState *pci = container_of(s, PCIESPState, esp); PCIESPState *pci = container_of(s, PCIESPState, esp);
esp_command_complete(req, status, resid); esp_command_complete(req, resid);
pci->dma_regs[DMA_WBC] = 0; pci->dma_regs[DMA_WBC] = 0;
pci->dma_regs[DMA_STAT] |= DMA_STAT_DONE; pci->dma_regs[DMA_STAT] |= DMA_STAT_DONE;
} }

View File

@ -485,8 +485,7 @@ static void esp_report_command_complete(ESPState *s, uint32_t status)
} }
} }
void esp_command_complete(SCSIRequest *req, uint32_t status, void esp_command_complete(SCSIRequest *req, size_t resid)
size_t resid)
{ {
ESPState *s = req->hba_private; ESPState *s = req->hba_private;
@ -495,11 +494,11 @@ void esp_command_complete(SCSIRequest *req, uint32_t status,
* interrupt has been handled. * interrupt has been handled.
*/ */
trace_esp_command_complete_deferred(); trace_esp_command_complete_deferred();
s->deferred_status = status; s->deferred_status = req->status;
s->deferred_complete = true; s->deferred_complete = true;
return; return;
} }
esp_report_command_complete(s, status); esp_report_command_complete(s, req->status);
} }
void esp_transfer_data(SCSIRequest *req, uint32_t len) void esp_transfer_data(SCSIRequest *req, uint32_t len)

View File

@ -787,14 +787,14 @@ static int lsi_queue_req(LSIState *s, SCSIRequest *req, uint32_t len)
} }
/* Callback to indicate that the SCSI layer has completed a command. */ /* Callback to indicate that the SCSI layer has completed a command. */
static void lsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) static void lsi_command_complete(SCSIRequest *req, size_t resid)
{ {
LSIState *s = LSI53C895A(req->bus->qbus.parent); LSIState *s = LSI53C895A(req->bus->qbus.parent);
int out; int out;
out = (s->sstat1 & PHASE_MASK) == PHASE_DO; out = (s->sstat1 & PHASE_MASK) == PHASE_DO;
trace_lsi_command_complete(status); trace_lsi_command_complete(req->status);
s->status = status; s->status = req->status;
s->command_complete = 2; s->command_complete = 2;
if (s->waiting && s->dbc != 0) { if (s->waiting && s->dbc != 0) {
/* Raise phase mismatch for short transfers. */ /* Raise phase mismatch for short transfers. */

View File

@ -1852,13 +1852,12 @@ static void megasas_xfer_complete(SCSIRequest *req, uint32_t len)
} }
} }
static void megasas_command_complete(SCSIRequest *req, uint32_t status, static void megasas_command_complete(SCSIRequest *req, size_t resid)
size_t resid)
{ {
MegasasCmd *cmd = req->hba_private; MegasasCmd *cmd = req->hba_private;
uint8_t cmd_status = MFI_STAT_OK; uint8_t cmd_status = MFI_STAT_OK;
trace_megasas_command_complete(cmd->index, status, resid); trace_megasas_command_complete(cmd->index, req->status, resid);
if (req->io_canceled) { if (req->io_canceled) {
return; return;
@ -1873,7 +1872,6 @@ static void megasas_command_complete(SCSIRequest *req, uint32_t status,
return; return;
} }
} else { } else {
req->status = status;
trace_megasas_scsi_complete(cmd->index, req->status, trace_megasas_scsi_complete(cmd->index, req->status,
cmd->iov_size, req->cmd.xfer); cmd->iov_size, req->cmd.xfer);
if (req->status != GOOD) { if (req->status != GOOD) {

View File

@ -1133,7 +1133,7 @@ static QEMUSGList *mptsas_get_sg_list(SCSIRequest *sreq)
} }
static void mptsas_command_complete(SCSIRequest *sreq, static void mptsas_command_complete(SCSIRequest *sreq,
uint32_t status, size_t resid) size_t resid)
{ {
MPTSASRequest *req = sreq->hba_private; MPTSASRequest *req = sreq->hba_private;
MPTSASState *s = req->dev; MPTSASState *s = req->dev;
@ -1143,7 +1143,8 @@ static void mptsas_command_complete(SCSIRequest *sreq,
hwaddr sense_buffer_addr = req->dev->sense_buffer_high_addr | hwaddr sense_buffer_addr = req->dev->sense_buffer_high_addr |
req->scsi_io.SenseBufferLowAddr; req->scsi_io.SenseBufferLowAddr;
trace_mptsas_command_complete(s, req->scsi_io.MsgContext, status, resid); trace_mptsas_command_complete(s, req->scsi_io.MsgContext,
sreq->status, resid);
sense_len = scsi_req_get_sense(sreq, sense_buf, SCSI_SENSE_BUF_SIZE); sense_len = scsi_req_get_sense(sreq, sense_buf, SCSI_SENSE_BUF_SIZE);
if (sense_len > 0) { if (sense_len > 0) {

View File

@ -1483,7 +1483,7 @@ void scsi_req_complete(SCSIRequest *req, int status)
scsi_req_ref(req); scsi_req_ref(req);
scsi_req_dequeue(req); scsi_req_dequeue(req);
req->bus->info->complete(req, req->status, req->resid); req->bus->info->complete(req, req->resid);
/* Cancelled requests might end up being completed instead of cancelled */ /* Cancelled requests might end up being completed instead of cancelled */
notifier_list_notify(&req->cancel_notifiers, req); notifier_list_notify(&req->cancel_notifiers, req);

View File

@ -111,8 +111,6 @@ struct SCSIDiskState {
uint16_t rotation_rate; uint16_t rotation_rate;
}; };
static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed);
static void scsi_free_request(SCSIRequest *req) static void scsi_free_request(SCSIRequest *req)
{ {
SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req); SCSIDiskReq *r = DO_UPCAST(SCSIDiskReq, req, req);
@ -182,6 +180,78 @@ static void scsi_disk_load_request(QEMUFile *f, SCSIRequest *req)
qemu_iovec_init_external(&r->qiov, &r->iov, 1); qemu_iovec_init_external(&r->qiov, &r->iov, 1);
} }
/*
* scsi_handle_rw_error has two return values. False means that the error
* must be ignored, true means that the error has been processed and the
* caller should not do anything else for this request. Note that
* scsi_handle_rw_error always manages its reference counts, independent
* of the return value.
*/
static bool scsi_handle_rw_error(SCSIDiskReq *r, int ret, bool acct_failed)
{
bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV);
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
SCSISense sense = SENSE_CODE(NO_SENSE);
int error = 0;
bool req_has_sense = false;
BlockErrorAction action;
int status;
if (ret < 0) {
status = scsi_sense_from_errno(-ret, &sense);
error = -ret;
} else {
/* A passthrough command has completed with nonzero status. */
status = ret;
if (status == CHECK_CONDITION) {
req_has_sense = true;
error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
} else {
error = EINVAL;
}
}
/*
* Check whether the error has to be handled by the guest or should
* rather follow the rerror=/werror= settings. Guest-handled errors
* are usually retried immediately, so do not post them to QMP and
* do not account them as failed I/O.
*/
if (req_has_sense &&
scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) {
action = BLOCK_ERROR_ACTION_REPORT;
acct_failed = false;
} else {
action = blk_get_error_action(s->qdev.conf.blk, is_read, error);
blk_error_action(s->qdev.conf.blk, action, is_read, error);
}
switch (action) {
case BLOCK_ERROR_ACTION_REPORT:
if (acct_failed) {
block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
}
if (req_has_sense) {
sdc->update_sense(&r->req);
} else if (status == CHECK_CONDITION) {
scsi_req_build_sense(&r->req, sense);
}
scsi_req_complete(&r->req, status);
return true;
case BLOCK_ERROR_ACTION_IGNORE:
return false;
case BLOCK_ERROR_ACTION_STOP:
scsi_req_retry(&r->req);
return true;
default:
g_assert_not_reached();
}
}
static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed) static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed)
{ {
if (r->req.io_canceled) { if (r->req.io_canceled) {
@ -189,8 +259,10 @@ static bool scsi_disk_req_check_error(SCSIDiskReq *r, int ret, bool acct_failed)
return true; return true;
} }
if (ret < 0 || (r->status && *r->status)) { if (ret < 0) {
return scsi_handle_rw_error(r, -ret, acct_failed); return scsi_handle_rw_error(r, ret, acct_failed);
} else if (r->status && *r->status) {
return scsi_handle_rw_error(r, *r->status, acct_failed);
} }
return false; return false;
@ -428,89 +500,6 @@ static void scsi_read_data(SCSIRequest *req)
} }
} }
/*
* scsi_handle_rw_error has two return values. False means that the error
* must be ignored, true means that the error has been processed and the
* caller should not do anything else for this request. Note that
* scsi_handle_rw_error always manages its reference counts, independent
* of the return value.
*/
static bool scsi_handle_rw_error(SCSIDiskReq *r, int error, bool acct_failed)
{
bool is_read = (r->req.cmd.mode == SCSI_XFER_FROM_DEV);
SCSIDiskState *s = DO_UPCAST(SCSIDiskState, qdev, r->req.dev);
SCSIDiskClass *sdc = (SCSIDiskClass *) object_get_class(OBJECT(s));
BlockErrorAction action = blk_get_error_action(s->qdev.conf.blk,
is_read, error);
if (action == BLOCK_ERROR_ACTION_REPORT) {
if (acct_failed) {
block_acct_failed(blk_get_stats(s->qdev.conf.blk), &r->acct);
}
switch (error) {
case 0:
/* A passthrough command has run and has produced sense data; check
* whether the error has to be handled by the guest or should rather
* pause the host.
*/
assert(r->status && *r->status);
if (scsi_sense_buf_is_guest_recoverable(r->req.sense, sizeof(r->req.sense))) {
/* These errors are handled by guest. */
sdc->update_sense(&r->req);
scsi_req_complete(&r->req, *r->status);
return true;
}
error = scsi_sense_buf_to_errno(r->req.sense, sizeof(r->req.sense));
break;
#ifdef CONFIG_LINUX
/* These errno mapping are specific to Linux. For more information:
* - scsi_decide_disposition in drivers/scsi/scsi_error.c
* - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c
* - blk_errors[] in block/blk-core.c
*/
case EBADE:
/* DID_NEXUS_FAILURE -> BLK_STS_NEXUS. */
scsi_req_complete(&r->req, RESERVATION_CONFLICT);
break;
case ENODATA:
/* DID_MEDIUM_ERROR -> BLK_STS_MEDIUM. */
scsi_check_condition(r, SENSE_CODE(READ_ERROR));
break;
case EREMOTEIO:
/* DID_TARGET_FAILURE -> BLK_STS_TARGET. */
scsi_req_complete(&r->req, HARDWARE_ERROR);
break;
#endif
case ENOMEDIUM:
scsi_check_condition(r, SENSE_CODE(NO_MEDIUM));
break;
case ENOMEM:
scsi_check_condition(r, SENSE_CODE(TARGET_FAILURE));
break;
case EINVAL:
scsi_check_condition(r, SENSE_CODE(INVALID_FIELD));
break;
case ENOSPC:
scsi_check_condition(r, SENSE_CODE(SPACE_ALLOC_FAILED));
break;
default:
scsi_check_condition(r, SENSE_CODE(IO_ERROR));
break;
}
}
blk_error_action(s->qdev.conf.blk, action, is_read, error);
if (action == BLOCK_ERROR_ACTION_IGNORE) {
scsi_req_complete(&r->req, 0);
return true;
}
if (action == BLOCK_ERROR_ACTION_STOP) {
scsi_req_retry(&r->req);
}
return true;
}
static void scsi_write_complete_noio(SCSIDiskReq *r, int ret) static void scsi_write_complete_noio(SCSIDiskReq *r, int ret)
{ {
uint32_t n; uint32_t n;
@ -2624,7 +2613,7 @@ static int get_device_type(SCSIDiskState *s)
cmd[4] = sizeof(buf); cmd[4] = sizeof(buf);
ret = scsi_SG_IO_FROM_DEV(s->qdev.conf.blk, cmd, sizeof(cmd), ret = scsi_SG_IO_FROM_DEV(s->qdev.conf.blk, cmd, sizeof(cmd),
buf, sizeof(buf)); buf, sizeof(buf), s->qdev.io_timeout);
if (ret < 0) { if (ret < 0) {
return -1; return -1;
} }
@ -2785,10 +2774,11 @@ static BlockAIOCB *scsi_block_do_sgio(SCSIBlockReq *req,
/* The rest is as in scsi-generic.c. */ /* The rest is as in scsi-generic.c. */
io_header->mx_sb_len = sizeof(r->req.sense); io_header->mx_sb_len = sizeof(r->req.sense);
io_header->sbp = r->req.sense; io_header->sbp = r->req.sense;
io_header->timeout = UINT_MAX; io_header->timeout = s->qdev.io_timeout * 1000;
io_header->usr_ptr = r; io_header->usr_ptr = r;
io_header->flags |= SG_FLAG_DIRECT_IO; io_header->flags |= SG_FLAG_DIRECT_IO;
trace_scsi_disk_aio_sgio_command(r->req.tag, req->cdb[0], lba,
nb_logical_blocks, io_header->timeout);
aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque); aiocb = blk_aio_ioctl(s->qdev.conf.blk, SG_IO, io_header, cb, opaque);
assert(aiocb != NULL); assert(aiocb != NULL);
return aiocb; return aiocb;
@ -3103,6 +3093,8 @@ static Property scsi_block_properties[] = {
DEFAULT_MAX_IO_SIZE), DEFAULT_MAX_IO_SIZE),
DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version, DEFINE_PROP_INT32("scsi_version", SCSIDiskState, qdev.default_scsi_version,
-1), -1),
DEFINE_PROP_UINT32("io_timeout", SCSIDiskState, qdev.io_timeout,
DEFAULT_IO_TIMEOUT),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };

View File

@ -115,6 +115,8 @@ static int execute_command(BlockBackend *blk,
SCSIGenericReq *r, int direction, SCSIGenericReq *r, int direction,
BlockCompletionFunc *complete) BlockCompletionFunc *complete)
{ {
SCSIDevice *s = r->req.dev;
r->io_header.interface_id = 'S'; r->io_header.interface_id = 'S';
r->io_header.dxfer_direction = direction; r->io_header.dxfer_direction = direction;
r->io_header.dxferp = r->buf; r->io_header.dxferp = r->buf;
@ -123,10 +125,12 @@ static int execute_command(BlockBackend *blk,
r->io_header.cmd_len = r->req.cmd.len; r->io_header.cmd_len = r->req.cmd.len;
r->io_header.mx_sb_len = sizeof(r->req.sense); r->io_header.mx_sb_len = sizeof(r->req.sense);
r->io_header.sbp = r->req.sense; r->io_header.sbp = r->req.sense;
r->io_header.timeout = MAX_UINT; r->io_header.timeout = s->io_timeout * 1000;
r->io_header.usr_ptr = r; r->io_header.usr_ptr = r;
r->io_header.flags |= SG_FLAG_DIRECT_IO; r->io_header.flags |= SG_FLAG_DIRECT_IO;
trace_scsi_generic_aio_sgio_command(r->req.tag, r->req.cmd.buf[0],
r->io_header.timeout);
r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r); r->req.aiocb = blk_aio_ioctl(blk, SG_IO, &r->io_header, complete, r);
if (r->req.aiocb == NULL) { if (r->req.aiocb == NULL) {
return -EIO; return -EIO;
@ -506,7 +510,7 @@ static int read_naa_id(const uint8_t *p, uint64_t *p_wwn)
} }
int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size, int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
uint8_t *buf, uint8_t buf_size) uint8_t *buf, uint8_t buf_size, uint32_t timeout)
{ {
sg_io_hdr_t io_header; sg_io_hdr_t io_header;
uint8_t sensebuf[8]; uint8_t sensebuf[8];
@ -521,10 +525,14 @@ int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
io_header.cmd_len = cmd_size; io_header.cmd_len = cmd_size;
io_header.mx_sb_len = sizeof(sensebuf); io_header.mx_sb_len = sizeof(sensebuf);
io_header.sbp = sensebuf; io_header.sbp = sensebuf;
io_header.timeout = 6000; /* XXX */ io_header.timeout = timeout * 1000;
trace_scsi_generic_ioctl_sgio_command(cmd[0], io_header.timeout);
ret = blk_ioctl(blk, SG_IO, &io_header); ret = blk_ioctl(blk, SG_IO, &io_header);
if (ret < 0 || io_header.driver_status || io_header.host_status) { if (ret < 0 || io_header.status ||
io_header.driver_status || io_header.host_status) {
trace_scsi_generic_ioctl_sgio_done(cmd[0], ret, io_header.status,
io_header.host_status);
return -1; return -1;
} }
return 0; return 0;
@ -551,7 +559,7 @@ static void scsi_generic_set_vpd_bl_emulation(SCSIDevice *s)
cmd[4] = sizeof(buf); cmd[4] = sizeof(buf);
ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd), ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
buf, sizeof(buf)); buf, sizeof(buf), s->io_timeout);
if (ret < 0) { if (ret < 0) {
/* /*
* Do not assume anything if we can't retrieve the * Do not assume anything if we can't retrieve the
@ -587,7 +595,7 @@ static void scsi_generic_read_device_identification(SCSIDevice *s)
cmd[4] = sizeof(buf); cmd[4] = sizeof(buf);
ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd), ret = scsi_SG_IO_FROM_DEV(s->conf.blk, cmd, sizeof(cmd),
buf, sizeof(buf)); buf, sizeof(buf), s->io_timeout);
if (ret < 0) { if (ret < 0) {
return; return;
} }
@ -638,7 +646,7 @@ static int get_stream_blocksize(BlockBackend *blk)
cmd[0] = MODE_SENSE; cmd[0] = MODE_SENSE;
cmd[4] = sizeof(buf); cmd[4] = sizeof(buf);
ret = scsi_SG_IO_FROM_DEV(blk, cmd, sizeof(cmd), buf, sizeof(buf)); ret = scsi_SG_IO_FROM_DEV(blk, cmd, sizeof(cmd), buf, sizeof(buf), 6);
if (ret < 0) { if (ret < 0) {
return -1; return -1;
} }
@ -665,7 +673,8 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
return; return;
} }
if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC) { if (blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC &&
blk_get_on_error(s->conf.blk, 0) != BLOCKDEV_ON_ERROR_REPORT) {
error_setg(errp, "Device doesn't support drive option werror"); error_setg(errp, "Device doesn't support drive option werror");
return; return;
} }
@ -728,6 +737,7 @@ static void scsi_generic_realize(SCSIDevice *s, Error **errp)
/* Only used by scsi-block, but initialize it nevertheless to be clean. */ /* Only used by scsi-block, but initialize it nevertheless to be clean. */
s->default_scsi_version = -1; s->default_scsi_version = -1;
s->io_timeout = DEFAULT_IO_TIMEOUT;
scsi_generic_read_device_inquiry(s); scsi_generic_read_device_inquiry(s);
} }
@ -751,6 +761,8 @@ static SCSIRequest *scsi_new_request(SCSIDevice *d, uint32_t tag, uint32_t lun,
static Property scsi_generic_properties[] = { static Property scsi_generic_properties[] = {
DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk), DEFINE_PROP_DRIVE("drive", SCSIDevice, conf.blk),
DEFINE_PROP_BOOL("share-rw", SCSIDevice, conf.share_rw, false), DEFINE_PROP_BOOL("share-rw", SCSIDevice, conf.share_rw, false),
DEFINE_PROP_UINT32("io_timeout", SCSIDevice, io_timeout,
DEFAULT_IO_TIMEOUT),
DEFINE_PROP_END_OF_LIST(), DEFINE_PROP_END_OF_LIST(),
}; };

View File

@ -551,19 +551,19 @@ static void vscsi_transfer_data(SCSIRequest *sreq, uint32_t len)
} }
/* Callback to indicate that the SCSI layer has completed a transfer. */ /* Callback to indicate that the SCSI layer has completed a transfer. */
static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t resid) static void vscsi_command_complete(SCSIRequest *sreq, size_t resid)
{ {
VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(sreq->bus->qbus.parent); VSCSIState *s = VIO_SPAPR_VSCSI_DEVICE(sreq->bus->qbus.parent);
vscsi_req *req = sreq->hba_private; vscsi_req *req = sreq->hba_private;
int32_t res_in = 0, res_out = 0; int32_t res_in = 0, res_out = 0;
trace_spapr_vscsi_command_complete(sreq->tag, status, req); trace_spapr_vscsi_command_complete(sreq->tag, sreq->status, req);
if (req == NULL) { if (req == NULL) {
fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag); fprintf(stderr, "VSCSI: Can't find request for tag 0x%x\n", sreq->tag);
return; return;
} }
if (status == CHECK_CONDITION) { if (sreq->status == CHECK_CONDITION) {
req->senselen = scsi_req_get_sense(req->sreq, req->sense, req->senselen = scsi_req_get_sense(req->sreq, req->sense,
sizeof(req->sense)); sizeof(req->sense));
trace_spapr_vscsi_command_complete_sense_data1(req->senselen, trace_spapr_vscsi_command_complete_sense_data1(req->senselen,
@ -574,8 +574,8 @@ static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t re
req->sense[12], req->sense[13], req->sense[14], req->sense[15]); req->sense[12], req->sense[13], req->sense[14], req->sense[15]);
} }
trace_spapr_vscsi_command_complete_status(status); trace_spapr_vscsi_command_complete_status(sreq->status);
if (status == 0) { if (sreq->status == 0) {
/* We handle overflows, not underflows for normal commands, /* We handle overflows, not underflows for normal commands,
* but hopefully nobody cares * but hopefully nobody cares
*/ */
@ -585,7 +585,7 @@ static void vscsi_command_complete(SCSIRequest *sreq, uint32_t status, size_t re
res_in = req->data_len; res_in = req->data_len;
} }
} }
vscsi_send_rsp(s, req, status, res_in, res_out); vscsi_send_rsp(s, req, sreq->status, res_in, res_out);
vscsi_put_req(req); vscsi_put_req(req);
} }

View File

@ -331,6 +331,7 @@ scsi_disk_emulate_command_UNKNOWN(int cmd, const char *name) "Unknown SCSI comma
scsi_disk_dma_command_READ(uint64_t lba, uint32_t len) "Read (sector %" PRId64 ", count %u)" scsi_disk_dma_command_READ(uint64_t lba, uint32_t len) "Read (sector %" PRId64 ", count %u)"
scsi_disk_dma_command_WRITE(const char *cmd, uint64_t lba, int len) "Write %s(sector %" PRId64 ", count %u)" scsi_disk_dma_command_WRITE(const char *cmd, uint64_t lba, int len) "Write %s(sector %" PRId64 ", count %u)"
scsi_disk_new_request(uint32_t lun, uint32_t tag, const char *line) "Command: lun=%d tag=0x%x data=%s" scsi_disk_new_request(uint32_t lun, uint32_t tag, const char *line) "Command: lun=%d tag=0x%x data=%s"
scsi_disk_aio_sgio_command(uint32_t tag, uint8_t cmd, uint64_t lba, int len, uint32_t timeout) "disk aio sgio: tag=0x%x cmd=0x%x (sector %" PRId64 ", count %d) timeout=%u"
# scsi-generic.c # scsi-generic.c
scsi_generic_command_complete_noio(void *req, uint32_t tag, int statuc) "Command complete %p tag=0x%x status=%d" scsi_generic_command_complete_noio(void *req, uint32_t tag, int statuc) "Command complete %p tag=0x%x status=%d"
@ -342,3 +343,6 @@ scsi_generic_write_data(uint32_t tag) "scsi_write_data tag=0x%x"
scsi_generic_send_command(const char *line) "Command: data=%s" scsi_generic_send_command(const char *line) "Command: data=%s"
scsi_generic_realize_type(int type) "device type %d" scsi_generic_realize_type(int type) "device type %d"
scsi_generic_realize_blocksize(int blocksize) "block size %d" scsi_generic_realize_blocksize(int blocksize) "block size %d"
scsi_generic_aio_sgio_command(uint32_t tag, uint8_t cmd, uint32_t timeout) "generic aio sgio: tag=0x%x cmd=0x%x timeout=%u"
scsi_generic_ioctl_sgio_command(uint8_t cmd, uint32_t timeout) "generic ioctl sgio: cmd=0x%x timeout=%u"
scsi_generic_ioctl_sgio_done(uint8_t cmd, int ret, uint8_t status, uint8_t host_status) "generic ioctl sgio: cmd=0x%x ret=%d status=0x%x host_status=0x%x"

View File

@ -52,12 +52,14 @@ void virtio_scsi_dataplane_setup(VirtIOSCSI *s, Error **errp)
static bool virtio_scsi_data_plane_handle_cmd(VirtIODevice *vdev, static bool virtio_scsi_data_plane_handle_cmd(VirtIODevice *vdev,
VirtQueue *vq) VirtQueue *vq)
{ {
bool progress; bool progress = false;
VirtIOSCSI *s = VIRTIO_SCSI(vdev); VirtIOSCSI *s = VIRTIO_SCSI(vdev);
virtio_scsi_acquire(s); virtio_scsi_acquire(s);
assert(s->ctx && s->dataplane_started); if (!s->dataplane_fenced) {
progress = virtio_scsi_handle_cmd_vq(s, vq); assert(s->ctx && s->dataplane_started);
progress = virtio_scsi_handle_cmd_vq(s, vq);
}
virtio_scsi_release(s); virtio_scsi_release(s);
return progress; return progress;
} }
@ -65,12 +67,14 @@ static bool virtio_scsi_data_plane_handle_cmd(VirtIODevice *vdev,
static bool virtio_scsi_data_plane_handle_ctrl(VirtIODevice *vdev, static bool virtio_scsi_data_plane_handle_ctrl(VirtIODevice *vdev,
VirtQueue *vq) VirtQueue *vq)
{ {
bool progress; bool progress = false;
VirtIOSCSI *s = VIRTIO_SCSI(vdev); VirtIOSCSI *s = VIRTIO_SCSI(vdev);
virtio_scsi_acquire(s); virtio_scsi_acquire(s);
assert(s->ctx && s->dataplane_started); if (!s->dataplane_fenced) {
progress = virtio_scsi_handle_ctrl_vq(s, vq); assert(s->ctx && s->dataplane_started);
progress = virtio_scsi_handle_ctrl_vq(s, vq);
}
virtio_scsi_release(s); virtio_scsi_release(s);
return progress; return progress;
} }
@ -78,12 +82,14 @@ static bool virtio_scsi_data_plane_handle_ctrl(VirtIODevice *vdev,
static bool virtio_scsi_data_plane_handle_event(VirtIODevice *vdev, static bool virtio_scsi_data_plane_handle_event(VirtIODevice *vdev,
VirtQueue *vq) VirtQueue *vq)
{ {
bool progress; bool progress = false;
VirtIOSCSI *s = VIRTIO_SCSI(vdev); VirtIOSCSI *s = VIRTIO_SCSI(vdev);
virtio_scsi_acquire(s); virtio_scsi_acquire(s);
assert(s->ctx && s->dataplane_started); if (!s->dataplane_fenced) {
progress = virtio_scsi_handle_event_vq(s, vq); assert(s->ctx && s->dataplane_started);
progress = virtio_scsi_handle_event_vq(s, vq);
}
virtio_scsi_release(s); virtio_scsi_release(s);
return progress; return progress;
} }

View File

@ -500,8 +500,7 @@ static void virtio_scsi_complete_cmd_req(VirtIOSCSIReq *req)
virtio_scsi_complete_req(req); virtio_scsi_complete_req(req);
} }
static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status, static void virtio_scsi_command_complete(SCSIRequest *r, size_t resid)
size_t resid)
{ {
VirtIOSCSIReq *req = r->hba_private; VirtIOSCSIReq *req = r->hba_private;
uint8_t sense[SCSI_SENSE_BUF_SIZE]; uint8_t sense[SCSI_SENSE_BUF_SIZE];
@ -513,7 +512,7 @@ static void virtio_scsi_command_complete(SCSIRequest *r, uint32_t status,
} }
req->resp.cmd.response = VIRTIO_SCSI_S_OK; req->resp.cmd.response = VIRTIO_SCSI_S_OK;
req->resp.cmd.status = status; req->resp.cmd.status = r->status;
if (req->resp.cmd.status == GOOD) { if (req->resp.cmd.status == GOOD) {
req->resp.cmd.resid = virtio_tswap32(vdev, resid); req->resp.cmd.resid = virtio_tswap32(vdev, resid);
} else { } else {

View File

@ -511,7 +511,7 @@ pvscsi_write_sense(PVSCSIRequest *r, uint8_t *sense, int len)
} }
static void static void
pvscsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid) pvscsi_command_complete(SCSIRequest *req, size_t resid)
{ {
PVSCSIRequest *pvscsi_req = req->hba_private; PVSCSIRequest *pvscsi_req = req->hba_private;
PVSCSIState *s; PVSCSIState *s;
@ -528,7 +528,7 @@ pvscsi_command_complete(SCSIRequest *req, uint32_t status, size_t resid)
pvscsi_req->cmp.hostStatus = BTSTAT_DATARUN; pvscsi_req->cmp.hostStatus = BTSTAT_DATARUN;
} }
pvscsi_req->cmp.scsiStatus = status; pvscsi_req->cmp.scsiStatus = req->status;
if (pvscsi_req->cmp.scsiStatus == CHECK_CONDITION) { if (pvscsi_req->cmp.scsiStatus == CHECK_CONDITION) {
uint8_t sense[SCSI_SENSE_BUF_SIZE]; uint8_t sense[SCSI_SENSE_BUF_SIZE];
int sense_len = int sense_len =

View File

@ -277,17 +277,17 @@ static void usb_msd_transfer_data(SCSIRequest *req, uint32_t len)
} }
} }
static void usb_msd_command_complete(SCSIRequest *req, uint32_t status, size_t resid) static void usb_msd_command_complete(SCSIRequest *req, size_t resid)
{ {
MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent); MSDState *s = DO_UPCAST(MSDState, dev.qdev, req->bus->qbus.parent);
USBPacket *p = s->packet; USBPacket *p = s->packet;
trace_usb_msd_cmd_complete(status, req->tag); trace_usb_msd_cmd_complete(req->status, req->tag);
s->csw.sig = cpu_to_le32(0x53425355); s->csw.sig = cpu_to_le32(0x53425355);
s->csw.tag = cpu_to_le32(req->tag); s->csw.tag = cpu_to_le32(req->tag);
s->csw.residue = cpu_to_le32(s->data_len); s->csw.residue = cpu_to_le32(s->data_len);
s->csw.status = status != 0; s->csw.status = req->status != 0;
if (s->packet) { if (s->packet) {
if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) { if (s->data_len == 0 && s->mode == USB_MSDM_DATAOUT) {

View File

@ -598,17 +598,16 @@ static void usb_uas_scsi_transfer_data(SCSIRequest *r, uint32_t len)
} }
} }
static void usb_uas_scsi_command_complete(SCSIRequest *r, static void usb_uas_scsi_command_complete(SCSIRequest *r, size_t resid)
uint32_t status, size_t resid)
{ {
UASRequest *req = r->hba_private; UASRequest *req = r->hba_private;
trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, status, resid); trace_usb_uas_scsi_complete(req->uas->dev.addr, req->tag, r->status, resid);
req->complete = true; req->complete = true;
if (req->data) { if (req->data) {
usb_uas_complete_data_packet(req); usb_uas_complete_data_packet(req);
} }
usb_uas_queue_sense(req, status); usb_uas_queue_sense(req, r->status);
scsi_req_unref(req->req); scsi_req_unref(req->req);
} }

View File

@ -151,7 +151,7 @@ struct SysBusESPState {
void esp_dma_enable(ESPState *s, int irq, int level); void esp_dma_enable(ESPState *s, int irq, int level);
void esp_request_cancelled(SCSIRequest *req); void esp_request_cancelled(SCSIRequest *req);
void esp_command_complete(SCSIRequest *req, uint32_t status, size_t resid); void esp_command_complete(SCSIRequest *req, size_t resid);
void esp_transfer_data(SCSIRequest *req, uint32_t len); void esp_transfer_data(SCSIRequest *req, uint32_t len);
void esp_hard_reset(ESPState *s); void esp_hard_reset(ESPState *s);
uint64_t esp_reg_read(ESPState *s, uint32_t saddr); uint64_t esp_reg_read(ESPState *s, uint32_t saddr);

View File

@ -18,6 +18,7 @@ typedef struct SCSIReqOps SCSIReqOps;
#define SCSI_SENSE_BUF_SIZE_OLD 96 #define SCSI_SENSE_BUF_SIZE_OLD 96
#define SCSI_SENSE_BUF_SIZE 252 #define SCSI_SENSE_BUF_SIZE 252
#define DEFAULT_IO_TIMEOUT 30
struct SCSIRequest { struct SCSIRequest {
SCSIBus *bus; SCSIBus *bus;
@ -84,6 +85,7 @@ struct SCSIDevice
uint64_t port_wwn; uint64_t port_wwn;
int scsi_version; int scsi_version;
int default_scsi_version; int default_scsi_version;
uint32_t io_timeout;
bool needs_vpd_bl_emulation; bool needs_vpd_bl_emulation;
bool hba_supports_iothread; bool hba_supports_iothread;
}; };
@ -121,7 +123,7 @@ struct SCSIBusInfo {
int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf, int (*parse_cdb)(SCSIDevice *dev, SCSICommand *cmd, uint8_t *buf,
void *hba_private); void *hba_private);
void (*transfer_data)(SCSIRequest *req, uint32_t arg); void (*transfer_data)(SCSIRequest *req, uint32_t arg);
void (*complete)(SCSIRequest *req, uint32_t arg, size_t resid); void (*complete)(SCSIRequest *req, size_t resid);
void (*cancel)(SCSIRequest *req); void (*cancel)(SCSIRequest *req);
void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense); void (*change)(SCSIBus *bus, SCSIDevice *dev, SCSISense sense);
QEMUSGList *(*get_sg_list)(SCSIRequest *req); QEMUSGList *(*get_sg_list)(SCSIRequest *req);
@ -188,7 +190,7 @@ void scsi_device_unit_attention_reported(SCSIDevice *dev);
void scsi_generic_read_device_inquiry(SCSIDevice *dev); void scsi_generic_read_device_inquiry(SCSIDevice *dev);
int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed); int scsi_device_get_sense(SCSIDevice *dev, uint8_t *buf, int len, bool fixed);
int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size, int scsi_SG_IO_FROM_DEV(BlockBackend *blk, uint8_t *cmd, uint8_t cmd_size,
uint8_t *buf, uint8_t buf_size); uint8_t *buf, uint8_t buf_size, uint32_t timeout);
SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int target, int lun); SCSIDevice *scsi_device_find(SCSIBus *bus, int channel, int target, int lun);
SCSIDevice *scsi_device_get(SCSIBus *bus, int channel, int target, int lun); SCSIDevice *scsi_device_get(SCSIBus *bus, int channel, int target, int lun);

View File

@ -135,4 +135,6 @@ int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr,
SCSISense *sense); SCSISense *sense);
#endif #endif
int scsi_sense_from_errno(int errno_value, SCSISense *sense);
#endif #endif

View File

@ -157,6 +157,11 @@ if targetos != 'linux' and get_option('mpath').enabled()
error('Multipath is supported only on Linux') error('Multipath is supported only on Linux')
endif endif
if targetos != 'linux' and get_option('multiprocess').enabled()
error('Multiprocess QEMU is supported only on Linux')
endif
multiprocess_allowed = targetos == 'linux' and not get_option('multiprocess').disabled()
m = cc.find_library('m', required: false) m = cc.find_library('m', required: false)
util = cc.find_library('util', required: false) util = cc.find_library('util', required: false)
winmm = [] winmm = []
@ -1228,7 +1233,7 @@ host_kconfig = \
(have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \ (have_virtfs ? ['CONFIG_VIRTFS=y'] : []) + \
('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \ ('CONFIG_LINUX' in config_host ? ['CONFIG_LINUX=y'] : []) + \
('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \ ('CONFIG_PVRDMA' in config_host ? ['CONFIG_PVRDMA=y'] : []) + \
('CONFIG_MULTIPROCESS_ALLOWED' in config_host ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : []) (multiprocess_allowed ? ['CONFIG_MULTIPROCESS_ALLOWED=y'] : [])
ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ] ignored = [ 'TARGET_XML_FILES', 'TARGET_ABI_DIR', 'TARGET_ARCH' ]
@ -2224,7 +2229,7 @@ foreach target : target_dirs
endif endif
emulator = executable(exe_name, exe['sources'], emulator = executable(exe_name, exe['sources'],
install: not exe_sign, install: true,
c_args: c_args, c_args: c_args,
dependencies: arch_deps + deps + exe['dependencies'], dependencies: arch_deps + deps + exe['dependencies'],
objects: lib.extract_all_objects(recursive: true), objects: lib.extract_all_objects(recursive: true),
@ -2235,8 +2240,6 @@ foreach target : target_dirs
if exe_sign if exe_sign
emulators += {exe['name'] : custom_target(exe['name'], emulators += {exe['name'] : custom_target(exe['name'],
install: true,
install_dir: get_option('bindir'),
depends: emulator, depends: emulator,
output: exe['name'], output: exe['name'],
command: [ command: [
@ -2246,6 +2249,11 @@ foreach target : target_dirs
meson.current_source_dir() / 'accel/hvf/entitlements.plist' meson.current_source_dir() / 'accel/hvf/entitlements.plist'
]) ])
} }
meson.add_install_script('scripts/entitlement.sh', '--install',
get_option('bindir') / exe_name,
get_option('bindir') / exe['name'],
meson.current_source_dir() / 'accel/hvf/entitlements.plist')
else else
emulators += {exe['name']: emulator} emulators += {exe['name']: emulator}
endif endif
@ -2553,6 +2561,7 @@ endif
summary_info += {'target list': ' '.join(target_dirs)} summary_info += {'target list': ' '.join(target_dirs)}
if have_system if have_system
summary_info += {'default devices': get_option('default_devices')} summary_info += {'default devices': get_option('default_devices')}
summary_info += {'out of process emulation': multiprocess_allowed}
endif endif
summary(summary_info, bool_yn: true, section: 'Targets and accelerators') summary(summary_info, bool_yn: true, section: 'Targets and accelerators')
@ -2673,7 +2682,6 @@ summary_info += {'libpmem support': config_host.has_key('CONFIG_LIBPMEM')}
summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')} summary_info += {'libdaxctl support': config_host.has_key('CONFIG_LIBDAXCTL')}
summary_info += {'libudev': libudev.found()} summary_info += {'libudev': libudev.found()}
summary_info += {'FUSE lseek': fuse_lseek.found()} summary_info += {'FUSE lseek': fuse_lseek.found()}
summary_info += {'Multiprocess QEMU': config_host.has_key('CONFIG_MULTIPROCESS_ALLOWED')}
summary(summary_info, bool_yn: true, section: 'Dependencies') summary(summary_info, bool_yn: true, section: 'Dependencies')
if not supported_cpus.contains(cpu) if not supported_cpus.contains(cpu)

View File

@ -45,6 +45,8 @@ option('cfi', type: 'boolean', value: 'false',
description: 'Control-Flow Integrity (CFI)') description: 'Control-Flow Integrity (CFI)')
option('cfi_debug', type: 'boolean', value: 'false', 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',
description: 'Out of process device emulation support')
option('attr', type : 'feature', value : 'auto', option('attr', type : 'feature', value : 'auto',
description: 'attr/xattr support') description: 'attr/xattr support')

View File

@ -47,12 +47,12 @@
# "return": [ # "return": [
# { # {
# "label": "charchannel0", # "label": "charchannel0",
# "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server", # "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.agent,server=on",
# "frontend-open": false # "frontend-open": false
# }, # },
# { # {
# "label": "charmonitor", # "label": "charmonitor",
# "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server", # "filename": "unix:/var/lib/libvirt/qemu/seabios.rhel6.monitor,server=on",
# "frontend-open": true # "frontend-open": true
# }, # },
# { # {

View File

@ -1894,16 +1894,17 @@ DEF("spice", HAS_ARG, QEMU_OPTION_spice,
"-spice [port=port][,tls-port=secured-port][,x509-dir=<dir>]\n" "-spice [port=port][,tls-port=secured-port][,x509-dir=<dir>]\n"
" [,x509-key-file=<file>][,x509-key-password=<file>]\n" " [,x509-key-file=<file>][,x509-key-password=<file>]\n"
" [,x509-cert-file=<file>][,x509-cacert-file=<file>]\n" " [,x509-cert-file=<file>][,x509-cacert-file=<file>]\n"
" [,x509-dh-key-file=<file>][,addr=addr][,ipv4|ipv6|unix]\n" " [,x509-dh-key-file=<file>][,addr=addr]\n"
" [,ipv4=on|off][,ipv6=on|off][,unix=on|off]\n"
" [,tls-ciphers=<list>]\n" " [,tls-ciphers=<list>]\n"
" [,tls-channel=[main|display|cursor|inputs|record|playback]]\n" " [,tls-channel=[main|display|cursor|inputs|record|playback]]\n"
" [,plaintext-channel=[main|display|cursor|inputs|record|playback]]\n" " [,plaintext-channel=[main|display|cursor|inputs|record|playback]]\n"
" [,sasl][,password=<secret>][,disable-ticketing]\n" " [,sasl=on|off][,password=<secret>][,disable-ticketing=on|off]\n"
" [,image-compression=[auto_glz|auto_lz|quic|glz|lz|off]]\n" " [,image-compression=[auto_glz|auto_lz|quic|glz|lz|off]]\n"
" [,jpeg-wan-compression=[auto|never|always]]\n" " [,jpeg-wan-compression=[auto|never|always]]\n"
" [,zlib-glz-wan-compression=[auto|never|always]]\n" " [,zlib-glz-wan-compression=[auto|never|always]]\n"
" [,streaming-video=[off|all|filter]][,disable-copy-paste]\n" " [,streaming-video=[off|all|filter]][,disable-copy-paste=on|off]\n"
" [,disable-agent-file-xfer][,agent-mouse=[on|off]]\n" " [,disable-agent-file-xfer=on|off][,agent-mouse=[on|off]]\n"
" [,playback-compression=[on|off]][,seamless-migration=[on|off]]\n" " [,playback-compression=[on|off]][,seamless-migration=[on|off]]\n"
" [,gl=[on|off]][,rendernode=<file>]\n" " [,gl=[on|off]][,rendernode=<file>]\n"
" enable spice\n" " enable spice\n"
@ -1920,13 +1921,13 @@ SRST
Set the IP address spice is listening on. Default is any Set the IP address spice is listening on. Default is any
address. address.
``ipv4``; \ ``ipv6``; \ ``unix`` ``ipv4=on|off``; \ ``ipv6=on|off``; \ ``unix=on|off``
Force using the specified IP version. Force using the specified IP version.
``password=<secret>`` ``password=<secret>``
Set the password you need to authenticate. Set the password you need to authenticate.
``sasl`` ``sasl=on|off``
Require that the client use SASL to authenticate with the spice. Require that the client use SASL to authenticate with the spice.
The exact choice of authentication method used is controlled The exact choice of authentication method used is controlled
from the system / user's SASL configuration file for the 'qemu' from the system / user's SASL configuration file for the 'qemu'
@ -1940,13 +1941,13 @@ SRST
data encryption preventing compromise of authentication data encryption preventing compromise of authentication
credentials. credentials.
``disable-ticketing`` ``disable-ticketing=on|off``
Allow client connects without authentication. Allow client connects without authentication.
``disable-copy-paste`` ``disable-copy-paste=on|off``
Disable copy paste between the client and the guest. Disable copy paste between the client and the guest.
``disable-agent-file-xfer`` ``disable-agent-file-xfer=on|off``
Disable spice-vdagent based file-xfer between the client and the Disable spice-vdagent based file-xfer between the client and the
guest. guest.
@ -2122,13 +2123,13 @@ SRST
Following the display value there may be one or more option flags Following the display value there may be one or more option flags
separated by commas. Valid options are separated by commas. Valid options are
``reverse`` ``reverse=on|off``
Connect to a listening VNC client via a "reverse" connection. Connect to a listening VNC client via a "reverse" connection.
The client is specified by the display. For reverse network The client is specified by the display. For reverse network
connections (host:d,``reverse``), the d argument is a TCP port connections (host:d,``reverse``), the d argument is a TCP port
number, not a display number. number, not a display number.
``websocket`` ``websocket=on|off``
Opens an additional TCP listening port dedicated to VNC Opens an additional TCP listening port dedicated to VNC
Websocket connections. If a bare websocket option is given, the Websocket connections. If a bare websocket option is given, the
Websocket port is 5700+display. An alternative port can be Websocket port is 5700+display. An alternative port can be
@ -2142,7 +2143,7 @@ SRST
runs in unencrypted mode. If TLS credentials are provided, the runs in unencrypted mode. If TLS credentials are provided, the
websocket connection requires encrypted client connections. websocket connection requires encrypted client connections.
``password`` ``password=on|off``
Require that password based authentication is used for client Require that password based authentication is used for client
connections. connections.
@ -2179,7 +2180,7 @@ SRST
on the fly while the VNC server is active. If missing, it will on the fly while the VNC server is active. If missing, it will
default to denying access. default to denying access.
``sasl`` ``sasl=on|off``
Require that the client use SASL to authenticate with the VNC Require that the client use SASL to authenticate with the VNC
server. The exact choice of authentication method used is server. The exact choice of authentication method used is
controlled from the system / user's SASL configuration file for controlled from the system / user's SASL configuration file for
@ -2202,7 +2203,7 @@ SRST
fly while the VNC server is active. If missing, it will default fly while the VNC server is active. If missing, it will default
to denying access. to denying access.
``acl`` ``acl=on|off``
Legacy method for enabling authorization of clients against the Legacy method for enabling authorization of clients against the
x509 distinguished name and SASL username. It results in the x509 distinguished name and SASL username. It results in the
creation of two ``authz-list`` objects with IDs of creation of two ``authz-list`` objects with IDs of
@ -2212,13 +2213,13 @@ SRST
This option is deprecated and should no longer be used. The new This option is deprecated and should no longer be used. The new
``sasl-authz`` and ``tls-authz`` options are a replacement. ``sasl-authz`` and ``tls-authz`` options are a replacement.
``lossy`` ``lossy=on|off``
Enable lossy compression methods (gradient, JPEG, ...). If this Enable lossy compression methods (gradient, JPEG, ...). If this
option is set, VNC client may receive lossy framebuffer updates option is set, VNC client may receive lossy framebuffer updates
depending on its encoding settings. Enabling this option can depending on its encoding settings. Enabling this option can
save a lot of bandwidth at the expense of quality. save a lot of bandwidth at the expense of quality.
``non-adaptive`` ``non-adaptive=on|off``
Disable adaptive encodings. Adaptive encodings are enabled by Disable adaptive encodings. Adaptive encodings are enabled by
default. An adaptive encoding will try to detect frequently default. An adaptive encoding will try to detect frequently
updated screen regions, and send updates in these regions using updated screen regions, and send updates in these regions using
@ -2253,7 +2254,7 @@ SRST
must be omitted, otherwise is must be present and specify a must be omitted, otherwise is must be present and specify a
valid audiodev. valid audiodev.
``power-control`` ``power-control=on|off``
Permit the remote client to issue shutdown, reboot or reset power Permit the remote client to issue shutdown, reboot or reset power
control requests. control requests.
ERST ERST
@ -2405,8 +2406,8 @@ DEFHEADING(Network options:)
DEF("netdev", HAS_ARG, QEMU_OPTION_netdev, DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
#ifdef CONFIG_SLIRP #ifdef CONFIG_SLIRP
"-netdev user,id=str[,ipv4[=on|off]][,net=addr[/mask]][,host=addr]\n" "-netdev user,id=str[,ipv4=on|off][,net=addr[/mask]][,host=addr]\n"
" [,ipv6[=on|off]][,ipv6-net=addr[/int]][,ipv6-host=addr]\n" " [,ipv6=on|off][,ipv6-net=addr[/int]][,ipv6-host=addr]\n"
" [,restrict=on|off][,hostname=host][,dhcpstart=addr]\n" " [,restrict=on|off][,hostname=host][,dhcpstart=addr]\n"
" [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,domainname=domain]\n" " [,dns=addr][,ipv6-dns=addr][,dnssearch=domain][,domainname=domain]\n"
" [,tftp=dir][,tftp-server-name=name][,bootfile=f][,hostfwd=rule][,guestfwd=rule]" " [,tftp=dir][,tftp-server-name=name][,bootfile=f][,hostfwd=rule][,guestfwd=rule]"
@ -2453,8 +2454,8 @@ DEF("netdev", HAS_ARG, QEMU_OPTION_netdev,
#endif #endif
#ifdef __linux__ #ifdef __linux__
"-netdev l2tpv3,id=str,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport]\n" "-netdev l2tpv3,id=str,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport]\n"
" [,rxsession=rxsession],txsession=txsession[,ipv6=on/off][,udp=on/off]\n" " [,rxsession=rxsession],txsession=txsession[,ipv6=on|off][,udp=on|off]\n"
" [,cookie64=on/off][,counter][,pincounter][,txcookie=txcookie]\n" " [,cookie64=on|off][,counter][,pincounter][,txcookie=txcookie]\n"
" [,rxcookie=rxcookie][,offset=offset]\n" " [,rxcookie=rxcookie][,offset=offset]\n"
" configure a network backend with ID 'str' connected to\n" " configure a network backend with ID 'str' connected to\n"
" an Ethernet over L2TPv3 pseudowire.\n" " an Ethernet over L2TPv3 pseudowire.\n"
@ -2883,7 +2884,7 @@ SRST
-device e1000,netdev=n1,mac=52:54:00:12:34:56 \\ -device e1000,netdev=n1,mac=52:54:00:12:34:56 \\
-netdev socket,id=n1,mcast=239.192.168.1:1102,localaddr=1.2.3.4 -netdev socket,id=n1,mcast=239.192.168.1:1102,localaddr=1.2.3.4
``-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport],txsession=txsession[,rxsession=rxsession][,ipv6][,udp][,cookie64][,counter][,pincounter][,txcookie=txcookie][,rxcookie=rxcookie][,offset=offset]`` ``-netdev l2tpv3,id=id,src=srcaddr,dst=dstaddr[,srcport=srcport][,dstport=dstport],txsession=txsession[,rxsession=rxsession][,ipv6=on|off][,udp=on|off][,cookie64][,counter][,pincounter][,txcookie=txcookie][,rxcookie=rxcookie][,offset=offset]``
Configure a L2TPv3 pseudowire host network backend. L2TPv3 (RFC3931) Configure a L2TPv3 pseudowire host network backend. L2TPv3 (RFC3931)
is a popular protocol to transport Ethernet (and other Layer 2) data is a popular protocol to transport Ethernet (and other Layer 2) data
frames between two systems. It is present in routers, firewalls and frames between two systems. It is present in routers, firewalls and
@ -3032,13 +3033,13 @@ DEFHEADING(Character device options:)
DEF("chardev", HAS_ARG, QEMU_OPTION_chardev, DEF("chardev", HAS_ARG, QEMU_OPTION_chardev,
"-chardev help\n" "-chardev help\n"
"-chardev null,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n" "-chardev null,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
"-chardev socket,id=id[,host=host],port=port[,to=to][,ipv4][,ipv6][,nodelay][,reconnect=seconds]\n" "-chardev socket,id=id[,host=host],port=port[,to=to][,ipv4=on|off][,ipv6=on|off][,delay=on|off][,reconnect=seconds]\n"
" [,server][,nowait][,telnet][,websocket][,reconnect=seconds][,mux=on|off]\n" " [,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds][,mux=on|off]\n"
" [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] (tcp)\n" " [,logfile=PATH][,logappend=on|off][,tls-creds=ID][,tls-authz=ID] (tcp)\n"
"-chardev socket,id=id,path=path[,server][,nowait][,telnet][,websocket][,reconnect=seconds]\n" "-chardev socket,id=id,path=path[,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds]\n"
" [,mux=on|off][,logfile=PATH][,logappend=on|off][,abstract=on|off][,tight=on|off] (unix)\n" " [,mux=on|off][,logfile=PATH][,logappend=on|off][,abstract=on|off][,tight=on|off] (unix)\n"
"-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n" "-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr]\n"
" [,localport=localport][,ipv4][,ipv6][,mux=on|off]\n" " [,localport=localport][,ipv4=on|off][,ipv6=on|off][,mux=on|off]\n"
" [,logfile=PATH][,logappend=on|off]\n" " [,logfile=PATH][,logappend=on|off]\n"
"-chardev msmouse,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n" "-chardev msmouse,id=id[,mux=on|off][,logfile=PATH][,logappend=on|off]\n"
"-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]\n" "-chardev vc,id=id[[,width=width][,height=height]][[,cols=cols][,rows=rows]]\n"
@ -3148,21 +3149,21 @@ The available backends are:
A void device. This device will not emit any data, and will drop any A void device. This device will not emit any data, and will drop any
data it receives. The null backend does not take any options. data it receives. The null backend does not take any options.
``-chardev socket,id=id[,TCP options or unix options][,server][,nowait][,telnet][,websocket][,reconnect=seconds][,tls-creds=id][,tls-authz=id]`` ``-chardev socket,id=id[,TCP options or unix options][,server=on|off][,wait=on|off][,telnet=on|off][,websocket=on|off][,reconnect=seconds][,tls-creds=id][,tls-authz=id]``
Create a two-way stream socket, which can be either a TCP or a unix Create a two-way stream socket, which can be either a TCP or a unix
socket. A unix socket will be created if ``path`` is specified. socket. A unix socket will be created if ``path`` is specified.
Behaviour is undefined if TCP options are specified for a unix Behaviour is undefined if TCP options are specified for a unix
socket. socket.
``server`` specifies that the socket shall be a listening socket. ``server=on|off`` specifies that the socket shall be a listening socket.
``nowait`` specifies that QEMU should not block waiting for a client ``wait=on|off`` specifies that QEMU should not block waiting for a client
to connect to a listening socket. to connect to a listening socket.
``telnet`` specifies that traffic on the socket should interpret ``telnet=on|off`` specifies that traffic on the socket should interpret
telnet escape sequences. telnet escape sequences.
``websocket`` specifies that the socket uses WebSocket protocol for ``websocket=on|off`` specifies that the socket uses WebSocket protocol for
communication. communication.
``reconnect`` sets the timeout for reconnecting on non-server ``reconnect`` sets the timeout for reconnecting on non-server
@ -3183,7 +3184,7 @@ The available backends are:
TCP and unix socket options are given below: TCP and unix socket options are given below:
``TCP options: port=port[,host=host][,to=to][,ipv4][,ipv6][,nodelay]`` ``TCP options: port=port[,host=host][,to=to][,ipv4=on|off][,ipv6=on|off][,delay=on|off]``
``host`` for a listening socket specifies the local address to ``host`` for a listening socket specifies the local address to
be bound. For a connecting socket species the remote host to be bound. For a connecting socket species the remote host to
connect to. ``host`` is optional for listening sockets. If not connect to. ``host`` is optional for listening sockets. If not
@ -3199,21 +3200,21 @@ The available backends are:
bind to subsequent ports up to and including ``to`` until it bind to subsequent ports up to and including ``to`` until it
succeeds. ``to`` must be specified as a port number. succeeds. ``to`` must be specified as a port number.
``ipv4`` and ``ipv6`` specify that either IPv4 or IPv6 must be ``ipv4=on|off`` and ``ipv6=on|off`` specify that either IPv4
used. If neither is specified the socket may use either or IPv6 must be used. If neither is specified the socket may
protocol. use either protocol.
``nodelay`` disables the Nagle algorithm. ``delay=on|off`` disables the Nagle algorithm.
``unix options: path=path[,abstract=on|off][,tight=on|off]`` ``unix options: path=path[,abstract=on|off][,tight=on|off]``
``path`` specifies the local path of the unix socket. ``path`` ``path`` specifies the local path of the unix socket. ``path``
is required. is required.
``abstract`` specifies the use of the abstract socket namespace, ``abstract=on|off`` specifies the use of the abstract socket namespace,
rather than the filesystem. Optional, defaults to false. rather than the filesystem. Optional, defaults to false.
``tight`` sets the socket length of abstract sockets to their minimum, ``tight=on|off`` sets the socket length of abstract sockets to their minimum,
rather than the full sun_path length. Optional, defaults to true. rather than the full sun_path length. Optional, defaults to true.
``-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4][,ipv6]`` ``-chardev udp,id=id[,host=host],port=port[,localaddr=localaddr][,localport=localport][,ipv4=on|off][,ipv6=on|off]``
Sends all traffic from the guest to a remote host over UDP. Sends all traffic from the guest to a remote host over UDP.
``host`` specifies the remote host to connect to. If not specified ``host`` specifies the remote host to connect to. If not specified
@ -3228,7 +3229,7 @@ The available backends are:
``localport`` specifies the local port to bind to. If not specified ``localport`` specifies the local port to bind to. If not specified
any available local port will be used. any available local port will be used.
``ipv4`` and ``ipv6`` specify that either IPv4 or IPv6 must be used. ``ipv4=on|off`` and ``ipv6=on|off`` specify that either IPv4 or IPv6 must be used.
If neither is specified the device may use either protocol. If neither is specified the device may use either protocol.
``-chardev msmouse,id=id`` ``-chardev msmouse,id=id``
@ -3592,30 +3593,30 @@ SRST
``telnet options:`` ``telnet options:``
localhost 5555 localhost 5555
``tcp:[host]:port[,server][,nowait][,nodelay][,reconnect=seconds]`` ``tcp:[host]:port[,server=on|off][,wait=on|off][,delay=on|off][,reconnect=seconds]``
The TCP Net Console has two modes of operation. It can send the The TCP Net Console has two modes of operation. It can send the
serial I/O to a location or wait for a connection from a serial I/O to a location or wait for a connection from a
location. By default the TCP Net Console is sent to host at the location. By default the TCP Net Console is sent to host at the
port. If you use the server option QEMU will wait for a client port. If you use the ``server=on`` option QEMU will wait for a client
socket application to connect to the port before continuing, socket application to connect to the port before continuing,
unless the ``nowait`` option was specified. The ``nodelay`` unless the ``wait=on|off`` option was specified. The ``delay=on|off``
option disables the Nagle buffering algorithm. The ``reconnect`` option disables the Nagle buffering algorithm. The ``reconnect=on``
option only applies if noserver is set, if the connection goes option only applies if ``server=no`` is set, if the connection goes
down it will attempt to reconnect at the given interval. If host down it will attempt to reconnect at the given interval. If host
is omitted, 0.0.0.0 is assumed. Only one TCP connection at a is omitted, 0.0.0.0 is assumed. Only one TCP connection at a
time is accepted. You can use ``telnet`` to connect to the time is accepted. You can use ``telnet=on`` to connect to the
corresponding character device. corresponding character device.
``Example to send tcp console to 192.168.0.2 port 4444`` ``Example to send tcp console to 192.168.0.2 port 4444``
-serial tcp:192.168.0.2:4444 -serial tcp:192.168.0.2:4444
``Example to listen and wait on port 4444 for connection`` ``Example to listen and wait on port 4444 for connection``
-serial tcp::4444,server -serial tcp::4444,server=on
``Example to not wait and listen on ip 192.168.0.100 port 4444`` ``Example to not wait and listen on ip 192.168.0.100 port 4444``
-serial tcp:192.168.0.100:4444,server,nowait -serial tcp:192.168.0.100:4444,server=on,wait=off
``telnet:host:port[,server][,nowait][,nodelay]`` ``telnet:host:port[,server=on|off][,wait=on|off][,delay=on|off]``
The telnet protocol is used instead of raw tcp sockets. The The telnet protocol is used instead of raw tcp sockets. The
options work the same as if you had specified ``-serial tcp``. options work the same as if you had specified ``-serial tcp``.
The difference is that the port acts like a telnet server or The difference is that the port acts like a telnet server or
@ -3625,11 +3626,11 @@ SRST
you do it with Control-] and then type "send break" followed by you do it with Control-] and then type "send break" followed by
pressing the enter key. pressing the enter key.
``websocket:host:port,server[,nowait][,nodelay]`` ``websocket:host:port,server=on[,wait=on|off][,delay=on|off]``
The WebSocket protocol is used instead of raw tcp socket. The The WebSocket protocol is used instead of raw tcp socket. The
port acts as a WebSocket server. Client mode is not supported. port acts as a WebSocket server. Client mode is not supported.
``unix:path[,server][,nowait][,reconnect=seconds]`` ``unix:path[,server=on|off][,wait=on|off][,reconnect=seconds]``
A unix domain socket is used instead of a tcp socket. The option A unix domain socket is used instead of a tcp socket. The option
works the same as if you had specified ``-serial tcp`` except works the same as if you had specified ``-serial tcp`` except
the unix domain socket path is used for connections. the unix domain socket path is used for connections.
@ -3642,7 +3643,7 @@ SRST
multiplex the monitor onto a telnet server listening on port multiplex the monitor onto a telnet server listening on port
4444 would be: 4444 would be:
``-serial mon:telnet::4444,server,nowait`` ``-serial mon:telnet::4444,server=on,wait=off``
When the monitor is multiplexed to stdio in this way, Ctrl+C When the monitor is multiplexed to stdio in this way, Ctrl+C
will not terminate QEMU any more but will be passed to the guest will not terminate QEMU any more but will be passed to the guest
@ -4134,8 +4135,8 @@ SRST
ERST ERST
DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \ DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \
"-incoming tcp:[host]:port[,to=maxport][,ipv4][,ipv6]\n" \ "-incoming tcp:[host]:port[,to=maxport][,ipv4=on|off][,ipv6=on|off]\n" \
"-incoming rdma:host:port[,ipv4][,ipv6]\n" \ "-incoming rdma:host:port[,ipv4=on|off][,ipv6=on|off]\n" \
"-incoming unix:socketpath\n" \ "-incoming unix:socketpath\n" \
" prepare for incoming migration, listen on\n" \ " prepare for incoming migration, listen on\n" \
" specified protocol and socket address\n" \ " specified protocol and socket address\n" \
@ -4147,9 +4148,9 @@ DEF("incoming", HAS_ARG, QEMU_OPTION_incoming, \
" wait for the URI to be specified via migrate_incoming\n", " wait for the URI to be specified via migrate_incoming\n",
QEMU_ARCH_ALL) QEMU_ARCH_ALL)
SRST SRST
``-incoming tcp:[host]:port[,to=maxport][,ipv4][,ipv6]`` ``-incoming tcp:[host]:port[,to=maxport][,ipv4=on|off][,ipv6=on|off]``
\ \
``-incoming rdma:host:port[,ipv4][,ipv6]`` ``-incoming rdma:host:port[,ipv4=on|off][,ipv6=on|off]``
Prepare for incoming migration, listen on a given tcp port. Prepare for incoming migration, listen on a given tcp port.
``-incoming unix:socketpath`` ``-incoming unix:socketpath``
@ -4334,13 +4335,8 @@ SRST
ERST ERST
DEF("writeconfig", HAS_ARG, QEMU_OPTION_writeconfig, DEF("writeconfig", HAS_ARG, QEMU_OPTION_writeconfig,
"-writeconfig <file>\n" "-writeconfig <file>\n"
" read/write config file\n", QEMU_ARCH_ALL) " read/write config file (deprecated)\n", QEMU_ARCH_ALL)
SRST SRST
``-writeconfig file``
Write device configuration to file. The file can be either filename
to save command line and device configuration into file or dash
``-``) character to print the output to stdout. This can be later
used as input file for ``-readconfig`` option.
ERST ERST
DEF("no-user-config", 0, QEMU_OPTION_nouserconfig, DEF("no-user-config", 0, QEMU_OPTION_nouserconfig,
@ -4815,11 +4811,11 @@ SRST
primary: primary:
-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66 -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
-chardev socket,id=mirror0,host=3.3.3.3,port=9003,server,nowait -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
-chardev socket,id=compare1,host=3.3.3.3,port=9004,server,nowait -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
-chardev socket,id=compare0,host=3.3.3.3,port=9001,server,nowait -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
-chardev socket,id=compare0-0,host=3.3.3.3,port=9001 -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
-chardev socket,id=compare_out,host=3.3.3.3,port=9005,server,nowait -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
-chardev socket,id=compare_out0,host=3.3.3.3,port=9005 -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
-object iothread,id=iothread1 -object iothread,id=iothread1
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0
@ -4841,13 +4837,13 @@ SRST
primary: primary:
-netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown -netdev tap,id=hn0,vhost=off,script=/etc/qemu-ifup,downscript=/etc/qemu-ifdown
-device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66 -device e1000,id=e0,netdev=hn0,mac=52:a4:00:12:78:66
-chardev socket,id=mirror0,host=3.3.3.3,port=9003,server,nowait -chardev socket,id=mirror0,host=3.3.3.3,port=9003,server=on,wait=off
-chardev socket,id=compare1,host=3.3.3.3,port=9004,server,nowait -chardev socket,id=compare1,host=3.3.3.3,port=9004,server=on,wait=off
-chardev socket,id=compare0,host=3.3.3.3,port=9001,server,nowait -chardev socket,id=compare0,host=3.3.3.3,port=9001,server=on,wait=off
-chardev socket,id=compare0-0,host=3.3.3.3,port=9001 -chardev socket,id=compare0-0,host=3.3.3.3,port=9001
-chardev socket,id=compare_out,host=3.3.3.3,port=9005,server,nowait -chardev socket,id=compare_out,host=3.3.3.3,port=9005,server=on,wait=off
-chardev socket,id=compare_out0,host=3.3.3.3,port=9005 -chardev socket,id=compare_out0,host=3.3.3.3,port=9005
-chardev socket,id=notify_way,host=3.3.3.3,port=9009,server,nowait -chardev socket,id=notify_way,host=3.3.3.3,port=9009,server=on,wait=off
-object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0 -object filter-mirror,id=m0,netdev=hn0,queue=tx,outdev=mirror0
-object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out -object filter-redirector,netdev=hn0,id=redire0,queue=rx,indev=compare_out
-object filter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0 -object filter-redirector,netdev=hn0,id=redire1,queue=rx,outdev=compare0

View File

@ -695,7 +695,7 @@ static void object_finalize(void *data)
/* Find the minimum alignment guaranteed by the system malloc. */ /* Find the minimum alignment guaranteed by the system malloc. */
#if __STDC_VERSION__ >= 201112L #if __STDC_VERSION__ >= 201112L
typddef max_align_t qemu_max_align_t; typedef max_align_t qemu_max_align_t;
#else #else
typedef union { typedef union {
long l; long l;

View File

@ -2,12 +2,24 @@
# #
# Helper script for the build process to apply entitlements # Helper script for the build process to apply entitlements
in_place=:
if [ "$1" = --install ]; then
shift
in_place=false
fi
SRC="$1" SRC="$1"
DST="$2" DST="$2"
ENTITLEMENT="$3" ENTITLEMENT="$3"
trap 'rm "$DST.tmp"' exit if $in_place; then
cp -af "$SRC" "$DST.tmp" trap 'rm "$DST.tmp"' exit
codesign --entitlements "$ENTITLEMENT" --force -s - "$DST.tmp" cp -af "$SRC" "$DST.tmp"
mv "$DST.tmp" "$DST" SRC="$DST.tmp"
else
cd "$MESON_INSTALL_DESTDIR_PREFIX"
fi
codesign --entitlements "$ENTITLEMENT" --force -s - "$SRC"
mv -f "$SRC" "$DST"
trap '' exit trap '' exit

View File

@ -11,7 +11,7 @@
# #
# Start QEMU with: # Start QEMU with:
# #
# # qemu [...] -chardev socket,path=/tmp/qga.sock,server,nowait,id=qga0 \ # # qemu [...] -chardev socket,path=/tmp/qga.sock,server=on,wait=off,id=qga0 \
# -device virtio-serial -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 # -device virtio-serial -device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0
# #
# Run the script: # Run the script:

View File

@ -565,21 +565,52 @@ const char *scsi_command_name(uint8_t cmd)
return names[cmd]; return names[cmd];
} }
int scsi_sense_from_errno(int errno_value, SCSISense *sense)
{
switch (errno_value) {
case 0:
return GOOD;
case EDOM:
return TASK_SET_FULL;
#ifdef CONFIG_LINUX
/* These errno mapping are specific to Linux. For more information:
* - scsi_decide_disposition in drivers/scsi/scsi_error.c
* - scsi_result_to_blk_status in drivers/scsi/scsi_lib.c
* - blk_errors[] in block/blk-core.c
*/
case EBADE:
return RESERVATION_CONFLICT;
case ENODATA:
*sense = SENSE_CODE(READ_ERROR);
return CHECK_CONDITION;
case EREMOTEIO:
*sense = SENSE_CODE(LUN_COMM_FAILURE);
return CHECK_CONDITION;
#endif
case ENOMEDIUM:
*sense = SENSE_CODE(NO_MEDIUM);
return CHECK_CONDITION;
case ENOMEM:
*sense = SENSE_CODE(TARGET_FAILURE);
return CHECK_CONDITION;
case EINVAL:
*sense = SENSE_CODE(INVALID_FIELD);
return CHECK_CONDITION;
case ENOSPC:
*sense = SENSE_CODE(SPACE_ALLOC_FAILED);
return CHECK_CONDITION;
default:
*sense = SENSE_CODE(IO_ERROR);
return CHECK_CONDITION;
}
}
#ifdef CONFIG_LINUX #ifdef CONFIG_LINUX
int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr, int sg_io_sense_from_errno(int errno_value, struct sg_io_hdr *io_hdr,
SCSISense *sense) SCSISense *sense)
{ {
if (errno_value != 0) { if (errno_value != 0) {
switch (errno_value) { return scsi_sense_from_errno(errno_value, sense);
case EDOM:
return TASK_SET_FULL;
case ENOMEM:
*sense = SENSE_CODE(TARGET_FAILURE);
return CHECK_CONDITION;
default:
*sense = SENSE_CODE(IO_ERROR);
return CHECK_CONDITION;
}
} else { } else {
if (io_hdr->host_status == SG_ERR_DID_NO_CONNECT || if (io_hdr->host_status == SG_ERR_DID_NO_CONNECT ||
io_hdr->host_status == SG_ERR_DID_BUS_BUSY || io_hdr->host_status == SG_ERR_DID_BUS_BUSY ||

View File

@ -3356,6 +3356,7 @@ void qemu_init(int argc, char **argv, char **envp)
case QEMU_OPTION_writeconfig: case QEMU_OPTION_writeconfig:
{ {
FILE *fp; FILE *fp;
warn_report("-writeconfig is deprecated and will go away without a replacement");
if (strcmp(optarg, "-") == 0) { if (strcmp(optarg, "-") == 0) {
fp = stdout; fp = stdout;
} else { } else {

View File

@ -963,7 +963,7 @@ static FeatureWordInfo feature_word_info[FEATURE_WORDS] = {
"avx512bitalg", NULL, "avx512-vpopcntdq", NULL, "avx512bitalg", NULL, "avx512-vpopcntdq", NULL,
"la57", NULL, NULL, NULL, "la57", NULL, NULL, NULL,
NULL, NULL, "rdpid", NULL, NULL, NULL, "rdpid", NULL,
NULL, "cldemote", NULL, "movdiri", "bus-lock-detect", "cldemote", NULL, "movdiri",
"movdir64b", NULL, NULL, "pks", "movdir64b", NULL, NULL, "pks",
}, },
.cpuid = { .cpuid = {
@ -6557,7 +6557,7 @@ static void x86_cpu_expand_features(X86CPU *cpu, Error **errp)
} else if (cpu->env.cpuid_min_level < 0x14) { } else if (cpu->env.cpuid_min_level < 0x14) {
mark_unavailable_features(cpu, FEAT_7_0_EBX, mark_unavailable_features(cpu, FEAT_7_0_EBX,
CPUID_7_0_EBX_INTEL_PT, CPUID_7_0_EBX_INTEL_PT,
"Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,+intel-pt,min-level=0x14\""); "Intel PT need CPUID leaf 0x14, please set by \"-cpu ...,intel-pt=on,min-level=0x14\"");
} }
} }

View File

@ -769,6 +769,8 @@ typedef uint64_t FeatureWordArray[FEATURE_WORDS];
#define CPUID_7_0_ECX_LA57 (1U << 16) #define CPUID_7_0_ECX_LA57 (1U << 16)
/* Read Processor ID */ /* Read Processor ID */
#define CPUID_7_0_ECX_RDPID (1U << 22) #define CPUID_7_0_ECX_RDPID (1U << 22)
/* Bus Lock Debug Exception */
#define CPUID_7_0_ECX_BUS_LOCK_DETECT (1U << 24)
/* Cache Line Demote Instruction */ /* Cache Line Demote Instruction */
#define CPUID_7_0_ECX_CLDEMOTE (1U << 25) #define CPUID_7_0_ECX_CLDEMOTE (1U << 25)
/* Move Doubleword as Direct Store Instruction */ /* Move Doubleword as Direct Store Instruction */

View File

@ -222,7 +222,8 @@ void helper_rdtscp(CPUX86State *env)
void helper_rdpmc(CPUX86State *env) void helper_rdpmc(CPUX86State *env)
{ {
if ((env->cr[4] & CR4_PCE_MASK) && ((env->hflags & HF_CPL_MASK) != 0)) { if (((env->cr[4] & CR4_PCE_MASK) == 0 ) &&
((env->hflags & HF_CPL_MASK) != 0)) {
raise_exception_ra(env, EXCP0D_GPF, GETPC()); raise_exception_ra(env, EXCP0D_GPF, GETPC());
} }
cpu_svm_check_intercept_param(env, SVM_EXIT_RDPMC, 0, GETPC()); cpu_svm_check_intercept_param(env, SVM_EXIT_RDPMC, 0, GETPC());

View File

@ -64,10 +64,10 @@ if __name__ == '__main__':
# Launch QEMU with binary # Launch QEMU with binary
if "system" in args.qemu: if "system" in args.qemu:
cmd = "%s %s %s -gdb unix:path=%s,server" % (args.qemu, cmd = "%s %s %s -gdb unix:path=%s,server=on" % (args.qemu,
args.qargs, args.qargs,
args.binary, args.binary,
socket_name) socket_name)
else: else:
cmd = "%s %s -g %s %s" % (args.qemu, args.qargs, socket_name, cmd = "%s %s -g %s %s" % (args.qemu, args.qargs, socket_name,
args.binary) args.binary)

View File

@ -235,82 +235,82 @@ int main(int argc, char **argv)
/* If level is not large enough, it should increase automatically: */ /* If level is not large enough, it should increase automatically: */
/* CPUID[6].EAX: */ /* CPUID[6].EAX: */
add_cpuid_test("x86/cpuid/auto-level/phenom/arat", add_cpuid_test("x86/cpuid/auto-level/phenom/arat",
"-cpu 486,+arat", "level", 6); "-cpu 486,arat=on", "level", 6);
/* CPUID[EAX=7,ECX=0].EBX: */ /* CPUID[EAX=7,ECX=0].EBX: */
add_cpuid_test("x86/cpuid/auto-level/phenom/fsgsbase", add_cpuid_test("x86/cpuid/auto-level/phenom/fsgsbase",
"-cpu phenom,+fsgsbase", "level", 7); "-cpu phenom,fsgsbase=on", "level", 7);
/* CPUID[EAX=7,ECX=0].ECX: */ /* CPUID[EAX=7,ECX=0].ECX: */
add_cpuid_test("x86/cpuid/auto-level/phenom/avx512vbmi", add_cpuid_test("x86/cpuid/auto-level/phenom/avx512vbmi",
"-cpu phenom,+avx512vbmi", "level", 7); "-cpu phenom,avx512vbmi=on", "level", 7);
/* CPUID[EAX=0xd,ECX=1].EAX: */ /* CPUID[EAX=0xd,ECX=1].EAX: */
add_cpuid_test("x86/cpuid/auto-level/phenom/xsaveopt", add_cpuid_test("x86/cpuid/auto-level/phenom/xsaveopt",
"-cpu phenom,+xsaveopt", "level", 0xd); "-cpu phenom,xsaveopt=on", "level", 0xd);
/* CPUID[8000_0001].EDX: */ /* CPUID[8000_0001].EDX: */
add_cpuid_test("x86/cpuid/auto-xlevel/486/3dnow", add_cpuid_test("x86/cpuid/auto-xlevel/486/3dnow",
"-cpu 486,+3dnow", "xlevel", 0x80000001); "-cpu 486,3dnow=on", "xlevel", 0x80000001);
/* CPUID[8000_0001].ECX: */ /* CPUID[8000_0001].ECX: */
add_cpuid_test("x86/cpuid/auto-xlevel/486/sse4a", add_cpuid_test("x86/cpuid/auto-xlevel/486/sse4a",
"-cpu 486,+sse4a", "xlevel", 0x80000001); "-cpu 486,sse4a=on", "xlevel", 0x80000001);
/* CPUID[8000_0007].EDX: */ /* CPUID[8000_0007].EDX: */
add_cpuid_test("x86/cpuid/auto-xlevel/486/invtsc", add_cpuid_test("x86/cpuid/auto-xlevel/486/invtsc",
"-cpu 486,+invtsc", "xlevel", 0x80000007); "-cpu 486,invtsc=on", "xlevel", 0x80000007);
/* CPUID[8000_000A].EDX: */ /* CPUID[8000_000A].EDX: */
add_cpuid_test("x86/cpuid/auto-xlevel/486/npt", add_cpuid_test("x86/cpuid/auto-xlevel/486/npt",
"-cpu 486,+svm,+npt", "xlevel", 0x8000000A); "-cpu 486,svm=on,npt=on", "xlevel", 0x8000000A);
/* CPUID[C000_0001].EDX: */ /* CPUID[C000_0001].EDX: */
add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore", add_cpuid_test("x86/cpuid/auto-xlevel2/phenom/xstore",
"-cpu phenom,+xstore", "xlevel2", 0xC0000001); "-cpu phenom,xstore=on", "xlevel2", 0xC0000001);
/* SVM needs CPUID[0x8000000A] */ /* SVM needs CPUID[0x8000000A] */
add_cpuid_test("x86/cpuid/auto-xlevel/athlon/svm", add_cpuid_test("x86/cpuid/auto-xlevel/athlon/svm",
"-cpu athlon,+svm", "xlevel", 0x8000000A); "-cpu athlon,svm=on", "xlevel", 0x8000000A);
/* If level is already large enough, it shouldn't change: */ /* If level is already large enough, it shouldn't change: */
add_cpuid_test("x86/cpuid/auto-level/SandyBridge/multiple", add_cpuid_test("x86/cpuid/auto-level/SandyBridge/multiple",
"-cpu SandyBridge,+arat,+fsgsbase,+avx512vbmi", "-cpu SandyBridge,arat=on,fsgsbase=on,avx512vbmi=on",
"level", 0xd); "level", 0xd);
/* If level is explicitly set, it shouldn't change: */ /* If level is explicitly set, it shouldn't change: */
add_cpuid_test("x86/cpuid/auto-level/486/fixed/0xF", add_cpuid_test("x86/cpuid/auto-level/486/fixed/0xF",
"-cpu 486,level=0xF,+arat,+fsgsbase,+avx512vbmi,+xsaveopt", "-cpu 486,level=0xF,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
"level", 0xF); "level", 0xF);
add_cpuid_test("x86/cpuid/auto-level/486/fixed/2", add_cpuid_test("x86/cpuid/auto-level/486/fixed/2",
"-cpu 486,level=2,+arat,+fsgsbase,+avx512vbmi,+xsaveopt", "-cpu 486,level=2,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
"level", 2); "level", 2);
add_cpuid_test("x86/cpuid/auto-level/486/fixed/0", add_cpuid_test("x86/cpuid/auto-level/486/fixed/0",
"-cpu 486,level=0,+arat,+fsgsbase,+avx512vbmi,+xsaveopt", "-cpu 486,level=0,arat=on,fsgsbase=on,avx512vbmi=on,xsaveopt=on",
"level", 0); "level", 0);
/* if xlevel is already large enough, it shouldn't change: */ /* if xlevel is already large enough, it shouldn't change: */
add_cpuid_test("x86/cpuid/auto-xlevel/phenom/3dnow", add_cpuid_test("x86/cpuid/auto-xlevel/phenom/3dnow",
"-cpu phenom,+3dnow,+sse4a,+invtsc,+npt,+svm", "-cpu phenom,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
"xlevel", 0x8000001A); "xlevel", 0x8000001A);
/* If xlevel is explicitly set, it shouldn't change: */ /* If xlevel is explicitly set, it shouldn't change: */
add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/80000002", add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/80000002",
"-cpu 486,xlevel=0x80000002,+3dnow,+sse4a,+invtsc,+npt,+svm", "-cpu 486,xlevel=0x80000002,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
"xlevel", 0x80000002); "xlevel", 0x80000002);
add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/8000001A", add_cpuid_test("x86/cpuid/auto-xlevel/486/fixed/8000001A",
"-cpu 486,xlevel=0x8000001A,+3dnow,+sse4a,+invtsc,+npt,+svm", "-cpu 486,xlevel=0x8000001A,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
"xlevel", 0x8000001A); "xlevel", 0x8000001A);
add_cpuid_test("x86/cpuid/auto-xlevel/phenom/fixed/0", add_cpuid_test("x86/cpuid/auto-xlevel/phenom/fixed/0",
"-cpu 486,xlevel=0,+3dnow,+sse4a,+invtsc,+npt,+svm", "-cpu 486,xlevel=0,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
"xlevel", 0); "xlevel", 0);
/* if xlevel2 is already large enough, it shouldn't change: */ /* if xlevel2 is already large enough, it shouldn't change: */
add_cpuid_test("x86/cpuid/auto-xlevel2/486/fixed", add_cpuid_test("x86/cpuid/auto-xlevel2/486/fixed",
"-cpu 486,xlevel2=0xC0000002,+xstore", "-cpu 486,xlevel2=0xC0000002,xstore=on",
"xlevel2", 0xC0000002); "xlevel2", 0xC0000002);
/* Check compatibility of old machine-types that didn't /* Check compatibility of old machine-types that didn't
* auto-increase level/xlevel/xlevel2: */ * auto-increase level/xlevel/xlevel2: */
add_cpuid_test("x86/cpuid/auto-level/pc-2.7", add_cpuid_test("x86/cpuid/auto-level/pc-2.7",
"-machine pc-i440fx-2.7 -cpu 486,+arat,+avx512vbmi,+xsaveopt", "-machine pc-i440fx-2.7 -cpu 486,arat=on,avx512vbmi=on,xsaveopt=on",
"level", 1); "level", 1);
add_cpuid_test("x86/cpuid/auto-xlevel/pc-2.7", add_cpuid_test("x86/cpuid/auto-xlevel/pc-2.7",
"-machine pc-i440fx-2.7 -cpu 486,+3dnow,+sse4a,+invtsc,+npt,+svm", "-machine pc-i440fx-2.7 -cpu 486,3dnow=on,sse4a=on,invtsc=on,npt=on,svm=on",
"xlevel", 0); "xlevel", 0);
add_cpuid_test("x86/cpuid/auto-xlevel2/pc-2.7", add_cpuid_test("x86/cpuid/auto-xlevel2/pc-2.7",
"-machine pc-i440fx-2.7 -cpu 486,+xstore", "-machine pc-i440fx-2.7 -cpu 486,xstore=on",
"xlevel2", 0); "xlevel2", 0);
/* /*
* QEMU 1.4.0 had auto-level enabled for CPUID[7], already, * QEMU 1.4.0 had auto-level enabled for CPUID[7], already,
@ -321,19 +321,19 @@ int main(int argc, char **argv)
"-machine pc-i440fx-1.4 -cpu Nehalem", "-machine pc-i440fx-1.4 -cpu Nehalem",
"level", 2); "level", 2);
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-1.5/on", add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-1.5/on",
"-machine pc-i440fx-1.4 -cpu Nehalem,+smap", "-machine pc-i440fx-1.4 -cpu Nehalem,smap=on",
"level", 7); "level", 7);
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/off", add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/off",
"-machine pc-i440fx-2.3 -cpu Penryn", "-machine pc-i440fx-2.3 -cpu Penryn",
"level", 4); "level", 4);
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/on", add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.3/on",
"-machine pc-i440fx-2.3 -cpu Penryn,+erms", "-machine pc-i440fx-2.3 -cpu Penryn,erms=on",
"level", 7); "level", 7);
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/off", add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/off",
"-machine pc-i440fx-2.9 -cpu Conroe", "-machine pc-i440fx-2.9 -cpu Conroe",
"level", 10); "level", 10);
add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/on", add_cpuid_test("x86/cpuid/auto-level7/pc-i440fx-2.9/on",
"-machine pc-i440fx-2.9 -cpu Conroe,+erms", "-machine pc-i440fx-2.9 -cpu Conroe,erms=on",
"level", 10); "level", 10);
/* /*
@ -348,7 +348,7 @@ int main(int argc, char **argv)
"-machine pc-i440fx-2.4 -cpu SandyBridge,", "-machine pc-i440fx-2.4 -cpu SandyBridge,",
"xlevel", 0x80000008); "xlevel", 0x80000008);
add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on", add_cpuid_test("x86/cpuid/xlevel-compat/pc-i440fx-2.4/npt-on",
"-machine pc-i440fx-2.4 -cpu SandyBridge,+svm,+npt", "-machine pc-i440fx-2.4 -cpu SandyBridge,svm=on,npt=on",
"xlevel", 0x80000008); "xlevel", 0x80000008);
/* Test feature parsing */ /* Test feature parsing */

View File

@ -780,7 +780,7 @@ static void char_socket_server_test(gconstpointer opaque)
g_setenv("QTEST_SILENT_ERRORS", "1", 1); g_setenv("QTEST_SILENT_ERRORS", "1", 1);
/* /*
* We rely on config->addr containing "nowait", otherwise * We rely on config->addr containing "wait=off", otherwise
* qemu_chr_new() will block until a client connects. We * qemu_chr_new() will block until a client connects. We
* can't spawn our client thread though, because until * can't spawn our client thread though, because until
* qemu_chr_new() returns we don't know what TCP port was * qemu_chr_new() returns we don't know what TCP port was
@ -1114,7 +1114,7 @@ static void char_socket_server_two_clients_test(gconstpointer opaque)
g_setenv("QTEST_SILENT_ERRORS", "1", 1); g_setenv("QTEST_SILENT_ERRORS", "1", 1);
/* /*
* We rely on addr containing "nowait", otherwise * We rely on addr containing "wait=off", otherwise
* qemu_chr_new() will block until a client connects. We * qemu_chr_new() will block until a client connects. We
* can't spawn our client thread though, because until * can't spawn our client thread though, because until
* qemu_chr_new() returns we don't know what TCP port was * qemu_chr_new() returns we don't know what TCP port was