Merge branch 'master' into blitz 2021-02-26
This commit is contained in:
commit
dfd2ca4bb3
@ -32,7 +32,6 @@ windows_msys2_task:
|
||||
mingw-w64-x86_64-libgcrypt
|
||||
mingw-w64-x86_64-libpng
|
||||
mingw-w64-x86_64-libssh
|
||||
mingw-w64-x86_64-libxml2
|
||||
mingw-w64-x86_64-snappy
|
||||
mingw-w64-x86_64-libusb
|
||||
mingw-w64-x86_64-usbredir
|
||||
|
1
.gitignore
vendored
1
.gitignore
vendored
@ -15,3 +15,4 @@ GTAGS
|
||||
*.depend_raw
|
||||
*.swp
|
||||
*.patch
|
||||
*.gcov
|
||||
|
@ -473,33 +473,6 @@ tsan-build:
|
||||
TARGETS: x86_64-softmmu ppc64-softmmu riscv64-softmmu x86_64-linux-user
|
||||
MAKE_CHECK_ARGS: bench V=1
|
||||
|
||||
# These targets are on the way out
|
||||
build-deprecated:
|
||||
extends: .native_build_job_template
|
||||
needs:
|
||||
job: amd64-debian-user-cross-container
|
||||
variables:
|
||||
IMAGE: debian-all-test-cross
|
||||
CONFIGURE_ARGS: --disable-tools
|
||||
MAKE_CHECK_ARGS: build-tcg
|
||||
TARGETS: ppc64abi32-linux-user
|
||||
artifacts:
|
||||
expire_in: 2 days
|
||||
paths:
|
||||
- build
|
||||
|
||||
# We split the check-tcg step as test failures are expected but we still
|
||||
# want to catch the build breaking.
|
||||
check-deprecated:
|
||||
extends: .native_test_job_template
|
||||
needs:
|
||||
- job: build-deprecated
|
||||
artifacts: true
|
||||
variables:
|
||||
IMAGE: debian-all-test-cross
|
||||
MAKE_CHECK_ARGS: check-tcg
|
||||
allow_failure: true
|
||||
|
||||
# gprof/gcov are GCC features
|
||||
build-gprof-gcov:
|
||||
extends: .native_build_job_template
|
||||
|
@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake'
|
||||
NINJA='/usr/local/bin/ninja'
|
||||
PACKAGING_COMMAND='pkg'
|
||||
PIP3='/usr/local/bin/pip-3.8'
|
||||
PKGS='alsa-lib bash bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage ctags curl cyrus-sasl dbus diffutils dtc gettext git glib gmake gnutls gsed gtk3 libepoxy libffi libgcrypt libjpeg-turbo libnfs libspice-server libssh libtasn1 libxml2 llvm lttng-ust lzo2 meson ncurses nettle ninja opencv p5-Test-Harness perl5 pixman pkgconf png py38-numpy py38-pillow py38-pip py38-sphinx py38-sphinx_rtd_theme py38-virtualenv py38-yaml python3 rpm2cpio sdl2 sdl2_image snappy spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PKGS='alsa-lib bash bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage ctags curl cyrus-sasl dbus diffutils dtc fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 libepoxy libffi libgcrypt libjpeg-turbo libnfs libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv p5-Test-Harness perl5 pixman pkgconf png py38-numpy py38-pillow py38-pip py38-sphinx py38-sphinx_rtd_theme py38-virtualenv py38-yaml python3 rpm2cpio sdl2 sdl2_image snappy spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PYPI_PKGS=''
|
||||
PYTHON='/usr/local/bin/python3'
|
||||
|
@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake'
|
||||
NINJA='/usr/local/bin/ninja'
|
||||
PACKAGING_COMMAND='pkg'
|
||||
PIP3='/usr/local/bin/pip-3.8'
|
||||
PKGS='alsa-lib bash bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage ctags curl cyrus-sasl dbus diffutils dtc gettext git glib gmake gnutls gsed gtk3 libepoxy libffi libgcrypt libjpeg-turbo libnfs libspice-server libssh libtasn1 libxml2 llvm lttng-ust lzo2 meson ncurses nettle ninja opencv p5-Test-Harness perl5 pixman pkgconf png py38-numpy py38-pillow py38-pip py38-sphinx py38-sphinx_rtd_theme py38-virtualenv py38-yaml python3 rpm2cpio sdl2 sdl2_image snappy spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PKGS='alsa-lib bash bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage ctags curl cyrus-sasl dbus diffutils dtc fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 libepoxy libffi libgcrypt libjpeg-turbo libnfs libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv p5-Test-Harness perl5 pixman pkgconf png py38-numpy py38-pillow py38-pip py38-sphinx py38-sphinx_rtd_theme py38-virtualenv py38-yaml python3 rpm2cpio sdl2 sdl2_image snappy spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PYPI_PKGS=''
|
||||
PYTHON='/usr/local/bin/python3'
|
||||
|
@ -11,6 +11,6 @@ MAKE='/usr/local/bin/gmake'
|
||||
NINJA='/usr/local/bin/ninja'
|
||||
PACKAGING_COMMAND='brew'
|
||||
PIP3='/usr/local/bin/pip3'
|
||||
PKGS='bash bc bzip2 capstone ccache cpanminus ctags curl dbus diffutils dtc gcovr gettext git glib gnu-sed gnutls gtk+3 jemalloc jpeg-turbo libepoxy libffi libgcrypt libiscsi libnfs libpng libslirp libssh libtasn1 libusb libxml2 llvm lzo make meson ncurses nettle ninja perl pixman pkg-config python3 rpm2cpio sdl2 sdl2_image snappy sparse spice-protocol tesseract texinfo usbredir vde vte3 zlib zstd'
|
||||
PKGS='bash bc bzip2 capstone ccache cpanminus ctags curl dbus diffutils dtc gcovr gettext git glib gnu-sed gnutls gtk+3 jemalloc jpeg-turbo libepoxy libffi libgcrypt libiscsi libnfs libpng libslirp libssh libtasn1 libusb llvm lzo make meson ncurses nettle ninja perl pixman pkg-config python3 rpm2cpio sdl2 sdl2_image snappy sparse spice-protocol tesseract texinfo usbredir vde vte3 zlib zstd'
|
||||
PYPI_PKGS='PyYAML numpy pillow sphinx sphinx-rtd-theme virtualenv'
|
||||
PYTHON='/usr/local/bin/python3'
|
||||
|
@ -14,7 +14,7 @@
|
||||
- make -j$(expr $(nproc) + 1) all check-build $MAKE_CHECK_ARGS
|
||||
- if grep -q "EXESUF=.exe" config-host.mak;
|
||||
then make installer;
|
||||
version="$(git describe --match v[0-9]*)";
|
||||
version="$(git describe --match v[0-9]* 2>/dev/null || git rev-parse --short HEAD)";
|
||||
mv -v qemu-setup*.exe qemu-setup-${version}.exe;
|
||||
fi
|
||||
|
||||
|
@ -44,7 +44,6 @@ msys2-64bit:
|
||||
mingw-w64-x86_64-libssh
|
||||
mingw-w64-x86_64-libtasn1
|
||||
mingw-w64-x86_64-libusb
|
||||
mingw-w64-x86_64-libxml2
|
||||
mingw-w64-x86_64-nettle
|
||||
mingw-w64-x86_64-ninja
|
||||
mingw-w64-x86_64-pixman
|
||||
@ -80,7 +79,6 @@ msys2-32bit:
|
||||
mingw-w64-i686-libssh
|
||||
mingw-w64-i686-libtasn1
|
||||
mingw-w64-i686-libusb
|
||||
mingw-w64-i686-libxml2
|
||||
mingw-w64-i686-lzo2
|
||||
mingw-w64-i686-ninja
|
||||
mingw-w64-i686-pixman
|
||||
|
2
.gitmodules
vendored
2
.gitmodules
vendored
@ -66,4 +66,4 @@
|
||||
url = https://gitlab.com/qemu-project/vbootrom.git
|
||||
[submodule "tests/lcitool/libvirt-ci"]
|
||||
path = tests/lcitool/libvirt-ci
|
||||
url = http://gitlab.com/libvirt/libvirt-ci
|
||||
url = https://gitlab.com/libvirt/libvirt-ci.git
|
||||
|
24
MAINTAINERS
24
MAINTAINERS
@ -286,6 +286,13 @@ F: include/hw/riscv/
|
||||
F: linux-user/host/riscv32/
|
||||
F: linux-user/host/riscv64/
|
||||
|
||||
RISC-V XVentanaCondOps extension
|
||||
M: Philipp Tomsich <philipp.tomsich@vrull.eu>
|
||||
L: qemu-riscv@nongnu.org
|
||||
S: Supported
|
||||
F: target/riscv/XVentanaCondOps.decode
|
||||
F: target/riscv/insn_trans/trans_xventanacondops.c.inc
|
||||
|
||||
RENESAS RX CPUs
|
||||
R: Yoshinori Sato <ysato@users.sourceforge.jp>
|
||||
S: Orphan
|
||||
@ -408,7 +415,7 @@ M: Paolo Bonzini <pbonzini@redhat.com>
|
||||
M: Marcelo Tosatti <mtosatti@redhat.com>
|
||||
L: kvm@vger.kernel.org
|
||||
S: Supported
|
||||
F: docs/amd-memory-encryption.txt
|
||||
F: docs/system/i386/amd-memory-encryption.rst
|
||||
F: docs/system/i386/sgx.rst
|
||||
F: target/i386/kvm/
|
||||
F: target/i386/sev*
|
||||
@ -2182,6 +2189,7 @@ F: tests/qtest/prom-env-test.c
|
||||
|
||||
VM Generation ID
|
||||
S: Orphan
|
||||
R: Ani Sinha <ani@anisinha.ca>
|
||||
F: hw/acpi/vmgenid.c
|
||||
F: include/hw/acpi/vmgenid.h
|
||||
F: docs/specs/vmgenid.txt
|
||||
@ -2197,6 +2205,7 @@ F: hw/misc/led.c
|
||||
Unimplemented device
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
R: Ani Sinha <ani@anisinha.ca>
|
||||
S: Maintained
|
||||
F: include/hw/misc/unimp.h
|
||||
F: hw/misc/unimp.c
|
||||
@ -2204,6 +2213,7 @@ F: hw/misc/unimp.c
|
||||
Empty slot
|
||||
M: Artyom Tarasenko <atar4qemu@gmail.com>
|
||||
R: Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||
R: Ani Sinha <ani@anisinha.ca>
|
||||
S: Maintained
|
||||
F: include/hw/misc/empty_slot.h
|
||||
F: hw/misc/empty_slot.c
|
||||
@ -2406,6 +2416,7 @@ F: audio/alsaaudio.c
|
||||
Core Audio framework backend
|
||||
M: Gerd Hoffmann <kraxel@redhat.com>
|
||||
R: Christian Schoenebeck <qemu_oss@crudebyte.com>
|
||||
R: Akihiko Odaki <akihiko.odaki@gmail.com>
|
||||
S: Odd Fixes
|
||||
F: audio/coreaudio.c
|
||||
|
||||
@ -2658,6 +2669,7 @@ F: util/drm.c
|
||||
|
||||
Cocoa graphics
|
||||
M: Peter Maydell <peter.maydell@linaro.org>
|
||||
R: Akihiko Odaki <akihiko.odaki@gmail.com>
|
||||
S: Odd Fixes
|
||||
F: ui/cocoa.m
|
||||
|
||||
@ -2735,13 +2747,13 @@ F: backends/cryptodev*.c
|
||||
Python library
|
||||
M: John Snow <jsnow@redhat.com>
|
||||
M: Cleber Rosa <crosa@redhat.com>
|
||||
R: Eduardo Habkost <eduardo@habkost.net>
|
||||
R: Beraldo Leal <bleal@redhat.com>
|
||||
S: Maintained
|
||||
F: python/
|
||||
T: git https://gitlab.com/jsnow/qemu.git python
|
||||
|
||||
Python scripts
|
||||
M: Eduardo Habkost <eduardo@habkost.net>
|
||||
M: John Snow <jsnow@redhat.com>
|
||||
M: Cleber Rosa <crosa@redhat.com>
|
||||
S: Odd Fixes
|
||||
F: scripts/*.py
|
||||
@ -2978,10 +2990,11 @@ F: docs/sphinx/fakedbusdoc.py
|
||||
F: tests/qtest/dbus*
|
||||
|
||||
Seccomp
|
||||
M: Eduardo Otubo <otubo@redhat.com>
|
||||
S: Supported
|
||||
M: Daniel P. Berrange <berrange@redhat.com>
|
||||
S: Odd Fixes
|
||||
F: softmmu/qemu-seccomp.c
|
||||
F: include/sysemu/seccomp.h
|
||||
F: tests/unit/test-seccomp.c
|
||||
|
||||
Cryptography
|
||||
M: Daniel P. Berrange <berrange@redhat.com>
|
||||
@ -3585,6 +3598,7 @@ F: .travis.yml
|
||||
F: scripts/ci/
|
||||
F: tests/docker/
|
||||
F: tests/vm/
|
||||
F: tests/lcitool/
|
||||
F: scripts/archive-source.sh
|
||||
W: https://gitlab.com/qemu-project/qemu/pipelines
|
||||
W: https://travis-ci.org/qemu/qemu
|
||||
|
3
Makefile
3
Makefile
@ -206,7 +206,8 @@ recurse-clean: $(addsuffix /clean, $(ROM_DIRS))
|
||||
clean: recurse-clean
|
||||
-$(quiet-@)test -f build.ninja && $(NINJA) $(NINJAFLAGS) -t clean || :
|
||||
-$(quiet-@)test -f build.ninja && $(NINJA) $(NINJAFLAGS) clean-ctlist || :
|
||||
find . \( -name '*.so' -o -name '*.dll' -o -name '*.[oda]' \) -type f \
|
||||
find . \( -name '*.so' -o -name '*.dll' -o \
|
||||
-name '*.[oda]' -o -name '*.gcno' \) -type f \
|
||||
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-aarch64.a \
|
||||
! -path ./roms/edk2/ArmPkg/Library/GccLto/liblto-arm.a \
|
||||
-exec rm {} +
|
||||
|
@ -13,14 +13,6 @@
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
static void atomic_trace_rmw_pre(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
CPUState *cpu = env_cpu(env);
|
||||
|
||||
trace_guest_rmw_before_exec(cpu, addr, oi);
|
||||
}
|
||||
|
||||
static void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
@ -28,24 +20,12 @@ static void atomic_trace_rmw_post(CPUArchState *env, target_ulong addr,
|
||||
}
|
||||
|
||||
#if HAVE_ATOMIC128
|
||||
static void atomic_trace_ld_pre(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
}
|
||||
|
||||
static void atomic_trace_ld_post(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
|
||||
}
|
||||
|
||||
static void atomic_trace_st_pre(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
}
|
||||
|
||||
static void atomic_trace_st_post(CPUArchState *env, target_ulong addr,
|
||||
MemOpIdx oi)
|
||||
{
|
||||
|
@ -77,7 +77,6 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
|
||||
PAGE_READ | PAGE_WRITE, retaddr);
|
||||
DATA_TYPE ret;
|
||||
|
||||
atomic_trace_rmw_pre(env, addr, oi);
|
||||
#if DATA_SIZE == 16
|
||||
ret = atomic16_cmpxchg(haddr, cmpv, newv);
|
||||
#else
|
||||
@ -97,7 +96,6 @@ ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr,
|
||||
PAGE_READ, retaddr);
|
||||
DATA_TYPE val;
|
||||
|
||||
atomic_trace_ld_pre(env, addr, oi);
|
||||
val = atomic16_read(haddr);
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
atomic_trace_ld_post(env, addr, oi);
|
||||
@ -110,7 +108,6 @@ void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||
PAGE_WRITE, retaddr);
|
||||
|
||||
atomic_trace_st_pre(env, addr, oi);
|
||||
atomic16_set(haddr, val);
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
atomic_trace_st_post(env, addr, oi);
|
||||
@ -124,7 +121,6 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||
PAGE_READ | PAGE_WRITE, retaddr);
|
||||
DATA_TYPE ret;
|
||||
|
||||
atomic_trace_rmw_pre(env, addr, oi);
|
||||
ret = qatomic_xchg__nocheck(haddr, val);
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
atomic_trace_rmw_post(env, addr, oi);
|
||||
@ -138,7 +134,6 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||
DATA_TYPE ret; \
|
||||
atomic_trace_rmw_pre(env, addr, oi); \
|
||||
ret = qatomic_##X(haddr, val); \
|
||||
ATOMIC_MMU_CLEANUP; \
|
||||
atomic_trace_rmw_post(env, addr, oi); \
|
||||
@ -171,7 +166,6 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||
XDATA_TYPE cmp, old, new, val = xval; \
|
||||
atomic_trace_rmw_pre(env, addr, oi); \
|
||||
smp_mb(); \
|
||||
cmp = qatomic_read__nocheck(haddr); \
|
||||
do { \
|
||||
@ -216,7 +210,6 @@ ABI_TYPE ATOMIC_NAME(cmpxchg)(CPUArchState *env, target_ulong addr,
|
||||
PAGE_READ | PAGE_WRITE, retaddr);
|
||||
DATA_TYPE ret;
|
||||
|
||||
atomic_trace_rmw_pre(env, addr, oi);
|
||||
#if DATA_SIZE == 16
|
||||
ret = atomic16_cmpxchg(haddr, BSWAP(cmpv), BSWAP(newv));
|
||||
#else
|
||||
@ -236,7 +229,6 @@ ABI_TYPE ATOMIC_NAME(ld)(CPUArchState *env, target_ulong addr,
|
||||
PAGE_READ, retaddr);
|
||||
DATA_TYPE val;
|
||||
|
||||
atomic_trace_ld_pre(env, addr, oi);
|
||||
val = atomic16_read(haddr);
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
atomic_trace_ld_post(env, addr, oi);
|
||||
@ -249,7 +241,6 @@ void ATOMIC_NAME(st)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE,
|
||||
PAGE_WRITE, retaddr);
|
||||
|
||||
atomic_trace_st_pre(env, addr, oi);
|
||||
val = BSWAP(val);
|
||||
atomic16_set(haddr, val);
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
@ -264,7 +255,6 @@ ABI_TYPE ATOMIC_NAME(xchg)(CPUArchState *env, target_ulong addr, ABI_TYPE val,
|
||||
PAGE_READ | PAGE_WRITE, retaddr);
|
||||
ABI_TYPE ret;
|
||||
|
||||
atomic_trace_rmw_pre(env, addr, oi);
|
||||
ret = qatomic_xchg__nocheck(haddr, BSWAP(val));
|
||||
ATOMIC_MMU_CLEANUP;
|
||||
atomic_trace_rmw_post(env, addr, oi);
|
||||
@ -278,7 +268,6 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||
DATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||
DATA_TYPE ret; \
|
||||
atomic_trace_rmw_pre(env, addr, oi); \
|
||||
ret = qatomic_##X(haddr, BSWAP(val)); \
|
||||
ATOMIC_MMU_CLEANUP; \
|
||||
atomic_trace_rmw_post(env, addr, oi); \
|
||||
@ -308,7 +297,6 @@ ABI_TYPE ATOMIC_NAME(X)(CPUArchState *env, target_ulong addr, \
|
||||
XDATA_TYPE *haddr = atomic_mmu_lookup(env, addr, oi, DATA_SIZE, \
|
||||
PAGE_READ | PAGE_WRITE, retaddr); \
|
||||
XDATA_TYPE ldo, ldn, old, new, val = xval; \
|
||||
atomic_trace_rmw_pre(env, addr, oi); \
|
||||
smp_mb(); \
|
||||
ldn = qatomic_read__nocheck(haddr); \
|
||||
do { \
|
||||
|
@ -648,7 +648,8 @@ static inline bool cpu_handle_exception(CPUState *cpu, int *ret)
|
||||
if (replay_has_exception()
|
||||
&& cpu_neg(cpu)->icount_decr.u16.low + cpu->icount_extra == 0) {
|
||||
/* Execute just one insn to trigger exception pending in the log */
|
||||
cpu->cflags_next_tb = (curr_cflags(cpu) & ~CF_USE_ICOUNT) | 1;
|
||||
cpu->cflags_next_tb = (curr_cflags(cpu) & ~CF_USE_ICOUNT)
|
||||
| CF_NOIRQ | 1;
|
||||
}
|
||||
#endif
|
||||
return false;
|
||||
|
@ -783,6 +783,15 @@ static void tlb_flush_range_by_mmuidx_async_0(CPUState *cpu,
|
||||
}
|
||||
qemu_spin_unlock(&env_tlb(env)->c.lock);
|
||||
|
||||
/*
|
||||
* If the length is larger than the jump cache size, then it will take
|
||||
* longer to clear each entry individually than it will to clear it all.
|
||||
*/
|
||||
if (d.len >= (TARGET_PAGE_SIZE * TB_JMP_CACHE_SIZE)) {
|
||||
cpu_tb_jmp_cache_clear(cpu);
|
||||
return;
|
||||
}
|
||||
|
||||
for (target_ulong i = 0; i < d.len; i += TARGET_PAGE_SIZE) {
|
||||
tb_flush_jmp_cache(cpu, d.addr + i);
|
||||
}
|
||||
@ -2140,7 +2149,6 @@ static inline uint64_t cpu_load_helper(CPUArchState *env, abi_ptr addr,
|
||||
{
|
||||
uint64_t ret;
|
||||
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
ret = full_load(env, addr, oi, retaddr);
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_R);
|
||||
return ret;
|
||||
@ -2487,7 +2495,6 @@ static inline void cpu_store_helper(CPUArchState *env, target_ulong addr,
|
||||
uint64_t val, MemOpIdx oi, uintptr_t ra,
|
||||
FullStoreHelper *full_store)
|
||||
{
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
full_store(env, addr, val, oi, ra);
|
||||
qemu_plugin_vcpu_mem_cb(env_cpu(env), addr, oi, QEMU_PLUGIN_MEM_W);
|
||||
}
|
||||
|
@ -854,10 +854,20 @@ static void plugin_gen_inject(const struct qemu_plugin_tb *plugin_tb)
|
||||
|
||||
bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool mem_only)
|
||||
{
|
||||
struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
|
||||
bool ret = false;
|
||||
|
||||
if (test_bit(QEMU_PLUGIN_EV_VCPU_TB_TRANS, cpu->plugin_mask)) {
|
||||
struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
|
||||
int i;
|
||||
|
||||
/* reset callbacks */
|
||||
for (i = 0; i < PLUGIN_N_CB_SUBTYPES; i++) {
|
||||
if (ptb->cbs[i]) {
|
||||
g_array_set_size(ptb->cbs[i], 0);
|
||||
}
|
||||
}
|
||||
ptb->n = 0;
|
||||
|
||||
ret = true;
|
||||
|
||||
ptb->vaddr = tb->pc;
|
||||
@ -868,6 +878,9 @@ bool plugin_gen_tb_start(CPUState *cpu, const TranslationBlock *tb, bool mem_onl
|
||||
|
||||
plugin_gen_empty_callback(PLUGIN_GEN_FROM_TB);
|
||||
}
|
||||
|
||||
tcg_ctx->plugin_insn = NULL;
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
@ -904,23 +917,19 @@ void plugin_gen_insn_end(void)
|
||||
plugin_gen_empty_callback(PLUGIN_GEN_AFTER_INSN);
|
||||
}
|
||||
|
||||
/*
|
||||
* There are cases where we never get to finalise a translation - for
|
||||
* example a page fault during translation. As a result we shouldn't
|
||||
* do any clean-up here and make sure things are reset in
|
||||
* plugin_gen_tb_start.
|
||||
*/
|
||||
void plugin_gen_tb_end(CPUState *cpu)
|
||||
{
|
||||
struct qemu_plugin_tb *ptb = tcg_ctx->plugin_tb;
|
||||
int i;
|
||||
|
||||
/* collect instrumentation requests */
|
||||
qemu_plugin_tb_trans_cb(cpu, ptb);
|
||||
|
||||
/* inject the instrumentation at the appropriate places */
|
||||
plugin_gen_inject(ptb);
|
||||
|
||||
/* clean up */
|
||||
for (i = 0; i < PLUGIN_N_CB_SUBTYPES; i++) {
|
||||
if (ptb->cbs[i]) {
|
||||
g_array_set_size(ptb->cbs[i], 0);
|
||||
}
|
||||
}
|
||||
ptb->n = 0;
|
||||
tcg_ctx->plugin_insn = NULL;
|
||||
}
|
||||
|
@ -51,6 +51,7 @@
|
||||
#include "qemu/qemu-print.h"
|
||||
#include "qemu/timer.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qemu/cacheinfo.h"
|
||||
#include "exec/log.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "sysemu/cpu-timers.h"
|
||||
|
@ -250,7 +250,6 @@ uint8_t cpu_ldb_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint8_t ret;
|
||||
|
||||
validate_memop(oi, MO_UB);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = ldub_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -265,7 +264,6 @@ uint16_t cpu_ldw_be_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint16_t ret;
|
||||
|
||||
validate_memop(oi, MO_BEUW);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = lduw_be_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -280,7 +278,6 @@ uint32_t cpu_ldl_be_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint32_t ret;
|
||||
|
||||
validate_memop(oi, MO_BEUL);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = ldl_be_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -295,7 +292,6 @@ uint64_t cpu_ldq_be_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint64_t ret;
|
||||
|
||||
validate_memop(oi, MO_BEUQ);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = ldq_be_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -310,7 +306,6 @@ uint16_t cpu_ldw_le_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint16_t ret;
|
||||
|
||||
validate_memop(oi, MO_LEUW);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = lduw_le_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -325,7 +320,6 @@ uint32_t cpu_ldl_le_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint32_t ret;
|
||||
|
||||
validate_memop(oi, MO_LEUL);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = ldl_le_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -340,7 +334,6 @@ uint64_t cpu_ldq_le_mmu(CPUArchState *env, abi_ptr addr,
|
||||
uint64_t ret;
|
||||
|
||||
validate_memop(oi, MO_LEUQ);
|
||||
trace_guest_ld_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_LOAD);
|
||||
ret = ldq_le_p(haddr);
|
||||
clear_helper_retaddr();
|
||||
@ -354,7 +347,6 @@ void cpu_stb_mmu(CPUArchState *env, abi_ptr addr, uint8_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_UB);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stb_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -367,7 +359,6 @@ void cpu_stw_be_mmu(CPUArchState *env, abi_ptr addr, uint16_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_BEUW);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stw_be_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -380,7 +371,6 @@ void cpu_stl_be_mmu(CPUArchState *env, abi_ptr addr, uint32_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_BEUL);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stl_be_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -393,7 +383,6 @@ void cpu_stq_be_mmu(CPUArchState *env, abi_ptr addr, uint64_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_BEUQ);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stq_be_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -406,7 +395,6 @@ void cpu_stw_le_mmu(CPUArchState *env, abi_ptr addr, uint16_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_LEUW);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stw_le_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -419,7 +407,6 @@ void cpu_stl_le_mmu(CPUArchState *env, abi_ptr addr, uint32_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_LEUL);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stl_le_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
@ -432,7 +419,6 @@ void cpu_stq_le_mmu(CPUArchState *env, abi_ptr addr, uint64_t val,
|
||||
void *haddr;
|
||||
|
||||
validate_memop(oi, MO_LEUQ);
|
||||
trace_guest_st_before_exec(env_cpu(env), addr, oi);
|
||||
haddr = cpu_mmu_lookup(env, addr, oi, ra, MMU_DATA_STORE);
|
||||
stq_le_p(haddr, val);
|
||||
clear_helper_retaddr();
|
||||
|
@ -14,6 +14,7 @@
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/module.h"
|
||||
#include "qemu/madvise.h"
|
||||
#include "sysemu/hostmem.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "qom/object.h"
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "qemu/config-file.h"
|
||||
#include "qom/object_interfaces.h"
|
||||
#include "qemu/mmap-alloc.h"
|
||||
#include "qemu/madvise.h"
|
||||
|
||||
#ifdef CONFIG_NUMA
|
||||
#include <numaif.h>
|
||||
|
@ -1,8 +1,6 @@
|
||||
tpm_ss = ss.source_set()
|
||||
|
||||
tpm_ss.add(files('tpm_backend.c'))
|
||||
tpm_ss.add(files('tpm_util.c'))
|
||||
tpm_ss.add(when: 'CONFIG_TPM_PASSTHROUGH', if_true: files('tpm_passthrough.c'))
|
||||
tpm_ss.add(when: 'CONFIG_TPM_EMULATOR', if_true: files('tpm_emulator.c'))
|
||||
|
||||
softmmu_ss.add_all(when: 'CONFIG_TPM', if_true: tpm_ss)
|
||||
if have_tpm
|
||||
softmmu_ss.add(files('tpm_backend.c'))
|
||||
softmmu_ss.add(files('tpm_util.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_TPM_PASSTHROUGH', if_true: files('tpm_passthrough.c'))
|
||||
softmmu_ss.add(when: 'CONFIG_TPM_EMULATOR', if_true: files('tpm_emulator.c'))
|
||||
endif
|
||||
|
@ -45,26 +45,44 @@ block_ss.add(files(
|
||||
|
||||
softmmu_ss.add(when: 'CONFIG_TCG', if_true: files('blkreplay.c'))
|
||||
|
||||
block_ss.add(when: 'CONFIG_QCOW1', if_true: files('qcow.c'))
|
||||
block_ss.add(when: 'CONFIG_VDI', if_true: files('vdi.c'))
|
||||
block_ss.add(when: 'CONFIG_CLOOP', if_true: files('cloop.c'))
|
||||
block_ss.add(when: 'CONFIG_BOCHS', if_true: files('bochs.c'))
|
||||
block_ss.add(when: 'CONFIG_VVFAT', if_true: files('vvfat.c'))
|
||||
block_ss.add(when: 'CONFIG_DMG', if_true: files('dmg.c'))
|
||||
block_ss.add(when: 'CONFIG_QED', if_true: files(
|
||||
'qed-check.c',
|
||||
'qed-cluster.c',
|
||||
'qed-l2-cache.c',
|
||||
'qed-table.c',
|
||||
'qed.c',
|
||||
))
|
||||
block_ss.add(when: [libxml2, 'CONFIG_PARALLELS'],
|
||||
if_true: files('parallels.c', 'parallels-ext.c'))
|
||||
if get_option('qcow1').allowed()
|
||||
block_ss.add(files('qcow.c'))
|
||||
endif
|
||||
if get_option('vdi').allowed()
|
||||
block_ss.add(files('vdi.c'))
|
||||
endif
|
||||
if get_option('cloop').allowed()
|
||||
block_ss.add(files('cloop.c'))
|
||||
endif
|
||||
if get_option('bochs').allowed()
|
||||
block_ss.add(files('bochs.c'))
|
||||
endif
|
||||
if get_option('vvfat').allowed()
|
||||
block_ss.add(files('vvfat.c'))
|
||||
endif
|
||||
if get_option('dmg').allowed()
|
||||
block_ss.add(files('dmg.c'))
|
||||
endif
|
||||
if get_option('qed').allowed()
|
||||
block_ss.add(files(
|
||||
'qed-check.c',
|
||||
'qed-cluster.c',
|
||||
'qed-l2-cache.c',
|
||||
'qed-table.c',
|
||||
'qed.c',
|
||||
))
|
||||
endif
|
||||
if get_option('parallels').allowed()
|
||||
block_ss.add(files('parallels.c', 'parallels-ext.c'))
|
||||
endif
|
||||
|
||||
block_ss.add(when: 'CONFIG_WIN32', if_true: files('file-win32.c', 'win32-aio.c'))
|
||||
block_ss.add(when: 'CONFIG_POSIX', if_true: [files('file-posix.c'), coref, iokit])
|
||||
block_ss.add(when: libiscsi, if_true: files('iscsi-opts.c'))
|
||||
block_ss.add(when: 'CONFIG_LINUX', if_true: files('nvme.c'))
|
||||
block_ss.add(when: 'CONFIG_REPLICATION', if_true: files('replication.c'))
|
||||
if not get_option('replication').disabled()
|
||||
block_ss.add(files('replication.c'))
|
||||
endif
|
||||
block_ss.add(when: libaio, if_true: files('linux-aio.c'))
|
||||
block_ss.add(when: linux_io_uring, if_true: files('io_uring.c'))
|
||||
|
||||
@ -90,7 +108,7 @@ foreach m : [
|
||||
endforeach
|
||||
|
||||
# those are not exactly regular block modules, so treat them apart
|
||||
if 'CONFIG_DMG' in config_host
|
||||
if get_option('dmg').allowed()
|
||||
foreach m : [
|
||||
[liblzfse, 'dmg-lzfse', liblzfse, 'dmg-lzfse.c'],
|
||||
[libbzip2, 'dmg-bz2', [glib, libbzip2], 'dmg-bz2.c']
|
||||
|
64
block/nbd.c
64
block/nbd.c
@ -110,6 +110,10 @@ static void nbd_clear_bdrvstate(BlockDriverState *bs)
|
||||
|
||||
yank_unregister_instance(BLOCKDEV_YANK_INSTANCE(bs->node_name));
|
||||
|
||||
/* Must not leave timers behind that would access freed data */
|
||||
assert(!s->reconnect_delay_timer);
|
||||
assert(!s->open_timer);
|
||||
|
||||
object_unref(OBJECT(s->tlscreds));
|
||||
qapi_free_SocketAddress(s->saddr);
|
||||
s->saddr = NULL;
|
||||
@ -381,6 +385,13 @@ static coroutine_fn void nbd_reconnect_attempt(BDRVNBDState *s)
|
||||
}
|
||||
|
||||
nbd_co_do_establish_connection(s->bs, NULL);
|
||||
|
||||
/*
|
||||
* The reconnect attempt is done (maybe successfully, maybe not), so
|
||||
* we no longer need this timer. Delete it so it will not outlive
|
||||
* this I/O request (so draining removes all timers).
|
||||
*/
|
||||
reconnect_delay_timer_del(s);
|
||||
}
|
||||
|
||||
static coroutine_fn int nbd_receive_replies(BDRVNBDState *s, uint64_t handle)
|
||||
@ -1878,11 +1889,19 @@ static int nbd_open(BlockDriverState *bs, QDict *options, int flags,
|
||||
goto fail;
|
||||
}
|
||||
|
||||
/*
|
||||
* The connect attempt is done, so we no longer need this timer.
|
||||
* Delete it, because we do not want it to be around when this node
|
||||
* is drained or closed.
|
||||
*/
|
||||
open_timer_del(s);
|
||||
|
||||
nbd_client_connection_enable_retry(s->conn);
|
||||
|
||||
return 0;
|
||||
|
||||
fail:
|
||||
open_timer_del(s);
|
||||
nbd_clear_bdrvstate(bs);
|
||||
return ret;
|
||||
}
|
||||
@ -2036,6 +2055,42 @@ static void nbd_cancel_in_flight(BlockDriverState *bs)
|
||||
nbd_co_establish_connection_cancel(s->conn);
|
||||
}
|
||||
|
||||
static void nbd_attach_aio_context(BlockDriverState *bs,
|
||||
AioContext *new_context)
|
||||
{
|
||||
BDRVNBDState *s = bs->opaque;
|
||||
|
||||
/* The open_timer is used only during nbd_open() */
|
||||
assert(!s->open_timer);
|
||||
|
||||
/*
|
||||
* The reconnect_delay_timer is scheduled in I/O paths when the
|
||||
* connection is lost, to cancel the reconnection attempt after a
|
||||
* given time. Once this attempt is done (successfully or not),
|
||||
* nbd_reconnect_attempt() ensures the timer is deleted before the
|
||||
* respective I/O request is resumed.
|
||||
* Since the AioContext can only be changed when a node is drained,
|
||||
* the reconnect_delay_timer cannot be active here.
|
||||
*/
|
||||
assert(!s->reconnect_delay_timer);
|
||||
|
||||
if (s->ioc) {
|
||||
qio_channel_attach_aio_context(s->ioc, new_context);
|
||||
}
|
||||
}
|
||||
|
||||
static void nbd_detach_aio_context(BlockDriverState *bs)
|
||||
{
|
||||
BDRVNBDState *s = bs->opaque;
|
||||
|
||||
assert(!s->open_timer);
|
||||
assert(!s->reconnect_delay_timer);
|
||||
|
||||
if (s->ioc) {
|
||||
qio_channel_detach_aio_context(s->ioc);
|
||||
}
|
||||
}
|
||||
|
||||
static BlockDriver bdrv_nbd = {
|
||||
.format_name = "nbd",
|
||||
.protocol_name = "nbd",
|
||||
@ -2059,6 +2114,9 @@ static BlockDriver bdrv_nbd = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
|
||||
.bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
.bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static BlockDriver bdrv_nbd_tcp = {
|
||||
@ -2084,6 +2142,9 @@ static BlockDriver bdrv_nbd_tcp = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
|
||||
.bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
.bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static BlockDriver bdrv_nbd_unix = {
|
||||
@ -2109,6 +2170,9 @@ static BlockDriver bdrv_nbd_unix = {
|
||||
.bdrv_dirname = nbd_dirname,
|
||||
.strong_runtime_opts = nbd_strong_runtime_opts,
|
||||
.bdrv_cancel_in_flight = nbd_cancel_in_flight,
|
||||
|
||||
.bdrv_attach_aio_context = nbd_attach_aio_context,
|
||||
.bdrv_detach_aio_context = nbd_detach_aio_context,
|
||||
};
|
||||
|
||||
static void bdrv_nbd_init(void)
|
||||
|
42
block/ssh.c
42
block/ssh.c
@ -386,14 +386,28 @@ static int compare_fingerprint(const unsigned char *fingerprint, size_t len,
|
||||
return *host_key_check - '\0';
|
||||
}
|
||||
|
||||
static char *format_fingerprint(const unsigned char *fingerprint, size_t len)
|
||||
{
|
||||
static const char *hex = "0123456789abcdef";
|
||||
char *ret = g_new0(char, (len * 2) + 1);
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
ret[i * 2] = hex[((fingerprint[i] >> 4) & 0xf)];
|
||||
ret[(i * 2) + 1] = hex[(fingerprint[i] & 0xf)];
|
||||
}
|
||||
ret[len * 2] = '\0';
|
||||
return ret;
|
||||
}
|
||||
|
||||
static int
|
||||
check_host_key_hash(BDRVSSHState *s, const char *hash,
|
||||
enum ssh_publickey_hash_type type, Error **errp)
|
||||
enum ssh_publickey_hash_type type, const char *typestr,
|
||||
Error **errp)
|
||||
{
|
||||
int r;
|
||||
ssh_key pubkey;
|
||||
unsigned char *server_hash;
|
||||
size_t server_hash_len;
|
||||
const char *keytype;
|
||||
|
||||
r = ssh_get_server_publickey(s->session, &pubkey);
|
||||
if (r != SSH_OK) {
|
||||
@ -401,6 +415,8 @@ check_host_key_hash(BDRVSSHState *s, const char *hash,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
keytype = ssh_key_type_to_char(ssh_key_type(pubkey));
|
||||
|
||||
r = ssh_get_publickey_hash(pubkey, type, &server_hash, &server_hash_len);
|
||||
ssh_key_free(pubkey);
|
||||
if (r != 0) {
|
||||
@ -410,12 +426,16 @@ check_host_key_hash(BDRVSSHState *s, const char *hash,
|
||||
}
|
||||
|
||||
r = compare_fingerprint(server_hash, server_hash_len, hash);
|
||||
ssh_clean_pubkey_hash(&server_hash);
|
||||
if (r != 0) {
|
||||
error_setg(errp, "remote host key does not match host_key_check '%s'",
|
||||
hash);
|
||||
g_autofree char *server_fp = format_fingerprint(server_hash,
|
||||
server_hash_len);
|
||||
error_setg(errp, "remote host %s key fingerprint '%s:%s' "
|
||||
"does not match host_key_check '%s:%s'",
|
||||
keytype, typestr, server_fp, typestr, hash);
|
||||
ssh_clean_pubkey_hash(&server_hash);
|
||||
return -EPERM;
|
||||
}
|
||||
ssh_clean_pubkey_hash(&server_hash);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -436,13 +456,16 @@ static int check_host_key(BDRVSSHState *s, SshHostKeyCheck *hkc, Error **errp)
|
||||
case SSH_HOST_KEY_CHECK_MODE_HASH:
|
||||
if (hkc->u.hash.type == SSH_HOST_KEY_CHECK_HASH_TYPE_MD5) {
|
||||
return check_host_key_hash(s, hkc->u.hash.hash,
|
||||
SSH_PUBLICKEY_HASH_MD5, errp);
|
||||
SSH_PUBLICKEY_HASH_MD5, "md5",
|
||||
errp);
|
||||
} else if (hkc->u.hash.type == SSH_HOST_KEY_CHECK_HASH_TYPE_SHA1) {
|
||||
return check_host_key_hash(s, hkc->u.hash.hash,
|
||||
SSH_PUBLICKEY_HASH_SHA1, errp);
|
||||
SSH_PUBLICKEY_HASH_SHA1, "sha1",
|
||||
errp);
|
||||
} else if (hkc->u.hash.type == SSH_HOST_KEY_CHECK_HASH_TYPE_SHA256) {
|
||||
return check_host_key_hash(s, hkc->u.hash.hash,
|
||||
SSH_PUBLICKEY_HASH_SHA256, errp);
|
||||
SSH_PUBLICKEY_HASH_SHA256, "sha256",
|
||||
errp);
|
||||
}
|
||||
g_assert_not_reached();
|
||||
break;
|
||||
@ -556,6 +579,11 @@ static bool ssh_process_legacy_options(QDict *output_opts,
|
||||
qdict_put_str(output_opts, "host-key-check.type", "sha1");
|
||||
qdict_put_str(output_opts, "host-key-check.hash",
|
||||
&host_key_check[5]);
|
||||
} else if (strncmp(host_key_check, "sha256:", 7) == 0) {
|
||||
qdict_put_str(output_opts, "host-key-check.mode", "hash");
|
||||
qdict_put_str(output_opts, "host-key-check.type", "sha256");
|
||||
qdict_put_str(output_opts, "host-key-check.hash",
|
||||
&host_key_check[7]);
|
||||
} else if (strcmp(host_key_check, "yes") == 0) {
|
||||
qdict_put_str(output_opts, "host-key-check.mode", "known_hosts");
|
||||
} else {
|
||||
|
11
blockdev.c
11
blockdev.c
@ -3530,6 +3530,7 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||
{
|
||||
BlockReopenQueue *queue = NULL;
|
||||
GSList *drained = NULL;
|
||||
GSList *p;
|
||||
|
||||
/* Add each one of the BDS that we want to reopen to the queue */
|
||||
for (; reopen_list != NULL; reopen_list = reopen_list->next) {
|
||||
@ -3579,7 +3580,15 @@ void qmp_blockdev_reopen(BlockdevOptionsList *reopen_list, Error **errp)
|
||||
|
||||
fail:
|
||||
bdrv_reopen_queue_free(queue);
|
||||
g_slist_free_full(drained, (GDestroyNotify) bdrv_subtree_drained_end);
|
||||
for (p = drained; p; p = p->next) {
|
||||
BlockDriverState *bs = p->data;
|
||||
AioContext *ctx = bdrv_get_aio_context(bs);
|
||||
|
||||
aio_context_acquire(ctx);
|
||||
bdrv_subtree_drained_end(bs);
|
||||
aio_context_release(ctx);
|
||||
}
|
||||
g_slist_free(drained);
|
||||
}
|
||||
|
||||
void qmp_blockdev_del(const char *node_name, Error **errp)
|
||||
|
@ -20,6 +20,7 @@
|
||||
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu.h"
|
||||
#include "qemu-common.h"
|
||||
#include "signal-common.h"
|
||||
|
@ -24,7 +24,8 @@
|
||||
.type safe_syscall_end, @function
|
||||
|
||||
#define STACK_BIAS 2047
|
||||
#define PARAM(N) STACK_BIAS + N*8
|
||||
#define WINDOW_SIZE 16 * 8
|
||||
#define PARAM(N) STACK_BIAS + WINDOW_SIZE + N * 8
|
||||
|
||||
/*
|
||||
* This is the entry point for making a system call. The calling
|
||||
@ -74,7 +75,7 @@ safe_syscall_end:
|
||||
/* code path for having successfully executed the syscall */
|
||||
bcs,pn %xcc, 1f
|
||||
nop
|
||||
ret
|
||||
retl
|
||||
nop
|
||||
|
||||
/* code path when we didn't execute the syscall */
|
||||
|
@ -1,8 +0,0 @@
|
||||
TARGET_ARCH=ppc64
|
||||
TARGET_ABI32=y
|
||||
TARGET_BASE_ARCH=ppc
|
||||
TARGET_ABI_DIR=ppc
|
||||
TARGET_SYSTBL_ABI=common,nospu,32
|
||||
TARGET_SYSTBL=syscall.tbl
|
||||
TARGET_WORDS_BIGENDIAN=y
|
||||
TARGET_XML_FILES= gdb-xml/power64-core.xml gdb-xml/power-fpu.xml gdb-xml/power-altivec.xml gdb-xml/power-spe.xml gdb-xml/power-vsx.xml
|
636
configure
vendored
636
configure
vendored
@ -238,9 +238,7 @@ cross_prefix=""
|
||||
audio_drv_list="default"
|
||||
block_drv_rw_whitelist=""
|
||||
block_drv_ro_whitelist=""
|
||||
block_drv_whitelist_tools="no"
|
||||
host_cc="cc"
|
||||
libs_qga=""
|
||||
debug_info="yes"
|
||||
lto="false"
|
||||
stack_protector=""
|
||||
@ -290,7 +288,6 @@ EXTRA_CXXFLAGS=""
|
||||
EXTRA_LDFLAGS=""
|
||||
|
||||
xen_ctrl_version="$default_feature"
|
||||
membarrier="$default_feature"
|
||||
vhost_kernel="$default_feature"
|
||||
vhost_net="$default_feature"
|
||||
vhost_crypto="$default_feature"
|
||||
@ -301,7 +298,6 @@ vhost_user_fs="$default_feature"
|
||||
vhost_vdpa="$default_feature"
|
||||
rdma="$default_feature"
|
||||
pvrdma="$default_feature"
|
||||
gprof="no"
|
||||
debug_tcg="no"
|
||||
debug="no"
|
||||
sanitizers="no"
|
||||
@ -313,57 +309,36 @@ modules="no"
|
||||
module_upgrades="no"
|
||||
prefix="/usr/local"
|
||||
qemu_suffix="qemu"
|
||||
profiler="no"
|
||||
softmmu="yes"
|
||||
linux_user=""
|
||||
bsd_user=""
|
||||
pkgversion=""
|
||||
pie=""
|
||||
qom_cast_debug="yes"
|
||||
trace_backends="log"
|
||||
trace_file="trace"
|
||||
opengl="$default_feature"
|
||||
cpuid_h="no"
|
||||
avx2_opt="$default_feature"
|
||||
guest_agent="$default_feature"
|
||||
vss_win32_sdk="$default_feature"
|
||||
win_sdk="no"
|
||||
want_tools="$default_feature"
|
||||
coroutine=""
|
||||
coroutine_pool="$default_feature"
|
||||
debug_stack_usage="no"
|
||||
crypto_afalg="no"
|
||||
tls_priority="NORMAL"
|
||||
tpm="$default_feature"
|
||||
live_block_migration=${default_feature:-yes}
|
||||
numa="$default_feature"
|
||||
replication=${default_feature:-yes}
|
||||
bochs=${default_feature:-yes}
|
||||
cloop=${default_feature:-yes}
|
||||
dmg=${default_feature:-yes}
|
||||
qcow1=${default_feature:-yes}
|
||||
vdi=${default_feature:-yes}
|
||||
vvfat=${default_feature:-yes}
|
||||
qed=${default_feature:-yes}
|
||||
parallels=${default_feature:-yes}
|
||||
debug_mutex="no"
|
||||
plugins="$default_feature"
|
||||
rng_none="no"
|
||||
secret_keyring="$default_feature"
|
||||
meson=""
|
||||
meson_args=""
|
||||
ninja=""
|
||||
gio="$default_feature"
|
||||
skip_meson=no
|
||||
slirp_smbd="$default_feature"
|
||||
|
||||
# The following Meson options are handled manually (still they
|
||||
# are included in the automatically generated help message)
|
||||
|
||||
# 1. Track which submodules are needed
|
||||
capstone="auto"
|
||||
if test "$default_feature" = no ; then
|
||||
capstone="disabled"
|
||||
slirp="disabled"
|
||||
else
|
||||
capstone="auto"
|
||||
slirp="auto"
|
||||
fi
|
||||
fdt="auto"
|
||||
slirp="auto"
|
||||
|
||||
# 2. Support --with/--without option
|
||||
default_devices="true"
|
||||
@ -441,6 +416,7 @@ objcopy="${OBJCOPY-${cross_prefix}objcopy}"
|
||||
ld="${LD-${cross_prefix}ld}"
|
||||
ranlib="${RANLIB-${cross_prefix}ranlib}"
|
||||
nm="${NM-${cross_prefix}nm}"
|
||||
smbd="$SMBD"
|
||||
strip="${STRIP-${cross_prefix}strip}"
|
||||
windres="${WINDRES-${cross_prefix}windres}"
|
||||
pkg_config_exe="${PKG_CONFIG-${cross_prefix}pkg-config}"
|
||||
@ -560,7 +536,6 @@ darwin)
|
||||
sunos)
|
||||
solaris="yes"
|
||||
make="${MAKE-gmake}"
|
||||
smbd="${SMBD-/usr/sfw/sbin/smbd}"
|
||||
# needed for CMSG_ macros in sys/socket.h
|
||||
QEMU_CFLAGS="-D_XOPEN_SOURCE=600 $QEMU_CFLAGS"
|
||||
# needed for TIOCWIN* defines in termios.h
|
||||
@ -720,7 +695,6 @@ if test "$mingw32" = "yes" ; then
|
||||
write_c_skeleton;
|
||||
prefix="/qemu"
|
||||
qemu_suffix=""
|
||||
libs_qga="-lws2_32 -lwinmm -lpowrprof -lwtsapi32 -lwininet -liphlpapi -lnetapi32 $libs_qga"
|
||||
fi
|
||||
|
||||
werror=""
|
||||
@ -830,8 +804,6 @@ for opt do
|
||||
;;
|
||||
--without-default-features) # processed above
|
||||
;;
|
||||
--enable-gprof) gprof="yes"
|
||||
;;
|
||||
--enable-gcov) gcov="yes"
|
||||
;;
|
||||
--static)
|
||||
@ -872,20 +844,12 @@ for opt do
|
||||
# configure to be used by RPM and similar macros that set
|
||||
# lots of directory switches by default.
|
||||
;;
|
||||
--disable-qom-cast-debug) qom_cast_debug="no"
|
||||
;;
|
||||
--enable-qom-cast-debug) qom_cast_debug="yes"
|
||||
;;
|
||||
--audio-drv-list=*) audio_drv_list="$optarg"
|
||||
;;
|
||||
--block-drv-rw-whitelist=*|--block-drv-whitelist=*) block_drv_rw_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
|
||||
;;
|
||||
--block-drv-ro-whitelist=*) block_drv_ro_whitelist=$(echo "$optarg" | sed -e 's/,/ /g')
|
||||
;;
|
||||
--enable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="yes"
|
||||
;;
|
||||
--disable-block-drv-whitelist-in-tools) block_drv_whitelist_tools="no"
|
||||
;;
|
||||
--enable-debug-tcg) debug_tcg="yes"
|
||||
;;
|
||||
--disable-debug-tcg) debug_tcg="no"
|
||||
@ -893,7 +857,7 @@ for opt do
|
||||
--enable-debug)
|
||||
# Enable debugging options that aren't excessively noisy
|
||||
debug_tcg="yes"
|
||||
debug_mutex="yes"
|
||||
meson_option_parse --enable-debug-mutex ""
|
||||
debug="yes"
|
||||
fortify_source="no"
|
||||
;;
|
||||
@ -922,8 +886,6 @@ for opt do
|
||||
;;
|
||||
--enable-tcg) tcg="enabled"
|
||||
;;
|
||||
--enable-profiler) profiler="yes"
|
||||
;;
|
||||
--disable-system) softmmu="no"
|
||||
;;
|
||||
--enable-system) softmmu="yes"
|
||||
@ -975,24 +937,10 @@ for opt do
|
||||
;;
|
||||
--enable-fdt=*) fdt="$optarg"
|
||||
;;
|
||||
--disable-membarrier) membarrier="no"
|
||||
;;
|
||||
--enable-membarrier) membarrier="yes"
|
||||
;;
|
||||
--with-pkgversion=*) pkgversion="$optarg"
|
||||
;;
|
||||
--with-coroutine=*) coroutine="$optarg"
|
||||
;;
|
||||
--disable-coroutine-pool) coroutine_pool="no"
|
||||
;;
|
||||
--enable-coroutine-pool) coroutine_pool="yes"
|
||||
;;
|
||||
--enable-debug-stack-usage) debug_stack_usage="yes"
|
||||
;;
|
||||
--enable-crypto-afalg) crypto_afalg="yes"
|
||||
;;
|
||||
--disable-crypto-afalg) crypto_afalg="no"
|
||||
;;
|
||||
--disable-vhost-net) vhost_net="no"
|
||||
;;
|
||||
--enable-vhost-net) vhost_net="yes"
|
||||
@ -1019,34 +967,6 @@ for opt do
|
||||
;;
|
||||
--disable-zlib-test)
|
||||
;;
|
||||
--enable-guest-agent) guest_agent="yes"
|
||||
;;
|
||||
--disable-guest-agent) guest_agent="no"
|
||||
;;
|
||||
--with-vss-sdk) vss_win32_sdk=""
|
||||
;;
|
||||
--with-vss-sdk=*) vss_win32_sdk="$optarg"
|
||||
;;
|
||||
--without-vss-sdk) vss_win32_sdk="no"
|
||||
;;
|
||||
--with-win-sdk) win_sdk=""
|
||||
;;
|
||||
--with-win-sdk=*) win_sdk="$optarg"
|
||||
;;
|
||||
--without-win-sdk) win_sdk="no"
|
||||
;;
|
||||
--enable-tools) want_tools="yes"
|
||||
;;
|
||||
--disable-tools) want_tools="no"
|
||||
;;
|
||||
--disable-avx2) avx2_opt="no"
|
||||
;;
|
||||
--enable-avx2) avx2_opt="yes"
|
||||
;;
|
||||
--disable-avx512f) avx512f_opt="no"
|
||||
;;
|
||||
--enable-avx512f) avx512f_opt="yes"
|
||||
;;
|
||||
--disable-virtio-blk-data-plane|--enable-virtio-blk-data-plane)
|
||||
echo "$0: $opt is obsolete, virtio-blk data-plane is always on" >&2
|
||||
;;
|
||||
@ -1066,54 +986,6 @@ for opt do
|
||||
;;
|
||||
--disable-pvrdma) pvrdma="no"
|
||||
;;
|
||||
--disable-tpm) tpm="no"
|
||||
;;
|
||||
--enable-tpm) tpm="yes"
|
||||
;;
|
||||
--disable-live-block-migration) live_block_migration="no"
|
||||
;;
|
||||
--enable-live-block-migration) live_block_migration="yes"
|
||||
;;
|
||||
--disable-numa) numa="no"
|
||||
;;
|
||||
--enable-numa) numa="yes"
|
||||
;;
|
||||
--disable-replication) replication="no"
|
||||
;;
|
||||
--enable-replication) replication="yes"
|
||||
;;
|
||||
--disable-bochs) bochs="no"
|
||||
;;
|
||||
--enable-bochs) bochs="yes"
|
||||
;;
|
||||
--disable-cloop) cloop="no"
|
||||
;;
|
||||
--enable-cloop) cloop="yes"
|
||||
;;
|
||||
--disable-dmg) dmg="no"
|
||||
;;
|
||||
--enable-dmg) dmg="yes"
|
||||
;;
|
||||
--disable-qcow1) qcow1="no"
|
||||
;;
|
||||
--enable-qcow1) qcow1="yes"
|
||||
;;
|
||||
--disable-vdi) vdi="no"
|
||||
;;
|
||||
--enable-vdi) vdi="yes"
|
||||
;;
|
||||
--disable-vvfat) vvfat="no"
|
||||
;;
|
||||
--enable-vvfat) vvfat="yes"
|
||||
;;
|
||||
--disable-qed) qed="no"
|
||||
;;
|
||||
--enable-qed) qed="yes"
|
||||
;;
|
||||
--disable-parallels) parallels="no"
|
||||
;;
|
||||
--enable-parallels) parallels="yes"
|
||||
;;
|
||||
--disable-vhost-user) vhost_user="no"
|
||||
;;
|
||||
--enable-vhost-user) vhost_user="yes"
|
||||
@ -1139,10 +1011,6 @@ for opt do
|
||||
--with-git-submodules=*)
|
||||
git_submodules_action="$optarg"
|
||||
;;
|
||||
--enable-debug-mutex) debug_mutex=yes
|
||||
;;
|
||||
--disable-debug-mutex) debug_mutex=no
|
||||
;;
|
||||
--enable-plugins) if test "$mingw32" = "yes"; then
|
||||
error_exit "TCG plugins not currently supported on Windows platforms"
|
||||
else
|
||||
@ -1157,10 +1025,6 @@ for opt do
|
||||
;;
|
||||
--gdb=*) gdb_bin="$optarg"
|
||||
;;
|
||||
--enable-rng-none) rng_none=yes
|
||||
;;
|
||||
--disable-rng-none) rng_none=no
|
||||
;;
|
||||
--enable-keyring) secret_keyring="yes"
|
||||
;;
|
||||
--disable-keyring) secret_keyring="no"
|
||||
@ -1169,10 +1033,6 @@ for opt do
|
||||
;;
|
||||
--disable-gio) gio=no
|
||||
;;
|
||||
--enable-slirp-smbd) slirp_smbd=yes
|
||||
;;
|
||||
--disable-slirp-smbd) slirp_smbd=no
|
||||
;;
|
||||
# backwards compatibility options
|
||||
--enable-trace-backend=*) meson_option_parse "--enable-trace-backends=$optarg" "$optarg"
|
||||
;;
|
||||
@ -1258,8 +1118,6 @@ if eval test -z "\${cross_cc_$cpu}"; then
|
||||
fi
|
||||
|
||||
default_target_list=""
|
||||
deprecated_targets_list=ppc64abi32-linux-user
|
||||
deprecated_features=""
|
||||
mak_wilds=""
|
||||
|
||||
if [ "$linux_user" != no ]; then
|
||||
@ -1287,16 +1145,6 @@ if [ "$bsd_user" = "yes" ]; then
|
||||
mak_wilds="${mak_wilds} $source_path/configs/targets/*-bsd-user.mak"
|
||||
fi
|
||||
|
||||
# If the user doesn't explicitly specify a deprecated target we will
|
||||
# skip it.
|
||||
if test -z "$target_list"; then
|
||||
if test -z "$target_list_exclude"; then
|
||||
target_list_exclude="$deprecated_targets_list"
|
||||
else
|
||||
target_list_exclude="$target_list_exclude,$deprecated_targets_list"
|
||||
fi
|
||||
fi
|
||||
|
||||
for config in $mak_wilds; do
|
||||
target="$(basename "$config" .mak)"
|
||||
if echo "$target_list_exclude" | grep -vq "$target"; then
|
||||
@ -1315,11 +1163,9 @@ Standard options:
|
||||
--prefix=PREFIX install in PREFIX [$prefix]
|
||||
--interp-prefix=PREFIX where to find shared libraries, etc.
|
||||
use %M for cpu name [$interp_prefix]
|
||||
--target-list=LIST set target list (default: build all non-deprecated)
|
||||
--target-list=LIST set target list (default: build all)
|
||||
$(echo Available targets: $default_target_list | \
|
||||
fold -s -w 53 | sed -e 's/^/ /')
|
||||
$(echo Deprecated targets: $deprecated_targets_list | \
|
||||
fold -s -w 53 | sed -e 's/^/ /')
|
||||
--target-list-exclude=LIST exclude a set of targets from the default target-list
|
||||
|
||||
Advanced options (experts only):
|
||||
@ -1377,21 +1223,13 @@ Advanced options (experts only):
|
||||
--block-drv-ro-whitelist=L
|
||||
set block driver read-only whitelist
|
||||
(by default affects only QEMU, not tools like qemu-img)
|
||||
--enable-block-drv-whitelist-in-tools
|
||||
use block whitelist also in tools instead of only QEMU
|
||||
--with-trace-file=NAME Full PATH,NAME of file to store traces
|
||||
Default:trace-<pid>
|
||||
--cpu=CPU Build for host CPU [$cpu]
|
||||
--with-coroutine=BACKEND coroutine backend. Supported options:
|
||||
ucontext, sigaltstack, windows
|
||||
--enable-gcov enable test coverage analysis with gcov
|
||||
--with-vss-sdk=SDK-path enable Windows VSS support in QEMU Guest Agent
|
||||
--with-win-sdk=SDK-path path to Windows Platform SDK (to build VSS .tlb)
|
||||
--tls-priority default TLS protocol/cipher priority string
|
||||
--enable-gprof QEMU profiling with gprof
|
||||
--enable-profiler profiler support
|
||||
--enable-debug-stack-usage
|
||||
track the maximum stack usage of stacks created by qemu_alloc_stack
|
||||
--enable-plugins
|
||||
enable plugins via shared library loading
|
||||
--disable-containers don't use containers for cross-building
|
||||
@ -1403,7 +1241,6 @@ cat << EOF
|
||||
user supported user emulation targets
|
||||
linux-user all linux usermode emulation targets
|
||||
bsd-user all BSD usermode emulation targets
|
||||
guest-agent build the QEMU Guest Agent
|
||||
pie Position Independent Executables
|
||||
modules modules support (non-Windows)
|
||||
module-upgrades try to load modules from alternate paths for upgrades
|
||||
@ -1412,7 +1249,6 @@ cat << EOF
|
||||
lto Enable Link-Time Optimization.
|
||||
safe-stack SafeStack Stack Smash Protection. Depends on
|
||||
clang/llvm >= 3.7 and requires coroutine backend ucontext.
|
||||
membarrier membarrier system call (for Linux 4.14+ or Windows)
|
||||
rdma Enable RDMA-based migration
|
||||
pvrdma Enable PVRDMA support
|
||||
vhost-net vhost-net kernel acceleration support
|
||||
@ -1422,29 +1258,8 @@ cat << EOF
|
||||
vhost-kernel vhost kernel backend support
|
||||
vhost-user vhost-user backend support
|
||||
vhost-vdpa vhost-vdpa kernel backend support
|
||||
live-block-migration Block migration in the main migration stream
|
||||
coroutine-pool coroutine freelist (better performance)
|
||||
tpm TPM support
|
||||
numa libnuma support
|
||||
avx2 AVX2 optimization support
|
||||
avx512f AVX512F optimization support
|
||||
replication replication support
|
||||
opengl opengl support
|
||||
qom-cast-debug cast debugging support
|
||||
tools build qemu-io, qemu-nbd and qemu-img tools
|
||||
bochs bochs image format support
|
||||
cloop cloop image format support
|
||||
dmg dmg image format support
|
||||
qcow1 qcow v1 image format support
|
||||
vdi vdi image format support
|
||||
vvfat vvfat image format support
|
||||
qed qed image format support
|
||||
parallels parallels image format support
|
||||
crypto-afalg Linux AF_ALG crypto backend driver
|
||||
debug-mutex mutex debugging support
|
||||
rng-none dummy RNG, avoid using /dev/(u)random and getrandom()
|
||||
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
|
||||
@ -1803,13 +1618,6 @@ else
|
||||
done
|
||||
fi
|
||||
|
||||
for target in $target_list; do
|
||||
# if a deprecated target is enabled we note it here
|
||||
if echo "$deprecated_targets_list" | grep -q "$target"; then
|
||||
add_to deprecated_features $target
|
||||
fi
|
||||
done
|
||||
|
||||
# see if system emulation was really requested
|
||||
case " $target_list " in
|
||||
*"-softmmu "*) softmmu=yes
|
||||
@ -1853,16 +1661,6 @@ else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# system tools
|
||||
if test -z "$want_tools"; then
|
||||
if test "$softmmu" = "no"; then
|
||||
want_tools=no
|
||||
else
|
||||
want_tools=yes
|
||||
fi
|
||||
fi
|
||||
|
||||
#########################################
|
||||
# vhost interdependencies and host support
|
||||
|
||||
@ -2452,21 +2250,6 @@ if test "$modules" = yes; then
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# TPM emulation is only on POSIX
|
||||
|
||||
if test "$tpm" = ""; then
|
||||
if test "$mingw32" = "yes"; then
|
||||
tpm=no
|
||||
else
|
||||
tpm=yes
|
||||
fi
|
||||
elif test "$tpm" = "yes"; then
|
||||
if test "$mingw32" = "yes" ; then
|
||||
error_exit "TPM emulation only available on POSIX systems"
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# fdt probe
|
||||
|
||||
@ -2506,26 +2289,6 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# libnuma probe
|
||||
|
||||
if test "$numa" != "no" ; then
|
||||
cat > $TMPC << EOF
|
||||
#include <numa.h>
|
||||
int main(void) { return numa_available(); }
|
||||
EOF
|
||||
|
||||
if compile_prog "" "-lnuma" ; then
|
||||
numa=yes
|
||||
numa_libs="-lnuma"
|
||||
else
|
||||
if test "$numa" = "yes" ; then
|
||||
feature_not_found "numa" "install numactl devel"
|
||||
fi
|
||||
numa=no
|
||||
fi
|
||||
fi
|
||||
|
||||
# check for usbfs
|
||||
have_usbfs=no
|
||||
if test "$linux_user" = "yes"; then
|
||||
@ -2550,85 +2313,6 @@ EOF
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check if we have VSS SDK headers for win
|
||||
|
||||
guest_agent_with_vss="no"
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
|
||||
test "$vss_win32_sdk" != "no" ; then
|
||||
case "$vss_win32_sdk" in
|
||||
"") vss_win32_include="-isystem $source_path" ;;
|
||||
*\ *) # The SDK is installed in "Program Files" by default, but we cannot
|
||||
# handle path with spaces. So we symlink the headers into ".sdk/vss".
|
||||
vss_win32_include="-isystem $source_path/.sdk/vss"
|
||||
symlink "$vss_win32_sdk/inc" "$source_path/.sdk/vss/inc"
|
||||
;;
|
||||
*) vss_win32_include="-isystem $vss_win32_sdk"
|
||||
esac
|
||||
cat > $TMPC << EOF
|
||||
#define __MIDL_user_allocate_free_DEFINED__
|
||||
#include <inc/win2003/vss.h>
|
||||
int main(void) { return VSS_CTX_BACKUP; }
|
||||
EOF
|
||||
if compile_prog "$vss_win32_include" "" ; then
|
||||
guest_agent_with_vss="yes"
|
||||
QEMU_CFLAGS="$QEMU_CFLAGS $vss_win32_include"
|
||||
libs_qga="-lole32 -loleaut32 -lshlwapi -lstdc++ -Wl,--enable-stdcall-fixup $libs_qga"
|
||||
qga_vss_provider="qga/vss-win32/qga-vss.dll qga/vss-win32/qga-vss.tlb"
|
||||
else
|
||||
if test "$vss_win32_sdk" != "" ; then
|
||||
echo "ERROR: Please download and install Microsoft VSS SDK:"
|
||||
echo "ERROR: http://www.microsoft.com/en-us/download/details.aspx?id=23490"
|
||||
echo "ERROR: On POSIX-systems, you can extract the SDK headers by:"
|
||||
echo "ERROR: scripts/extract-vsssdk-headers setup.exe"
|
||||
echo "ERROR: The headers are extracted in the directory \`inc'."
|
||||
feature_not_found "VSS support"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# lookup Windows platform SDK (if not specified)
|
||||
# The SDK is needed only to build .tlb (type library) file of guest agent
|
||||
# VSS provider from the source. It is usually unnecessary because the
|
||||
# pre-compiled .tlb file is included.
|
||||
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no" && \
|
||||
test "$guest_agent_with_vss" = "yes" ; then
|
||||
if test -z "$win_sdk"; then
|
||||
programfiles="$PROGRAMFILES"
|
||||
test -n "$PROGRAMW6432" && programfiles="$PROGRAMW6432"
|
||||
if test -n "$programfiles"; then
|
||||
win_sdk=$(ls -d "$programfiles/Microsoft SDKs/Windows/v"* | tail -1) 2>/dev/null
|
||||
else
|
||||
feature_not_found "Windows SDK"
|
||||
fi
|
||||
elif test "$win_sdk" = "no"; then
|
||||
win_sdk=""
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check if mingw environment provides a recent ntddscsi.h
|
||||
guest_agent_ntddscsi="no"
|
||||
if test "$mingw32" = "yes" && test "$guest_agent" != "no"; then
|
||||
cat > $TMPC << EOF
|
||||
#include <windows.h>
|
||||
#include <ntddscsi.h>
|
||||
int main(void) {
|
||||
#if !defined(IOCTL_SCSI_GET_ADDRESS)
|
||||
#error Missing required ioctl definitions
|
||||
#endif
|
||||
SCSI_ADDRESS addr = { .Lun = 0, .TargetId = 0, .PathId = 0 };
|
||||
return addr.Lun;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
guest_agent_ntddscsi=yes
|
||||
libs_qga="-lsetupapi -lcfgmgr32 $libs_qga"
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# capstone
|
||||
|
||||
@ -2694,17 +2378,6 @@ else
|
||||
esac
|
||||
fi
|
||||
|
||||
if test "$coroutine_pool" = ""; then
|
||||
coroutine_pool=yes
|
||||
fi
|
||||
|
||||
if test "$debug_stack_usage" = "yes"; then
|
||||
if test "$coroutine_pool" = "yes"; then
|
||||
echo "WARN: disabling coroutine pool for stack usage debugging"
|
||||
coroutine_pool=no
|
||||
fi
|
||||
fi
|
||||
|
||||
##################################################
|
||||
# SafeStack
|
||||
|
||||
@ -2767,85 +2440,6 @@ else # "$safe_stack" = ""
|
||||
fi
|
||||
fi
|
||||
|
||||
########################################
|
||||
# check if cpuid.h is usable.
|
||||
|
||||
cat > $TMPC << EOF
|
||||
#include <cpuid.h>
|
||||
int main(void) {
|
||||
unsigned a, b, c, d;
|
||||
int max = __get_cpuid_max(0, 0);
|
||||
|
||||
if (max >= 1) {
|
||||
__cpuid(1, a, b, c, d);
|
||||
}
|
||||
|
||||
if (max >= 7) {
|
||||
__cpuid_count(7, 0, a, b, c, d);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
cpuid_h=yes
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# avx2 optimization requirement check
|
||||
#
|
||||
# There is no point enabling this if cpuid.h is not usable,
|
||||
# since we won't be able to select the new routines.
|
||||
|
||||
if test "$cpuid_h" = "yes" && test "$avx2_opt" != "no"; then
|
||||
cat > $TMPC << EOF
|
||||
#pragma GCC push_options
|
||||
#pragma GCC target("avx2")
|
||||
#include <cpuid.h>
|
||||
#include <immintrin.h>
|
||||
static int bar(void *a) {
|
||||
__m256i x = *(__m256i *)a;
|
||||
return _mm256_testz_si256(x, x);
|
||||
}
|
||||
int main(int argc, char *argv[]) { return bar(argv[0]); }
|
||||
EOF
|
||||
if compile_object "-Werror" ; then
|
||||
avx2_opt="yes"
|
||||
else
|
||||
avx2_opt="no"
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# avx512f optimization requirement check
|
||||
#
|
||||
# There is no point enabling this if cpuid.h is not usable,
|
||||
# since we won't be able to select the new routines.
|
||||
# by default, it is turned off.
|
||||
# if user explicitly want to enable it, check environment
|
||||
|
||||
if test "$cpuid_h" = "yes" && test "$avx512f_opt" = "yes"; then
|
||||
cat > $TMPC << EOF
|
||||
#pragma GCC push_options
|
||||
#pragma GCC target("avx512f")
|
||||
#include <cpuid.h>
|
||||
#include <immintrin.h>
|
||||
static int bar(void *a) {
|
||||
__m512i x = *(__m512i *)a;
|
||||
return _mm512_test_epi64_mask(x, x);
|
||||
}
|
||||
int main(int argc, char *argv[])
|
||||
{
|
||||
return bar(argv[0]);
|
||||
}
|
||||
EOF
|
||||
if ! compile_object "-Werror" ; then
|
||||
avx512f_opt="no"
|
||||
fi
|
||||
else
|
||||
avx512f_opt="no"
|
||||
fi
|
||||
|
||||
########################################
|
||||
# check if __[u]int128_t is usable.
|
||||
|
||||
@ -2941,63 +2535,6 @@ if test "$fortify_source" != "no"; then
|
||||
fi
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check for usable membarrier system call
|
||||
if test "$membarrier" = "yes"; then
|
||||
have_membarrier=no
|
||||
if test "$mingw32" = "yes" ; then
|
||||
have_membarrier=yes
|
||||
elif test "$linux" = "yes" ; then
|
||||
cat > $TMPC << EOF
|
||||
#include <linux/membarrier.h>
|
||||
#include <sys/syscall.h>
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
int main(void) {
|
||||
syscall(__NR_membarrier, MEMBARRIER_CMD_QUERY, 0);
|
||||
syscall(__NR_membarrier, MEMBARRIER_CMD_SHARED, 0);
|
||||
exit(0);
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
have_membarrier=yes
|
||||
fi
|
||||
fi
|
||||
if test "$have_membarrier" = "no"; then
|
||||
feature_not_found "membarrier" "membarrier system call not available"
|
||||
fi
|
||||
else
|
||||
# Do not enable it by default even for Mingw32, because it doesn't
|
||||
# work on Wine.
|
||||
membarrier=no
|
||||
fi
|
||||
|
||||
##########################################
|
||||
# check for usable AF_ALG environment
|
||||
have_afalg=no
|
||||
cat > $TMPC << EOF
|
||||
#include <errno.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <linux/if_alg.h>
|
||||
int main(void) {
|
||||
int sock;
|
||||
sock = socket(AF_ALG, SOCK_SEQPACKET, 0);
|
||||
return sock;
|
||||
}
|
||||
EOF
|
||||
if compile_prog "" "" ; then
|
||||
have_afalg=yes
|
||||
fi
|
||||
if test "$crypto_afalg" = "yes"
|
||||
then
|
||||
if test "$have_afalg" != "yes"
|
||||
then
|
||||
error_exit "AF_ALG requested but could not be detected"
|
||||
fi
|
||||
fi
|
||||
|
||||
|
||||
##########################################
|
||||
# checks for sanitizers
|
||||
|
||||
@ -3079,19 +2616,6 @@ 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
|
||||
|
||||
@ -3147,11 +2671,6 @@ alpha)
|
||||
;;
|
||||
esac
|
||||
|
||||
if test "$gprof" = "yes" ; then
|
||||
QEMU_CFLAGS="-p $QEMU_CFLAGS"
|
||||
QEMU_LDFLAGS="-p $QEMU_LDFLAGS"
|
||||
fi
|
||||
|
||||
if test "$have_asan" = "yes"; then
|
||||
QEMU_CFLAGS="-fsanitize=address $QEMU_CFLAGS"
|
||||
QEMU_LDFLAGS="-fsanitize=address $QEMU_LDFLAGS"
|
||||
@ -3203,20 +2722,6 @@ if test "$mingw32" = "yes" ; then
|
||||
done
|
||||
fi
|
||||
|
||||
# Probe for guest agent support/options
|
||||
|
||||
if [ "$guest_agent" != "no" ]; then
|
||||
if [ "$softmmu" = no -a "$want_tools" = no ] ; then
|
||||
guest_agent=no
|
||||
elif [ "$linux" = "yes" -o "$bsd" = "yes" -o "$solaris" = "yes" -o "$mingw32" = "yes" ] ; then
|
||||
guest_agent=yes
|
||||
elif [ "$guest_agent" != yes ]; then
|
||||
guest_agent=no
|
||||
else
|
||||
error_exit "Guest agent is not supported on this platform"
|
||||
fi
|
||||
fi
|
||||
|
||||
# Guest agent Windows MSI package
|
||||
|
||||
if test "$QEMU_GA_MANUFACTURER" = ""; then
|
||||
@ -3317,14 +2822,6 @@ if test "$debug_tcg" = "yes" ; then
|
||||
fi
|
||||
if test "$mingw32" = "yes" ; then
|
||||
echo "CONFIG_WIN32=y" >> $config_host_mak
|
||||
if test "$guest_agent_with_vss" = "yes" ; then
|
||||
echo "CONFIG_QGA_VSS=y" >> $config_host_mak
|
||||
echo "QGA_VSS_PROVIDER=$qga_vss_provider" >> $config_host_mak
|
||||
echo "WIN_SDK=\"$win_sdk\"" >> $config_host_mak
|
||||
fi
|
||||
if test "$guest_agent_ntddscsi" = "yes" ; then
|
||||
echo "CONFIG_QGA_NTDDSCSI=y" >> $config_host_mak
|
||||
fi
|
||||
echo "QEMU_GA_MSI_MINGW_DLL_PATH=${QEMU_GA_MSI_MINGW_DLL_PATH}" >> $config_host_mak
|
||||
echo "QEMU_GA_MANUFACTURER=${QEMU_GA_MANUFACTURER}" >> $config_host_mak
|
||||
echo "QEMU_GA_DISTRO=${QEMU_GA_DISTRO}" >> $config_host_mak
|
||||
@ -3347,27 +2844,8 @@ fi
|
||||
if test "$static" = "yes" ; then
|
||||
echo "CONFIG_STATIC=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$profiler" = "yes" ; then
|
||||
echo "CONFIG_PROFILER=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$want_tools" = "yes" ; then
|
||||
echo "CONFIG_TOOLS=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$guest_agent" = "yes" ; then
|
||||
echo "CONFIG_GUEST_AGENT=y" >> $config_host_mak
|
||||
fi
|
||||
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 "$gprof" = "yes" ; then
|
||||
echo "CONFIG_GPROF=y" >> $config_host_mak
|
||||
fi
|
||||
echo "CONFIG_BDRV_RW_WHITELIST=$block_drv_rw_whitelist" >> $config_host_mak
|
||||
echo "CONFIG_BDRV_RO_WHITELIST=$block_drv_ro_whitelist" >> $config_host_mak
|
||||
if test "$block_drv_whitelist_tools" = "yes" ; then
|
||||
echo "CONFIG_BDRV_WHITELIST_TOOLS=y" >> $config_host_mak
|
||||
fi
|
||||
qemu_version=$(head $source_path/VERSION)
|
||||
echo "PKGVERSION=$pkgversion" >>$config_host_mak
|
||||
echo "SRC_PATH=$source_path" >> $config_host_mak
|
||||
@ -3433,9 +2911,6 @@ fi
|
||||
if test "$vhost_user_fs" = "yes" ; then
|
||||
echo "CONFIG_VHOST_USER_FS=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$membarrier" = "yes" ; then
|
||||
echo "CONFIG_MEMBARRIER=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$tcg" = "enabled" -a "$tcg_interpreter" = "true" ; then
|
||||
echo "CONFIG_TCG_INTERPRETER=y" >> $config_host_mak
|
||||
fi
|
||||
@ -3446,37 +2921,12 @@ if test "$opengl" = "yes" ; then
|
||||
echo "OPENGL_LIBS=$opengl_libs" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$avx2_opt" = "yes" ; then
|
||||
echo "CONFIG_AVX2_OPT=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$avx512f_opt" = "yes" ; then
|
||||
echo "CONFIG_AVX512F_OPT=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
# XXX: suppress that
|
||||
if [ "$bsd" = "yes" ] ; then
|
||||
echo "CONFIG_BSD=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$qom_cast_debug" = "yes" ; then
|
||||
echo "CONFIG_QOM_CAST_DEBUG=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
echo "CONFIG_COROUTINE_BACKEND=$coroutine" >> $config_host_mak
|
||||
if test "$coroutine_pool" = "yes" ; then
|
||||
echo "CONFIG_COROUTINE_POOL=1" >> $config_host_mak
|
||||
else
|
||||
echo "CONFIG_COROUTINE_POOL=0" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$debug_stack_usage" = "yes" ; then
|
||||
echo "CONFIG_DEBUG_STACK_USAGE=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$crypto_afalg" = "yes" ; then
|
||||
echo "CONFIG_AF_ALG=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$have_asan_iface_fiber" = "yes" ; then
|
||||
echo "CONFIG_ASAN_IFACE_FIBER=y" >> $config_host_mak
|
||||
@ -3486,10 +2936,6 @@ if test "$have_tsan" = "yes" && test "$have_tsan_iface_fiber" = "yes" ; then
|
||||
echo "CONFIG_TSAN=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$cpuid_h" = "yes" ; then
|
||||
echo "CONFIG_CPUID_H=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$int128" = "yes" ; then
|
||||
echo "CONFIG_INT128=y" >> $config_host_mak
|
||||
fi
|
||||
@ -3502,14 +2948,6 @@ if test "$cmpxchg128" = "yes" ; then
|
||||
echo "CONFIG_CMPXCHG128=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$live_block_migration" = "yes" ; then
|
||||
echo "CONFIG_LIVE_BLOCK_MIGRATION=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$tpm" = "yes"; then
|
||||
echo 'CONFIG_TPM=y' >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$rdma" = "yes" ; then
|
||||
echo "CONFIG_RDMA=y" >> $config_host_mak
|
||||
echo "RDMA_LIBS=$rdma_libs" >> $config_host_mak
|
||||
@ -3519,39 +2957,6 @@ if test "$pvrdma" = "yes" ; then
|
||||
echo "CONFIG_PVRDMA=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$replication" = "yes" ; then
|
||||
echo "CONFIG_REPLICATION=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$debug_mutex" = "yes" ; then
|
||||
echo "CONFIG_DEBUG_MUTEX=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$bochs" = "yes" ; then
|
||||
echo "CONFIG_BOCHS=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$cloop" = "yes" ; then
|
||||
echo "CONFIG_CLOOP=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$dmg" = "yes" ; then
|
||||
echo "CONFIG_DMG=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$qcow1" = "yes" ; then
|
||||
echo "CONFIG_QCOW1=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$vdi" = "yes" ; then
|
||||
echo "CONFIG_VDI=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$vvfat" = "yes" ; then
|
||||
echo "CONFIG_VVFAT=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$qed" = "yes" ; then
|
||||
echo "CONFIG_QED=y" >> $config_host_mak
|
||||
fi
|
||||
if test "$parallels" = "yes" ; then
|
||||
echo "CONFIG_PARALLELS=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$plugins" = "yes" ; then
|
||||
echo "CONFIG_PLUGIN=y" >> $config_host_mak
|
||||
fi
|
||||
@ -3575,9 +2980,6 @@ echo "MESON=$meson" >> $config_host_mak
|
||||
echo "NINJA=$ninja" >> $config_host_mak
|
||||
echo "CC=$cc" >> $config_host_mak
|
||||
echo "HOST_CC=$host_cc" >> $config_host_mak
|
||||
if $iasl -h > /dev/null 2>&1; then
|
||||
echo "CONFIG_IASL=$iasl" >> $config_host_mak
|
||||
fi
|
||||
echo "AR=$ar" >> $config_host_mak
|
||||
echo "AS=$as" >> $config_host_mak
|
||||
echo "CCAS=$ccas" >> $config_host_mak
|
||||
@ -3594,11 +2996,6 @@ echo "QEMU_LDFLAGS=$QEMU_LDFLAGS" >> $config_host_mak
|
||||
echo "LD_I386_EMULATION=$ld_i386_emulation" >> $config_host_mak
|
||||
echo "STRIP=$strip" >> $config_host_mak
|
||||
echo "EXESUF=$EXESUF" >> $config_host_mak
|
||||
echo "LIBS_QGA=$libs_qga" >> $config_host_mak
|
||||
|
||||
if test "$rng_none" = "yes"; then
|
||||
echo "CONFIG_RNG_NONE=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
# use included Linux headers
|
||||
if test "$linux" = "yes" ; then
|
||||
@ -3648,11 +3045,6 @@ if test "$default_targets" = "yes"; then
|
||||
echo "CONFIG_DEFAULT_TARGETS=y" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$numa" = "yes"; then
|
||||
echo "CONFIG_NUMA=y" >> $config_host_mak
|
||||
echo "NUMA_LIBS=$numa_libs" >> $config_host_mak
|
||||
fi
|
||||
|
||||
if test "$ccache_cpp2" = "yes"; then
|
||||
echo "export CCACHE_CPP2=y" >> $config_host_mak
|
||||
fi
|
||||
@ -3805,8 +3197,10 @@ if test "$skip_meson" = no; then
|
||||
-Daudio_drv_list=$audio_drv_list \
|
||||
-Ddefault_devices=$default_devices \
|
||||
-Ddocdir="$docdir" \
|
||||
-Diasl="$($iasl -h >/dev/null 2>&1 && printf %s "$iasl")" \
|
||||
-Dqemu_firmwarepath="$firmwarepath" \
|
||||
-Dqemu_suffix="$qemu_suffix" \
|
||||
-Dsmbd="$smbd" \
|
||||
-Dsphinx_build="$sphinx_build" \
|
||||
-Dtrace_file="$trace_file" \
|
||||
-Doptimization=$(if test "$debug" = yes; then echo 0; else echo 2; fi) \
|
||||
@ -3836,12 +3230,6 @@ else
|
||||
fi
|
||||
fi
|
||||
|
||||
if test -n "${deprecated_features}"; then
|
||||
echo "Warning, deprecated features enabled."
|
||||
echo "Please see docs/about/deprecated.rst"
|
||||
echo " features: ${deprecated_features}"
|
||||
fi
|
||||
|
||||
# Save the configure command line for later reuse.
|
||||
cat <<EOD >config.status
|
||||
#!/bin/sh
|
||||
|
@ -20,6 +20,7 @@ NAMES += howvec
|
||||
NAMES += lockstep
|
||||
NAMES += hwprofile
|
||||
NAMES += cache
|
||||
NAMES += drcov
|
||||
|
||||
SONAMES := $(addsuffix .so,$(addprefix lib,$(NAMES)))
|
||||
|
||||
|
163
contrib/plugins/drcov.c
Normal file
163
contrib/plugins/drcov.c
Normal file
@ -0,0 +1,163 @@
|
||||
/*
|
||||
* Copyright (C) 2021, Ivanov Arkady <arkadiy.ivanov@ispras.ru>
|
||||
*
|
||||
* Drcov - a DynamoRIO-based tool that collects coverage information
|
||||
* from a binary. Primary goal this script is to have coverage log
|
||||
* files that work in Lighthouse.
|
||||
*
|
||||
* License: GNU GPL, version 2 or later.
|
||||
* See the COPYING file in the top-level directory.
|
||||
*/
|
||||
|
||||
#include <inttypes.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <inttypes.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <glib.h>
|
||||
|
||||
#include <qemu-plugin.h>
|
||||
|
||||
QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
|
||||
|
||||
static char header[] = "DRCOV VERSION: 2\n"
|
||||
"DRCOV FLAVOR: drcov-64\n"
|
||||
"Module Table: version 2, count 1\n"
|
||||
"Columns: id, base, end, entry, path\n";
|
||||
|
||||
static FILE *fp;
|
||||
static const char *file_name = "file.drcov.trace";
|
||||
static GMutex lock;
|
||||
|
||||
typedef struct {
|
||||
uint32_t start;
|
||||
uint16_t size;
|
||||
uint16_t mod_id;
|
||||
bool exec;
|
||||
} bb_entry_t;
|
||||
|
||||
/* Translated blocks */
|
||||
static GPtrArray *blocks;
|
||||
|
||||
static void printf_header(unsigned long count)
|
||||
{
|
||||
fprintf(fp, "%s", header);
|
||||
const char *path = qemu_plugin_path_to_binary();
|
||||
uint64_t start_code = qemu_plugin_start_code();
|
||||
uint64_t end_code = qemu_plugin_end_code();
|
||||
uint64_t entry = qemu_plugin_entry_code();
|
||||
fprintf(fp, "0, 0x%lx, 0x%lx, 0x%lx, %s\n",
|
||||
start_code, end_code, entry, path);
|
||||
fprintf(fp, "BB Table: %ld bbs\n", count);
|
||||
}
|
||||
|
||||
static void printf_char_array32(uint32_t data)
|
||||
{
|
||||
const uint8_t *bytes = (const uint8_t *)(&data);
|
||||
fwrite(bytes, sizeof(char), sizeof(data), fp);
|
||||
}
|
||||
|
||||
static void printf_char_array16(uint16_t data)
|
||||
{
|
||||
const uint8_t *bytes = (const uint8_t *)(&data);
|
||||
fwrite(bytes, sizeof(char), sizeof(data), fp);
|
||||
}
|
||||
|
||||
|
||||
static void printf_el(gpointer data, gpointer user_data)
|
||||
{
|
||||
bb_entry_t *bb = (bb_entry_t *)data;
|
||||
if (bb->exec) {
|
||||
printf_char_array32(bb->start);
|
||||
printf_char_array16(bb->size);
|
||||
printf_char_array16(bb->mod_id);
|
||||
}
|
||||
g_free(bb);
|
||||
}
|
||||
|
||||
static void count_block(gpointer data, gpointer user_data)
|
||||
{
|
||||
unsigned long *count = (unsigned long *) user_data;
|
||||
bb_entry_t *bb = (bb_entry_t *)data;
|
||||
if (bb->exec) {
|
||||
*count = *count + 1;
|
||||
}
|
||||
}
|
||||
|
||||
static void plugin_exit(qemu_plugin_id_t id, void *p)
|
||||
{
|
||||
unsigned long count = 0;
|
||||
g_mutex_lock(&lock);
|
||||
g_ptr_array_foreach(blocks, count_block, &count);
|
||||
|
||||
/* Print function */
|
||||
printf_header(count);
|
||||
g_ptr_array_foreach(blocks, printf_el, NULL);
|
||||
|
||||
/* Clear */
|
||||
g_ptr_array_free(blocks, true);
|
||||
|
||||
fclose(fp);
|
||||
|
||||
g_mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
static void plugin_init(void)
|
||||
{
|
||||
fp = fopen(file_name, "wb");
|
||||
blocks = g_ptr_array_sized_new(128);
|
||||
}
|
||||
|
||||
static void vcpu_tb_exec(unsigned int cpu_index, void *udata)
|
||||
{
|
||||
bb_entry_t *bb = (bb_entry_t *) udata;
|
||||
|
||||
g_mutex_lock(&lock);
|
||||
bb->exec = true;
|
||||
g_mutex_unlock(&lock);
|
||||
}
|
||||
|
||||
static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
|
||||
{
|
||||
uint64_t pc = qemu_plugin_tb_vaddr(tb);
|
||||
size_t n = qemu_plugin_tb_n_insns(tb);
|
||||
|
||||
g_mutex_lock(&lock);
|
||||
|
||||
bb_entry_t *bb = g_new0(bb_entry_t, 1);
|
||||
for (int i = 0; i < n; i++) {
|
||||
bb->size += qemu_plugin_insn_size(qemu_plugin_tb_get_insn(tb, i));
|
||||
}
|
||||
|
||||
bb->start = pc;
|
||||
bb->mod_id = 0;
|
||||
bb->exec = false;
|
||||
g_ptr_array_add(blocks, bb);
|
||||
|
||||
g_mutex_unlock(&lock);
|
||||
qemu_plugin_register_vcpu_tb_exec_cb(tb, vcpu_tb_exec,
|
||||
QEMU_PLUGIN_CB_NO_REGS,
|
||||
(void *)bb);
|
||||
|
||||
}
|
||||
|
||||
QEMU_PLUGIN_EXPORT
|
||||
int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info,
|
||||
int argc, char **argv)
|
||||
{
|
||||
for (int i = 0; i < argc; i++) {
|
||||
g_autofree char **tokens = g_strsplit(argv[i], "=", 2);
|
||||
if (g_strcmp0(tokens[0], "filename") == 0) {
|
||||
file_name = g_strdup(tokens[1]);
|
||||
}
|
||||
}
|
||||
|
||||
plugin_init();
|
||||
|
||||
qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans);
|
||||
qemu_plugin_register_atexit_cb(id, plugin_exit, NULL);
|
||||
|
||||
return 0;
|
||||
}
|
@ -1,5 +1,4 @@
|
||||
if 'CONFIG_TOOLS' in config_host and virgl.found() and gbm.found() \
|
||||
and 'CONFIG_LINUX' in config_host and pixman.found()
|
||||
if have_vhost_user_gpu
|
||||
executable('vhost-user-gpu', files('vhost-user-gpu.c', 'virgl.c', 'vugbm.c'),
|
||||
dependencies: [qemuutil, pixman, gbm, virgl, vhost_user, opengl],
|
||||
install: true,
|
||||
|
22
cpu.c
22
cpu.c
@ -196,13 +196,33 @@ static Property cpu_common_props[] = {
|
||||
DEFINE_PROP_LINK("memory", CPUState, memory, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
#endif
|
||||
DEFINE_PROP_BOOL("start-powered-off", CPUState, start_powered_off, false),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
static bool cpu_get_start_powered_off(Object *obj, Error **errp)
|
||||
{
|
||||
CPUState *cpu = CPU(obj);
|
||||
return cpu->start_powered_off;
|
||||
}
|
||||
|
||||
static void cpu_set_start_powered_off(Object *obj, bool value, Error **errp)
|
||||
{
|
||||
CPUState *cpu = CPU(obj);
|
||||
cpu->start_powered_off = value;
|
||||
}
|
||||
|
||||
void cpu_class_init_props(DeviceClass *dc)
|
||||
{
|
||||
ObjectClass *oc = OBJECT_CLASS(dc);
|
||||
|
||||
device_class_set_props(dc, cpu_common_props);
|
||||
/*
|
||||
* We can't use DEFINE_PROP_BOOL in the Property array for this
|
||||
* property, because we want this to be settable after realize.
|
||||
*/
|
||||
object_class_property_add_bool(oc, "start-powered-off",
|
||||
cpu_get_start_powered_off,
|
||||
cpu_set_start_powered_off);
|
||||
}
|
||||
|
||||
void cpu_exec_initfn(CPUState *cpu)
|
||||
|
@ -35,7 +35,9 @@ else
|
||||
endif
|
||||
|
||||
crypto_ss.add(when: 'CONFIG_SECRET_KEYRING', if_true: files('secret_keyring.c'))
|
||||
crypto_ss.add(when: 'CONFIG_AF_ALG', if_true: files('afalg.c', 'cipher-afalg.c', 'hash-afalg.c'))
|
||||
if have_afalg
|
||||
crypto_ss.add(if_true: files('afalg.c', 'cipher-afalg.c', 'hash-afalg.c'))
|
||||
endif
|
||||
crypto_ss.add(when: gnutls, if_true: files('tls-cipher-suites.c'))
|
||||
|
||||
util_ss.add(files('aes.c'))
|
||||
@ -48,7 +50,7 @@ if gcrypt.found()
|
||||
util_ss.add(gcrypt, files('random-gcrypt.c'))
|
||||
elif gnutls.found()
|
||||
util_ss.add(gnutls, files('random-gnutls.c'))
|
||||
elif 'CONFIG_RNG_NONE' in config_host
|
||||
elif get_option('rng_none')
|
||||
util_ss.add(files('random-none.c'))
|
||||
else
|
||||
util_ss.add(files('random-platform.c'))
|
||||
|
@ -403,13 +403,6 @@ The above, converted to the current supported format::
|
||||
linux-user mode CPUs
|
||||
--------------------
|
||||
|
||||
``ppc64abi32`` CPUs (since 5.2)
|
||||
'''''''''''''''''''''''''''''''
|
||||
|
||||
The ``ppc64abi32`` architecture has a number of issues which regularly
|
||||
trip up our CI testing and is suspected to be quite broken. For that
|
||||
reason the maintainers strongly suspect no one actually uses it.
|
||||
|
||||
MIPS ``I7200`` CPU (since 5.2)
|
||||
''''''''''''''''''''''''''''''
|
||||
|
||||
@ -454,3 +447,20 @@ nanoMIPS ISA
|
||||
|
||||
The ``nanoMIPS`` ISA has never been upstreamed to any compiler toolchain.
|
||||
As it is hard to generate binaries for it, declare it deprecated.
|
||||
|
||||
Tools
|
||||
-----
|
||||
|
||||
virtiofsd
|
||||
'''''''''
|
||||
|
||||
There is a new Rust implementation of ``virtiofsd`` at
|
||||
``https://gitlab.com/virtio-fs/virtiofsd``;
|
||||
since this is now marked stable, new development should be done on that
|
||||
rather than the existing C version in the QEMU tree.
|
||||
The C version will still accept fixes and patches that
|
||||
are already in development for the moment, but will eventually
|
||||
be deleted from this tree.
|
||||
New deployments should use the Rust version, and existing systems
|
||||
should consider moving to it. The command line and feature set
|
||||
is very close and moving should be simple.
|
||||
|
@ -601,6 +601,27 @@ the upstream Linux kernel in 2018, and it has also been dropped from glibc, so
|
||||
there is no new Linux development taking place with this architecture. For
|
||||
running the old binaries, you can use older versions of QEMU.
|
||||
|
||||
``ppc64abi32`` CPUs (removed in 7.0)
|
||||
''''''''''''''''''''''''''''''''''''
|
||||
|
||||
The ``ppc64abi32`` architecture has a number of issues which regularly
|
||||
tripped up the CI testing and was suspected to be quite broken. For that
|
||||
reason the maintainers strongly suspected no one actually used it.
|
||||
|
||||
|
||||
TCG introspection features
|
||||
--------------------------
|
||||
|
||||
TCG trace-events (since 6.2)
|
||||
''''''''''''''''''''''''''''
|
||||
|
||||
The ability to add new TCG trace points had bit rotted and as the
|
||||
feature can be replicated with TCG plugins it was removed. If
|
||||
any user is currently using this feature and needs help with
|
||||
converting to using TCG plugins they should contact the qemu-devel
|
||||
mailing list.
|
||||
|
||||
|
||||
System emulator devices
|
||||
-----------------------
|
||||
|
||||
|
@ -192,11 +192,15 @@ declares its dependencies in different ways:
|
||||
no directive and are not used in the Makefile either; they only appear
|
||||
as conditions for ``default y`` directives.
|
||||
|
||||
QEMU currently has two device groups, ``PCI_DEVICES`` and
|
||||
``TEST_DEVICES``. PCI devices usually have a ``default y if
|
||||
QEMU currently has three device groups, ``PCI_DEVICES``, ``I2C_DEVICES``,
|
||||
and ``TEST_DEVICES``. PCI devices usually have a ``default y if
|
||||
PCI_DEVICES`` directive rather than just ``default y``. This lets
|
||||
some boards (notably s390) easily support a subset of PCI devices,
|
||||
for example only VFIO (passthrough) and virtio-pci devices.
|
||||
``I2C_DEVICES`` is similar to ``PCI_DEVICES``. It contains i2c devices
|
||||
that users might reasonably want to plug in to an i2c bus on any
|
||||
board (and not ones which are very board-specific or that need
|
||||
to be wired up in a way that can't be done on the command line).
|
||||
``TEST_DEVICES`` instead is used for devices that are rarely used on
|
||||
production virtual machines, but provide useful hooks to test QEMU
|
||||
or KVM.
|
||||
@ -301,7 +305,7 @@ and also listed as follows in the top-level meson.build's host_kconfig
|
||||
variable::
|
||||
|
||||
host_kconfig = \
|
||||
('CONFIG_TPM' in config_host ? ['CONFIG_TPM=y'] : []) + \
|
||||
(have_tpm ? ['CONFIG_TPM=y'] : []) + \
|
||||
('CONFIG_SPICE' in config_host ? ['CONFIG_SPICE=y'] : []) + \
|
||||
(have_ivshmem ? ['CONFIG_IVSHMEM=y'] : []) + \
|
||||
...
|
||||
|
@ -12,6 +12,10 @@ patches before submitting.
|
||||
Formatting and style
|
||||
********************
|
||||
|
||||
The repository includes a ``.editorconfig`` file which can help with
|
||||
getting the right settings for your preferred $EDITOR. See
|
||||
`<https://editorconfig.org/>`_ for details.
|
||||
|
||||
Whitespace
|
||||
==========
|
||||
|
||||
|
@ -413,88 +413,3 @@ disabled, this check will have no performance impact.
|
||||
return ptr;
|
||||
}
|
||||
|
||||
"tcg"
|
||||
-----
|
||||
|
||||
Guest code generated by TCG can be traced by defining an event with the "tcg"
|
||||
event property. Internally, this property generates two events:
|
||||
"<eventname>_trans" to trace the event at translation time, and
|
||||
"<eventname>_exec" to trace the event at execution time.
|
||||
|
||||
Instead of using these two events, you should instead use the function
|
||||
"trace_<eventname>_tcg" during translation (TCG code generation). This function
|
||||
will automatically call "trace_<eventname>_trans", and will generate the
|
||||
necessary TCG code to call "trace_<eventname>_exec" during guest code execution.
|
||||
|
||||
Events with the "tcg" property can be declared in the "trace-events" file with a
|
||||
mix of native and TCG types, and "trace_<eventname>_tcg" will gracefully forward
|
||||
them to the "<eventname>_trans" and "<eventname>_exec" events. Since TCG values
|
||||
are not known at translation time, these are ignored by the "<eventname>_trans"
|
||||
event. Because of this, the entry in the "trace-events" file needs two printing
|
||||
formats (separated by a comma)::
|
||||
|
||||
tcg foo(uint8_t a1, TCGv_i32 a2) "a1=%d", "a1=%d a2=%d"
|
||||
|
||||
For example::
|
||||
|
||||
#include "trace-tcg.h"
|
||||
|
||||
void some_disassembly_func (...)
|
||||
{
|
||||
uint8_t a1 = ...;
|
||||
TCGv_i32 a2 = ...;
|
||||
trace_foo_tcg(a1, a2);
|
||||
}
|
||||
|
||||
This will immediately call::
|
||||
|
||||
void trace_foo_trans(uint8_t a1);
|
||||
|
||||
and will generate the TCG code to call::
|
||||
|
||||
void trace_foo(uint8_t a1, uint32_t a2);
|
||||
|
||||
"vcpu"
|
||||
------
|
||||
|
||||
Identifies events that trace vCPU-specific information. It implicitly adds a
|
||||
"CPUState*" argument, and extends the tracing print format to show the vCPU
|
||||
information. If used together with the "tcg" property, it adds a second
|
||||
"TCGv_env" argument that must point to the per-target global TCG register that
|
||||
points to the vCPU when guest code is executed (usually the "cpu_env" variable).
|
||||
|
||||
The "tcg" and "vcpu" properties are currently only honored in the root
|
||||
./trace-events file.
|
||||
|
||||
The following example events::
|
||||
|
||||
foo(uint32_t a) "a=%x"
|
||||
vcpu bar(uint32_t a) "a=%x"
|
||||
tcg vcpu baz(uint32_t a) "a=%x", "a=%x"
|
||||
|
||||
Can be used as::
|
||||
|
||||
#include "trace-tcg.h"
|
||||
|
||||
CPUArchState *env;
|
||||
TCGv_ptr cpu_env;
|
||||
|
||||
void some_disassembly_func(...)
|
||||
{
|
||||
/* trace emitted at this point */
|
||||
trace_foo(0xd1);
|
||||
/* trace emitted at this point */
|
||||
trace_bar(env_cpu(env), 0xd2);
|
||||
/* trace emitted at this point (env) and when guest code is executed (cpu_env) */
|
||||
trace_baz_tcg(env_cpu(env), cpu_env, 0xd3);
|
||||
}
|
||||
|
||||
If the translating vCPU has address 0xc1 and code is later executed by vCPU
|
||||
0xc2, this would be an example output::
|
||||
|
||||
// at guest code translation
|
||||
foo a=0xd1
|
||||
bar cpu=0xc1 a=0xd2
|
||||
baz_trans cpu=0xc1 a=0xd3
|
||||
// at guest code execution
|
||||
baz_exec cpu=0xc2 a=0xd3
|
||||
|
@ -210,24 +210,61 @@
|
||||
'data' : { 'filename' : 'str',
|
||||
'format' : 'BlockdevDriver' } }
|
||||
|
||||
|
||||
##
|
||||
# @FirmwareFlashType:
|
||||
#
|
||||
# Describes how the firmware build handles code versus variable
|
||||
# persistence.
|
||||
#
|
||||
# @split: the executable file contains code while the NVRAM
|
||||
# template provides variable storage. The executable
|
||||
# must be configured read-only and can be shared between
|
||||
# multiple guests. The NVRAM template must be cloned
|
||||
# for each new guest and configured read-write.
|
||||
#
|
||||
# @combined: the executable file contains both code and
|
||||
# variable storage. The executable must be cloned
|
||||
# for each new guest and configured read-write.
|
||||
# No NVRAM template will be specified.
|
||||
#
|
||||
# @stateless: the executable file contains code and variable
|
||||
# storage is not persisted. The executable must
|
||||
# be configured read-only and can be shared
|
||||
# between multiple guests. No NVRAM template
|
||||
# will be specified.
|
||||
#
|
||||
# Since: 7.0.0
|
||||
##
|
||||
{ 'enum': 'FirmwareFlashMode',
|
||||
'data': [ 'split', 'combined', 'stateless' ] }
|
||||
|
||||
##
|
||||
# @FirmwareMappingFlash:
|
||||
#
|
||||
# Describes loading and mapping properties for the firmware executable
|
||||
# and its accompanying NVRAM file, when @FirmwareDevice is @flash.
|
||||
#
|
||||
# @executable: Identifies the firmware executable. The firmware
|
||||
# executable may be shared by multiple virtual machine
|
||||
# definitions. The preferred corresponding QEMU command
|
||||
# line options are
|
||||
# @mode: Describes how the firmware build handles code versus variable
|
||||
# storage. If not present, it must be treated as if it was
|
||||
# configured with value ``split``. Since: 7.0.0
|
||||
#
|
||||
# @executable: Identifies the firmware executable. The @mode
|
||||
# indicates whether there will be an associated
|
||||
# NVRAM template present. The preferred
|
||||
# corresponding QEMU command line options are
|
||||
# -drive if=none,id=pflash0,readonly=on,file=@executable.@filename,format=@executable.@format
|
||||
# -machine pflash0=pflash0
|
||||
# or equivalent -blockdev instead of -drive.
|
||||
# or equivalent -blockdev instead of -drive. When
|
||||
# @mode is ``combined`` the executable must be
|
||||
# cloned before use and configured with readonly=off.
|
||||
# With QEMU versions older than 4.0, you have to use
|
||||
# -drive if=pflash,unit=0,readonly=on,file=@executable.@filename,format=@executable.@format
|
||||
#
|
||||
# @nvram-template: Identifies the NVRAM template compatible with
|
||||
# @executable. Management software instantiates an
|
||||
# @executable, when @mode is set to ``split``,
|
||||
# otherwise it should not be present.
|
||||
# Management software instantiates an
|
||||
# individual copy -- a specific NVRAM file -- from
|
||||
# @nvram-template.@filename for each new virtual
|
||||
# machine definition created. @nvram-template.@filename
|
||||
@ -246,8 +283,9 @@
|
||||
# Since: 3.0
|
||||
##
|
||||
{ 'struct' : 'FirmwareMappingFlash',
|
||||
'data' : { 'executable' : 'FirmwareFlashFile',
|
||||
'nvram-template' : 'FirmwareFlashFile' } }
|
||||
'data' : { '*mode': 'FirmwareFlashMode',
|
||||
'executable' : 'FirmwareFlashFile',
|
||||
'*nvram-template' : 'FirmwareFlashFile' } }
|
||||
|
||||
##
|
||||
# @FirmwareMappingKernel:
|
||||
|
@ -37,8 +37,6 @@ endif
|
||||
if build_docs
|
||||
SPHINX_ARGS += ['-Dversion=' + meson.project_version(), '-Drelease=' + config_host['PKGVERSION']]
|
||||
|
||||
have_ga = have_tools and config_host.has_key('CONFIG_GUEST_AGENT')
|
||||
|
||||
man_pages = {
|
||||
'qemu-ga.8': (have_ga ? 'man8' : ''),
|
||||
'qemu-ga-ref.7': (have_ga ? 'man7' : ''),
|
||||
|
@ -21,6 +21,7 @@ Hyperscale applications. The following machines are based on this chip :
|
||||
- ``quanta-gbs-bmc`` Quanta GBS server BMC
|
||||
- ``quanta-gsj`` Quanta GSJ server BMC
|
||||
- ``kudo-bmc`` Fii USA Kudo server BMC
|
||||
- ``mori-bmc`` Fii USA Mori server BMC
|
||||
|
||||
There are also two more SoCs, NPCM710 and NPCM705, which are single-core
|
||||
variants of NPCM750 and NPCM730, respectively. These are currently not
|
||||
|
@ -19,10 +19,10 @@ Running a Confidential Guest
|
||||
|
||||
To run a confidential guest you need to add two command line parameters:
|
||||
|
||||
1. Use "-object" to create a "confidential guest support" object. The
|
||||
1. Use ``-object`` to create a "confidential guest support" object. The
|
||||
type and parameters will vary with the specific mechanism to be
|
||||
used
|
||||
2. Set the "confidential-guest-support" machine parameter to the ID of
|
||||
2. Set the ``confidential-guest-support`` machine parameter to the ID of
|
||||
the object from (1).
|
||||
|
||||
Example (for AMD SEV)::
|
||||
@ -37,13 +37,8 @@ Supported mechanisms
|
||||
|
||||
Currently supported confidential guest mechanisms are:
|
||||
|
||||
AMD Secure Encrypted Virtualization (SEV)
|
||||
docs/amd-memory-encryption.txt
|
||||
|
||||
POWER Protected Execution Facility (PEF)
|
||||
docs/papr-pef.txt
|
||||
|
||||
s390x Protected Virtualization (PV)
|
||||
docs/system/s390x/protvirt.rst
|
||||
* AMD Secure Encrypted Virtualization (SEV) (see :doc:`i386/amd-memory-encryption`)
|
||||
* POWER Protected Execution Facility (PEF) (see :ref:`power-papr-protected-execution-facility-pef`)
|
||||
* s390x Protected Virtualization (PV) (see :doc:`s390x/protvirt`)
|
||||
|
||||
Other mechanisms may be supported in future.
|
@ -1,3 +1,6 @@
|
||||
AMD Secure Encrypted Virtualization (SEV)
|
||||
=========================================
|
||||
|
||||
Secure Encrypted Virtualization (SEV) is a feature found on AMD processors.
|
||||
|
||||
SEV is an extension to the AMD-V architecture which supports running encrypted
|
||||
@ -24,17 +27,18 @@ the hypervisor to satisfy the requested function.
|
||||
|
||||
Launching
|
||||
---------
|
||||
|
||||
Boot images (such as bios) must be encrypted before a guest can be booted. The
|
||||
MEMORY_ENCRYPT_OP ioctl provides commands to encrypt the images: LAUNCH_START,
|
||||
LAUNCH_UPDATE_DATA, LAUNCH_MEASURE and LAUNCH_FINISH. These four commands
|
||||
``MEMORY_ENCRYPT_OP`` ioctl provides commands to encrypt the images: ``LAUNCH_START``,
|
||||
``LAUNCH_UPDATE_DATA``, ``LAUNCH_MEASURE`` and ``LAUNCH_FINISH``. These four commands
|
||||
together generate a fresh memory encryption key for the VM, encrypt the boot
|
||||
images and provide a measurement than can be used as an attestation of a
|
||||
successful launch.
|
||||
|
||||
For a SEV-ES guest, the LAUNCH_UPDATE_VMSA command is also used to encrypt the
|
||||
For a SEV-ES guest, the ``LAUNCH_UPDATE_VMSA`` command is also used to encrypt the
|
||||
guest register state, or VM save area (VMSA), for all of the guest vCPUs.
|
||||
|
||||
LAUNCH_START is called first to create a cryptographic launch context within
|
||||
``LAUNCH_START`` is called first to create a cryptographic launch context within
|
||||
the firmware. To create this context, guest owner must provide a guest policy,
|
||||
its public Diffie-Hellman key (PDH) and session parameters. These inputs
|
||||
should be treated as a binary blob and must be passed as-is to the SEV firmware.
|
||||
@ -45,37 +49,37 @@ in bad measurement). The guest policy is a 4-byte data structure containing
|
||||
several flags that restricts what can be done on a running SEV guest.
|
||||
See KM Spec section 3 and 6.2 for more details.
|
||||
|
||||
The guest policy can be provided via the 'policy' property (see below)
|
||||
The guest policy can be provided via the ``policy`` property::
|
||||
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,policy=0x1...\
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,policy=0x1...\
|
||||
|
||||
Setting the "SEV-ES required" policy bit (bit 2) will launch the guest as a
|
||||
SEV-ES guest (see below)
|
||||
SEV-ES guest::
|
||||
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,policy=0x5...\
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,policy=0x5...\
|
||||
|
||||
The guest owner provided DH certificate and session parameters will be used to
|
||||
establish a cryptographic session with the guest owner to negotiate keys used
|
||||
for the attestation.
|
||||
|
||||
The DH certificate and session blob can be provided via the 'dh-cert-file' and
|
||||
'session-file' properties (see below)
|
||||
The DH certificate and session blob can be provided via the ``dh-cert-file`` and
|
||||
``session-file`` properties::
|
||||
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,dh-cert-file=<file1>,session-file=<file2>
|
||||
# ${QEMU} \
|
||||
sev-guest,id=sev0,dh-cert-file=<file1>,session-file=<file2>
|
||||
|
||||
LAUNCH_UPDATE_DATA encrypts the memory region using the cryptographic context
|
||||
created via the LAUNCH_START command. If required, this command can be called
|
||||
``LAUNCH_UPDATE_DATA`` encrypts the memory region using the cryptographic context
|
||||
created via the ``LAUNCH_START`` command. If required, this command can be called
|
||||
multiple times to encrypt different memory regions. The command also calculates
|
||||
the measurement of the memory contents as it encrypts.
|
||||
|
||||
LAUNCH_UPDATE_VMSA encrypts all the vCPU VMSAs for a SEV-ES guest using the
|
||||
cryptographic context created via the LAUNCH_START command. The command also
|
||||
``LAUNCH_UPDATE_VMSA`` encrypts all the vCPU VMSAs for a SEV-ES guest using the
|
||||
cryptographic context created via the ``LAUNCH_START`` command. The command also
|
||||
calculates the measurement of the VMSAs as it encrypts them.
|
||||
|
||||
LAUNCH_MEASURE can be used to retrieve the measurement of encrypted memory and,
|
||||
``LAUNCH_MEASURE`` can be used to retrieve the measurement of encrypted memory and,
|
||||
for a SEV-ES guest, encrypted VMSAs. This measurement is a signature of the
|
||||
memory contents and, for a SEV-ES guest, the VMSA contents, that can be sent
|
||||
to the guest owner as an attestation that the memory and VMSAs were encrypted
|
||||
@ -85,27 +89,28 @@ Since the guest owner knows the initial contents of the guest at boot, the
|
||||
attestation measurement can be verified by comparing it to what the guest owner
|
||||
expects.
|
||||
|
||||
LAUNCH_FINISH finalizes the guest launch and destroys the cryptographic
|
||||
``LAUNCH_FINISH`` finalizes the guest launch and destroys the cryptographic
|
||||
context.
|
||||
|
||||
See SEV KM API Spec [1] 'Launching a guest' usage flow (Appendix A) for the
|
||||
See SEV KM API Spec ([SEVKM]_) 'Launching a guest' usage flow (Appendix A) for the
|
||||
complete flow chart.
|
||||
|
||||
To launch a SEV guest
|
||||
To launch a SEV guest::
|
||||
|
||||
# ${QEMU} \
|
||||
-machine ...,confidential-guest-support=sev0 \
|
||||
-object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1
|
||||
# ${QEMU} \
|
||||
-machine ...,confidential-guest-support=sev0 \
|
||||
-object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1
|
||||
|
||||
To launch a SEV-ES guest
|
||||
To launch a SEV-ES guest::
|
||||
|
||||
# ${QEMU} \
|
||||
-machine ...,confidential-guest-support=sev0 \
|
||||
-object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1,policy=0x5
|
||||
# ${QEMU} \
|
||||
-machine ...,confidential-guest-support=sev0 \
|
||||
-object sev-guest,id=sev0,cbitpos=47,reduced-phys-bits=1,policy=0x5
|
||||
|
||||
An SEV-ES guest has some restrictions as compared to a SEV guest. Because the
|
||||
guest register state is encrypted and cannot be updated by the VMM/hypervisor,
|
||||
a SEV-ES guest:
|
||||
|
||||
- Does not support SMM - SMM support requires updating the guest register
|
||||
state.
|
||||
- Does not support reboot - a system reset requires updating the guest register
|
||||
@ -114,35 +119,42 @@ a SEV-ES guest:
|
||||
manage booting APs.
|
||||
|
||||
Debugging
|
||||
-----------
|
||||
---------
|
||||
|
||||
Since the memory contents of a SEV guest are encrypted, hypervisor access to
|
||||
the guest memory will return cipher text. If the guest policy allows debugging,
|
||||
then a hypervisor can use the DEBUG_DECRYPT and DEBUG_ENCRYPT commands to access
|
||||
the guest memory region for debug purposes. This is not supported in QEMU yet.
|
||||
|
||||
Snapshot/Restore
|
||||
-----------------
|
||||
----------------
|
||||
|
||||
TODO
|
||||
|
||||
Live Migration
|
||||
----------------
|
||||
---------------
|
||||
|
||||
TODO
|
||||
|
||||
References
|
||||
-----------------
|
||||
----------
|
||||
|
||||
AMD Memory Encryption whitepaper:
|
||||
https://developer.amd.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf
|
||||
`AMD Memory Encryption whitepaper
|
||||
<https://developer.amd.com/wordpress/media/2013/12/AMD_Memory_Encryption_Whitepaper_v7-Public.pdf>`_
|
||||
|
||||
Secure Encrypted Virtualization Key Management:
|
||||
[1] http://developer.amd.com/wordpress/media/2017/11/55766_SEV-KM-API_Specification.pdf
|
||||
.. [SEVKM] `Secure Encrypted Virtualization Key Management
|
||||
<http://developer.amd.com/wordpress/media/2017/11/55766_SEV-KM-API_Specification.pdf>`_
|
||||
|
||||
KVM Forum slides:
|
||||
http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf
|
||||
https://www.linux-kvm.org/images/9/94/Extending-Secure-Encrypted-Virtualization-with-SEV-ES-Thomas-Lendacky-AMD.pdf
|
||||
|
||||
AMD64 Architecture Programmer's Manual:
|
||||
http://support.amd.com/TechDocs/24593.pdf
|
||||
SME is section 7.10
|
||||
SEV is section 15.34
|
||||
SEV-ES is section 15.35
|
||||
* `AMD’s Virtualization Memory Encryption (2016)
|
||||
<http://www.linux-kvm.org/images/7/74/02x08A-Thomas_Lendacky-AMDs_Virtualizatoin_Memory_Encryption_Technology.pdf>`_
|
||||
* `Extending Secure Encrypted Virtualization With SEV-ES (2018)
|
||||
<https://www.linux-kvm.org/images/9/94/Extending-Secure-Encrypted-Virtualization-with-SEV-ES-Thomas-Lendacky-AMD.pdf>`_
|
||||
|
||||
`AMD64 Architecture Programmer's Manual:
|
||||
<http://support.amd.com/TechDocs/24593.pdf>`_
|
||||
|
||||
* SME is section 7.10
|
||||
* SEV is section 15.34
|
||||
* SEV-ES is section 15.35
|
@ -34,3 +34,4 @@ or Hypervisor.Framework.
|
||||
targets
|
||||
security
|
||||
multi-process
|
||||
confidential-guest-support
|
||||
|
@ -224,6 +224,8 @@ nested. Combinations not shown in the table are not available.
|
||||
.. [3] Introduced on Power10 machines.
|
||||
|
||||
|
||||
.. _power-papr-protected-execution-facility-pef:
|
||||
|
||||
POWER (PAPR) Protected Execution Facility (PEF)
|
||||
-----------------------------------------------
|
||||
|
||||
|
@ -778,10 +778,32 @@ The optional *HOST_KEY_CHECK* parameter controls how the remote
|
||||
host's key is checked. The default is ``yes`` which means to use
|
||||
the local ``.ssh/known_hosts`` file. Setting this to ``no``
|
||||
turns off known-hosts checking. Or you can check that the host key
|
||||
matches a specific fingerprint:
|
||||
``host_key_check=md5:78:45:8e:14:57:4f:d5:45:83:0a:0e:f3:49:82:c9:c8``
|
||||
(``sha1:`` can also be used as a prefix, but note that OpenSSH
|
||||
tools only use MD5 to print fingerprints).
|
||||
matches a specific fingerprint. The fingerprint can be provided in
|
||||
``md5``, ``sha1``, or ``sha256`` format, however, it is strongly
|
||||
recommended to only use ``sha256``, since the other options are
|
||||
considered insecure by modern standards. The fingerprint value
|
||||
must be given as a hex encoded string::
|
||||
|
||||
host_key_check=sha256:04ce2ae89ff4295a6b9c4111640bdcb3297858ee55cb434d9dd88796e93aa795
|
||||
|
||||
The key string may optionally contain ":" separators between
|
||||
each pair of hex digits.
|
||||
|
||||
The ``$HOME/.ssh/known_hosts`` file contains the base64 encoded
|
||||
host keys. These can be converted into the format needed for
|
||||
QEMU using a command such as::
|
||||
|
||||
$ for key in `grep 10.33.8.112 known_hosts | awk '{print $3}'`
|
||||
do
|
||||
echo $key | base64 -d | sha256sum
|
||||
done
|
||||
6c3aa525beda9dc83eadfbd7e5ba7d976ecb59575d1633c87cd06ed2ed6e366f -
|
||||
12214fd9ea5b408086f98ecccd9958609bd9ac7c0ea316734006bc7818b45dc8 -
|
||||
d36420137bcbd101209ef70c3b15dc07362fbe0fa53c5b135eba6e6afa82f0ce -
|
||||
|
||||
Note that there can be multiple keys present per host, each with
|
||||
different key ciphers. Care is needed to pick the key fingerprint
|
||||
that matches the cipher QEMU will negotiate with the remote server.
|
||||
|
||||
Currently authentication must be done using ssh-agent. Other
|
||||
authentication methods may be supported in future.
|
||||
|
@ -23,9 +23,9 @@ The ``virt`` machine supports the following devices:
|
||||
* 1 generic PCIe host bridge
|
||||
* The fw_cfg device that allows a guest to obtain data from QEMU
|
||||
|
||||
Note that the default CPU is a generic RV32GC/RV64GC. Optional extensions
|
||||
can be enabled via command line parameters, e.g.: ``-cpu rv64,x-h=true``
|
||||
enables the hypervisor extension for RV64.
|
||||
The hypervisor extension has been enabled for the default CPU, so virtual
|
||||
machines with hypervisor extension can simply be used without explicitly
|
||||
declaring.
|
||||
|
||||
Hardware configuration information
|
||||
----------------------------------
|
||||
|
@ -28,6 +28,7 @@ Architectural features
|
||||
i386/cpu
|
||||
i386/kvm-pv
|
||||
i386/sgx
|
||||
i386/amd-memory-encryption
|
||||
|
||||
.. _pcsys_005freq:
|
||||
|
||||
|
@ -104,6 +104,13 @@ Options
|
||||
* posix_acl|no_posix_acl -
|
||||
Enable/disable posix acl support. Posix ACLs are disabled by default.
|
||||
|
||||
* security_label|no_security_label -
|
||||
Enable/disable security label support. Security labels are disabled by
|
||||
default. This will allow client to send a MAC label of file during
|
||||
file creation. Typically this is expected to be SELinux security
|
||||
label. Server will try to set that label on newly created file
|
||||
atomically wherever possible.
|
||||
|
||||
.. option:: --socket-path=PATH
|
||||
|
||||
Listen on vhost-user UNIX domain socket at PATH.
|
||||
@ -348,6 +355,31 @@ client arguments or lists returned from the host. This stops
|
||||
the client seeing any 'security.' attributes on the server and
|
||||
stops it setting any.
|
||||
|
||||
SELinux support
|
||||
---------------
|
||||
One can enable support for SELinux by running virtiofsd with option
|
||||
"-o security_label". But this will try to save guest's security context
|
||||
in xattr security.selinux on host and it might fail if host's SELinux
|
||||
policy does not permit virtiofsd to do this operation.
|
||||
|
||||
Hence, it is preferred to remap guest's "security.selinux" xattr to say
|
||||
"trusted.virtiofs.security.selinux" on host.
|
||||
|
||||
"-o xattrmap=:map:security.selinux:trusted.virtiofs.:"
|
||||
|
||||
This will make sure that guest and host's SELinux xattrs on same file
|
||||
remain separate and not interfere with each other. And will allow both
|
||||
host and guest to implement their own separate SELinux policies.
|
||||
|
||||
Setting trusted xattr on host requires CAP_SYS_ADMIN. So one will need
|
||||
add this capability to daemon.
|
||||
|
||||
"-o modcaps=+sys_admin"
|
||||
|
||||
Giving CAP_SYS_ADMIN increases the risk on system. Now virtiofsd is more
|
||||
powerful and if gets compromised, it can do lot of damage to host system.
|
||||
So keep this trade-off in my mind while making a decision.
|
||||
|
||||
Examples
|
||||
--------
|
||||
|
||||
|
@ -166,7 +166,6 @@ Other binaries
|
||||
|
||||
- user mode (PowerPC)
|
||||
|
||||
* ``qemu-ppc64abi32`` TODO.
|
||||
* ``qemu-ppc64`` TODO.
|
||||
* ``qemu-ppc`` TODO.
|
||||
|
||||
|
@ -182,7 +182,12 @@ static int synth_opendir(FsContext *ctx,
|
||||
V9fsSynthOpenState *synth_open;
|
||||
V9fsSynthNode *node = *(V9fsSynthNode **)fs_path->data;
|
||||
|
||||
synth_open = g_malloc(sizeof(*synth_open));
|
||||
/*
|
||||
* V9fsSynthOpenState contains 'struct dirent' which have OS-specific
|
||||
* properties, thus it's zero cleared on allocation here and below
|
||||
* in synth_open.
|
||||
*/
|
||||
synth_open = g_new0(V9fsSynthOpenState, 1);
|
||||
synth_open->node = node;
|
||||
node->open_count++;
|
||||
fs->private = synth_open;
|
||||
@ -220,7 +225,14 @@ static void synth_rewinddir(FsContext *ctx, V9fsFidOpenState *fs)
|
||||
static void synth_direntry(V9fsSynthNode *node,
|
||||
struct dirent *entry, off_t off)
|
||||
{
|
||||
strcpy(entry->d_name, node->name);
|
||||
size_t sz = strlen(node->name) + 1;
|
||||
/*
|
||||
* 'entry' is always inside of V9fsSynthOpenState which have NAME_MAX
|
||||
* back padding. Ensure we do not overflow it.
|
||||
*/
|
||||
g_assert(sizeof(struct dirent) + NAME_MAX >=
|
||||
offsetof(struct dirent, d_name) + sz);
|
||||
memcpy(entry->d_name, node->name, sz);
|
||||
entry->d_ino = node->attr->inode;
|
||||
entry->d_off = off + 1;
|
||||
}
|
||||
@ -266,7 +278,7 @@ static int synth_open(FsContext *ctx, V9fsPath *fs_path,
|
||||
V9fsSynthOpenState *synth_open;
|
||||
V9fsSynthNode *node = *(V9fsSynthNode **)fs_path->data;
|
||||
|
||||
synth_open = g_malloc(sizeof(*synth_open));
|
||||
synth_open = g_new0(V9fsSynthOpenState, 1);
|
||||
synth_open->node = node;
|
||||
node->open_count++;
|
||||
fs->private = synth_open;
|
||||
|
@ -41,6 +41,11 @@ typedef struct V9fsSynthOpenState {
|
||||
off_t offset;
|
||||
V9fsSynthNode *node;
|
||||
struct dirent dent;
|
||||
/*
|
||||
* Ensure there is enough space for 'dent' above, some systems have a
|
||||
* d_name size of just 1, which would cause a buffer overrun.
|
||||
*/
|
||||
char dent_trailing_space[NAME_MAX];
|
||||
} V9fsSynthOpenState;
|
||||
|
||||
int qemu_v9fs_synth_mkdir(V9fsSynthNode *parent, int mode,
|
||||
|
@ -143,8 +143,7 @@ static int do_readdir_many(V9fsPDU *pdu, V9fsFidState *fidp,
|
||||
} else {
|
||||
e = e->next = g_malloc0(sizeof(V9fsDirEnt));
|
||||
}
|
||||
e->dent = g_malloc0(sizeof(struct dirent));
|
||||
memcpy(e->dent, dent, sizeof(struct dirent));
|
||||
e->dent = qemu_dirent_dup(dent);
|
||||
|
||||
/* perform a full stat() for directory entry if requested by caller */
|
||||
if (dostat) {
|
||||
|
@ -10,6 +10,7 @@ config ACPI_X86
|
||||
select ACPI_HMAT
|
||||
select ACPI_PIIX4
|
||||
select ACPI_PCIHP
|
||||
select ACPI_ERST
|
||||
|
||||
config ACPI_X86_ICH
|
||||
bool
|
||||
@ -60,3 +61,8 @@ config ACPI_HW_REDUCED
|
||||
select ACPI
|
||||
select ACPI_MEMORY_HOTPLUG
|
||||
select ACPI_NVDIMM
|
||||
|
||||
config ACPI_ERST
|
||||
bool
|
||||
default y
|
||||
depends on ACPI && PCI
|
||||
|
@ -1724,9 +1724,9 @@ void acpi_table_begin(AcpiTable *desc, GArray *array)
|
||||
build_append_int_noprefix(array, 0, 4); /* Length */
|
||||
build_append_int_noprefix(array, desc->rev, 1); /* Revision */
|
||||
build_append_int_noprefix(array, 0, 1); /* Checksum */
|
||||
build_append_padded_str(array, desc->oem_id, 6, ' '); /* OEMID */
|
||||
build_append_padded_str(array, desc->oem_id, 6, '\0'); /* OEMID */
|
||||
/* OEM Table ID */
|
||||
build_append_padded_str(array, desc->oem_table_id, 8, ' ');
|
||||
build_append_padded_str(array, desc->oem_table_id, 8, '\0');
|
||||
build_append_int_noprefix(array, 1, 4); /* OEM Revision */
|
||||
g_array_append_vals(array, ACPI_BUILD_APPNAME8, 4); /* Creator ID */
|
||||
build_append_int_noprefix(array, 1, 4); /* Creator Revision */
|
||||
|
1051
hw/acpi/erst.c
Normal file
1051
hw/acpi/erst.c
Normal file
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,5 @@
|
||||
#include "qemu/osdep.h"
|
||||
#include "hw/acpi/memory_hotplug.h"
|
||||
#include "hw/acpi/pc-hotplug.h"
|
||||
#include "hw/mem/pc-dimm.h"
|
||||
#include "hw/qdev-core.h"
|
||||
#include "migration/vmstate.h"
|
||||
|
@ -22,9 +22,12 @@ acpi_ss.add(when: 'CONFIG_ACPI_PCIHP', if_true: files('pcihp.c'))
|
||||
acpi_ss.add(when: 'CONFIG_ACPI_PCIHP', if_false: files('acpi-pci-hotplug-stub.c'))
|
||||
acpi_ss.add(when: 'CONFIG_ACPI_VIOT', if_true: files('viot.c'))
|
||||
acpi_ss.add(when: 'CONFIG_ACPI_X86_ICH', if_true: files('ich9.c', 'tco.c'))
|
||||
acpi_ss.add(when: 'CONFIG_ACPI_ERST', if_true: files('erst.c'))
|
||||
acpi_ss.add(when: 'CONFIG_IPMI', if_true: files('ipmi.c'), if_false: files('ipmi-stub.c'))
|
||||
acpi_ss.add(when: 'CONFIG_PC', if_false: files('acpi-x86-stub.c'))
|
||||
acpi_ss.add(when: 'CONFIG_TPM', if_true: files('tpm.c'))
|
||||
if have_tpm
|
||||
acpi_ss.add(files('tpm.c'))
|
||||
endif
|
||||
softmmu_ss.add(when: 'CONFIG_ACPI', if_false: files('acpi-stub.c', 'aml-build-stub.c', 'ghes-stub.c'))
|
||||
softmmu_ss.add_all(when: 'CONFIG_ACPI', if_true: acpi_ss)
|
||||
softmmu_ss.add(when: 'CONFIG_ALL', if_true: files('acpi-stub.c', 'aml-build-stub.c',
|
||||
|
@ -55,3 +55,18 @@ piix4_gpe_writeb(uint64_t addr, unsigned width, uint64_t val) "addr: 0x%" PRIx64
|
||||
# tco.c
|
||||
tco_timer_reload(int ticks, int msec) "ticks=%d (%d ms)"
|
||||
tco_timer_expired(int timeouts_no, bool strap, bool no_reboot) "timeouts_no=%d no_reboot=%d/%d"
|
||||
|
||||
# erst.c
|
||||
acpi_erst_reg_write(uint64_t addr, uint64_t val, unsigned size) "addr: 0x%04" PRIx64 " <== 0x%016" PRIx64 " (size: %u)"
|
||||
acpi_erst_reg_read(uint64_t addr, uint64_t val, unsigned size) " addr: 0x%04" PRIx64 " ==> 0x%016" PRIx64 " (size: %u)"
|
||||
acpi_erst_mem_write(uint64_t addr, uint64_t val, unsigned size) "addr: 0x%06" PRIx64 " <== 0x%016" PRIx64 " (size: %u)"
|
||||
acpi_erst_mem_read(uint64_t addr, uint64_t val, unsigned size) " addr: 0x%06" PRIx64 " ==> 0x%016" PRIx64 " (size: %u)"
|
||||
acpi_erst_pci_bar_0(uint64_t addr) "BAR0: 0x%016" PRIx64
|
||||
acpi_erst_pci_bar_1(uint64_t addr) "BAR1: 0x%016" PRIx64
|
||||
acpi_erst_realizefn_in(void)
|
||||
acpi_erst_realizefn_out(unsigned size) "total nvram size %u bytes"
|
||||
acpi_erst_reset_in(unsigned record_count) "record_count %u"
|
||||
acpi_erst_reset_out(unsigned record_count) "record_count %u"
|
||||
acpi_erst_post_load(void *header, unsigned slot_size) "header: 0x%p slot_size %u"
|
||||
acpi_erst_class_init_in(void)
|
||||
acpi_erst_class_init_out(void)
|
||||
|
@ -46,6 +46,7 @@ config DIGIC
|
||||
|
||||
config EXYNOS4
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select A9MPCORE
|
||||
select I2C
|
||||
select LAN9118
|
||||
@ -184,6 +185,7 @@ config REALVIEW
|
||||
bool
|
||||
imply PCI_DEVICES
|
||||
imply PCI_TESTDEV
|
||||
imply I2C_DEVICES
|
||||
select SMC91C111
|
||||
select LAN9118
|
||||
select A9MPCORE
|
||||
@ -229,6 +231,7 @@ config SABRELITE
|
||||
|
||||
config STELLARIS
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select ARM_V7M
|
||||
select CMSDK_APB_WATCHDOG
|
||||
select I2C
|
||||
@ -406,6 +409,7 @@ config NPCM7XX
|
||||
|
||||
config FSL_IMX25
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select IMX
|
||||
select IMX_FEC
|
||||
select IMX_I2C
|
||||
@ -414,6 +418,7 @@ config FSL_IMX25
|
||||
|
||||
config FSL_IMX31
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select SERIAL
|
||||
select IMX
|
||||
select IMX_I2C
|
||||
@ -422,6 +427,7 @@ config FSL_IMX31
|
||||
|
||||
config FSL_IMX6
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select A9MPCORE
|
||||
select IMX
|
||||
select IMX_FEC
|
||||
@ -450,6 +456,7 @@ config ASPEED_SOC
|
||||
|
||||
config MPS2
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select ARMSSE
|
||||
select LAN9118
|
||||
select MPS2_FPGAIO
|
||||
@ -466,6 +473,7 @@ config FSL_IMX7
|
||||
bool
|
||||
imply PCI_DEVICES
|
||||
imply TEST_DEVICES
|
||||
imply I2C_DEVICES
|
||||
select A15MPCORE
|
||||
select PCI
|
||||
select IMX
|
||||
@ -481,6 +489,7 @@ config ARM_SMMUV3
|
||||
|
||||
config FSL_IMX6UL
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select A15MPCORE
|
||||
select IMX
|
||||
select IMX_FEC
|
||||
@ -495,6 +504,7 @@ config MICROBIT
|
||||
|
||||
config NRF51_SOC
|
||||
bool
|
||||
imply I2C_DEVICES
|
||||
select I2C
|
||||
select ARM_V7M
|
||||
select UNIMP
|
||||
|
@ -235,11 +235,10 @@ static void allwinner_h3_realize(DeviceState *dev, Error **errp)
|
||||
/* CPUs */
|
||||
for (i = 0; i < AW_H3_NUM_CPUS; i++) {
|
||||
|
||||
/* Provide Power State Coordination Interface */
|
||||
qdev_prop_set_int32(DEVICE(&s->cpus[i]), "psci-conduit",
|
||||
QEMU_PSCI_CONDUIT_SMC);
|
||||
|
||||
/* Disable secondary CPUs */
|
||||
/*
|
||||
* Disable secondary CPUs. Guest EL3 firmware will start
|
||||
* them via CPU reset control registers.
|
||||
*/
|
||||
qdev_prop_set_bit(DEVICE(&s->cpus[i]), "start-powered-off",
|
||||
i > 0);
|
||||
|
||||
|
@ -284,6 +284,12 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
/* cpuclk must be connected; refclk is optional */
|
||||
if (!clock_has_source(s->cpuclk)) {
|
||||
error_setg(errp, "armv7m: cpuclk must be connected");
|
||||
return;
|
||||
}
|
||||
|
||||
memory_region_add_subregion_overlap(&s->container, 0, s->board_memory, -1);
|
||||
|
||||
s->cpu = ARM_CPU(object_new_with_props(s->cpu_type, OBJECT(s), "cpu",
|
||||
@ -420,8 +426,18 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
|
||||
&s->sysreg_ns_mem);
|
||||
}
|
||||
|
||||
/* Create and map the systick devices */
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk", s->refclk);
|
||||
/*
|
||||
* Create and map the systick devices. Note that we only connect
|
||||
* refclk if it has been connected to us; otherwise the systick
|
||||
* device gets the wrong answer for clock_has_source(refclk), because
|
||||
* it has an immediate source (the ARMv7M's clock object) but not
|
||||
* an ultimate source, and then it won't correctly auto-select the
|
||||
* CPU clock as its only possible clock source.
|
||||
*/
|
||||
if (clock_has_source(s->refclk)) {
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "refclk",
|
||||
s->refclk);
|
||||
}
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_NS]), "cpuclk", s->cpuclk);
|
||||
if (!sysbus_realize(SYS_BUS_DEVICE(&s->systick[M_REG_NS]), errp)) {
|
||||
return;
|
||||
@ -438,8 +454,10 @@ static void armv7m_realize(DeviceState *dev, Error **errp)
|
||||
*/
|
||||
object_initialize_child(OBJECT(dev), "systick-reg-s",
|
||||
&s->systick[M_REG_S], TYPE_SYSTICK);
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
|
||||
s->refclk);
|
||||
if (clock_has_source(s->refclk)) {
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "refclk",
|
||||
s->refclk);
|
||||
}
|
||||
qdev_connect_clock_in(DEVICE(&s->systick[M_REG_S]), "cpuclk",
|
||||
s->cpuclk);
|
||||
|
||||
|
@ -431,7 +431,6 @@ static void aspeed_machine_init(MachineState *machine)
|
||||
|
||||
aspeed_board_binfo.ram_size = machine->ram_size;
|
||||
aspeed_board_binfo.loader_start = sc->memmap[ASPEED_DEV_SDRAM];
|
||||
aspeed_board_binfo.nb_cpus = sc->num_cpus;
|
||||
|
||||
if (amc->i2c_init) {
|
||||
amc->i2c_init(bmc);
|
||||
|
107
hw/arm/boot.c
107
hw/arm/boot.c
@ -478,12 +478,13 @@ static void fdt_add_psci_node(void *fdt)
|
||||
}
|
||||
|
||||
/*
|
||||
* If /psci node is present in provided DTB, assume that no fixup
|
||||
* is necessary and all PSCI configuration should be taken as-is
|
||||
* A pre-existing /psci node might specify function ID values
|
||||
* that don't match QEMU's PSCI implementation. Delete the whole
|
||||
* node and put our own in instead.
|
||||
*/
|
||||
rc = fdt_path_offset(fdt, "/psci");
|
||||
if (rc >= 0) {
|
||||
return;
|
||||
qemu_fdt_nop_node(fdt, "/psci");
|
||||
}
|
||||
|
||||
qemu_fdt_add_subnode(fdt, "/psci");
|
||||
@ -804,7 +805,7 @@ static void do_cpu_reset(void *opaque)
|
||||
set_kernel_args(info, as);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
} else if (info->secondary_cpu_reset_hook) {
|
||||
info->secondary_cpu_reset_hook(cpu, info);
|
||||
}
|
||||
}
|
||||
@ -1030,16 +1031,6 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
|
||||
elf_machine = EM_ARM;
|
||||
}
|
||||
|
||||
if (!info->secondary_cpu_reset_hook) {
|
||||
info->secondary_cpu_reset_hook = default_reset_secondary;
|
||||
}
|
||||
if (!info->write_secondary_boot) {
|
||||
info->write_secondary_boot = default_write_secondary;
|
||||
}
|
||||
|
||||
if (info->nb_cpus == 0)
|
||||
info->nb_cpus = 1;
|
||||
|
||||
/* Assume that raw images are linux kernels, and ELF images are not. */
|
||||
kernel_size = arm_load_elf(info, &elf_entry, &image_low_addr,
|
||||
&image_high_addr, elf_machine, as);
|
||||
@ -1216,9 +1207,6 @@ static void arm_setup_direct_kernel_boot(ARMCPU *cpu,
|
||||
write_bootloader("bootloader", info->loader_start,
|
||||
primary_loader, fixupcontext, as);
|
||||
|
||||
if (info->nb_cpus > 1) {
|
||||
info->write_secondary_boot(cpu, info);
|
||||
}
|
||||
if (info->write_board_setup) {
|
||||
info->write_board_setup(cpu, info);
|
||||
}
|
||||
@ -1299,6 +1287,9 @@ void arm_load_kernel(ARMCPU *cpu, MachineState *ms, struct arm_boot_info *info)
|
||||
{
|
||||
CPUState *cs;
|
||||
AddressSpace *as = arm_boot_address_space(cpu, info);
|
||||
int boot_el;
|
||||
CPUARMState *env = &cpu->env;
|
||||
int nb_cpus = 0;
|
||||
|
||||
/*
|
||||
* CPU objects (unlike devices) are not automatically reset on system
|
||||
@ -1308,6 +1299,7 @@ void arm_load_kernel(ARMCPU *cpu, MachineState *ms, struct arm_boot_info *info)
|
||||
*/
|
||||
for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
|
||||
qemu_register_reset(do_cpu_reset, ARM_CPU(cs));
|
||||
nb_cpus++;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1329,6 +1321,87 @@ void arm_load_kernel(ARMCPU *cpu, MachineState *ms, struct arm_boot_info *info)
|
||||
arm_setup_direct_kernel_boot(cpu, info);
|
||||
}
|
||||
|
||||
/*
|
||||
* Disable the PSCI conduit if it is set up to target the same
|
||||
* or a lower EL than the one we're going to start the guest code in.
|
||||
* This logic needs to agree with the code in do_cpu_reset() which
|
||||
* decides whether we're going to boot the guest in the highest
|
||||
* supported exception level or in a lower one.
|
||||
*/
|
||||
|
||||
/*
|
||||
* If PSCI is enabled, then SMC calls all go to the PSCI handler and
|
||||
* are never emulated to trap into guest code. It therefore does not
|
||||
* make sense for the board to have a setup code fragment that runs
|
||||
* in Secure, because this will probably need to itself issue an SMC of some
|
||||
* kind as part of its operation.
|
||||
*/
|
||||
assert(info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED ||
|
||||
!info->secure_board_setup);
|
||||
|
||||
/* Boot into highest supported EL ... */
|
||||
if (arm_feature(env, ARM_FEATURE_EL3)) {
|
||||
boot_el = 3;
|
||||
} else if (arm_feature(env, ARM_FEATURE_EL2)) {
|
||||
boot_el = 2;
|
||||
} else {
|
||||
boot_el = 1;
|
||||
}
|
||||
/* ...except that if we're booting Linux we adjust the EL we boot into */
|
||||
if (info->is_linux && !info->secure_boot) {
|
||||
boot_el = arm_feature(env, ARM_FEATURE_EL2) ? 2 : 1;
|
||||
}
|
||||
|
||||
if ((info->psci_conduit == QEMU_PSCI_CONDUIT_HVC && boot_el >= 2) ||
|
||||
(info->psci_conduit == QEMU_PSCI_CONDUIT_SMC && boot_el == 3)) {
|
||||
info->psci_conduit = QEMU_PSCI_CONDUIT_DISABLED;
|
||||
}
|
||||
|
||||
if (info->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
|
||||
for (cs = first_cpu; cs; cs = CPU_NEXT(cs)) {
|
||||
Object *cpuobj = OBJECT(cs);
|
||||
|
||||
object_property_set_int(cpuobj, "psci-conduit", info->psci_conduit,
|
||||
&error_abort);
|
||||
/*
|
||||
* Secondary CPUs start in PSCI powered-down state. Like the
|
||||
* code in do_cpu_reset(), we assume first_cpu is the primary
|
||||
* CPU.
|
||||
*/
|
||||
if (cs != first_cpu) {
|
||||
object_property_set_bool(cpuobj, "start-powered-off", true,
|
||||
&error_abort);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (info->psci_conduit == QEMU_PSCI_CONDUIT_DISABLED &&
|
||||
info->is_linux && nb_cpus > 1) {
|
||||
/*
|
||||
* We're booting Linux but not using PSCI, so for SMP we need
|
||||
* to write a custom secondary CPU boot loader stub, and arrange
|
||||
* for the secondary CPU reset to make the accompanying initialization.
|
||||
*/
|
||||
if (!info->secondary_cpu_reset_hook) {
|
||||
info->secondary_cpu_reset_hook = default_reset_secondary;
|
||||
}
|
||||
if (!info->write_secondary_boot) {
|
||||
info->write_secondary_boot = default_write_secondary;
|
||||
}
|
||||
info->write_secondary_boot(cpu, info);
|
||||
} else {
|
||||
/*
|
||||
* No secondary boot stub; don't use the reset hook that would
|
||||
* have set the CPU up to call it
|
||||
*/
|
||||
info->write_secondary_boot = NULL;
|
||||
info->secondary_cpu_reset_hook = NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* arm_load_dtb() may add a PSCI node so it must be called after we have
|
||||
* decided whether to enable PSCI and set the psci-conduit CPU properties.
|
||||
*/
|
||||
if (!info->skip_dtb_autoload && have_dtb(info)) {
|
||||
if (arm_load_dtb(info->dtb_start, info, info->dtb_limit, as, ms) < 0) {
|
||||
exit(1);
|
||||
|
@ -67,7 +67,6 @@ static unsigned long exynos4_board_ram_size[EXYNOS4_NUM_OF_BOARDS] = {
|
||||
static struct arm_boot_info exynos4_board_binfo = {
|
||||
.loader_start = EXYNOS4210_BASE_BOOT_ADDR,
|
||||
.smp_loader_start = EXYNOS4210_SMP_BOOT_ADDR,
|
||||
.nb_cpus = EXYNOS4210_NCPUS,
|
||||
.write_secondary_boot = exynos4210_write_secondary,
|
||||
};
|
||||
|
||||
|
@ -166,8 +166,6 @@ static void fsl_imx6ul_realize(DeviceState *dev, Error **errp)
|
||||
return;
|
||||
}
|
||||
|
||||
object_property_set_int(OBJECT(&s->cpu), "psci-conduit",
|
||||
QEMU_PSCI_CONDUIT_SMC, &error_abort);
|
||||
qdev_realize(DEVICE(&s->cpu), NULL, &error_abort);
|
||||
|
||||
/*
|
||||
|
@ -159,9 +159,6 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
|
||||
for (i = 0; i < smp_cpus; i++) {
|
||||
o = OBJECT(&s->cpu[i]);
|
||||
|
||||
object_property_set_int(o, "psci-conduit", QEMU_PSCI_CONDUIT_SMC,
|
||||
&error_abort);
|
||||
|
||||
/* On uniprocessor, the CBAR is set to 0 */
|
||||
if (smp_cpus > 1) {
|
||||
object_property_set_int(o, "reset-cbar", FSL_IMX7_A7MPCORE_ADDR,
|
||||
@ -169,7 +166,10 @@ static void fsl_imx7_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
if (i) {
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
/*
|
||||
* Secondary CPUs start in powered-down state (and can be
|
||||
* powered up via the SRC system reset controller)
|
||||
*/
|
||||
object_property_set_bool(o, "start-powered-off", true,
|
||||
&error_abort);
|
||||
}
|
||||
|
@ -48,66 +48,6 @@
|
||||
|
||||
/* Board init. */
|
||||
|
||||
static void hb_write_board_setup(ARMCPU *cpu,
|
||||
const struct arm_boot_info *info)
|
||||
{
|
||||
arm_write_secure_board_setup_dummy_smc(cpu, info, MVBAR_ADDR);
|
||||
}
|
||||
|
||||
static void hb_write_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
{
|
||||
int n;
|
||||
uint32_t smpboot[] = {
|
||||
0xee100fb0, /* mrc p15, 0, r0, c0, c0, 5 - read current core id */
|
||||
0xe210000f, /* ands r0, r0, #0x0f */
|
||||
0xe3a03040, /* mov r3, #0x40 - jump address is 0x40 + 0x10 * core id */
|
||||
0xe0830200, /* add r0, r3, r0, lsl #4 */
|
||||
0xe59f2024, /* ldr r2, privbase */
|
||||
0xe3a01001, /* mov r1, #1 */
|
||||
0xe5821100, /* str r1, [r2, #256] - set GICC_CTLR.Enable */
|
||||
0xe3a010ff, /* mov r1, #0xff */
|
||||
0xe5821104, /* str r1, [r2, #260] - set GICC_PMR.Priority to 0xff */
|
||||
0xf57ff04f, /* dsb */
|
||||
0xe320f003, /* wfi */
|
||||
0xe5901000, /* ldr r1, [r0] */
|
||||
0xe1110001, /* tst r1, r1 */
|
||||
0x0afffffb, /* beq <wfi> */
|
||||
0xe12fff11, /* bx r1 */
|
||||
MPCORE_PERIPHBASE /* privbase: MPCore peripheral base address. */
|
||||
};
|
||||
for (n = 0; n < ARRAY_SIZE(smpboot); n++) {
|
||||
smpboot[n] = tswap32(smpboot[n]);
|
||||
}
|
||||
rom_add_blob_fixed_as("smpboot", smpboot, sizeof(smpboot), SMP_BOOT_ADDR,
|
||||
arm_boot_address_space(cpu, info));
|
||||
}
|
||||
|
||||
static void hb_reset_secondary(ARMCPU *cpu, const struct arm_boot_info *info)
|
||||
{
|
||||
CPUARMState *env = &cpu->env;
|
||||
|
||||
switch (info->nb_cpus) {
|
||||
case 4:
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x30, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
/* fallthrough */
|
||||
case 3:
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x20, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
/* fallthrough */
|
||||
case 2:
|
||||
address_space_stl_notdirty(&address_space_memory,
|
||||
SMP_BOOT_REG + 0x10, 0,
|
||||
MEMTXATTRS_UNSPECIFIED, NULL);
|
||||
env->regs[15] = SMP_BOOT_ADDR;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
#define NUM_REGS 0x200
|
||||
static void hb_regs_write(void *opaque, hwaddr offset,
|
||||
uint64_t value, unsigned size)
|
||||
@ -271,12 +211,6 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
|
||||
object_property_set_int(cpuobj, "psci-conduit", QEMU_PSCI_CONDUIT_SMC,
|
||||
&error_abort);
|
||||
|
||||
if (n) {
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
object_property_set_bool(cpuobj, "start-powered-off", true,
|
||||
&error_abort);
|
||||
}
|
||||
|
||||
if (object_property_find(cpuobj, "reset-cbar")) {
|
||||
object_property_set_int(cpuobj, "reset-cbar", MPCORE_PERIPHBASE,
|
||||
&error_abort);
|
||||
@ -390,13 +324,9 @@ static void calxeda_init(MachineState *machine, enum cxmachines machine_id)
|
||||
* clear that the value is meaningless.
|
||||
*/
|
||||
highbank_binfo.board_id = -1;
|
||||
highbank_binfo.nb_cpus = smp_cpus;
|
||||
highbank_binfo.loader_start = 0;
|
||||
highbank_binfo.write_secondary_boot = hb_write_secondary;
|
||||
highbank_binfo.secondary_cpu_reset_hook = hb_reset_secondary;
|
||||
highbank_binfo.board_setup_addr = BOARD_SETUP_ADDR;
|
||||
highbank_binfo.write_board_setup = hb_write_board_setup;
|
||||
highbank_binfo.secure_board_setup = true;
|
||||
highbank_binfo.psci_conduit = QEMU_PSCI_CONDUIT_SMC;
|
||||
|
||||
arm_load_kernel(ARM_CPU(first_cpu), machine, &highbank_binfo);
|
||||
}
|
||||
|
@ -114,8 +114,7 @@ static void imx25_pdk_init(MachineState *machine)
|
||||
|
||||
imx25_pdk_binfo.ram_size = machine->ram_size;
|
||||
imx25_pdk_binfo.loader_start = FSL_IMX25_SDRAM0_ADDR;
|
||||
imx25_pdk_binfo.board_id = 1771,
|
||||
imx25_pdk_binfo.nb_cpus = 1;
|
||||
imx25_pdk_binfo.board_id = 1771;
|
||||
|
||||
for (i = 0; i < FSL_IMX25_NUM_ESDHCS; i++) {
|
||||
BusState *bus;
|
||||
|
@ -124,7 +124,6 @@ static void kzm_init(MachineState *machine)
|
||||
}
|
||||
|
||||
kzm_binfo.ram_size = machine->ram_size;
|
||||
kzm_binfo.nb_cpus = 1;
|
||||
|
||||
if (!qtest_enabled()) {
|
||||
arm_load_kernel(&s->soc.cpu, machine, &kzm_binfo);
|
||||
|
@ -34,7 +34,7 @@ static void mcimx6ul_evk_init(MachineState *machine)
|
||||
.loader_start = FSL_IMX6UL_MMDC_ADDR,
|
||||
.board_id = -1,
|
||||
.ram_size = machine->ram_size,
|
||||
.nb_cpus = machine->smp.cpus,
|
||||
.psci_conduit = QEMU_PSCI_CONDUIT_SMC,
|
||||
};
|
||||
|
||||
s = FSL_IMX6UL(object_new(TYPE_FSL_IMX6UL));
|
||||
|
@ -36,7 +36,7 @@ static void mcimx7d_sabre_init(MachineState *machine)
|
||||
.loader_start = FSL_IMX7_MMDC_ADDR,
|
||||
.board_id = -1,
|
||||
.ram_size = machine->ram_size,
|
||||
.nb_cpus = machine->smp.cpus,
|
||||
.psci_conduit = QEMU_PSCI_CONDUIT_SMC,
|
||||
};
|
||||
|
||||
s = FSL_IMX7(object_new(TYPE_FSL_IMX7));
|
||||
|
@ -355,10 +355,7 @@ static struct arm_boot_info npcm7xx_binfo = {
|
||||
|
||||
void npcm7xx_load_kernel(MachineState *machine, NPCM7xxState *soc)
|
||||
{
|
||||
NPCM7xxClass *sc = NPCM7XX_GET_CLASS(soc);
|
||||
|
||||
npcm7xx_binfo.ram_size = machine->ram_size;
|
||||
npcm7xx_binfo.nb_cpus = sc->num_cpus;
|
||||
|
||||
arm_load_kernel(&soc->cpu[0], machine, &npcm7xx_binfo);
|
||||
}
|
||||
|
@ -34,6 +34,7 @@
|
||||
#define QUANTA_GSJ_POWER_ON_STRAPS 0x00001fff
|
||||
#define QUANTA_GBS_POWER_ON_STRAPS 0x000017ff
|
||||
#define KUDO_BMC_POWER_ON_STRAPS 0x00001fff
|
||||
#define MORI_BMC_POWER_ON_STRAPS 0x00001fff
|
||||
|
||||
static const char npcm7xx_default_bootrom[] = "npcm7xx_bootrom.bin";
|
||||
|
||||
@ -429,6 +430,21 @@ static void kudo_bmc_init(MachineState *machine)
|
||||
npcm7xx_load_kernel(machine, soc);
|
||||
}
|
||||
|
||||
static void mori_bmc_init(MachineState *machine)
|
||||
{
|
||||
NPCM7xxState *soc;
|
||||
|
||||
soc = npcm7xx_create_soc(machine, MORI_BMC_POWER_ON_STRAPS);
|
||||
npcm7xx_connect_dram(soc, machine->ram);
|
||||
qdev_realize(DEVICE(soc), NULL, &error_fatal);
|
||||
|
||||
npcm7xx_load_bootrom(machine, soc);
|
||||
npcm7xx_connect_flash(&soc->fiu[1], 0, "mx66u51235f",
|
||||
drive_get(IF_MTD, 3, 0));
|
||||
|
||||
npcm7xx_load_kernel(machine, soc);
|
||||
}
|
||||
|
||||
static void npcm7xx_set_soc_type(NPCM7xxMachineClass *nmc, const char *type)
|
||||
{
|
||||
NPCM7xxClass *sc = NPCM7XX_CLASS(object_class_by_name(type));
|
||||
@ -501,6 +517,18 @@ static void kudo_bmc_machine_class_init(ObjectClass *oc, void *data)
|
||||
mc->default_ram_size = 1 * GiB;
|
||||
};
|
||||
|
||||
static void mori_bmc_machine_class_init(ObjectClass *oc, void *data)
|
||||
{
|
||||
NPCM7xxMachineClass *nmc = NPCM7XX_MACHINE_CLASS(oc);
|
||||
MachineClass *mc = MACHINE_CLASS(oc);
|
||||
|
||||
npcm7xx_set_soc_type(nmc, TYPE_NPCM730);
|
||||
|
||||
mc->desc = "Mori BMC (Cortex-A9)";
|
||||
mc->init = mori_bmc_init;
|
||||
mc->default_ram_size = 1 * GiB;
|
||||
}
|
||||
|
||||
static const TypeInfo npcm7xx_machine_types[] = {
|
||||
{
|
||||
.name = TYPE_NPCM7XX_MACHINE,
|
||||
@ -525,6 +553,10 @@ static const TypeInfo npcm7xx_machine_types[] = {
|
||||
.name = MACHINE_TYPE_NAME("kudo-bmc"),
|
||||
.parent = TYPE_NPCM7XX_MACHINE,
|
||||
.class_init = kudo_bmc_machine_class_init,
|
||||
}, {
|
||||
.name = MACHINE_TYPE_NAME("mori-bmc"),
|
||||
.parent = TYPE_NPCM7XX_MACHINE,
|
||||
.class_init = mori_bmc_machine_class_init,
|
||||
},
|
||||
};
|
||||
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "chardev/char.h"
|
||||
#include "qemu/cutils.h"
|
||||
#include "qemu/bswap.h"
|
||||
#include "qemu/hw-version.h"
|
||||
#include "sysemu/reset.h"
|
||||
#include "sysemu/runstate.h"
|
||||
#include "sysemu/sysemu.h"
|
||||
|
@ -18,6 +18,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "qapi/error.h"
|
||||
|
@ -25,9 +25,7 @@
|
||||
#include "hw/qdev-properties.h"
|
||||
#include "hw/arm/allwinner-h3.h"
|
||||
|
||||
static struct arm_boot_info orangepi_binfo = {
|
||||
.nb_cpus = AW_H3_NUM_CPUS,
|
||||
};
|
||||
static struct arm_boot_info orangepi_binfo;
|
||||
|
||||
static void orangepi_init(MachineState *machine)
|
||||
{
|
||||
@ -105,6 +103,7 @@ static void orangepi_init(MachineState *machine)
|
||||
}
|
||||
orangepi_binfo.loader_start = h3->memmap[AW_H3_DEV_SDRAM];
|
||||
orangepi_binfo.ram_size = machine->ram_size;
|
||||
orangepi_binfo.psci_conduit = QEMU_PSCI_CONDUIT_SMC;
|
||||
arm_load_kernel(ARM_CPU(first_cpu), machine, &orangepi_binfo);
|
||||
}
|
||||
|
||||
|
@ -204,7 +204,6 @@ static void setup_boot(MachineState *machine, RaspiProcessorId processor_id,
|
||||
|
||||
s->binfo.board_id = MACH_TYPE_BCM2708;
|
||||
s->binfo.ram_size = ram_size;
|
||||
s->binfo.nb_cpus = machine->smp.cpus;
|
||||
|
||||
if (processor_id <= PROCESSOR_ID_BCM2836) {
|
||||
/*
|
||||
|
@ -363,7 +363,6 @@ static void realview_init(MachineState *machine,
|
||||
memory_region_add_subregion(sysmem, SMP_BOOT_ADDR, ram_hack);
|
||||
|
||||
realview_binfo.ram_size = ram_size;
|
||||
realview_binfo.nb_cpus = smp_cpus;
|
||||
realview_binfo.board_id = realview_board_id[board_type];
|
||||
realview_binfo.loader_start = (board_type == BOARD_PB_A8 ? 0x70000000 : 0);
|
||||
arm_load_kernel(ARM_CPU(first_cpu), machine, &realview_binfo);
|
||||
|
@ -93,7 +93,6 @@ static void sabrelite_init(MachineState *machine)
|
||||
}
|
||||
|
||||
sabrelite_binfo.ram_size = machine->ram_size;
|
||||
sabrelite_binfo.nb_cpus = machine->smp.cpus;
|
||||
sabrelite_binfo.secure_boot = true;
|
||||
sabrelite_binfo.write_secondary_boot = sabrelite_write_secondary;
|
||||
sabrelite_binfo.secondary_cpu_reset_hook = sabrelite_reset_secondary;
|
||||
|
@ -776,7 +776,6 @@ static void sbsa_ref_init(MachineState *machine)
|
||||
create_secure_ec(secure_sysmem);
|
||||
|
||||
sms->bootinfo.ram_size = machine->ram_size;
|
||||
sms->bootinfo.nb_cpus = smp_cpus;
|
||||
sms->bootinfo.board_id = -1;
|
||||
sms->bootinfo.loader_start = sbsa_ref_memmap[SBSA_MEM].base;
|
||||
sms->bootinfo.get_dtb = sbsa_ref_dtb;
|
||||
|
@ -278,6 +278,12 @@ static void smmuv3_init_regs(SMMUv3State *s)
|
||||
s->features = 0;
|
||||
s->sid_split = 0;
|
||||
s->aidr = 0x1;
|
||||
s->cr[0] = 0;
|
||||
s->cr0ack = 0;
|
||||
s->irq_ctrl = 0;
|
||||
s->gerror = 0;
|
||||
s->gerrorn = 0;
|
||||
s->statusr = 0;
|
||||
}
|
||||
|
||||
static int smmu_get_ste(SMMUv3State *s, dma_addr_t addr, STE *buf,
|
||||
|
@ -708,7 +708,6 @@ static void vexpress_common_init(MachineState *machine)
|
||||
}
|
||||
|
||||
daughterboard->bootinfo.ram_size = machine->ram_size;
|
||||
daughterboard->bootinfo.nb_cpus = machine->smp.cpus;
|
||||
daughterboard->bootinfo.board_id = VEXPRESS_BOARD_ID;
|
||||
daughterboard->bootinfo.loader_start = daughterboard->loader_start;
|
||||
daughterboard->bootinfo.smp_loader_start = map[VE_SRAM];
|
||||
|
@ -2088,17 +2088,6 @@ static void machvirt_init(MachineState *machine)
|
||||
object_property_set_bool(cpuobj, "has_el2", false, NULL);
|
||||
}
|
||||
|
||||
if (vms->psci_conduit != QEMU_PSCI_CONDUIT_DISABLED) {
|
||||
object_property_set_int(cpuobj, "psci-conduit", vms->psci_conduit,
|
||||
NULL);
|
||||
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
if (n > 0) {
|
||||
object_property_set_bool(cpuobj, "start-powered-off", true,
|
||||
NULL);
|
||||
}
|
||||
}
|
||||
|
||||
if (vmc->kvm_no_adjvtime &&
|
||||
object_property_find(cpuobj, "kvm-no-adjvtime")) {
|
||||
object_property_set_bool(cpuobj, "kvm-no-adjvtime", true, NULL);
|
||||
@ -2240,12 +2229,12 @@ static void machvirt_init(MachineState *machine)
|
||||
}
|
||||
|
||||
vms->bootinfo.ram_size = machine->ram_size;
|
||||
vms->bootinfo.nb_cpus = smp_cpus;
|
||||
vms->bootinfo.board_id = -1;
|
||||
vms->bootinfo.loader_start = vms->memmap[VIRT_MEM].base;
|
||||
vms->bootinfo.get_dtb = machvirt_dtb;
|
||||
vms->bootinfo.skip_dtb_autoload = true;
|
||||
vms->bootinfo.firmware_loaded = firmware_loaded;
|
||||
vms->bootinfo.psci_conduit = vms->psci_conduit;
|
||||
arm_load_kernel(ARM_CPU(first_cpu), machine, &vms->bootinfo);
|
||||
|
||||
vms->machine_done.notify = virt_machine_done;
|
||||
|
@ -343,7 +343,6 @@ static void zynq_init(MachineState *machine)
|
||||
sysbus_mmio_map(busdev, 0, 0xF8007000);
|
||||
|
||||
zynq_binfo.ram_size = machine->ram_size;
|
||||
zynq_binfo.nb_cpus = 1;
|
||||
zynq_binfo.board_id = 0xd32;
|
||||
zynq_binfo.loader_start = 0;
|
||||
zynq_binfo.board_setup_addr = BOARD_SETUP_ADDR;
|
||||
|
@ -628,6 +628,9 @@ static void versal_virt_init(MachineState *machine)
|
||||
* When loading an OS, we turn on QEMU's PSCI implementation with SMC
|
||||
* as the PSCI conduit. When there's no -kernel, we assume the user
|
||||
* provides EL3 firmware to handle PSCI.
|
||||
*
|
||||
* Even if the user provides a kernel filename, arm_load_kernel()
|
||||
* may suppress PSCI if it's going to boot that guest code at EL3.
|
||||
*/
|
||||
if (machine->kernel_filename) {
|
||||
psci_conduit = QEMU_PSCI_CONDUIT_SMC;
|
||||
@ -637,8 +640,6 @@ static void versal_virt_init(MachineState *machine)
|
||||
TYPE_XLNX_VERSAL);
|
||||
object_property_set_link(OBJECT(&s->soc), "ddr", OBJECT(machine->ram),
|
||||
&error_abort);
|
||||
object_property_set_int(OBJECT(&s->soc), "psci-conduit", psci_conduit,
|
||||
&error_abort);
|
||||
sysbus_realize(SYS_BUS_DEVICE(&s->soc), &error_fatal);
|
||||
|
||||
fdt_create(s);
|
||||
@ -679,20 +680,14 @@ static void versal_virt_init(MachineState *machine)
|
||||
s->binfo.loader_start = 0x0;
|
||||
s->binfo.get_dtb = versal_virt_get_dtb;
|
||||
s->binfo.modify_dtb = versal_virt_modify_dtb;
|
||||
if (machine->kernel_filename) {
|
||||
arm_load_kernel(&s->soc.fpd.apu.cpu[0], machine, &s->binfo);
|
||||
} else {
|
||||
AddressSpace *as = arm_boot_address_space(&s->soc.fpd.apu.cpu[0],
|
||||
&s->binfo);
|
||||
s->binfo.psci_conduit = psci_conduit;
|
||||
if (!machine->kernel_filename) {
|
||||
/* Some boot-loaders (e.g u-boot) don't like blobs at address 0 (NULL).
|
||||
* Offset things by 4K. */
|
||||
s->binfo.loader_start = 0x1000;
|
||||
s->binfo.dtb_limit = 0x1000000;
|
||||
if (arm_load_dtb(s->binfo.loader_start,
|
||||
&s->binfo, s->binfo.dtb_limit, as, machine) < 0) {
|
||||
exit(EXIT_FAILURE);
|
||||
}
|
||||
}
|
||||
arm_load_kernel(&s->soc.fpd.apu.cpu[0], machine, &s->binfo);
|
||||
|
||||
for (i = 0; i < XLNX_VERSAL_NUM_OSPI_FLASH; i++) {
|
||||
BusState *spi_bus;
|
||||
|
@ -40,10 +40,8 @@ static void versal_create_apu_cpus(Versal *s)
|
||||
object_initialize_child(OBJECT(s), "apu-cpu[*]", &s->fpd.apu.cpu[i],
|
||||
XLNX_VERSAL_ACPU_TYPE);
|
||||
obj = OBJECT(&s->fpd.apu.cpu[i]);
|
||||
object_property_set_int(obj, "psci-conduit", s->cfg.psci_conduit,
|
||||
&error_abort);
|
||||
if (i) {
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
/* Secondary CPUs start in powered-down state */
|
||||
object_property_set_bool(obj, "start-powered-off", true,
|
||||
&error_abort);
|
||||
}
|
||||
@ -667,7 +665,6 @@ static void versal_init(Object *obj)
|
||||
static Property versal_properties[] = {
|
||||
DEFINE_PROP_LINK("ddr", Versal, cfg.mr_ddr, TYPE_MEMORY_REGION,
|
||||
MemoryRegion *),
|
||||
DEFINE_PROP_UINT32("psci-conduit", Versal, cfg.psci_conduit, 0),
|
||||
DEFINE_PROP_END_OF_LIST()
|
||||
};
|
||||
|
||||
|
@ -236,6 +236,7 @@ static void xlnx_zcu102_init(MachineState *machine)
|
||||
s->binfo.ram_size = ram_size;
|
||||
s->binfo.loader_start = 0;
|
||||
s->binfo.modify_dtb = zcu102_modify_dtb;
|
||||
s->binfo.psci_conduit = QEMU_PSCI_CONDUIT_SMC;
|
||||
arm_load_kernel(s->soc.boot_cpu_ptr, machine, &s->binfo);
|
||||
}
|
||||
|
||||
|
@ -50,6 +50,7 @@
|
||||
#define LQSPI_ADDR 0xc0000000
|
||||
#define QSPI_IRQ 15
|
||||
#define QSPI_DMA_ADDR 0xff0f0800
|
||||
#define NUM_QSPI_IRQ_LINES 2
|
||||
|
||||
#define DP_ADDR 0xfd4a0000
|
||||
#define DP_IRQ 113
|
||||
@ -215,7 +216,9 @@ static void xlnx_zynqmp_create_rpu(MachineState *ms, XlnxZynqMPState *s,
|
||||
|
||||
name = object_get_canonical_path_component(OBJECT(&s->rpu_cpu[i]));
|
||||
if (strcmp(name, boot_cpu)) {
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
/*
|
||||
* Secondary CPUs start in powered-down state.
|
||||
*/
|
||||
object_property_set_bool(OBJECT(&s->rpu_cpu[i]),
|
||||
"start-powered-off", true, &error_abort);
|
||||
} else {
|
||||
@ -362,6 +365,8 @@ static void xlnx_zynqmp_init(Object *obj)
|
||||
}
|
||||
|
||||
object_initialize_child(obj, "qspi-dma", &s->qspi_dma, TYPE_XLNX_CSU_DMA);
|
||||
object_initialize_child(obj, "qspi-irq-orgate",
|
||||
&s->qspi_irq_orgate, TYPE_OR_IRQ);
|
||||
}
|
||||
|
||||
static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||
@ -435,12 +440,11 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||
for (i = 0; i < num_apus; i++) {
|
||||
const char *name;
|
||||
|
||||
object_property_set_int(OBJECT(&s->apu_cpu[i]), "psci-conduit",
|
||||
QEMU_PSCI_CONDUIT_SMC, &error_abort);
|
||||
|
||||
name = object_get_canonical_path_component(OBJECT(&s->apu_cpu[i]));
|
||||
if (strcmp(name, boot_cpu)) {
|
||||
/* Secondary CPUs start in PSCI powered-down state */
|
||||
/*
|
||||
* Secondary CPUs start in powered-down state.
|
||||
*/
|
||||
object_property_set_bool(OBJECT(&s->apu_cpu[i]),
|
||||
"start-powered-off", true, &error_abort);
|
||||
} else {
|
||||
@ -709,6 +713,11 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||
gic_spi[adma_ch_intr[i]]);
|
||||
}
|
||||
|
||||
object_property_set_int(OBJECT(&s->qspi_irq_orgate),
|
||||
"num-lines", NUM_QSPI_IRQ_LINES, &error_fatal);
|
||||
qdev_realize(DEVICE(&s->qspi_irq_orgate), NULL, &error_fatal);
|
||||
qdev_connect_gpio_out(DEVICE(&s->qspi_irq_orgate), 0, gic_spi[QSPI_IRQ]);
|
||||
|
||||
if (!object_property_set_link(OBJECT(&s->qspi_dma), "dma",
|
||||
OBJECT(system_memory), errp)) {
|
||||
return;
|
||||
@ -718,7 +727,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi_dma), 0, QSPI_DMA_ADDR);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi_dma), 0, gic_spi[QSPI_IRQ]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi_dma), 0,
|
||||
qdev_get_gpio_in(DEVICE(&s->qspi_irq_orgate), 0));
|
||||
|
||||
if (!object_property_set_link(OBJECT(&s->qspi), "stream-connected-dma",
|
||||
OBJECT(&s->qspi_dma), errp)) {
|
||||
@ -729,7 +739,8 @@ static void xlnx_zynqmp_realize(DeviceState *dev, Error **errp)
|
||||
}
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 0, QSPI_ADDR);
|
||||
sysbus_mmio_map(SYS_BUS_DEVICE(&s->qspi), 1, LQSPI_ADDR);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0, gic_spi[QSPI_IRQ]);
|
||||
sysbus_connect_irq(SYS_BUS_DEVICE(&s->qspi), 0,
|
||||
qdev_get_gpio_in(DEVICE(&s->qspi_irq_orgate), 1));
|
||||
|
||||
for (i = 0; i < XLNX_ZYNQMP_NUM_QSPI_BUS; i++) {
|
||||
g_autofree gchar *bus_name = g_strdup_printf("qspi%d", i);
|
||||
|
@ -216,6 +216,7 @@ int cmos_get_fd_drive_type(FloppyDriveType fd0)
|
||||
|
||||
static void fdc_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
{
|
||||
FDCtrlISABus *isa = ISA_FDC(isadev);
|
||||
Aml *dev;
|
||||
Aml *crs;
|
||||
int i;
|
||||
@ -227,11 +228,13 @@ static void fdc_isa_build_aml(ISADevice *isadev, Aml *scope)
|
||||
};
|
||||
|
||||
crs = aml_resource_template();
|
||||
aml_append(crs, aml_io(AML_DECODE16, 0x03F2, 0x03F2, 0x00, 0x04));
|
||||
aml_append(crs, aml_io(AML_DECODE16, 0x03F7, 0x03F7, 0x00, 0x01));
|
||||
aml_append(crs, aml_irq_no_flags(6));
|
||||
aml_append(crs,
|
||||
aml_dma(AML_COMPATIBILITY, AML_NOTBUSMASTER, AML_TRANSFER8, 2));
|
||||
aml_io(AML_DECODE16, isa->iobase + 2, isa->iobase + 2, 0x00, 0x04));
|
||||
aml_append(crs,
|
||||
aml_io(AML_DECODE16, isa->iobase + 7, isa->iobase + 7, 0x00, 0x01));
|
||||
aml_append(crs, aml_irq_no_flags(isa->irq));
|
||||
aml_append(crs,
|
||||
aml_dma(AML_COMPATIBILITY, AML_NOTBUSMASTER, AML_TRANSFER8, isa->dma));
|
||||
|
||||
dev = aml_device("FDC0");
|
||||
aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0700")));
|
||||
|
@ -32,6 +32,7 @@
|
||||
#include "hw/virtio/virtio-bus.h"
|
||||
#include "migration/qemu-file-types.h"
|
||||
#include "hw/virtio/virtio-access.h"
|
||||
#include "qemu/coroutine.h"
|
||||
|
||||
/* Config size before the discard support (hide associated config fields) */
|
||||
#define VIRTIO_BLK_CFG_SIZE offsetof(struct virtio_blk_config, \
|
||||
@ -1214,6 +1215,8 @@ static void virtio_blk_device_realize(DeviceState *dev, Error **errp)
|
||||
for (i = 0; i < conf->num_queues; i++) {
|
||||
virtio_add_queue(vdev, conf->queue_size, virtio_blk_handle_output);
|
||||
}
|
||||
qemu_coroutine_increase_pool_batch_size(conf->num_queues * conf->queue_size
|
||||
/ 2);
|
||||
virtio_blk_data_plane_create(vdev, conf, &s->dataplane, &err);
|
||||
if (err != NULL) {
|
||||
error_propagate(errp, err);
|
||||
@ -1250,6 +1253,8 @@ static void virtio_blk_device_unrealize(DeviceState *dev)
|
||||
for (i = 0; i < conf->num_queues; i++) {
|
||||
virtio_del_queue(vdev, i);
|
||||
}
|
||||
qemu_coroutine_decrease_pool_batch_size(conf->num_queues * conf->queue_size
|
||||
/ 2);
|
||||
qemu_del_vm_change_state_handler(s->change);
|
||||
blockdev_mark_auto_del(s->blk);
|
||||
virtio_cleanup(vdev);
|
||||
|
@ -56,7 +56,7 @@ static void generic_loader_reset(void *opaque)
|
||||
}
|
||||
|
||||
if (s->data_len) {
|
||||
assert(s->data_len < sizeof(s->data));
|
||||
assert(s->data_len <= sizeof(s->data));
|
||||
dma_memory_write(s->cpu->as, s->addr, &s->data, s->data_len,
|
||||
MEMTXATTRS_UNSPECIFIED);
|
||||
}
|
||||
@ -207,7 +207,7 @@ static void generic_loader_class_init(ObjectClass *klass, void *data)
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
}
|
||||
|
||||
static TypeInfo generic_loader_info = {
|
||||
static const TypeInfo generic_loader_info = {
|
||||
.name = TYPE_GENERIC_LOADER,
|
||||
.parent = TYPE_DEVICE,
|
||||
.instance_size = sizeof(GenericLoaderState),
|
||||
|
@ -129,7 +129,7 @@ static void guest_loader_class_init(ObjectClass *klass, void *data)
|
||||
set_bit(DEVICE_CATEGORY_MISC, dc->categories);
|
||||
}
|
||||
|
||||
static TypeInfo guest_loader_info = {
|
||||
static const TypeInfo guest_loader_info = {
|
||||
.name = TYPE_GUEST_LOADER,
|
||||
.parent = TYPE_DEVICE,
|
||||
.instance_size = sizeof(GuestLoaderState),
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include "sysemu/cpu-timers.h"
|
||||
#include "sysemu/qtest.h"
|
||||
#include "block/aio.h"
|
||||
#include "sysemu/cpus.h"
|
||||
#include "hw/clock.h"
|
||||
|
||||
#define DELTA_ADJUST 1
|
||||
|
@ -454,7 +454,7 @@ static void bcm2835_fb_class_init(ObjectClass *klass, void *data)
|
||||
dc->vmsd = &vmstate_bcm2835_fb;
|
||||
}
|
||||
|
||||
static TypeInfo bcm2835_fb_info = {
|
||||
static const TypeInfo bcm2835_fb_info = {
|
||||
.name = TYPE_BCM2835_FB,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(BCM2835FBState),
|
||||
|
@ -113,7 +113,7 @@ static void i2c_ddc_class_init(ObjectClass *oc, void *data)
|
||||
isc->send = i2c_ddc_tx;
|
||||
}
|
||||
|
||||
static TypeInfo i2c_ddc_info = {
|
||||
static const TypeInfo i2c_ddc_info = {
|
||||
.name = TYPE_I2CDDC,
|
||||
.parent = TYPE_I2C_SLAVE,
|
||||
.instance_size = sizeof(I2CDDCState),
|
||||
|
@ -782,14 +782,14 @@ static void macfb_nubus_class_init(ObjectClass *klass, void *data)
|
||||
device_class_set_props(dc, macfb_nubus_properties);
|
||||
}
|
||||
|
||||
static TypeInfo macfb_sysbus_info = {
|
||||
static const TypeInfo macfb_sysbus_info = {
|
||||
.name = TYPE_MACFB,
|
||||
.parent = TYPE_SYS_BUS_DEVICE,
|
||||
.instance_size = sizeof(MacfbSysBusState),
|
||||
.class_init = macfb_sysbus_class_init,
|
||||
};
|
||||
|
||||
static TypeInfo macfb_nubus_info = {
|
||||
static const TypeInfo macfb_nubus_info = {
|
||||
.name = TYPE_NUBUS_MACFB,
|
||||
.parent = TYPE_NUBUS_DEVICE,
|
||||
.instance_size = sizeof(MacfbNubusState),
|
||||
|
@ -19,6 +19,7 @@
|
||||
*/
|
||||
|
||||
#include "qemu/osdep.h"
|
||||
#include "qemu/log.h"
|
||||
#include "hw/hw.h"
|
||||
#include "hw/irq.h"
|
||||
#include "ui/console.h"
|
||||
|
@ -220,7 +220,7 @@ static void virtio_vga_base_class_init(ObjectClass *klass, void *data)
|
||||
virtio_vga_set_big_endian_fb);
|
||||
}
|
||||
|
||||
static TypeInfo virtio_vga_base_info = {
|
||||
static const TypeInfo virtio_vga_base_info = {
|
||||
.name = TYPE_VIRTIO_VGA_BASE,
|
||||
.parent = TYPE_VIRTIO_PCI,
|
||||
.instance_size = sizeof(VirtIOVGABase),
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user