Add the Windows Hypervisor Platform accelerator.

Introduces the configure support for the new Windows Hypervisor Platform that
allows for hypervisor acceleration from usermode components on the Windows
platform.

Signed-off-by: Justin Terry (VM) <juterry@microsoft.com>
Message-Id: <1516655269-1785-2-git-send-email-juterry@microsoft.com>
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
Justin Terry (VM) 2018-01-22 13:07:46 -08:00 committed by Paolo Bonzini
parent 8f6d701044
commit d661d9a42b
2 changed files with 51 additions and 5 deletions

48
configure vendored
View File

@ -222,6 +222,17 @@ supported_hvf_target() {
return 1 return 1
} }
supported_whpx_target() {
test "$whpx" = "yes" || return 1
glob "$1" "*-softmmu" || return 1
case "${1%-softmmu}" in
i386|x86_64)
return 0
;;
esac
return 1
}
supported_target() { supported_target() {
case "$1" in case "$1" in
*-softmmu) *-softmmu)
@ -248,6 +259,7 @@ supported_target() {
supported_xen_target "$1" && return 0 supported_xen_target "$1" && return 0
supported_hax_target "$1" && return 0 supported_hax_target "$1" && return 0
supported_hvf_target "$1" && return 0 supported_hvf_target "$1" && return 0
supported_whpx_target "$1" && return 0
print_error "TCG disabled, but hardware accelerator not available for '$target'" print_error "TCG disabled, but hardware accelerator not available for '$target'"
return 1 return 1
} }
@ -338,6 +350,7 @@ vhost_user=""
kvm="no" kvm="no"
hax="no" hax="no"
hvf="no" hvf="no"
whpx="no"
rdma="" rdma=""
gprof="no" gprof="no"
debug_tcg="no" debug_tcg="no"
@ -1058,6 +1071,10 @@ for opt do
;; ;;
--enable-hvf) hvf="yes" --enable-hvf) hvf="yes"
;; ;;
--disable-whpx) whpx="no"
;;
--enable-whpx) whpx="yes"
;;
--disable-tcg-interpreter) tcg_interpreter="no" --disable-tcg-interpreter) tcg_interpreter="no"
;; ;;
--enable-tcg-interpreter) tcg_interpreter="yes" --enable-tcg-interpreter) tcg_interpreter="yes"
@ -1557,6 +1574,7 @@ disabled with --disable-FEATURE, default is enabled if available:
kvm KVM acceleration support kvm KVM acceleration support
hax HAX acceleration support hax HAX acceleration support
hvf Hypervisor.framework acceleration support hvf Hypervisor.framework acceleration support
whpx Windows Hypervisor Platform acceleration support
rdma RDMA-based migration support rdma RDMA-based migration support
vde support for vde network vde support for vde network
netmap support for netmap network netmap support for netmap network
@ -2455,6 +2473,30 @@ if test "$xen_pv_domain_build" = "yes" &&
"which requires Xen support." "which requires Xen support."
fi fi
##########################################
# Windows Hypervisor Platform accelerator (WHPX) check
if test "$whpx" != "no" ; then
cat > $TMPC << EOF
#include <windows.h>
#include <winhvplatform.h>
#include <winhvemulation.h>
int main(void) {
WHV_CAPABILITY whpx_cap;
WHvGetCapability(WHvCapabilityCodeFeatures, &whpx_cap, sizeof(whpx_cap));
return 0;
}
EOF
if compile_prog "" "-lwinhvplatform -lwinhvemulation" ; then
libs_softmmu="$libs_softmmu -lwinhvplatform -lwinhvemulation"
whpx="yes"
else
if test "$whpx" = "yes"; then
feature_not_found "winhvplatform" "winhvemulation is not installed"
fi
whpx="no"
fi
fi
########################################## ##########################################
# Sparse probe # Sparse probe
if test "$sparse" != "no" ; then if test "$sparse" != "no" ; then
@ -5648,6 +5690,7 @@ echo "Install blobs $blobs"
echo "KVM support $kvm" echo "KVM support $kvm"
echo "HAX support $hax" echo "HAX support $hax"
echo "HVF support $hvf" echo "HVF support $hvf"
echo "WHPX support $whpx"
echo "TCG support $tcg" echo "TCG support $tcg"
if test "$tcg" = "yes" ; then if test "$tcg" = "yes" ; then
echo "TCG debug enabled $debug_tcg" echo "TCG debug enabled $debug_tcg"
@ -5815,7 +5858,7 @@ if test "$mingw32" = "yes" ; then
echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak echo "CONFIG_QGA_NTDDDISK=y" >> $config_host_mak
fi fi
if test "$guest_agent_msi" = "yes"; then if test "$guest_agent_msi" = "yes"; then
echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak echo "QEMU_GA_MSI_ENABLED=yes" >> $config_host_mak
echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak echo "QEMU_GA_MSI_WITH_VSS=${QEMU_GA_MSI_WITH_VSS}" >> $config_host_mak
echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak echo "QEMU_GA_MSI_ARCH=${QEMU_GA_MSI_ARCH}" >> $config_host_mak
@ -6748,6 +6791,9 @@ fi
if supported_hvf_target $target; then if supported_hvf_target $target; then
echo "CONFIG_HVF=y" >> $config_target_mak echo "CONFIG_HVF=y" >> $config_target_mak
fi fi
if supported_whpx_target $target; then
echo "CONFIG_WHPX=y" >> $config_target_mak
fi
if test "$target_bigendian" = "yes" ; then if test "$target_bigendian" = "yes" ; then
echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak echo "TARGET_WORDS_BIGENDIAN=y" >> $config_target_mak
fi fi

View File

@ -31,7 +31,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
"-machine [type=]name[,prop[=value][,...]]\n" "-machine [type=]name[,prop[=value][,...]]\n"
" selects emulated machine ('-machine help' for list)\n" " selects emulated machine ('-machine help' for list)\n"
" property accel=accel1[:accel2[:...]] selects accelerator\n" " property accel=accel1[:accel2[:...]] selects accelerator\n"
" supported accelerators are kvm, xen, hax, hvf or tcg (default: tcg)\n" " supported accelerators are kvm, xen, hax, hvf, whpx or tcg (default: tcg)\n"
" kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n" " kernel_irqchip=on|off|split controls accelerated irqchip support (default=off)\n"
" vmport=on|off|auto controls emulation of vmport (default: auto)\n" " vmport=on|off|auto controls emulation of vmport (default: auto)\n"
" kvm_shadow_mem=size of KVM shadow MMU in bytes\n" " kvm_shadow_mem=size of KVM shadow MMU in bytes\n"
@ -66,7 +66,7 @@ Supported machine properties are:
@table @option @table @option
@item accel=@var{accels1}[:@var{accels2}[:...]] @item accel=@var{accels1}[:@var{accels2}[:...]]
This is used to enable an accelerator. Depending on the target architecture, This is used to enable an accelerator. Depending on the target architecture,
kvm, xen, hax, hvf or tcg can be available. By default, tcg is used. If there is kvm, xen, hax, hvf, whpx or tcg can be available. By default, tcg is used. If there is
more than one accelerator specified, the next one is used if the previous one more than one accelerator specified, the next one is used if the previous one
fails to initialize. fails to initialize.
@item kernel_irqchip=on|off @item kernel_irqchip=on|off
@ -126,13 +126,13 @@ ETEXI
DEF("accel", HAS_ARG, QEMU_OPTION_accel, DEF("accel", HAS_ARG, QEMU_OPTION_accel,
"-accel [accel=]accelerator[,thread=single|multi]\n" "-accel [accel=]accelerator[,thread=single|multi]\n"
" select accelerator (kvm, xen, hax, hvf or tcg; use 'help' for a list)\n" " select accelerator (kvm, xen, hax, hvf, whpx or tcg; use 'help' for a list)\n"
" thread=single|multi (enable multi-threaded TCG)", QEMU_ARCH_ALL) " thread=single|multi (enable multi-threaded TCG)", QEMU_ARCH_ALL)
STEXI STEXI
@item -accel @var{name}[,prop=@var{value}[,...]] @item -accel @var{name}[,prop=@var{value}[,...]]
@findex -accel @findex -accel
This is used to enable an accelerator. Depending on the target architecture, This is used to enable an accelerator. Depending on the target architecture,
kvm, xen, hax, hvf or tcg can be available. By default, tcg is used. If there is kvm, xen, hax, hvf, whpx or tcg can be available. By default, tcg is used. If there is
more than one accelerator specified, the next one is used if the previous one more than one accelerator specified, the next one is used if the previous one
fails to initialize. fails to initialize.
@table @option @table @option