Doc, metadata, plugin and testing updates for 6.1-rc1:
- git ignore some file editor detritus - add overview on device emulation terminology - remove needless if leg in configure custom devices logic - numerous gitdm/mailmap updates - fix plugin_exit race for linux-user - fix a few bugs in cache modelling plugin - fix plugin calculation of physical address - handle pure assembler/linker tcg tests outside of docker - add tricore build to gitlab - remove superfluous MacOSX task - generalise the OpenBSI gitlab rules -----BEGIN PGP SIGNATURE----- iQEzBAABCgAdFiEEZoWumedRZ7yvyN81+9DbCVqeKkQFAmD67ioACgkQ+9DbCVqe KkTKcwf/UlEl2wlYrvymoJy7caasD/UrlNwpaK90zRTxuofJjG2bXX/58EGBlgxe cjbX3841702HXAFDxzswmWX3yeXQVgNiXrEy5FapB7L3h/qC/BDVS4pz987TITNW b4lw/d05bQVGavcdJXPnX0CdV8IK4hpieDkdh/LGj5+CSAC39jvyVGTYBpfLKl8D cps5qcJcJuQjz4hatB1haZOV1WHLyw8KI0srfcEqkh3IImZFZ09frs3qqAxrYRqE Y62d7SIN5TX1XgWuTaf1mmaMVmbNi9DTdCxWpGYr4ZBLhhzKeljQvKbF45ZGQ0z9 eBVBdxGJTX/WAKrimcbHxLo43pCo2Q== =7vzj -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/stsquad/tags/pull-for-6.1-rc1-230721-1' into staging Doc, metadata, plugin and testing updates for 6.1-rc1: - git ignore some file editor detritus - add overview on device emulation terminology - remove needless if leg in configure custom devices logic - numerous gitdm/mailmap updates - fix plugin_exit race for linux-user - fix a few bugs in cache modelling plugin - fix plugin calculation of physical address - handle pure assembler/linker tcg tests outside of docker - add tricore build to gitlab - remove superfluous MacOSX task - generalise the OpenBSI gitlab rules # gpg: Signature made Fri 23 Jul 2021 17:28:26 BST # 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 * remotes/stsquad/tags/pull-for-6.1-rc1-230721-1: (28 commits) gitlab-ci: Extract OpenSBI job rules to reusable section gitlab-ci: Remove the second superfluous macos task gitlab: enable a very minimal build with the tricore container tests/tcg/configure.sh: add handling for assembler only builds plugins: Fix physical address calculation for IO regions plugins/cache: Fixed "function decl. is not a prototype" warnings plugins/cache: limited the scope of a mutex lock plugins/cache: Fixed a bug with destroying FIFO metadata tcg/plugins: implement a qemu_plugin_user_exit helper contrib/gitdm: add more individual contributor entries. contrib/gitdm: add a new interns group-map for GSoC/Outreachy work contrib/gitdm: add an explicit academic entry for BU contrib/gitdm: add group-map for Netflix contrib/gitdm: add domain-map for NVIDIA contrib/gitdm: add domain-map for Crudebyte contrib/gitdm: un-ironically add a mapping for LWN contrib/gitdm: add domain-map/group-map for Wind River contrib/gitdm: add domain-map for Eldorado contrib/gitdm: add domain-map/group-map mappings for Samsung gitdm.config: sort the corporate GroupMap entries ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>
This commit is contained in:
commit
34fd92ab41
2
.gitignore
vendored
2
.gitignore
vendored
@ -13,3 +13,5 @@ GTAGS
|
|||||||
*~
|
*~
|
||||||
*.ast_raw
|
*.ast_raw
|
||||||
*.depend_raw
|
*.depend_raw
|
||||||
|
*.swp
|
||||||
|
*.patch
|
||||||
|
@ -354,6 +354,17 @@ build-some-softmmu:
|
|||||||
TARGETS: xtensa-softmmu arm-softmmu aarch64-softmmu alpha-softmmu
|
TARGETS: xtensa-softmmu arm-softmmu aarch64-softmmu alpha-softmmu
|
||||||
MAKE_CHECK_ARGS: check-tcg
|
MAKE_CHECK_ARGS: check-tcg
|
||||||
|
|
||||||
|
# We build tricore in a very minimal tricore only container
|
||||||
|
build-tricore-softmmu:
|
||||||
|
extends: .native_build_job_template
|
||||||
|
needs:
|
||||||
|
job: tricore-debian-cross-container
|
||||||
|
variables:
|
||||||
|
IMAGE: debian-tricore-cross
|
||||||
|
CONFIGURE_ARGS: --disable-tools --disable-fdt --enable-debug
|
||||||
|
TARGETS: tricore-softmmu
|
||||||
|
MAKE_CHECK_ARGS: check-tcg
|
||||||
|
|
||||||
clang-system:
|
clang-system:
|
||||||
extends: .native_build_job_template
|
extends: .native_build_job_template
|
||||||
needs:
|
needs:
|
||||||
|
@ -85,18 +85,3 @@ x64-macos-11-base-build:
|
|||||||
PATH_EXTRA: /usr/local/opt/ccache/libexec:/usr/local/opt/gettext/bin
|
PATH_EXTRA: /usr/local/opt/ccache/libexec:/usr/local/opt/gettext/bin
|
||||||
PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/ncurses/lib/pkgconfig:/usr/local/opt/readline/lib/pkgconfig
|
PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/ncurses/lib/pkgconfig:/usr/local/opt/readline/lib/pkgconfig
|
||||||
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
||||||
|
|
||||||
x64-macos-11-xcode-build:
|
|
||||||
extends: .cirrus_build_job
|
|
||||||
variables:
|
|
||||||
NAME: macos-11
|
|
||||||
CIRRUS_VM_INSTANCE_TYPE: osx_instance
|
|
||||||
CIRRUS_VM_IMAGE_SELECTOR: image
|
|
||||||
CIRRUS_VM_IMAGE_NAME: big-sur-xcode
|
|
||||||
CIRRUS_VM_CPUS: 12
|
|
||||||
CIRRUS_VM_RAM: 24G
|
|
||||||
UPDATE_COMMAND: brew update
|
|
||||||
INSTALL_COMMAND: brew install
|
|
||||||
PATH_EXTRA: /usr/local/opt/ccache/libexec:/usr/local/opt/gettext/bin
|
|
||||||
PKG_CONFIG_PATH: /usr/local/opt/curl/lib/pkgconfig:/usr/local/opt/ncurses/lib/pkgconfig:/usr/local/opt/readline/lib/pkgconfig
|
|
||||||
TEST_TARGETS: check-unit check-block check-qapi-schema check-softfloat check-qtest-x86_64
|
|
||||||
|
@ -1,10 +1,23 @@
|
|||||||
docker-opensbi:
|
# All jobs needing docker-opensbi must use the same rules it uses.
|
||||||
stage: containers
|
.opensbi_job_rules:
|
||||||
rules: # Only run this job when the Dockerfile is modified
|
rules: # Only run this job when ...
|
||||||
- changes:
|
- changes:
|
||||||
|
# this file is modified
|
||||||
- .gitlab-ci.d/opensbi.yml
|
- .gitlab-ci.d/opensbi.yml
|
||||||
|
# or the Dockerfile is modified
|
||||||
- .gitlab-ci.d/opensbi/Dockerfile
|
- .gitlab-ci.d/opensbi/Dockerfile
|
||||||
when: always
|
when: always
|
||||||
|
- changes: # or roms/opensbi/ is modified (submodule updated)
|
||||||
|
- roms/opensbi/*
|
||||||
|
when: always
|
||||||
|
- if: '$CI_COMMIT_REF_NAME =~ /^opensbi/' # or the branch/tag starts with 'opensbi'
|
||||||
|
when: always
|
||||||
|
- if: '$CI_COMMIT_MESSAGE =~ /opensbi/i' # or last commit description contains 'OpenSBI'
|
||||||
|
when: always
|
||||||
|
|
||||||
|
docker-opensbi:
|
||||||
|
extends: .opensbi_job_rules
|
||||||
|
stage: containers
|
||||||
image: docker:19.03.1
|
image: docker:19.03.1
|
||||||
services:
|
services:
|
||||||
- docker:19.03.1-dind
|
- docker:19.03.1-dind
|
||||||
@ -24,16 +37,9 @@ docker-opensbi:
|
|||||||
- docker push $IMAGE_TAG
|
- docker push $IMAGE_TAG
|
||||||
|
|
||||||
build-opensbi:
|
build-opensbi:
|
||||||
|
extends: .opensbi_job_rules
|
||||||
stage: build
|
stage: build
|
||||||
needs: ['docker-opensbi']
|
needs: ['docker-opensbi']
|
||||||
rules: # Only run this job when ...
|
|
||||||
- changes: # ... roms/opensbi/ is modified (submodule updated)
|
|
||||||
- roms/opensbi/*
|
|
||||||
when: always
|
|
||||||
- if: '$CI_COMMIT_REF_NAME =~ /^opensbi/' # or the branch/tag starts with 'opensbi'
|
|
||||||
when: always
|
|
||||||
- if: '$CI_COMMIT_MESSAGE =~ /opensbi/i' # or last commit description contains 'OpenSBI'
|
|
||||||
when: always
|
|
||||||
artifacts:
|
artifacts:
|
||||||
paths: # 'artifacts.zip' will contains the following files:
|
paths: # 'artifacts.zip' will contains the following files:
|
||||||
- pc-bios/opensbi-riscv32-generic-fw_dynamic.bin
|
- pc-bios/opensbi-riscv32-generic-fw_dynamic.bin
|
||||||
|
4
.mailmap
4
.mailmap
@ -27,6 +27,10 @@ Paul Brook <paul@codesourcery.com> pbrook <pbrook@c046a42c-6fe2-441c-8c8c-714662
|
|||||||
Thiemo Seufer <ths@networkno.de> ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
|
Thiemo Seufer <ths@networkno.de> ths <ths@c046a42c-6fe2-441c-8c8c-71466251a162>
|
||||||
malc <av1474@comtv.ru> malc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
|
malc <av1474@comtv.ru> malc <malc@c046a42c-6fe2-441c-8c8c-71466251a162>
|
||||||
|
|
||||||
|
# Corrupted Author fields
|
||||||
|
Marek Dolata <mkdolata@us.ibm.com> mkdolata@us.ibm.com <mkdolata@us.ibm.com>
|
||||||
|
Nick Hudson <hnick@vmware.com> hnick@vmware.com <hnick@vmware.com>
|
||||||
|
|
||||||
# There is also a:
|
# There is also a:
|
||||||
# (no author) <(no author)@c046a42c-6fe2-441c-8c8c-71466251a162>
|
# (no author) <(no author)@c046a42c-6fe2-441c-8c8c-71466251a162>
|
||||||
# for the cvs2svn initialization commit e63c3dc74bf.
|
# for the cvs2svn initialization commit e63c3dc74bf.
|
||||||
|
@ -335,7 +335,7 @@ abi_long do_freebsd_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
_mcleanup();
|
_mcleanup();
|
||||||
#endif
|
#endif
|
||||||
gdb_exit(arg1);
|
gdb_exit(arg1);
|
||||||
qemu_plugin_atexit_cb();
|
qemu_plugin_user_exit();
|
||||||
/* XXX: should free thread stack and CPU env */
|
/* XXX: should free thread stack and CPU env */
|
||||||
_exit(arg1);
|
_exit(arg1);
|
||||||
ret = 0; /* avoid warning */
|
ret = 0; /* avoid warning */
|
||||||
@ -437,7 +437,7 @@ abi_long do_netbsd_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
_mcleanup();
|
_mcleanup();
|
||||||
#endif
|
#endif
|
||||||
gdb_exit(arg1);
|
gdb_exit(arg1);
|
||||||
qemu_plugin_atexit_cb();
|
qemu_plugin_user_exit();
|
||||||
/* XXX: should free thread stack and CPU env */
|
/* XXX: should free thread stack and CPU env */
|
||||||
_exit(arg1);
|
_exit(arg1);
|
||||||
ret = 0; /* avoid warning */
|
ret = 0; /* avoid warning */
|
||||||
@ -516,7 +516,7 @@ abi_long do_openbsd_syscall(void *cpu_env, int num, abi_long arg1,
|
|||||||
_mcleanup();
|
_mcleanup();
|
||||||
#endif
|
#endif
|
||||||
gdb_exit(arg1);
|
gdb_exit(arg1);
|
||||||
qemu_plugin_atexit_cb();
|
qemu_plugin_user_exit();
|
||||||
/* XXX: should free thread stack and CPU env */
|
/* XXX: should free thread stack and CPU env */
|
||||||
_exit(arg1);
|
_exit(arg1);
|
||||||
ret = 0; /* avoid warning */
|
ret = 0; /* avoid warning */
|
||||||
|
2
configure
vendored
2
configure
vendored
@ -5103,12 +5103,10 @@ if test "$skip_meson" = no; then
|
|||||||
echo "[properties]" >> $cross
|
echo "[properties]" >> $cross
|
||||||
|
|
||||||
# unroll any custom device configs
|
# unroll any custom device configs
|
||||||
if test -n "$device_archs"; then
|
|
||||||
for a in $device_archs; do
|
for a in $device_archs; do
|
||||||
eval "c=\$devices_${a}"
|
eval "c=\$devices_${a}"
|
||||||
echo "${a}-softmmu = '$c'" >> $cross
|
echo "${a}-softmmu = '$c'" >> $cross
|
||||||
done
|
done
|
||||||
fi
|
|
||||||
|
|
||||||
test -z "$cxx" && echo "link_language = 'c'" >> $cross
|
test -z "$cxx" && echo "link_language = 'c'" >> $cross
|
||||||
echo "[built-in options]" >> $cross
|
echo "[built-in options]" >> $cross
|
||||||
|
@ -31,6 +31,12 @@ pbrook@c046a42c-6fe2-441c-8c8c-71466251a162 paul@codesourcery.com
|
|||||||
ths@c046a42c-6fe2-441c-8c8c-71466251a162 ths@networkno.de
|
ths@c046a42c-6fe2-441c-8c8c-71466251a162 ths@networkno.de
|
||||||
malc@c046a42c-6fe2-441c-8c8c-71466251a162 av1474@comtv.ru
|
malc@c046a42c-6fe2-441c-8c8c-71466251a162 av1474@comtv.ru
|
||||||
|
|
||||||
|
# canonical emails
|
||||||
|
liq3ea@163.com liq3ea@gmail.com
|
||||||
|
|
||||||
|
# some broken tags
|
||||||
|
yuval.shaia.ml.gmail.com yuval.shaia.ml@gmail.com
|
||||||
|
|
||||||
# There is also a:
|
# There is also a:
|
||||||
# (no author) <(no author)@c046a42c-6fe2-441c-8c8c-71466251a162>
|
# (no author) <(no author)@c046a42c-6fe2-441c-8c8c-71466251a162>
|
||||||
# for the cvs2svn initialization commit e63c3dc74bf.
|
# for the cvs2svn initialization commit e63c3dc74bf.
|
||||||
|
@ -9,6 +9,8 @@ baidu.com Baidu
|
|||||||
bytedance.com ByteDance
|
bytedance.com ByteDance
|
||||||
cmss.chinamobile.com China Mobile
|
cmss.chinamobile.com China Mobile
|
||||||
citrix.com Citrix
|
citrix.com Citrix
|
||||||
|
crudebyte.com Crudebyte
|
||||||
|
eldorado.org.br Instituto de Pesquisas Eldorado
|
||||||
fujitsu.com Fujitsu
|
fujitsu.com Fujitsu
|
||||||
google.com Google
|
google.com Google
|
||||||
greensocs.com GreenSocs
|
greensocs.com GreenSocs
|
||||||
@ -17,20 +19,25 @@ ibm.com IBM
|
|||||||
igalia.com Igalia
|
igalia.com Igalia
|
||||||
intel.com Intel
|
intel.com Intel
|
||||||
linaro.org Linaro
|
linaro.org Linaro
|
||||||
|
lwn.net LWN
|
||||||
microsoft.com Microsoft
|
microsoft.com Microsoft
|
||||||
|
mvista.com MontaVista
|
||||||
nokia.com Nokia
|
nokia.com Nokia
|
||||||
nuviainc.com NUVIA
|
nuviainc.com NUVIA
|
||||||
|
nvidia.com NVIDIA
|
||||||
oracle.com Oracle
|
oracle.com Oracle
|
||||||
proxmox.com Proxmox
|
proxmox.com Proxmox
|
||||||
quicinc.com Qualcomm Innovation Center
|
quicinc.com Qualcomm Innovation Center
|
||||||
redhat.com Red Hat
|
redhat.com Red Hat
|
||||||
rt-rk.com RT-RK
|
rt-rk.com RT-RK
|
||||||
|
samsung.com Samsung
|
||||||
siemens.com Siemens
|
siemens.com Siemens
|
||||||
sifive.com SiFive
|
sifive.com SiFive
|
||||||
suse.com SUSE
|
suse.com SUSE
|
||||||
suse.de SUSE
|
suse.de SUSE
|
||||||
virtuozzo.com Virtuozzo
|
virtuozzo.com Virtuozzo
|
||||||
wdc.com Western Digital
|
wdc.com Western Digital
|
||||||
|
windriver.com Wind River
|
||||||
xilinx.com Xilinx
|
xilinx.com Xilinx
|
||||||
yadro.com YADRO
|
yadro.com YADRO
|
||||||
yandex-team.ru Yandex
|
yandex-team.ru Yandex
|
||||||
|
@ -16,3 +16,6 @@ cota@braap.org
|
|||||||
uni-paderborn.de
|
uni-paderborn.de
|
||||||
edu
|
edu
|
||||||
edu.cn
|
edu.cn
|
||||||
|
|
||||||
|
# Boston University
|
||||||
|
bu.edu
|
||||||
|
@ -29,3 +29,8 @@ mrolnik@gmail.com
|
|||||||
huth@tuxfamily.org
|
huth@tuxfamily.org
|
||||||
jhogan@kernel.org
|
jhogan@kernel.org
|
||||||
atar4qemu@gmail.com
|
atar4qemu@gmail.com
|
||||||
|
minwoo.im.dev@gmail.com
|
||||||
|
bmeng.cn@gmail.com
|
||||||
|
liq3ea@gmail.com
|
||||||
|
chetan4windows@gmail.com
|
||||||
|
akihiko.odaki@gmail.com
|
||||||
|
13
contrib/gitdm/group-map-interns
Normal file
13
contrib/gitdm/group-map-interns
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#
|
||||||
|
# Group together everyone working as an intern via one of the various
|
||||||
|
# outreach programs.
|
||||||
|
#
|
||||||
|
|
||||||
|
# GSoC 2020 Virtual FIDO/U2F security key
|
||||||
|
cesar.belley@lse.epita.fr
|
||||||
|
|
||||||
|
# GSoC 2020 TCG performance
|
||||||
|
ahmedkhaledkaraman@gmail.com
|
||||||
|
|
||||||
|
# GSoC 2021 TCG plugins
|
||||||
|
ma.mandourr@gmail.com
|
5
contrib/gitdm/group-map-netflix
Normal file
5
contrib/gitdm/group-map-netflix
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
#
|
||||||
|
# Netflix contributors using their personal emails
|
||||||
|
#
|
||||||
|
|
||||||
|
imp@bsdimp.com
|
7
contrib/gitdm/group-map-robots
Normal file
7
contrib/gitdm/group-map-robots
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# There are various automatic robots that occasionally scan and report
|
||||||
|
# bugs. Let's group them together here.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Euler Robot
|
||||||
|
euler.robot@huawei.com
|
@ -200,7 +200,7 @@ static void fifo_destroy(Cache *cache)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i = 0; i < cache->assoc; i++) {
|
for (i = 0; i < cache->num_sets; i++) {
|
||||||
g_queue_free(cache->sets[i].fifo_queue);
|
g_queue_free(cache->sets[i].fifo_queue);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -355,15 +355,14 @@ static void vcpu_mem_access(unsigned int vcpu_index, qemu_plugin_meminfo_t info,
|
|||||||
struct qemu_plugin_hwaddr *hwaddr;
|
struct qemu_plugin_hwaddr *hwaddr;
|
||||||
InsnData *insn;
|
InsnData *insn;
|
||||||
|
|
||||||
g_mutex_lock(&mtx);
|
|
||||||
hwaddr = qemu_plugin_get_hwaddr(info, vaddr);
|
hwaddr = qemu_plugin_get_hwaddr(info, vaddr);
|
||||||
if (hwaddr && qemu_plugin_hwaddr_is_io(hwaddr)) {
|
if (hwaddr && qemu_plugin_hwaddr_is_io(hwaddr)) {
|
||||||
g_mutex_unlock(&mtx);
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
effective_addr = hwaddr ? qemu_plugin_hwaddr_phys_addr(hwaddr) : vaddr;
|
effective_addr = hwaddr ? qemu_plugin_hwaddr_phys_addr(hwaddr) : vaddr;
|
||||||
|
|
||||||
|
g_mutex_lock(&mtx);
|
||||||
if (!access_cache(dcache, effective_addr)) {
|
if (!access_cache(dcache, effective_addr)) {
|
||||||
insn = (InsnData *) userdata;
|
insn = (InsnData *) userdata;
|
||||||
insn->dmisses++;
|
insn->dmisses++;
|
||||||
@ -470,7 +469,7 @@ static int icmp(gconstpointer a, gconstpointer b)
|
|||||||
return insn_a->imisses < insn_b->imisses ? 1 : -1;
|
return insn_a->imisses < insn_b->imisses ? 1 : -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void log_stats()
|
static void log_stats(void)
|
||||||
{
|
{
|
||||||
g_autoptr(GString) rep = g_string_new("");
|
g_autoptr(GString) rep = g_string_new("");
|
||||||
g_string_append_printf(rep,
|
g_string_append_printf(rep,
|
||||||
@ -488,7 +487,7 @@ static void log_stats()
|
|||||||
qemu_plugin_outs(rep->str);
|
qemu_plugin_outs(rep->str);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void log_top_insns()
|
static void log_top_insns(void)
|
||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
GList *curr, *miss_insns;
|
GList *curr, *miss_insns;
|
||||||
@ -537,7 +536,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p)
|
|||||||
g_hash_table_destroy(miss_ht);
|
g_hash_table_destroy(miss_ht);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void policy_init()
|
static void policy_init(void)
|
||||||
{
|
{
|
||||||
switch (policy) {
|
switch (policy) {
|
||||||
case LRU:
|
case LRU:
|
||||||
|
@ -1,3 +1,5 @@
|
|||||||
|
.. _vhost_user_proto:
|
||||||
|
|
||||||
===================
|
===================
|
||||||
Vhost-user Protocol
|
Vhost-user Protocol
|
||||||
===================
|
===================
|
||||||
|
90
docs/system/device-emulation.rst
Normal file
90
docs/system/device-emulation.rst
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
.. _device-emulation:
|
||||||
|
|
||||||
|
Device Emulation
|
||||||
|
----------------
|
||||||
|
|
||||||
|
QEMU supports the emulation of a large number of devices from
|
||||||
|
peripherals such network cards and USB devices to integrated systems
|
||||||
|
on a chip (SoCs). Configuration of these is often a source of
|
||||||
|
confusion so it helps to have an understanding of some of the terms
|
||||||
|
used to describes devices within QEMU.
|
||||||
|
|
||||||
|
Common Terms
|
||||||
|
~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Device Front End
|
||||||
|
================
|
||||||
|
|
||||||
|
A device front end is how a device is presented to the guest. The type
|
||||||
|
of device presented should match the hardware that the guest operating
|
||||||
|
system is expecting to see. All devices can be specified with the
|
||||||
|
``--device`` command line option. Running QEMU with the command line
|
||||||
|
options ``--device help`` will list all devices it is aware of. Using
|
||||||
|
the command line ``--device foo,help`` will list the additional
|
||||||
|
configuration options available for that device.
|
||||||
|
|
||||||
|
A front end is often paired with a back end, which describes how the
|
||||||
|
host's resources are used in the emulation.
|
||||||
|
|
||||||
|
Device Buses
|
||||||
|
============
|
||||||
|
|
||||||
|
Most devices will exist on a BUS of some sort. Depending on the
|
||||||
|
machine model you choose (``-M foo``) a number of buses will have been
|
||||||
|
automatically created. In most cases the BUS a device is attached to
|
||||||
|
can be inferred, for example PCI devices are generally automatically
|
||||||
|
allocated to the next free address of first PCI bus found. However in
|
||||||
|
complicated configurations you can explicitly specify what bus
|
||||||
|
(``bus=ID``) a device is attached to along with its address
|
||||||
|
(``addr=N``).
|
||||||
|
|
||||||
|
Some devices, for example a PCI SCSI host controller, will add an
|
||||||
|
additional buses to the system that other devices can be attached to.
|
||||||
|
A hypothetical chain of devices might look like:
|
||||||
|
|
||||||
|
--device foo,bus=pci.0,addr=0,id=foo
|
||||||
|
--device bar,bus=foo.0,addr=1,id=baz
|
||||||
|
|
||||||
|
which would be a bar device (with the ID of baz) which is attached to
|
||||||
|
the first foo bus (foo.0) at address 1. The foo device which provides
|
||||||
|
that bus is itself is attached to the first PCI bus (pci.0).
|
||||||
|
|
||||||
|
|
||||||
|
Device Back End
|
||||||
|
===============
|
||||||
|
|
||||||
|
The back end describes how the data from the emulated device will be
|
||||||
|
processed by QEMU. The configuration of the back end is usually
|
||||||
|
specific to the class of device being emulated. For example serial
|
||||||
|
devices will be backed by a ``--chardev`` which can redirect the data
|
||||||
|
to a file or socket or some other system. Storage devices are handled
|
||||||
|
by ``--blockdev`` which will specify how blocks are handled, for
|
||||||
|
example being stored in a qcow2 file or accessing a raw host disk
|
||||||
|
partition. Back ends can sometimes be stacked to implement features
|
||||||
|
like snapshots.
|
||||||
|
|
||||||
|
While the choice of back end is generally transparent to the guest,
|
||||||
|
there are cases where features will not be reported to the guest if
|
||||||
|
the back end is unable to support it.
|
||||||
|
|
||||||
|
Device Pass Through
|
||||||
|
===================
|
||||||
|
|
||||||
|
Device pass through is where the device is actually given access to
|
||||||
|
the underlying hardware. This can be as simple as exposing a single
|
||||||
|
USB device on the host system to the guest or dedicating a video card
|
||||||
|
in a PCI slot to the exclusive use of the guest.
|
||||||
|
|
||||||
|
|
||||||
|
Emulated Devices
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
.. toctree::
|
||||||
|
:maxdepth: 1
|
||||||
|
|
||||||
|
devices/ivshmem.rst
|
||||||
|
devices/net.rst
|
||||||
|
devices/nvme.rst
|
||||||
|
devices/usb.rst
|
||||||
|
devices/vhost-user.rst
|
||||||
|
devices/virtio-pmem.rst
|
59
docs/system/devices/vhost-user.rst
Normal file
59
docs/system/devices/vhost-user.rst
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
.. _vhost_user:
|
||||||
|
|
||||||
|
vhost-user back ends
|
||||||
|
--------------------
|
||||||
|
|
||||||
|
vhost-user back ends are way to service the request of VirtIO devices
|
||||||
|
outside of QEMU itself. To do this there are a number of things
|
||||||
|
required.
|
||||||
|
|
||||||
|
vhost-user device
|
||||||
|
===================
|
||||||
|
|
||||||
|
These are simple stub devices that ensure the VirtIO device is visible
|
||||||
|
to the guest. The code is mostly boilerplate although each device has
|
||||||
|
a ``chardev`` option which specifies the ID of the ``--chardev``
|
||||||
|
device that connects via a socket to the vhost-user *daemon*.
|
||||||
|
|
||||||
|
vhost-user daemon
|
||||||
|
=================
|
||||||
|
|
||||||
|
This is a separate process that is connected to by QEMU via a socket
|
||||||
|
following the :ref:`vhost_user_proto`. There are a number of daemons
|
||||||
|
that can be built when enabled by the project although any daemon that
|
||||||
|
meets the specification for a given device can be used.
|
||||||
|
|
||||||
|
Shared memory object
|
||||||
|
====================
|
||||||
|
|
||||||
|
In order for the daemon to access the VirtIO queues to process the
|
||||||
|
requests it needs access to the guest's address space. This is
|
||||||
|
achieved via the ``memory-backend-file`` or ``memory-backend-memfd``
|
||||||
|
objects. A reference to a file-descriptor which can access this object
|
||||||
|
will be passed via the socket as part of the protocol negotiation.
|
||||||
|
|
||||||
|
Currently the shared memory object needs to match the size of the main
|
||||||
|
system memory as defined by the ``-m`` argument.
|
||||||
|
|
||||||
|
Example
|
||||||
|
=======
|
||||||
|
|
||||||
|
First start you daemon.
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
$ virtio-foo --socket-path=/var/run/foo.sock $OTHER_ARGS
|
||||||
|
|
||||||
|
The you start your QEMU instance specifying the device, chardev and
|
||||||
|
memory objects.
|
||||||
|
|
||||||
|
.. parsed-literal::
|
||||||
|
|
||||||
|
$ |qemu_system| \\
|
||||||
|
-m 4096 \\
|
||||||
|
-chardev socket,id=ba1,path=/var/run/foo.sock \\
|
||||||
|
-device vhost-user-foo,chardev=ba1,$OTHER_ARGS \\
|
||||||
|
-object memory-backend-memfd,id=mem,size=4G,share=on \\
|
||||||
|
-numa node,memdev=mem \\
|
||||||
|
...
|
||||||
|
|
@ -11,15 +11,12 @@ or Hypervisor.Framework.
|
|||||||
|
|
||||||
quickstart
|
quickstart
|
||||||
invocation
|
invocation
|
||||||
|
device-emulation
|
||||||
keys
|
keys
|
||||||
mux-chardev
|
mux-chardev
|
||||||
monitor
|
monitor
|
||||||
images
|
images
|
||||||
net
|
|
||||||
virtio-net-failover
|
virtio-net-failover
|
||||||
usb
|
|
||||||
nvme
|
|
||||||
ivshmem
|
|
||||||
linuxboot
|
linuxboot
|
||||||
generic-loader
|
generic-loader
|
||||||
guest-loader
|
guest-loader
|
||||||
@ -30,7 +27,6 @@ or Hypervisor.Framework.
|
|||||||
gdb
|
gdb
|
||||||
managed-startup
|
managed-startup
|
||||||
cpu-hotplug
|
cpu-hotplug
|
||||||
virtio-pmem
|
|
||||||
pr-manager
|
pr-manager
|
||||||
targets
|
targets
|
||||||
security
|
security
|
||||||
|
13
gitdm.config
13
gitdm.config
@ -28,20 +28,25 @@ EmailMap contrib/gitdm/domain-map
|
|||||||
#
|
#
|
||||||
# Use GroupMap to map a file full of addresses to the
|
# Use GroupMap to map a file full of addresses to the
|
||||||
# same employer. This is used for people that don't post from easily
|
# same employer. This is used for people that don't post from easily
|
||||||
# identifiable corporate emails.
|
# identifiable corporate emails. Please keep this list sorted.
|
||||||
#
|
#
|
||||||
|
|
||||||
GroupMap contrib/gitdm/group-map-redhat Red Hat
|
|
||||||
GroupMap contrib/gitdm/group-map-wavecomp Wave Computing
|
|
||||||
GroupMap contrib/gitdm/group-map-cadence Cadence Design Systems
|
GroupMap contrib/gitdm/group-map-cadence Cadence Design Systems
|
||||||
GroupMap contrib/gitdm/group-map-codeweavers CodeWeavers
|
GroupMap contrib/gitdm/group-map-codeweavers CodeWeavers
|
||||||
GroupMap contrib/gitdm/group-map-ibm IBM
|
GroupMap contrib/gitdm/group-map-ibm IBM
|
||||||
GroupMap contrib/gitdm/group-map-janustech Janus Technologies
|
GroupMap contrib/gitdm/group-map-janustech Janus Technologies
|
||||||
|
GroupMap contrib/gitdm/group-map-netflix Netflix
|
||||||
|
GroupMap contrib/gitdm/group-map-redhat Red Hat
|
||||||
|
GroupMap contrib/gitdm/group-map-wavecomp Wave Computing
|
||||||
|
|
||||||
# Also group together our prolific individual contributors
|
# Also group together our prolific individual contributors
|
||||||
# and those working under academic auspices
|
# and those working under academic or intern auspices
|
||||||
GroupMap contrib/gitdm/group-map-individuals (None)
|
GroupMap contrib/gitdm/group-map-individuals (None)
|
||||||
GroupMap contrib/gitdm/group-map-academics Academics (various)
|
GroupMap contrib/gitdm/group-map-academics Academics (various)
|
||||||
|
GroupMap contrib/gitdm/group-map-interns GSoC/Outreachy Interns
|
||||||
|
|
||||||
|
# Group together robots and other auto-reporters
|
||||||
|
GroupMap contrib/gitdm/group-map-robots Robots (various)
|
||||||
|
|
||||||
#
|
#
|
||||||
#
|
#
|
||||||
|
@ -190,6 +190,16 @@ void qemu_plugin_add_dyn_cb_arr(GArray *arr);
|
|||||||
|
|
||||||
void qemu_plugin_disable_mem_helpers(CPUState *cpu);
|
void qemu_plugin_disable_mem_helpers(CPUState *cpu);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemu_plugin_user_exit(): clean-up callbacks before calling exit callbacks
|
||||||
|
*
|
||||||
|
* This is a user-mode only helper that ensure we have fully cleared
|
||||||
|
* callbacks from all threads before calling the exit callbacks. This
|
||||||
|
* is so the plugins themselves don't have to jump through hoops to
|
||||||
|
* guard against race conditions.
|
||||||
|
*/
|
||||||
|
void qemu_plugin_user_exit(void);
|
||||||
|
|
||||||
#else /* !CONFIG_PLUGIN */
|
#else /* !CONFIG_PLUGIN */
|
||||||
|
|
||||||
static inline void qemu_plugin_add_opts(void)
|
static inline void qemu_plugin_add_opts(void)
|
||||||
@ -250,6 +260,8 @@ void qemu_plugin_add_dyn_cb_arr(GArray *arr)
|
|||||||
static inline void qemu_plugin_disable_mem_helpers(CPUState *cpu)
|
static inline void qemu_plugin_disable_mem_helpers(CPUState *cpu)
|
||||||
{ }
|
{ }
|
||||||
|
|
||||||
|
static inline void qemu_plugin_user_exit(void)
|
||||||
|
{ }
|
||||||
#endif /* !CONFIG_PLUGIN */
|
#endif /* !CONFIG_PLUGIN */
|
||||||
|
|
||||||
#endif /* QEMU_PLUGIN_H */
|
#endif /* QEMU_PLUGIN_H */
|
||||||
|
@ -549,6 +549,19 @@ void qemu_plugin_vcpu_for_each(qemu_plugin_id_t id,
|
|||||||
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
|
void qemu_plugin_register_flush_cb(qemu_plugin_id_t id,
|
||||||
qemu_plugin_simple_cb_t cb);
|
qemu_plugin_simple_cb_t cb);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* qemu_plugin_register_atexit_cb() - register exit callback
|
||||||
|
* @id: plugin ID
|
||||||
|
* @cb: callback
|
||||||
|
* @userdata: user data for callback
|
||||||
|
*
|
||||||
|
* The @cb function is called once execution has finished. Plugins
|
||||||
|
* should be able to free all their resources at this point much like
|
||||||
|
* after a reset/uninstall callback is called.
|
||||||
|
*
|
||||||
|
* In user-mode it is possible a few un-instrumented instructions from
|
||||||
|
* child threads may run before the host kernel reaps the threads.
|
||||||
|
*/
|
||||||
void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id,
|
void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id,
|
||||||
qemu_plugin_udata_cb_t cb, void *userdata);
|
qemu_plugin_udata_cb_t cb, void *userdata);
|
||||||
|
|
||||||
|
@ -35,5 +35,5 @@ void preexit_cleanup(CPUArchState *env, int code)
|
|||||||
__gcov_dump();
|
__gcov_dump();
|
||||||
#endif
|
#endif
|
||||||
gdb_exit(code);
|
gdb_exit(code);
|
||||||
qemu_plugin_atexit_cb();
|
qemu_plugin_user_exit();
|
||||||
}
|
}
|
||||||
|
@ -319,7 +319,7 @@ uint64_t qemu_plugin_hwaddr_phys_addr(const struct qemu_plugin_hwaddr *haddr)
|
|||||||
return block->offset + offset + block->mr->addr;
|
return block->offset + offset + block->mr->addr;
|
||||||
} else {
|
} else {
|
||||||
MemoryRegionSection *mrs = haddr->v.io.section;
|
MemoryRegionSection *mrs = haddr->v.io.section;
|
||||||
return haddr->v.io.offset + mrs->mr->addr;
|
return mrs->offset_within_address_space + haddr->v.io.offset;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
@ -487,6 +487,45 @@ void qemu_plugin_register_atexit_cb(qemu_plugin_id_t id,
|
|||||||
plugin_register_cb_udata(id, QEMU_PLUGIN_EV_ATEXIT, cb, udata);
|
plugin_register_cb_udata(id, QEMU_PLUGIN_EV_ATEXIT, cb, udata);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Handle exit from linux-user. Unlike the normal atexit() mechanism
|
||||||
|
* we need to handle the clean-up manually as it's possible threads
|
||||||
|
* are still running. We need to remove all callbacks from code
|
||||||
|
* generation, flush the current translations and then we can safely
|
||||||
|
* trigger the exit callbacks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void qemu_plugin_user_exit(void)
|
||||||
|
{
|
||||||
|
enum qemu_plugin_event ev;
|
||||||
|
CPUState *cpu;
|
||||||
|
|
||||||
|
QEMU_LOCK_GUARD(&plugin.lock);
|
||||||
|
|
||||||
|
start_exclusive();
|
||||||
|
|
||||||
|
/* un-register all callbacks except the final AT_EXIT one */
|
||||||
|
for (ev = 0; ev < QEMU_PLUGIN_EV_MAX; ev++) {
|
||||||
|
if (ev != QEMU_PLUGIN_EV_ATEXIT) {
|
||||||
|
struct qemu_plugin_ctx *ctx;
|
||||||
|
QTAILQ_FOREACH(ctx, &plugin.ctxs, entry) {
|
||||||
|
plugin_unregister_cb__locked(ctx, ev);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
tb_flush(current_cpu);
|
||||||
|
|
||||||
|
CPU_FOREACH(cpu) {
|
||||||
|
qemu_plugin_disable_mem_helpers(cpu);
|
||||||
|
}
|
||||||
|
|
||||||
|
end_exclusive();
|
||||||
|
|
||||||
|
/* now it's safe to handle the exit case */
|
||||||
|
qemu_plugin_atexit_cb();
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Call this function after longjmp'ing to the main loop. It's possible that the
|
* Call this function after longjmp'ing to the main loop. It's possible that the
|
||||||
* last instruction of a TB might have used helpers, and therefore the
|
* last instruction of a TB might have used helpers, and therefore the
|
||||||
|
@ -1,23 +1,47 @@
|
|||||||
#
|
#
|
||||||
# Docker TriCore cross-compiler target
|
# Docker TriCore cross-compiler target
|
||||||
#
|
#
|
||||||
# This docker target builds on the debian Stretch base image.
|
# This docker target builds on the Debian Buster base image but
|
||||||
|
# doesn't inherit from the common one to avoid bringing in unneeded
|
||||||
|
# dependencies.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2018 Philippe Mathieu-Daudé
|
# Copyright (c) 2018 Philippe Mathieu-Daudé
|
||||||
#
|
#
|
||||||
# SPDX-License-Identifier: GPL-2.0-or-later
|
# SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
#
|
#
|
||||||
FROM qemu/debian10
|
FROM docker.io/library/debian:buster-slim
|
||||||
|
|
||||||
MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
|
MAINTAINER Philippe Mathieu-Daudé <f4bug@amsat.org>
|
||||||
|
|
||||||
|
RUN apt update && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive apt install -yy eatmydata && \
|
||||||
|
DEBIAN_FRONTEND=noninteractive eatmydata apt install -yy \
|
||||||
|
bzip2 \
|
||||||
|
ca-certificates \
|
||||||
|
ccache \
|
||||||
|
g++ \
|
||||||
|
gcc \
|
||||||
|
git \
|
||||||
|
libglib2.0-dev \
|
||||||
|
libpixman-1-dev \
|
||||||
|
libtest-harness-perl \
|
||||||
|
locales \
|
||||||
|
make \
|
||||||
|
ninja-build \
|
||||||
|
perl-base \
|
||||||
|
pkgconf \
|
||||||
|
python3-pip \
|
||||||
|
python3-setuptools \
|
||||||
|
python3-wheel
|
||||||
|
|
||||||
RUN git clone --single-branch \
|
RUN git clone --single-branch \
|
||||||
https://github.com/bkoppelmann/tricore-binutils.git \
|
https://github.com/bkoppelmann/tricore-binutils.git \
|
||||||
/usr/src/binutils && \
|
/usr/src/binutils && \
|
||||||
cd /usr/src/binutils && chmod +x missing && \
|
cd /usr/src/binutils && chmod +x missing && \
|
||||||
CFLAGS=-w ./configure --prefix=/usr --disable-nls --target=tricore && \
|
CFLAGS=-w ./configure --prefix=/usr/local --disable-nls --target=tricore && \
|
||||||
make && make install && \
|
make && make install && \
|
||||||
rm -rf /usr/src/binutils
|
rm -rf /usr/src/binutils
|
||||||
|
|
||||||
# This image isn't designed for building QEMU but building tests
|
# This image can only build a very minimal QEMU as well as the tests
|
||||||
ENV QEMU_CONFIGURE_OPTS --disable-system --disable-user
|
ENV DEF_TARGET_LIST tricore-softmmu
|
||||||
|
ENV QEMU_CONFIGURE_OPTS --disable-user --disable-tools --disable-fdt
|
||||||
|
@ -72,6 +72,10 @@ fi
|
|||||||
: ${cross_cc_x86_64="x86_64-linux-gnu-gcc"}
|
: ${cross_cc_x86_64="x86_64-linux-gnu-gcc"}
|
||||||
: ${cross_cc_cflags_x86_64="-m64"}
|
: ${cross_cc_cflags_x86_64="-m64"}
|
||||||
|
|
||||||
|
# tricore is special as it doesn't have a compiler
|
||||||
|
: ${cross_as_tricore="tricore-as"}
|
||||||
|
: ${cross_ld_tricore="tricore-ld"}
|
||||||
|
|
||||||
for target in $target_list; do
|
for target in $target_list; do
|
||||||
arch=${target%%-*}
|
arch=${target%%-*}
|
||||||
|
|
||||||
@ -247,6 +251,20 @@ for target in $target_list; do
|
|||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
|
# Special handling for assembler only tests
|
||||||
|
eval "target_as=\"\${cross_as_$arch}\""
|
||||||
|
eval "target_ld=\"\${cross_ld_$arch}\""
|
||||||
|
if has $target_as && has $target_ld; then
|
||||||
|
case $target in
|
||||||
|
tricore-softmmu)
|
||||||
|
echo "CROSS_CC_GUEST=$target_as" >> $config_target_mak
|
||||||
|
echo "CROSS_AS_GUEST=$target_as" >> $config_target_mak
|
||||||
|
echo "CROSS_LD_GUEST=$target_ld" >> $config_target_mak
|
||||||
|
got_cross_cc=yes
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
|
|
||||||
if test $got_cross_cc = yes; then
|
if test $got_cross_cc = yes; then
|
||||||
|
Loading…
Reference in New Issue
Block a user