mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge tag 'pull-jan-omnibus-020223-1' of https://gitlab.com/stsquad/qemu into staging
Testing, docs, semihosting and plugin updates - update playbooks for custom runners - add section timing support to gitlab - upgrade fedora images to 37 - purge perl from the build system and deps - disable unstable tests in CI - improve intro, emulation and semihosting docs - semihosting bug fix and O_BINARY default - add memory-sve test - fix some races in qht - improve plugin handling of memory helpers - optimise plugin hooks - fix some plugin deadlocks - reduce win64-cross build time by dropping some targets # -----BEGIN PGP SIGNATURE----- # # iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmPb3fgACgkQ+9DbCVqe # KkQbXAf9Eoc+PdNvafbqzH/blPjvd9ve8pJ+GcPDukNXwxP8OF/jFEJUQ1E7l9O7 # y0qV4akKCdIqVice4R5bK2CAq44Y3aut8SDf56C8E3Riha2zA2RbQWOv/zCvA3OP # LFF+OaXZyg4JTR48HUKzh9ei2bd1+ccBSUe+xlRi59XaV5K8+5bmcZj10QKUR0lD # 0HC5auEWWpayvd5D7Da15C7+oVY3LMCFxSdpHwbuIPPan/TRo5yqMI6ChYDKB8QD # gdwMCL8znj2ADCTBftyBDYDAtjKVyLQidf7KdQHiSF+nmXYopS6SbsPCOMtJqCMH # tXcKAIxs/MEntPrWTKTdtdnzotJVKw== # =AtfN # -----END PGP SIGNATURE----- # gpg: Signature made Thu 02 Feb 2023 15:59:52 GMT # gpg: using RSA key 6685AE99E75167BCAFC8DF35FBD0DB095A9E2A44 # gpg: Good signature from "Alex Bennée (Master Work Key) <alex.bennee@linaro.org>" [full] # Primary key fingerprint: 6685 AE99 E751 67BC AFC8 DF35 FBD0 DB09 5A9E 2A44 * tag 'pull-jan-omnibus-020223-1' of https://gitlab.com/stsquad/qemu: (36 commits) gitlab: cut even more from cross-win64-system build plugins: Iterate on cb_lists in qemu_plugin_user_exit cpu-exec: assert that plugin_mem_cbs is NULL after execution tcg: exclude non-memory effecting helpers from instrumentation translator: always pair plugin_gen_insn_{start, end} calls plugins: fix optimization in plugin_gen_disable_mem_helpers plugins: make qemu_plugin_user_exit's locking order consistent with fork_start's util/qht: use striped locks under TSAN thread: de-const qemu_spin_destroy util/qht: add missing atomic_set(hashes[i]) cpu: free cpu->tb_jmp_cache with RCU tests/tcg: add memory-sve test for aarch64 semihosting: add O_BINARY flag in host_open for NT compatibility semihosting: Write back semihosting data before completion callback docs: add an introduction to the system docs semihosting: add semihosting section to the docs docs: add a new section to outline emulation support docs: add hotlinks to about preface text MAINTAINERS: Fix the entry for tests/tcg/nios2 gitlab: wrap up test results for custom runners ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
@@ -6,6 +6,11 @@
|
||||
# most restrictive to least restrictive
|
||||
#
|
||||
.base_job_template:
|
||||
variables:
|
||||
# Each script line from will be in a collapsible section in the job output
|
||||
# and show the duration of each line.
|
||||
FF_SCRIPT_SECTIONS: 1
|
||||
|
||||
rules:
|
||||
#############################################################
|
||||
# Stage 1: exclude scenarios where we definitely don't
|
||||
|
||||
@@ -510,6 +510,7 @@ build-oss-fuzz:
|
||||
IMAGE: fedora
|
||||
script:
|
||||
- mkdir build-oss-fuzz
|
||||
- export LSAN_OPTIONS=suppressions=scripts/oss-fuzz/lsan_suppressions.txt
|
||||
- CC="clang" CXX="clang++" CFLAGS="-fsanitize=address"
|
||||
./scripts/oss-fuzz/build.sh
|
||||
- export ASAN_OPTIONS="fast_unwind_on_malloc=0"
|
||||
|
||||
@@ -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 bison bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage cmocka ctags curl cyrus-sasl dbus diffutils dtc flex fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 json-c libepoxy libffi libgcrypt libjpeg-turbo libnfs libslirp libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv perl5 pixman pkgconf png py39-numpy py39-pillow py39-pip py39-sphinx py39-sphinx_rtd_theme py39-yaml python3 rpm2cpio sdl2 sdl2_image snappy sndio spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PKGS='alsa-lib bash bison bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage cmocka ctags curl cyrus-sasl dbus diffutils dtc flex fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 json-c libepoxy libffi libgcrypt libjpeg-turbo libnfs libslirp libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv pixman pkgconf png py39-numpy py39-pillow py39-pip py39-sphinx py39-sphinx_rtd_theme py39-yaml python3 rpm2cpio sdl2 sdl2_image snappy sndio spice-protocol tesseract 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 bison bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage cmocka ctags curl cyrus-sasl dbus diffutils dtc flex fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 json-c libepoxy libffi libgcrypt libjpeg-turbo libnfs libslirp libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv perl5 pixman pkgconf png py39-numpy py39-pillow py39-pip py39-sphinx py39-sphinx_rtd_theme py39-yaml python3 rpm2cpio sdl2 sdl2_image snappy sndio spice-protocol tesseract texinfo usbredir virglrenderer vte3 zstd'
|
||||
PKGS='alsa-lib bash bison bzip2 ca_root_nss capstone4 ccache cdrkit-genisoimage cmocka ctags curl cyrus-sasl dbus diffutils dtc flex fusefs-libs3 gettext git glib gmake gnutls gsed gtk3 json-c libepoxy libffi libgcrypt libjpeg-turbo libnfs libslirp libspice-server libssh libtasn1 llvm lzo2 meson ncurses nettle ninja opencv pixman pkgconf png py39-numpy py39-pillow py39-pip py39-sphinx py39-sphinx_rtd_theme py39-yaml python3 rpm2cpio sdl2 sdl2_image snappy sndio spice-protocol tesseract usbredir virglrenderer vte3 zstd'
|
||||
PYPI_PKGS=''
|
||||
PYTHON='/usr/local/bin/python3'
|
||||
|
||||
@@ -11,6 +11,6 @@ MAKE='/opt/homebrew/bin/gmake'
|
||||
NINJA='/opt/homebrew/bin/ninja'
|
||||
PACKAGING_COMMAND='brew'
|
||||
PIP3='/opt/homebrew/bin/pip3'
|
||||
PKGS='bash bc bison bzip2 capstone ccache cmocka ctags curl dbus diffutils dtc flex gcovr gettext git glib gnu-sed gnutls gtk+3 jemalloc jpeg-turbo json-c 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'
|
||||
PKGS='bash bc bison bzip2 capstone ccache cmocka ctags curl dbus diffutils dtc flex gcovr gettext git glib gnu-sed gnutls gtk+3 jemalloc jpeg-turbo json-c libepoxy libffi libgcrypt libiscsi libnfs libpng libslirp libssh libtasn1 libusb llvm lzo make meson ncurses nettle ninja pixman pkg-config python3 rpm2cpio sdl2 sdl2_image snappy sparse spice-protocol tesseract usbredir vde vte3 zlib zstd'
|
||||
PYPI_PKGS='PyYAML numpy pillow sphinx sphinx-rtd-theme'
|
||||
PYTHON='/opt/homebrew/bin/python3'
|
||||
|
||||
@@ -187,7 +187,9 @@ cross-win64-system:
|
||||
job: win64-fedora-cross-container
|
||||
variables:
|
||||
IMAGE: fedora-win64-cross
|
||||
CROSS_SKIP_TARGETS: or1k-softmmu rx-softmmu sh4eb-softmmu sparc64-softmmu
|
||||
CROSS_SKIP_TARGETS: alpha-softmmu avr-softmmu hppa-softmmu
|
||||
m68k-softmmu microblazeel-softmmu nios2-softmmu
|
||||
or1k-softmmu rx-softmmu sh4eb-softmmu sparc64-softmmu
|
||||
tricore-softmmu xtensaeb-softmmu
|
||||
artifacts:
|
||||
paths:
|
||||
|
||||
@@ -13,6 +13,17 @@
|
||||
variables:
|
||||
GIT_STRATEGY: clone
|
||||
|
||||
# All custom runners can extend this template to upload the testlog
|
||||
# data as an artifact and also feed the junit report
|
||||
.custom_artifacts_template:
|
||||
artifacts:
|
||||
name: "$CI_JOB_NAME-$CI_COMMIT_REF_SLUG"
|
||||
expire_in: 7 days
|
||||
paths:
|
||||
- build/meson-logs/testlog.txt
|
||||
reports:
|
||||
junit: build/meson-logs/testlog.junit.xml
|
||||
|
||||
include:
|
||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-20.04-s390x.yml'
|
||||
- local: '/.gitlab-ci.d/custom-runners/ubuntu-22.04-aarch64.yml'
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# "Install basic packages to build QEMU on Ubuntu 20.04/20.04"
|
||||
|
||||
ubuntu-20.04-s390x-all-linux-static:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -19,12 +20,11 @@ ubuntu-20.04-s390x-all-linux-static:
|
||||
- ../configure --enable-debug --static --disable-system --disable-glusterfs --disable-libssh
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc`
|
||||
- make --output-sync check-tcg
|
||||
- make --output-sync -j`nproc` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
- make --output-sync -j`nproc` check-tcg
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-20.04-s390x-all:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -41,9 +41,9 @@ ubuntu-20.04-s390x-all:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc`
|
||||
- make --output-sync -j`nproc` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-20.04-s390x-alldbg:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -64,9 +64,9 @@ ubuntu-20.04-s390x-alldbg:
|
||||
- make clean
|
||||
- make --output-sync -j`nproc`
|
||||
- make --output-sync -j`nproc` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-20.04-s390x-clang:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -86,7 +86,6 @@ ubuntu-20.04-s390x-clang:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc`
|
||||
- make --output-sync -j`nproc` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-20.04-s390x-tci:
|
||||
needs: []
|
||||
@@ -109,6 +108,7 @@ ubuntu-20.04-s390x-tci:
|
||||
- make --output-sync -j`nproc`
|
||||
|
||||
ubuntu-20.04-s390x-notcg:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -128,4 +128,3 @@ ubuntu-20.04-s390x-notcg:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc`
|
||||
- make --output-sync -j`nproc` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# "Install basic packages to build QEMU on Ubuntu 20.04"
|
||||
|
||||
ubuntu-22.04-aarch32-all:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -22,4 +23,3 @@ ubuntu-22.04-aarch32-all:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
# "Install basic packages to build QEMU on Ubuntu 20.04"
|
||||
|
||||
ubuntu-22.04-aarch64-all-linux-static:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -19,12 +20,11 @@ ubuntu-22.04-aarch64-all-linux-static:
|
||||
- ../configure --enable-debug --static --disable-system --disable-pie
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make check-tcg
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
- make --output-sync -j`nproc --ignore=40` check-tcg
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-22.04-aarch64-all:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -44,9 +44,9 @@ ubuntu-22.04-aarch64-all:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-22.04-aarch64-alldbg:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -63,9 +63,9 @@ ubuntu-22.04-aarch64-alldbg:
|
||||
- make clean
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-22.04-aarch64-clang:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -81,11 +81,10 @@ ubuntu-22.04-aarch64-clang:
|
||||
script:
|
||||
- mkdir build
|
||||
- cd build
|
||||
- ../configure --disable-libssh --cc=clang-10 --cxx=clang++-10 --enable-sanitizers
|
||||
- ../configure --disable-libssh --cc=clang --cxx=clang++ --enable-sanitizers
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
ubuntu-22.04-aarch64-tci:
|
||||
needs: []
|
||||
@@ -108,6 +107,7 @@ ubuntu-22.04-aarch64-tci:
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
|
||||
ubuntu-22.04-aarch64-notcg:
|
||||
extends: .custom_artifacts_template
|
||||
needs: []
|
||||
stage: build
|
||||
tags:
|
||||
@@ -127,4 +127,3 @@ ubuntu-22.04-aarch64-notcg:
|
||||
|| { cat config.log meson-logs/meson-log.txt; exit 1; }
|
||||
- make --output-sync -j`nproc --ignore=40`
|
||||
- make --output-sync -j`nproc --ignore=40` check
|
||||
|| { cat meson-logs/testlog.txt; exit 1; } ;
|
||||
|
||||
@@ -71,7 +71,7 @@ msys2-64bit:
|
||||
# for the msys2 64-bit job, due to the build could not complete within
|
||||
# the project timeout.
|
||||
- ..\msys64\usr\bin\bash -lc '../configure --target-list=x86_64-softmmu
|
||||
--without-default-devices --disable-opengl'
|
||||
--without-default-devices'
|
||||
- ..\msys64\usr\bin\bash -lc 'make'
|
||||
# qTests don't run successfully with "--without-default-devices",
|
||||
# so let's exclude the qtests from CI for now.
|
||||
@@ -113,8 +113,7 @@ msys2-32bit:
|
||||
- $env:MSYS = 'winsymlinks:native' # Enable native Windows symlink
|
||||
- mkdir output
|
||||
- cd output
|
||||
- ..\msys64\usr\bin\bash -lc '../configure --target-list=ppc64-softmmu
|
||||
--disable-opengl'
|
||||
- ..\msys64\usr\bin\bash -lc '../configure --target-list=ppc64-softmmu'
|
||||
- ..\msys64\usr\bin\bash -lc 'make'
|
||||
- ..\msys64\usr\bin\bash -lc 'make check MTESTARGS=\"--no-suite qtest\" ||
|
||||
{ cat meson-logs/testlog.txt; exit 1; }'
|
||||
|
||||
+1
-1
@@ -240,7 +240,6 @@ F: target/microblaze/
|
||||
F: hw/microblaze/
|
||||
F: disas/microblaze.c
|
||||
F: tests/docker/dockerfiles/debian-microblaze-cross.d/build-toolchain.sh
|
||||
F: tests/tcg/nios2/Makefile.target
|
||||
|
||||
MIPS TCG CPUs
|
||||
M: Philippe Mathieu-Daudé <philmd@linaro.org>
|
||||
@@ -262,6 +261,7 @@ F: hw/nios2/
|
||||
F: disas/nios2.c
|
||||
F: configs/devices/nios2-softmmu/default.mak
|
||||
F: tests/docker/dockerfiles/debian-nios2-cross.d/build-toolchain.sh
|
||||
F: tests/tcg/nios2/
|
||||
|
||||
OpenRISC TCG CPUs
|
||||
M: Stafford Horne <shorne@gmail.com>
|
||||
|
||||
@@ -504,6 +504,7 @@ static void cpu_exec_exit(CPUState *cpu)
|
||||
if (cc->tcg_ops->cpu_exec_exit) {
|
||||
cc->tcg_ops->cpu_exec_exit(cpu);
|
||||
}
|
||||
QEMU_PLUGIN_ASSERT(cpu->plugin_mem_cbs == NULL);
|
||||
}
|
||||
|
||||
void cpu_exec_step_atomic(CPUState *cpu)
|
||||
@@ -980,6 +981,7 @@ cpu_exec_loop(CPUState *cpu, SyncClocks *sc)
|
||||
|
||||
cpu_loop_exec_tb(cpu, tb, pc, &last_tb, &tb_exit);
|
||||
|
||||
QEMU_PLUGIN_ASSERT(cpu->plugin_mem_cbs == NULL);
|
||||
/* Try to align the host and virtual clocks
|
||||
if the guest is in advance */
|
||||
align_clocks(sc, cpu);
|
||||
@@ -1064,13 +1066,12 @@ void tcg_exec_realizefn(CPUState *cpu, Error **errp)
|
||||
/* undo the initializations in reverse order */
|
||||
void tcg_exec_unrealizefn(CPUState *cpu)
|
||||
{
|
||||
qemu_plugin_vcpu_exit_hook(cpu);
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
tcg_iommu_free_notifier_list(cpu);
|
||||
#endif /* !CONFIG_USER_ONLY */
|
||||
|
||||
tlb_destroy(cpu);
|
||||
g_free(cpu->tb_jmp_cache);
|
||||
g_free_rcu(cpu->tb_jmp_cache, rcu);
|
||||
}
|
||||
|
||||
#ifndef CONFIG_USER_ONLY
|
||||
|
||||
+18
-8
@@ -579,7 +579,8 @@ static void inject_mem_helper(TCGOp *begin_op, GArray *arr)
|
||||
* is possible that the code we generate after the instruction is
|
||||
* dead, we also add checks before generating tb_exit etc.
|
||||
*/
|
||||
static void inject_mem_enable_helper(struct qemu_plugin_insn *plugin_insn,
|
||||
static void inject_mem_enable_helper(struct qemu_plugin_tb *ptb,
|
||||
struct qemu_plugin_insn *plugin_insn,
|
||||
TCGOp *begin_op)
|
||||
{
|
||||
GArray *cbs[2];
|
||||
@@ -599,6 +600,7 @@ static void inject_mem_enable_helper(struct qemu_plugin_insn *plugin_insn,
|
||||
rm_ops(begin_op);
|
||||
return;
|
||||
}
|
||||
ptb->mem_helper = true;
|
||||
|
||||
arr = g_array_sized_new(false, false,
|
||||
sizeof(struct qemu_plugin_dyn_cb), n_cbs);
|
||||
@@ -626,15 +628,22 @@ void plugin_gen_disable_mem_helpers(void)
|
||||
{
|
||||
TCGv_ptr ptr;
|
||||
|
||||
if (likely(tcg_ctx->plugin_insn == NULL ||
|
||||
!tcg_ctx->plugin_insn->mem_helper)) {
|
||||
/*
|
||||
* We could emit the clearing unconditionally and be done. However, this can
|
||||
* be wasteful if for instance plugins don't track memory accesses, or if
|
||||
* most TBs don't use helpers. Instead, emit the clearing iff the TB calls
|
||||
* helpers that might access guest memory.
|
||||
*
|
||||
* Note: we do not reset plugin_tb->mem_helper here; a TB might have several
|
||||
* exit points, and we want to emit the clearing from all of them.
|
||||
*/
|
||||
if (!tcg_ctx->plugin_tb->mem_helper) {
|
||||
return;
|
||||
}
|
||||
ptr = tcg_const_ptr(NULL);
|
||||
tcg_gen_st_ptr(ptr, cpu_env, offsetof(CPUState, plugin_mem_cbs) -
|
||||
offsetof(ArchCPU, env));
|
||||
tcg_temp_free_ptr(ptr);
|
||||
tcg_ctx->plugin_insn->mem_helper = false;
|
||||
}
|
||||
|
||||
static void plugin_gen_tb_udata(const struct qemu_plugin_tb *ptb,
|
||||
@@ -682,14 +691,14 @@ static void plugin_gen_mem_inline(const struct qemu_plugin_tb *ptb,
|
||||
inject_inline_cb(cbs, begin_op, op_rw);
|
||||
}
|
||||
|
||||
static void plugin_gen_enable_mem_helper(const struct qemu_plugin_tb *ptb,
|
||||
static void plugin_gen_enable_mem_helper(struct qemu_plugin_tb *ptb,
|
||||
TCGOp *begin_op, int insn_idx)
|
||||
{
|
||||
struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
|
||||
inject_mem_enable_helper(insn, begin_op);
|
||||
inject_mem_enable_helper(ptb, insn, begin_op);
|
||||
}
|
||||
|
||||
static void plugin_gen_disable_mem_helper(const struct qemu_plugin_tb *ptb,
|
||||
static void plugin_gen_disable_mem_helper(struct qemu_plugin_tb *ptb,
|
||||
TCGOp *begin_op, int insn_idx)
|
||||
{
|
||||
struct qemu_plugin_insn *insn = g_ptr_array_index(ptb->insns, insn_idx);
|
||||
@@ -750,7 +759,7 @@ static void pr_ops(void)
|
||||
#endif
|
||||
}
|
||||
|
||||
static void plugin_gen_inject(const struct qemu_plugin_tb *plugin_tb)
|
||||
static void plugin_gen_inject(struct qemu_plugin_tb *plugin_tb)
|
||||
{
|
||||
TCGOp *op;
|
||||
int insn_idx = -1;
|
||||
@@ -870,6 +879,7 @@ bool plugin_gen_tb_start(CPUState *cpu, const DisasContextBase *db,
|
||||
ptb->haddr1 = db->host_addr[0];
|
||||
ptb->haddr2 = NULL;
|
||||
ptb->mem_only = mem_only;
|
||||
ptb->mem_helper = false;
|
||||
|
||||
plugin_gen_empty_callback(PLUGIN_GEN_FROM_TB);
|
||||
}
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
#ifdef CONFIG_PLUGIN
|
||||
DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb, TCG_CALL_NO_RWG, void, i32, ptr)
|
||||
DEF_HELPER_FLAGS_4(plugin_vcpu_mem_cb, TCG_CALL_NO_RWG, void, i32, i32, i64, ptr)
|
||||
DEF_HELPER_FLAGS_2(plugin_vcpu_udata_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, ptr)
|
||||
DEF_HELPER_FLAGS_4(plugin_vcpu_mem_cb, TCG_CALL_NO_RWG | TCG_CALL_PLUGIN, void, i32, i32, i64, ptr)
|
||||
#endif
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
* a load_acquire/store_release to 'tb'.
|
||||
*/
|
||||
struct CPUJumpCache {
|
||||
struct rcu_head rcu;
|
||||
struct {
|
||||
TranslationBlock *tb;
|
||||
#if TARGET_TB_PCREL
|
||||
|
||||
+10
-5
@@ -100,19 +100,24 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int max_insns,
|
||||
ops->translate_insn(db, cpu);
|
||||
}
|
||||
|
||||
/* Stop translation if translate_insn so indicated. */
|
||||
if (db->is_jmp != DISAS_NEXT) {
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* We can't instrument after instructions that change control
|
||||
* flow although this only really affects post-load operations.
|
||||
*
|
||||
* Calling plugin_gen_insn_end() before we possibly stop translation
|
||||
* is important. Even if this ends up as dead code, plugin generation
|
||||
* needs to see a matching plugin_gen_insn_{start,end}() pair in order
|
||||
* to accurately track instrumented helpers that might access memory.
|
||||
*/
|
||||
if (plugin_enabled) {
|
||||
plugin_gen_insn_end();
|
||||
}
|
||||
|
||||
/* Stop translation if translate_insn so indicated. */
|
||||
if (db->is_jmp != DISAS_NEXT) {
|
||||
break;
|
||||
}
|
||||
|
||||
/* Stop translation if the output buffer is full,
|
||||
or we have executed all of the allowed instructions. */
|
||||
if (tcg_op_buf_full() || db->num_insns >= db->max_insns) {
|
||||
|
||||
@@ -176,11 +176,20 @@ void cpu_exec_unrealizefn(CPUState *cpu)
|
||||
vmstate_unregister(NULL, &vmstate_cpu_common, cpu);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Call the plugin hook before clearing cpu->cpu_index in cpu_list_remove */
|
||||
if (tcg_enabled()) {
|
||||
tcg_exec_unrealizefn(cpu);
|
||||
qemu_plugin_vcpu_exit_hook(cpu);
|
||||
}
|
||||
|
||||
cpu_list_remove(cpu);
|
||||
/*
|
||||
* Now that the vCPU has been removed from the RCU list, we can call
|
||||
* tcg_exec_unrealizefn, which may free fields using call_rcu.
|
||||
*/
|
||||
if (tcg_enabled()) {
|
||||
tcg_exec_unrealizefn(cpu);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@@ -0,0 +1,190 @@
|
||||
Emulation
|
||||
=========
|
||||
|
||||
QEMU's Tiny Code Generator (TCG) provides the ability to emulate a
|
||||
number of CPU architectures on any supported host platform. Both
|
||||
:ref:`System Emulation` and :ref:`User Mode Emulation` are supported
|
||||
depending on the guest architecture.
|
||||
|
||||
.. list-table:: Supported Guest Architectures for Emulation
|
||||
:widths: 30 10 10 50
|
||||
:header-rows: 1
|
||||
|
||||
* - Architecture (qemu name)
|
||||
- System
|
||||
- User
|
||||
- Notes
|
||||
* - Alpha
|
||||
- Yes
|
||||
- Yes
|
||||
- Legacy 64 bit RISC ISA developed by DEC
|
||||
* - Arm (arm, aarch64)
|
||||
- :ref:`Yes<ARM-System-emulator>`
|
||||
- Yes
|
||||
- Wide range of features, see :ref:`Arm Emulation` for details
|
||||
* - AVR
|
||||
- :ref:`Yes<AVR-System-emulator>`
|
||||
- No
|
||||
- 8 bit micro controller, often used in maker projects
|
||||
* - Cris
|
||||
- Yes
|
||||
- Yes
|
||||
- Embedded RISC chip developed by AXIS
|
||||
* - Hexagon
|
||||
- No
|
||||
- Yes
|
||||
- Family of DSPs by Qualcomm
|
||||
* - PA-RISC (hppa)
|
||||
- Yes
|
||||
- Yes
|
||||
- A legacy RISC system used in HP's old minicomputers
|
||||
* - x86 (i386, x86_64)
|
||||
- :ref:`Yes<QEMU-PC-System-emulator>`
|
||||
- Yes
|
||||
- The ubiquitous desktop PC CPU architecture, 32 and 64 bit.
|
||||
* - Loongarch
|
||||
- Yes
|
||||
- Yes
|
||||
- A MIPS-like 64bit RISC architecture developed in China
|
||||
* - m68k
|
||||
- :ref:`Yes<ColdFire-System-emulator>`
|
||||
- Yes
|
||||
- Motorola 68000 variants and ColdFire
|
||||
* - Microblaze
|
||||
- Yes
|
||||
- Yes
|
||||
- RISC based soft-core by Xilinx
|
||||
* - MIPS (mips*)
|
||||
- :ref:`Yes<MIPS-System-emulator>`
|
||||
- Yes
|
||||
- Venerable RISC architecture originally out of Stanford University
|
||||
* - Nios2
|
||||
- Yes
|
||||
- Yes
|
||||
- 32 bit embedded soft-core by Altera
|
||||
* - OpenRISC
|
||||
- :ref:`Yes<OpenRISC-System-emulator>`
|
||||
- Yes
|
||||
- Open source RISC architecture developed by the OpenRISC community
|
||||
* - Power (ppc, ppc64)
|
||||
- :ref:`Yes<PowerPC-System-emulator>`
|
||||
- Yes
|
||||
- A general purpose RISC architecture now managed by IBM
|
||||
* - RISC-V
|
||||
- :ref:`Yes<RISC-V-System-emulator>`
|
||||
- Yes
|
||||
- An open standard RISC ISA maintained by RISC-V International
|
||||
* - RX
|
||||
- :ref:`Yes<RX-System-emulator>`
|
||||
- No
|
||||
- A 32 bit micro controller developed by Renesas
|
||||
* - s390x
|
||||
- :ref:`Yes<s390x-System-emulator>`
|
||||
- Yes
|
||||
- A 64 bit CPU found in IBM's System Z mainframes
|
||||
* - sh4
|
||||
- Yes
|
||||
- Yes
|
||||
- A 32 bit RISC embedded CPU developed by Hitachi
|
||||
* - SPARC (sparc, sparc64)
|
||||
- :ref:`Yes<Sparc32-System-emulator>`
|
||||
- Yes
|
||||
- A RISC ISA originally developed by Sun Microsystems
|
||||
* - Tricore
|
||||
- Yes
|
||||
- No
|
||||
- A 32 bit RISC/uController/DSP developed by Infineon
|
||||
* - Xtensa
|
||||
- :ref:`Yes<Xtensa-System-emulator>`
|
||||
- Yes
|
||||
- A configurable 32 bit soft core now owned by Cadence
|
||||
|
||||
A number of features are are only available when running under
|
||||
emulation including :ref:`Record/Replay<replay>` and :ref:`TCG Plugins`.
|
||||
|
||||
.. _Semihosting:
|
||||
|
||||
Semihosting
|
||||
-----------
|
||||
|
||||
Semihosting is a feature defined by the owner of the architecture to
|
||||
allow programs to interact with a debugging host system. On real
|
||||
hardware this is usually provided by an In-circuit emulator (ICE)
|
||||
hooked directly to the board. QEMU's implementation allows for
|
||||
semihosting calls to be passed to the host system or via the
|
||||
``gdbstub``.
|
||||
|
||||
Generally semihosting makes it easier to bring up low level code before a
|
||||
more fully functional operating system has been enabled. On QEMU it
|
||||
also allows for embedded micro-controller code which typically doesn't
|
||||
have a full libc to be run as "bare-metal" code under QEMU's user-mode
|
||||
emulation. It is also useful for writing test cases and indeed a
|
||||
number of compiler suites as well as QEMU itself use semihosting calls
|
||||
to exit test code while reporting the success state.
|
||||
|
||||
Semihosting is only available using TCG emulation. This is because the
|
||||
instructions to trigger a semihosting call are typically reserved
|
||||
causing most hypervisors to trap and fault on them.
|
||||
|
||||
.. warning::
|
||||
Semihosting inherently bypasses any isolation there may be between
|
||||
the guest and the host. As a result a program using semihosting can
|
||||
happily trash your host system. You should only ever run trusted
|
||||
code with semihosting enabled.
|
||||
|
||||
Redirection
|
||||
~~~~~~~~~~~
|
||||
|
||||
Semihosting calls can be re-directed to a (potentially remote) gdb
|
||||
during debugging via the :ref:`gdbstub<GDB usage>`. Output to the
|
||||
semihosting console is configured as a ``chardev`` so can be
|
||||
redirected to a file, pipe or socket like any other ``chardev``
|
||||
device.
|
||||
|
||||
Supported Targets
|
||||
~~~~~~~~~~~~~~~~~
|
||||
|
||||
Most targets offer similar semihosting implementations with some
|
||||
minor changes to define the appropriate instruction to encode the
|
||||
semihosting call and which registers hold the parameters. They tend to
|
||||
presents a simple POSIX-like API which allows your program to read and
|
||||
write files, access the console and some other basic interactions.
|
||||
|
||||
For full details of the ABI for a particular target, and the set of
|
||||
calls it provides, you should consult the semihosting specification
|
||||
for that architecture.
|
||||
|
||||
.. note::
|
||||
QEMU makes an implementation decision to implement all file
|
||||
access in ``O_BINARY`` mode. The user-visible effect of this is
|
||||
regardless of the text/binary mode the program sets QEMU will
|
||||
always select a binary mode ensuring no line-terminator conversion
|
||||
is performed on input or output. This is because gdb semihosting
|
||||
support doesn't make the distinction between the modes and
|
||||
magically processing line endings can be confusing.
|
||||
|
||||
.. list-table:: Guest Architectures supporting Semihosting
|
||||
:widths: 10 10 80
|
||||
:header-rows: 1
|
||||
|
||||
* - Architecture
|
||||
- Modes
|
||||
- Specification
|
||||
* - Arm
|
||||
- System and User-mode
|
||||
- https://github.com/ARM-software/abi-aa/blob/main/semihosting/semihosting.rst
|
||||
* - m68k
|
||||
- System
|
||||
- https://sourceware.org/git/?p=newlib-cygwin.git;a=blob;f=libgloss/m68k/m68k-semi.txt;hb=HEAD
|
||||
* - MIPS
|
||||
- System
|
||||
- Unified Hosting Interface (MD01069)
|
||||
* - Nios II
|
||||
- System
|
||||
- https://sourceware.org/git/gitweb.cgi?p=newlib-cygwin.git;a=blob;f=libgloss/nios2/nios2-semi.txt;hb=HEAD
|
||||
* - RISC-V
|
||||
- System and User-mode
|
||||
- https://github.com/riscv/riscv-semihosting-spec/blob/main/riscv-semihosting-spec.adoc
|
||||
* - Xtensa
|
||||
- System
|
||||
- Tensilica ISS SIMCALL
|
||||
@@ -5,24 +5,25 @@ About QEMU
|
||||
QEMU is a generic and open source machine emulator and virtualizer.
|
||||
|
||||
QEMU can be used in several different ways. The most common is for
|
||||
"system emulation", where it provides a virtual model of an
|
||||
:ref:`System Emulation`, where it provides a virtual model of an
|
||||
entire machine (CPU, memory and emulated devices) to run a guest OS.
|
||||
In this mode the CPU may be fully emulated, or it may work with
|
||||
a hypervisor such as KVM, Xen, Hax or Hypervisor.Framework to
|
||||
allow the guest to run directly on the host CPU.
|
||||
In this mode the CPU may be fully emulated, or it may work with a
|
||||
hypervisor such as KVM, Xen, Hax or Hypervisor.Framework to allow the
|
||||
guest to run directly on the host CPU.
|
||||
|
||||
The second supported way to use QEMU is "user mode emulation",
|
||||
The second supported way to use QEMU is :ref:`User Mode Emulation`,
|
||||
where QEMU can launch processes compiled for one CPU on another CPU.
|
||||
In this mode the CPU is always emulated.
|
||||
|
||||
QEMU also provides a number of standalone commandline utilities,
|
||||
such as the ``qemu-img`` disk image utility that allows you to create,
|
||||
convert and modify disk images.
|
||||
QEMU also provides a number of standalone :ref:`command line
|
||||
utilities<Tools>`, such as the ``qemu-img`` disk image utility that
|
||||
allows you to create, convert and modify disk images.
|
||||
|
||||
.. toctree::
|
||||
:maxdepth: 2
|
||||
|
||||
build-platforms
|
||||
emulation
|
||||
deprecated
|
||||
removed-features
|
||||
license
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user