mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'remotes/bonzini-gitlab/tags/for-upstream' into staging
* NetBSD NVMM support * RateLimit mutex * Prepare for Meson 0.57 upgrade # gpg: Signature made Tue 04 May 2021 13:15:37 BST # 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: glib-compat: accept G_TEST_SLOW environment variable gitlab-ci: use --meson=internal for CFI jobs configure: handle meson options that have changed type configure: reindent meson invocation slirp: add configure option to disable smbd ratelimit: protect with a mutex Add NVMM Accelerator: add maintainers for NetBSD/NVMM Add NVMM accelerator: acceleration enlightenments Add NVMM accelerator: x86 CPU support Add NVMM accelerator: configure and build logic oslib-win32: do not rely on macro to get redefined function name Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
+7
-3
@@ -19,17 +19,21 @@ include:
|
||||
before_script:
|
||||
- JOBS=$(expr $(nproc) + 1)
|
||||
script:
|
||||
- if test -n "$LD_JOBS";
|
||||
then
|
||||
scripts/git-submodule.sh update meson ;
|
||||
fi
|
||||
- mkdir build
|
||||
- cd build
|
||||
- if test -n "$TARGETS";
|
||||
then
|
||||
../configure --enable-werror --disable-docs $CONFIGURE_ARGS --target-list="$TARGETS" ;
|
||||
../configure --enable-werror --disable-docs ${LD_JOBS:+--meson=internal} $CONFIGURE_ARGS --target-list="$TARGETS" ;
|
||||
else
|
||||
../configure --enable-werror --disable-docs $CONFIGURE_ARGS ;
|
||||
../configure --enable-werror --disable-docs ${LD_JOBS:+--meson=internal} $CONFIGURE_ARGS ;
|
||||
fi || { cat config.log meson-logs/meson-log.txt && exit 1; }
|
||||
- if test -n "$LD_JOBS";
|
||||
then
|
||||
meson configure . -Dbackend_max_links="$LD_JOBS" ;
|
||||
../meson/meson.py configure . -Dbackend_max_links="$LD_JOBS" ;
|
||||
fi || exit 1;
|
||||
- make -j"$JOBS"
|
||||
- if test -n "$MAKE_CHECK_ARGS";
|
||||
|
||||
+11
@@ -510,6 +510,15 @@ F: accel/stubs/hax-stub.c
|
||||
F: include/sysemu/hax.h
|
||||
F: target/i386/hax/
|
||||
|
||||
Guest CPU Cores (NVMM)
|
||||
----------------------
|
||||
NetBSD Virtual Machine Monitor (NVMM) CPU support
|
||||
M: Kamil Rytarowski <kamil@netbsd.org>
|
||||
M: Reinoud Zandijk <reinoud@netbsd.org>
|
||||
S: Maintained
|
||||
F: include/sysemu/nvmm.h
|
||||
F: target/i386/nvmm/
|
||||
|
||||
Hosts
|
||||
-----
|
||||
LINUX
|
||||
@@ -530,6 +539,8 @@ F: include/qemu/*posix*.h
|
||||
|
||||
NETBSD
|
||||
M: Kamil Rytarowski <kamil@netbsd.org>
|
||||
M: Reinoud Zandijk <reinoud@netbsd.org>
|
||||
M: Ryo ONODERA <ryoon@netbsd.org>
|
||||
S: Maintained
|
||||
K: ^Subject:.*(?i)NetBSD
|
||||
|
||||
|
||||
@@ -1,6 +1,9 @@
|
||||
config WHPX
|
||||
bool
|
||||
|
||||
config NVMM
|
||||
bool
|
||||
|
||||
config HAX
|
||||
bool
|
||||
|
||||
|
||||
@@ -230,6 +230,7 @@ void block_copy_state_free(BlockCopyState *s)
|
||||
return;
|
||||
}
|
||||
|
||||
ratelimit_destroy(&s->rate_limit);
|
||||
bdrv_release_dirty_bitmap(s->copy_bitmap);
|
||||
shres_destroy(s->mem);
|
||||
g_free(s);
|
||||
@@ -289,6 +290,7 @@ BlockCopyState *block_copy_state_new(BdrvChild *source, BdrvChild *target,
|
||||
s->copy_size = MAX(s->cluster_size, BLOCK_COPY_MAX_BUFFER);
|
||||
}
|
||||
|
||||
ratelimit_init(&s->rate_limit);
|
||||
QLIST_INIT(&s->tasks);
|
||||
QLIST_INIT(&s->calls);
|
||||
|
||||
|
||||
@@ -87,6 +87,7 @@ void block_job_free(Job *job)
|
||||
|
||||
block_job_remove_all_bdrv(bjob);
|
||||
blk_unref(bjob->blk);
|
||||
ratelimit_destroy(&bjob->limit);
|
||||
error_free(bjob->blocker);
|
||||
}
|
||||
|
||||
@@ -442,6 +443,8 @@ void *block_job_create(const char *job_id, const BlockJobDriver *driver,
|
||||
assert(job->job.driver->free == &block_job_free);
|
||||
assert(job->job.driver->user_resume == &block_job_user_resume);
|
||||
|
||||
ratelimit_init(&job->limit);
|
||||
|
||||
job->blk = blk;
|
||||
|
||||
job->finalize_cancelled_notifier.notify = block_job_event_cancelled;
|
||||
|
||||
@@ -352,6 +352,7 @@ kvm="auto"
|
||||
hax="auto"
|
||||
hvf="auto"
|
||||
whpx="auto"
|
||||
nvmm="auto"
|
||||
rdma="$default_feature"
|
||||
pvrdma="$default_feature"
|
||||
gprof="no"
|
||||
@@ -463,6 +464,7 @@ gettext="auto"
|
||||
fuse="auto"
|
||||
fuse_lseek="auto"
|
||||
multiprocess="auto"
|
||||
slirp_smbd="$default_feature"
|
||||
|
||||
malloc_trim="auto"
|
||||
gio="$default_feature"
|
||||
@@ -835,8 +837,6 @@ do
|
||||
fi
|
||||
done
|
||||
|
||||
: ${smbd=${SMBD-/usr/sbin/smbd}}
|
||||
|
||||
# Default objcc to clang if available, otherwise use CC
|
||||
if has clang; then
|
||||
objcc=clang
|
||||
@@ -1107,6 +1107,10 @@ for opt do
|
||||
;;
|
||||
--enable-hvf) hvf="enabled"
|
||||
;;
|
||||
--disable-nvmm) nvmm="disabled"
|
||||
;;
|
||||
--enable-nvmm) nvmm="enabled"
|
||||
;;
|
||||
--disable-whpx) whpx="disabled"
|
||||
;;
|
||||
--enable-whpx) whpx="enabled"
|
||||
@@ -1565,6 +1569,10 @@ for opt do
|
||||
;;
|
||||
--disable-gio) gio=no
|
||||
;;
|
||||
--enable-slirp-smbd) slirp_smbd=yes
|
||||
;;
|
||||
--disable-slirp-smbd) slirp_smbd=no
|
||||
;;
|
||||
*)
|
||||
echo "ERROR: unknown option $opt"
|
||||
echo "Try '$0 --help' for more information"
|
||||
@@ -1848,6 +1856,7 @@ disabled with --disable-FEATURE, default is enabled if available
|
||||
kvm KVM acceleration support
|
||||
hax HAX acceleration support
|
||||
hvf Hypervisor.framework acceleration support
|
||||
nvmm NVMM acceleration support
|
||||
whpx Windows Hypervisor Platform acceleration support
|
||||
rdma Enable RDMA-based migration
|
||||
pvrdma Enable PVRDMA support
|
||||
@@ -1919,6 +1928,7 @@ disabled with --disable-FEATURE, default is enabled if available
|
||||
fuse-lseek SEEK_HOLE/SEEK_DATA support for FUSE exports
|
||||
multiprocess Out of process device emulation support
|
||||
gio libgio support
|
||||
slirp-smbd use smbd (at path --smbd=*) in slirp networking
|
||||
|
||||
NOTE: The object files are built at the place where configure is launched
|
||||
EOF
|
||||
@@ -5255,6 +5265,19 @@ case "$slirp" in
|
||||
;;
|
||||
esac
|
||||
|
||||
# Check for slirp smbd dupport
|
||||
: ${smbd=${SMBD-/usr/sbin/smbd}}
|
||||
if test "$slirp_smbd" != "no" ; then
|
||||
if test "$mingw32" = "yes" ; then
|
||||
if test "$slirp_smbd" = "yes" ; then
|
||||
error_exit "Host smbd not supported on this platform."
|
||||
fi
|
||||
slirp_smbd=no
|
||||
else
|
||||
slirp_smbd=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check for usable __NR_keyctl syscall
|
||||
|
||||
@@ -5530,7 +5553,10 @@ fi
|
||||
if test "$guest_agent" = "yes" ; then
|
||||
echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
|
||||
fi
|
||||
echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
|
||||
if test "$slirp_smbd" = "yes" ; then
|
||||
echo "CONFIG_SLIRP_SMBD=y" >> $config_host_mak
|
||||
echo "CONFIG_SMBD_COMMAND=\"$smbd\"" >> $config_host_mak
|
||||
fi
|
||||
if test "$vde" = "yes" ; then
|
||||
echo "CONFIG_VDE=y" >> $config_host_mak
|
||||
echo "VDE_LIBS=$vde_libs" >> $config_host_mak
|
||||
@@ -6319,33 +6345,33 @@ for rom in seabios; do
|
||||
done
|
||||
|
||||
if test "$skip_meson" = no; then
|
||||
cross="config-meson.cross.new"
|
||||
meson_quote() {
|
||||
cross="config-meson.cross.new"
|
||||
meson_quote() {
|
||||
echo "'$(echo $* | sed "s/ /','/g")'"
|
||||
}
|
||||
}
|
||||
|
||||
echo "# Automatically generated by configure - do not modify" > $cross
|
||||
echo "[properties]" >> $cross
|
||||
test -z "$cxx" && echo "link_language = 'c'" >> $cross
|
||||
echo "[built-in options]" >> $cross
|
||||
echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
|
||||
echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
|
||||
echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
|
||||
echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
|
||||
echo "[binaries]" >> $cross
|
||||
echo "c = [$(meson_quote $cc)]" >> $cross
|
||||
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
|
||||
test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
|
||||
echo "ar = [$(meson_quote $ar)]" >> $cross
|
||||
echo "nm = [$(meson_quote $nm)]" >> $cross
|
||||
echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
|
||||
echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
|
||||
if has $sdl2_config; then
|
||||
echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
|
||||
fi
|
||||
echo "strip = [$(meson_quote $strip)]" >> $cross
|
||||
echo "windres = [$(meson_quote $windres)]" >> $cross
|
||||
if test "$cross_compile" = "yes"; then
|
||||
echo "# Automatically generated by configure - do not modify" > $cross
|
||||
echo "[properties]" >> $cross
|
||||
test -z "$cxx" && echo "link_language = 'c'" >> $cross
|
||||
echo "[built-in options]" >> $cross
|
||||
echo "c_args = [${CFLAGS:+$(meson_quote $CFLAGS)}]" >> $cross
|
||||
echo "cpp_args = [${CXXFLAGS:+$(meson_quote $CXXFLAGS)}]" >> $cross
|
||||
echo "c_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
|
||||
echo "cpp_link_args = [${LDFLAGS:+$(meson_quote $LDFLAGS)}]" >> $cross
|
||||
echo "[binaries]" >> $cross
|
||||
echo "c = [$(meson_quote $cc)]" >> $cross
|
||||
test -n "$cxx" && echo "cpp = [$(meson_quote $cxx)]" >> $cross
|
||||
test -n "$objcc" && echo "objc = [$(meson_quote $objcc)]" >> $cross
|
||||
echo "ar = [$(meson_quote $ar)]" >> $cross
|
||||
echo "nm = [$(meson_quote $nm)]" >> $cross
|
||||
echo "pkgconfig = [$(meson_quote $pkg_config_exe)]" >> $cross
|
||||
echo "ranlib = [$(meson_quote $ranlib)]" >> $cross
|
||||
if has $sdl2_config; then
|
||||
echo "sdl2-config = [$(meson_quote $sdl2_config)]" >> $cross
|
||||
fi
|
||||
echo "strip = [$(meson_quote $strip)]" >> $cross
|
||||
echo "windres = [$(meson_quote $windres)]" >> $cross
|
||||
if test "$cross_compile" = "yes"; then
|
||||
cross_arg="--cross-file config-meson.cross"
|
||||
echo "[host_machine]" >> $cross
|
||||
if test "$mingw32" = "yes" ; then
|
||||
@@ -6377,17 +6403,17 @@ if test "$cross_compile" = "yes"; then
|
||||
else
|
||||
echo "endian = 'little'" >> $cross
|
||||
fi
|
||||
else
|
||||
else
|
||||
cross_arg="--native-file config-meson.cross"
|
||||
fi
|
||||
mv $cross config-meson.cross
|
||||
fi
|
||||
mv $cross config-meson.cross
|
||||
|
||||
rm -rf meson-private meson-info meson-logs
|
||||
unset staticpic
|
||||
if ! version_ge "$($meson --version)" 0.56.0; then
|
||||
staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
|
||||
fi
|
||||
NINJA=$ninja $meson setup \
|
||||
rm -rf meson-private meson-info meson-logs
|
||||
unset staticpic
|
||||
if ! version_ge "$($meson --version)" 0.56.0; then
|
||||
staticpic=$(if test "$pie" = yes; then echo true; else echo false; fi)
|
||||
fi
|
||||
NINJA=$ninja $meson setup \
|
||||
--prefix "$prefix" \
|
||||
--libdir "$libdir" \
|
||||
--libexecdir "$libexecdir" \
|
||||
@@ -6410,7 +6436,7 @@ NINJA=$ninja $meson setup \
|
||||
-Db_coverage=$(if test "$gcov" = yes; then echo true; else echo false; fi) \
|
||||
-Db_lto=$lto -Dcfi=$cfi -Dcfi_debug=$cfi_debug \
|
||||
-Dmalloc=$malloc -Dmalloc_trim=$malloc_trim -Dsparse=$sparse \
|
||||
-Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf \
|
||||
-Dkvm=$kvm -Dhax=$hax -Dwhpx=$whpx -Dhvf=$hvf -Dnvmm=$nvmm \
|
||||
-Dxen=$xen -Dxen_pci_passthrough=$xen_pci_passthrough -Dtcg=$tcg \
|
||||
-Dcocoa=$cocoa -Dgtk=$gtk -Dmpath=$mpath -Dsdl=$sdl -Dsdl_image=$sdl_image \
|
||||
-Dvnc=$vnc -Dvnc_sasl=$vnc_sasl -Dvnc_jpeg=$vnc_jpeg -Dvnc_png=$vnc_png \
|
||||
@@ -6429,9 +6455,18 @@ NINJA=$ninja $meson setup \
|
||||
$cross_arg \
|
||||
"$PWD" "$source_path"
|
||||
|
||||
if test "$?" -ne 0 ; then
|
||||
error_exit "meson setup failed"
|
||||
fi
|
||||
if test "$?" -ne 0 ; then
|
||||
error_exit "meson setup failed"
|
||||
fi
|
||||
else
|
||||
if test -f meson-private/cmd_line.txt; then
|
||||
# Adjust old command line options whose type was changed
|
||||
# Avoids having to use "setup --wipe" when Meson is upgraded
|
||||
perl -i -ne '
|
||||
s/^gettext = true$/gettext = auto/;
|
||||
s/^gettext = false$/gettext = disabled/;
|
||||
print;' meson-private/cmd_line.txt
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "${deprecated_features}"; then
|
||||
|
||||
@@ -100,6 +100,23 @@ g_unix_get_passwd_entry_qemu(const gchar *user_name, GError **error)
|
||||
}
|
||||
#endif /* G_OS_UNIX */
|
||||
|
||||
static inline bool
|
||||
qemu_g_test_slow(void)
|
||||
{
|
||||
static int cached = -1;
|
||||
if (cached == -1) {
|
||||
cached = g_test_slow() || getenv("G_TEST_SLOW") != NULL;
|
||||
}
|
||||
return cached;
|
||||
}
|
||||
|
||||
#undef g_test_slow
|
||||
#undef g_test_thorough
|
||||
#undef g_test_quick
|
||||
#define g_test_slow() qemu_g_test_slow()
|
||||
#define g_test_thorough() qemu_g_test_slow()
|
||||
#define g_test_quick() (!qemu_g_test_slow())
|
||||
|
||||
#pragma GCC diagnostic pop
|
||||
|
||||
#endif
|
||||
|
||||
@@ -14,9 +14,11 @@
|
||||
#ifndef QEMU_RATELIMIT_H
|
||||
#define QEMU_RATELIMIT_H
|
||||
|
||||
#include "qemu/lockable.h"
|
||||
#include "qemu/timer.h"
|
||||
|
||||
typedef struct {
|
||||
QemuMutex lock;
|
||||
int64_t slice_start_time;
|
||||
int64_t slice_end_time;
|
||||
uint64_t slice_quota;
|
||||
@@ -40,6 +42,7 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
|
||||
int64_t now = qemu_clock_get_ns(QEMU_CLOCK_REALTIME);
|
||||
double delay_slices;
|
||||
|
||||
QEMU_LOCK_GUARD(&limit->lock);
|
||||
assert(limit->slice_quota && limit->slice_ns);
|
||||
|
||||
if (limit->slice_end_time < now) {
|
||||
@@ -65,9 +68,20 @@ static inline int64_t ratelimit_calculate_delay(RateLimit *limit, uint64_t n)
|
||||
return limit->slice_end_time - now;
|
||||
}
|
||||
|
||||
static inline void ratelimit_init(RateLimit *limit)
|
||||
{
|
||||
qemu_mutex_init(&limit->lock);
|
||||
}
|
||||
|
||||
static inline void ratelimit_destroy(RateLimit *limit)
|
||||
{
|
||||
qemu_mutex_destroy(&limit->lock);
|
||||
}
|
||||
|
||||
static inline void ratelimit_set_speed(RateLimit *limit, uint64_t speed,
|
||||
uint64_t slice_ns)
|
||||
{
|
||||
QEMU_LOCK_GUARD(&limit->lock);
|
||||
limit->slice_ns = slice_ns;
|
||||
limit->slice_quota = MAX(((double)speed * slice_ns) / 1000000000ULL, 1);
|
||||
}
|
||||
|
||||
@@ -16,6 +16,7 @@
|
||||
#include "sysemu/kvm.h"
|
||||
#include "sysemu/hvf.h"
|
||||
#include "sysemu/whpx.h"
|
||||
#include "sysemu/nvmm.h"
|
||||
|
||||
void cpu_synchronize_state(CPUState *cpu);
|
||||
void cpu_synchronize_post_reset(CPUState *cpu);
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2019 Maxime Villard, All rights reserved.
|
||||
*
|
||||
* NetBSD Virtual Machine Monitor (NVMM) accelerator support.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef QEMU_NVMM_H
|
||||
#define QEMU_NVMM_H
|
||||
|
||||
#include "config-host.h"
|
||||
#include "qemu-common.h"
|
||||
|
||||
#ifdef CONFIG_NVMM
|
||||
|
||||
int nvmm_enabled(void);
|
||||
|
||||
#else /* CONFIG_NVMM */
|
||||
|
||||
#define nvmm_enabled() (0)
|
||||
|
||||
#endif /* CONFIG_NVMM */
|
||||
|
||||
#endif /* CONFIG_NVMM */
|
||||
+15
-1
@@ -87,6 +87,7 @@ if cpu in ['x86', 'x86_64']
|
||||
accelerator_targets += {
|
||||
'CONFIG_HAX': ['i386-softmmu', 'x86_64-softmmu'],
|
||||
'CONFIG_HVF': ['x86_64-softmmu'],
|
||||
'CONFIG_NVMM': ['i386-softmmu', 'x86_64-softmmu'],
|
||||
'CONFIG_WHPX': ['i386-softmmu', 'x86_64-softmmu'],
|
||||
}
|
||||
endif
|
||||
@@ -170,6 +171,7 @@ version_res = []
|
||||
coref = []
|
||||
iokit = []
|
||||
emulator_link_args = []
|
||||
nvmm =not_found
|
||||
hvf = not_found
|
||||
if targetos == 'windows'
|
||||
socket = cc.find_library('ws2_32')
|
||||
@@ -227,6 +229,14 @@ if not get_option('hax').disabled()
|
||||
accelerators += 'CONFIG_HAX'
|
||||
endif
|
||||
endif
|
||||
if targetos == 'netbsd'
|
||||
if cc.has_header_symbol('nvmm.h', 'nvmm_cpu_stop', required: get_option('nvmm'))
|
||||
nvmm = cc.find_library('nvmm', required: get_option('nvmm'))
|
||||
endif
|
||||
if nvmm.found()
|
||||
accelerators += 'CONFIG_NVMM'
|
||||
endif
|
||||
endif
|
||||
|
||||
tcg_arch = config_host['ARCH']
|
||||
if not get_option('tcg').disabled()
|
||||
@@ -270,6 +280,9 @@ endif
|
||||
if 'CONFIG_HVF' not in accelerators and get_option('hvf').enabled()
|
||||
error('HVF not available on this platform')
|
||||
endif
|
||||
if 'CONFIG_NVMM' not in accelerators and get_option('nvmm').enabled()
|
||||
error('NVMM not available on this platform')
|
||||
endif
|
||||
if 'CONFIG_WHPX' not in accelerators and get_option('whpx').enabled()
|
||||
error('WHPX not available on this platform')
|
||||
endif
|
||||
@@ -2456,7 +2469,7 @@ summary_info += {'genisoimage': config_host['GENISOIMAGE']}
|
||||
if targetos == 'windows' and config_host.has_key('CONFIG_GUEST_AGENT')
|
||||
summary_info += {'wixl': wixl.found() ? wixl.full_path() : false}
|
||||
endif
|
||||
if slirp_opt != 'disabled'
|
||||
if slirp_opt != 'disabled' and 'CONFIG_SLIRP_SMBD' in config_host
|
||||
summary_info += {'smbd': config_host['CONFIG_SMBD_COMMAND']}
|
||||
endif
|
||||
summary(summary_info, bool_yn: true, section: 'Host binaries')
|
||||
@@ -2581,6 +2594,7 @@ if have_system
|
||||
summary_info += {'HAX support': config_all.has_key('CONFIG_HAX')}
|
||||
summary_info += {'HVF support': config_all.has_key('CONFIG_HVF')}
|
||||
summary_info += {'WHPX support': config_all.has_key('CONFIG_WHPX')}
|
||||
summary_info += {'NVMM support': config_all.has_key('CONFIG_NVMM')}
|
||||
summary_info += {'Xen support': config_host.has_key('CONFIG_XEN_BACKEND')}
|
||||
if config_host.has_key('CONFIG_XEN_BACKEND')
|
||||
summary_info += {'xen ctrl version': config_host['CONFIG_XEN_CTRL_INTERFACE_VERSION']}
|
||||
|
||||
@@ -33,6 +33,8 @@ option('whpx', type: 'feature', value: 'auto',
|
||||
description: 'WHPX acceleration support')
|
||||
option('hvf', type: 'feature', value: 'auto',
|
||||
description: 'HVF acceleration support')
|
||||
option('nvmm', type: 'feature', value: 'auto',
|
||||
description: 'NVMM acceleration support')
|
||||
option('xen', type: 'feature', value: 'auto',
|
||||
description: 'Xen backend support')
|
||||
option('xen_pci_passthrough', type: 'feature', value: 'auto',
|
||||
|
||||
+8
-8
@@ -27,7 +27,7 @@
|
||||
#include "net/slirp.h"
|
||||
|
||||
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
#include <pwd.h>
|
||||
#include <sys/wait.h>
|
||||
#endif
|
||||
@@ -91,7 +91,7 @@ typedef struct SlirpState {
|
||||
Slirp *slirp;
|
||||
Notifier poll_notifier;
|
||||
Notifier exit_notifier;
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
gchar *smb_dir;
|
||||
#endif
|
||||
GSList *fwd;
|
||||
@@ -104,7 +104,7 @@ static QTAILQ_HEAD(, SlirpState) slirp_stacks =
|
||||
static int slirp_hostfwd(SlirpState *s, const char *redir_str, Error **errp);
|
||||
static int slirp_guestfwd(SlirpState *s, const char *config_str, Error **errp);
|
||||
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
static int slirp_smb(SlirpState *s, const char *exported_dir,
|
||||
struct in_addr vserver_addr, Error **errp);
|
||||
static void slirp_smb_cleanup(SlirpState *s);
|
||||
@@ -377,7 +377,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
||||
struct in6_addr ip6_prefix;
|
||||
struct in6_addr ip6_host;
|
||||
struct in6_addr ip6_dns;
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
struct in_addr smbsrv = { .s_addr = 0 };
|
||||
#endif
|
||||
NetClientState *nc;
|
||||
@@ -487,7 +487,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
||||
return -1;
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
if (vsmbserver && !inet_aton(vsmbserver, &smbsrv)) {
|
||||
error_setg(errp, "Failed to parse SMB address");
|
||||
return -1;
|
||||
@@ -602,7 +602,7 @@ static int net_slirp_init(NetClientState *peer, const char *model,
|
||||
}
|
||||
}
|
||||
}
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
if (smb_export) {
|
||||
if (slirp_smb(s, smb_export, smbsrv, errp) < 0) {
|
||||
goto error;
|
||||
@@ -794,7 +794,7 @@ void hmp_hostfwd_add(Monitor *mon, const QDict *qdict)
|
||||
|
||||
}
|
||||
|
||||
#ifndef _WIN32
|
||||
#if defined(CONFIG_SLIRP_SMBD)
|
||||
|
||||
/* automatic user mode samba server configuration */
|
||||
static void slirp_smb_cleanup(SlirpState *s)
|
||||
@@ -909,7 +909,7 @@ static int slirp_smb(SlirpState* s, const char *exported_dir,
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif /* !defined(_WIN32) */
|
||||
#endif /* defined(CONFIG_SLIRP_SMBD) */
|
||||
|
||||
static int guestfwd_can_read(void *opaque)
|
||||
{
|
||||
|
||||
+4
-4
@@ -26,7 +26,7 @@ DEF("machine", HAS_ARG, QEMU_OPTION_machine, \
|
||||
"-machine [type=]name[,prop[=value][,...]]\n"
|
||||
" selects emulated machine ('-machine help' for list)\n"
|
||||
" property accel=accel1[:accel2[:...]] selects accelerator\n"
|
||||
" supported accelerators are kvm, xen, hax, hvf, whpx or tcg (default: tcg)\n"
|
||||
" supported accelerators are kvm, xen, hax, hvf, nvmm, whpx or tcg (default: tcg)\n"
|
||||
" vmport=on|off|auto controls emulation of vmport (default: auto)\n"
|
||||
" dump-guest-core=on|off include guest memory in a core dump (default=on)\n"
|
||||
" mem-merge=on|off controls memory merge support (default: on)\n"
|
||||
@@ -58,7 +58,7 @@ SRST
|
||||
|
||||
``accel=accels1[:accels2[:...]]``
|
||||
This is used to enable an accelerator. Depending on the target
|
||||
architecture, kvm, xen, hax, hvf, whpx or tcg can be available.
|
||||
architecture, kvm, xen, hax, hvf, nvmm, 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 fails to
|
||||
initialize.
|
||||
@@ -135,7 +135,7 @@ ERST
|
||||
|
||||
DEF("accel", HAS_ARG, QEMU_OPTION_accel,
|
||||
"-accel [accel=]accelerator[,prop[=value][,...]]\n"
|
||||
" select accelerator (kvm, xen, hax, hvf, whpx or tcg; use 'help' for a list)\n"
|
||||
" select accelerator (kvm, xen, hax, hvf, nvmm, whpx or tcg; use 'help' for a list)\n"
|
||||
" igd-passthru=on|off (enable Xen integrated Intel graphics passthrough, default=off)\n"
|
||||
" kernel-irqchip=on|off|split controls accelerated irqchip support (default=on)\n"
|
||||
" kvm-shadow-mem=size of KVM shadow MMU in bytes\n"
|
||||
@@ -145,7 +145,7 @@ DEF("accel", HAS_ARG, QEMU_OPTION_accel,
|
||||
SRST
|
||||
``-accel name[,prop=value[,...]]``
|
||||
This is used to enable an accelerator. Depending on the target
|
||||
architecture, kvm, xen, hax, hvf, whpx or tcg can be available. By
|
||||
architecture, kvm, xen, hax, hvf, nvmm, 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 fails to
|
||||
initialize.
|
||||
|
||||
@@ -495,7 +495,7 @@ void cpu_report_tpr_access(CPUX86State *env, TPRAccess access)
|
||||
X86CPU *cpu = env_archcpu(env);
|
||||
CPUState *cs = env_cpu(env);
|
||||
|
||||
if (kvm_enabled() || whpx_enabled()) {
|
||||
if (kvm_enabled() || whpx_enabled() || nvmm_enabled()) {
|
||||
env->tpr_access_type = access;
|
||||
|
||||
cpu_interrupt(cs, CPU_INTERRUPT_TPR);
|
||||
|
||||
@@ -19,6 +19,7 @@ i386_softmmu_ss.add(files(
|
||||
subdir('kvm')
|
||||
subdir('hax')
|
||||
subdir('whpx')
|
||||
subdir('nvmm')
|
||||
subdir('hvf')
|
||||
subdir('tcg')
|
||||
|
||||
|
||||
@@ -0,0 +1,8 @@
|
||||
i386_softmmu_ss.add(when: 'CONFIG_NVMM', if_true:
|
||||
files(
|
||||
'nvmm-all.c',
|
||||
'nvmm-accel-ops.c',
|
||||
)
|
||||
)
|
||||
|
||||
i386_softmmu_ss.add(when: 'CONFIG_NVMM', if_true: nvmm)
|
||||
@@ -0,0 +1,111 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2019 Maxime Villard, All rights reserved.
|
||||
*
|
||||
* NetBSD Virtual Machine Monitor (NVMM) accelerator for QEMU.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "sysemu/kvm_int.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "qemu/guest-random.h"
|
||||
|
||||
#include "sysemu/nvmm.h"
|
||||
#include "nvmm-accel-ops.h"
|
||||
|
||||
static void *qemu_nvmm_cpu_thread_fn(void *arg)
|
||||
{
|
||||
CPUState *cpu = arg;
|
||||
int r;
|
||||
|
||||
assert(nvmm_enabled());
|
||||
|
||||
rcu_register_thread();
|
||||
|
||||
qemu_mutex_lock_iothread();
|
||||
qemu_thread_get_self(cpu->thread);
|
||||
cpu->thread_id = qemu_get_thread_id();
|
||||
current_cpu = cpu;
|
||||
|
||||
r = nvmm_init_vcpu(cpu);
|
||||
if (r < 0) {
|
||||
fprintf(stderr, "nvmm_init_vcpu failed: %s\n", strerror(-r));
|
||||
exit(1);
|
||||
}
|
||||
|
||||
/* signal CPU creation */
|
||||
cpu_thread_signal_created(cpu);
|
||||
qemu_guest_random_seed_thread_part2(cpu->random_seed);
|
||||
|
||||
do {
|
||||
if (cpu_can_run(cpu)) {
|
||||
r = nvmm_vcpu_exec(cpu);
|
||||
if (r == EXCP_DEBUG) {
|
||||
cpu_handle_guest_debug(cpu);
|
||||
}
|
||||
}
|
||||
while (cpu_thread_is_idle(cpu)) {
|
||||
qemu_cond_wait_iothread(cpu->halt_cond);
|
||||
}
|
||||
qemu_wait_io_event_common(cpu);
|
||||
} while (!cpu->unplug || cpu_can_run(cpu));
|
||||
|
||||
nvmm_destroy_vcpu(cpu);
|
||||
cpu_thread_signal_destroyed(cpu);
|
||||
qemu_mutex_unlock_iothread();
|
||||
rcu_unregister_thread();
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static void nvmm_start_vcpu_thread(CPUState *cpu)
|
||||
{
|
||||
char thread_name[VCPU_THREAD_NAME_SIZE];
|
||||
|
||||
cpu->thread = g_malloc0(sizeof(QemuThread));
|
||||
cpu->halt_cond = g_malloc0(sizeof(QemuCond));
|
||||
qemu_cond_init(cpu->halt_cond);
|
||||
snprintf(thread_name, VCPU_THREAD_NAME_SIZE, "CPU %d/NVMM",
|
||||
cpu->cpu_index);
|
||||
qemu_thread_create(cpu->thread, thread_name, qemu_nvmm_cpu_thread_fn,
|
||||
cpu, QEMU_THREAD_JOINABLE);
|
||||
}
|
||||
|
||||
/*
|
||||
* Abort the call to run the virtual processor by another thread, and to
|
||||
* return the control to that thread.
|
||||
*/
|
||||
static void nvmm_kick_vcpu_thread(CPUState *cpu)
|
||||
{
|
||||
cpu->exit_request = 1;
|
||||
cpus_kick_thread(cpu);
|
||||
}
|
||||
|
||||
static void nvmm_accel_ops_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
AccelOpsClass *ops = ACCEL_OPS_CLASS(oc);
|
||||
|
||||
ops->create_vcpu_thread = nvmm_start_vcpu_thread;
|
||||
ops->kick_vcpu_thread = nvmm_kick_vcpu_thread;
|
||||
|
||||
ops->synchronize_post_reset = nvmm_cpu_synchronize_post_reset;
|
||||
ops->synchronize_post_init = nvmm_cpu_synchronize_post_init;
|
||||
ops->synchronize_state = nvmm_cpu_synchronize_state;
|
||||
ops->synchronize_pre_loadvm = nvmm_cpu_synchronize_pre_loadvm;
|
||||
}
|
||||
|
||||
static const TypeInfo nvmm_accel_ops_type = {
|
||||
.name = ACCEL_OPS_NAME("nvmm"),
|
||||
|
||||
.parent = TYPE_ACCEL_OPS,
|
||||
.class_init = nvmm_accel_ops_class_init,
|
||||
.abstract = true,
|
||||
};
|
||||
|
||||
static void nvmm_accel_ops_register_types(void)
|
||||
{
|
||||
type_register_static(&nvmm_accel_ops_type);
|
||||
}
|
||||
type_init(nvmm_accel_ops_register_types);
|
||||
@@ -0,0 +1,24 @@
|
||||
/*
|
||||
* Copyright (c) 2018-2019 Maxime Villard, All rights reserved.
|
||||
*
|
||||
* NetBSD Virtual Machine Monitor (NVMM) accelerator for QEMU.
|
||||
*
|
||||
* This work is licensed under the terms of the GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#ifndef NVMM_CPUS_H
|
||||
#define NVMM_CPUS_H
|
||||
|
||||
#include "sysemu/cpus.h"
|
||||
|
||||
int nvmm_init_vcpu(CPUState *cpu);
|
||||
int nvmm_vcpu_exec(CPUState *cpu);
|
||||
void nvmm_destroy_vcpu(CPUState *cpu);
|
||||
|
||||
void nvmm_cpu_synchronize_state(CPUState *cpu);
|
||||
void nvmm_cpu_synchronize_post_reset(CPUState *cpu);
|
||||
void nvmm_cpu_synchronize_post_init(CPUState *cpu);
|
||||
void nvmm_cpu_synchronize_pre_loadvm(CPUState *cpu);
|
||||
|
||||
#endif /* NVMM_CPUS_H */
|
||||
File diff suppressed because it is too large
Load Diff
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user