[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH for 4.2 v5 00/55] Support for TCG plugins
From: |
Alex Bennée |
Subject: |
[PATCH for 4.2 v5 00/55] Support for TCG plugins |
Date: |
Mon, 14 Oct 2019 11:48:53 +0100 |
Hi,
This is the latest iteration of the TCG plugins series. From the documentation:
QEMU TCG plugins provide a way for users to run experiments taking
advantage of the total system control emulation can have over a guest.
It provides a mechanism for plugins to subscribe to events during
translation and execution and optionally callback into the plugin
during these events. TCG plugins are unable to change the system state
only monitor it passively. However they can do this down to an
individual instruction granularity including potentially subscribing
to all load and store operations.
I think I've addressed most of the comments from the v4 posting. I've
made a couple of changes to API which I intend to keep as separate
patches in the series to aid review. They are:
qemu_plugin_install - new info block
qemu_plugin_outs - output a string via QEMU's log system
The first allows plugins to know about the guest architecture - in a
fairly simple way by exposing TARGET_NAME. Its enough that a plugin
could decide not to install anything if it is not what it is expecting
but not so much that it has detailed information about the target. For
that sort of subtly you will have to pass details down via the plugin
options. I did briefly look at exposing ElfMachine information but
that got too gnarly. The only user in the examples is the howvec
plugin which will now run on all architectures although it can only
classify aarch64 and sparc64 instructions into groups.
The ability of the plugins to be fully "multiarch" aware meant I could
enable check-tcg to run most tests with each available plugin. This
proved very effective at exposing some bugs in the code that didn't
show up on my main test architecture (ARM). I can still trigger
crashes in sparc64-linux-user but rth informs me it is currently quite
broken so I skip it for now in the CI config.
The qemu_plugin_outs patch is mostly mechanical but it does neaten up
the output of plugins and prevent them just spamming stdout. Currently
the output goes via the logging system but I can envisage future
tweaks for system emulation which could push the output via a chardev
and allow nicer integration with test harnesses.
One requested feature that didn't make it in was a way to introspect
the state of the registers. It's not a deal breaker as the plugin can
always decode the instruction itself and has access to all
loads/stores so could track the data itself. I didn't want to hold up
the merging of what we have given softfreeze is so close so I think
this is something to think about for the next cycle. I'm open to ideas
of the best way to do this. One idle thought I had was giving the
plugin the ability to trigger a debug exception which would then punt
the problem to the gdbstub. I'm not sure if triggering a non-guest
visible exception violates the passive monitoring contract of TCG
plugins.
I've added some more words to the documentation to hopefully ally
fears about TCG plugins being used to end-run around the GPL.
The only other change of note is fixing a bunch of races by using
__thread for per-CPU data structures. There are more details bellow
the --- comments in each patch.
I'm hoping to get it merged this cycle so please review:
02 - trace add mmu_index to mem_info
17 - plugins implement helpers for resolving hwaddr
40 - tests tcg Makefile.target fix path to config host
41 - tests tcg set QEMU_OPTS for all cris runs
42 - tests tcg move virtual tests to EXTRA_TESTS
43 - tests tcg drop test i386 fprem from TESTS when no
44 - tests tcg enable plugin testing
45 - tests plugin add a hotblocks plugin
47 - tests plugin add instruction execution breakdown
48 - tests plugin add hotpages plugin to breakdown mem
51 - plugins expand the plugin_init function to includ
52 - plugins make howvec plugin more generic
53 - plugins add sparc64 instruction classification ta
54 - plugins add qemu_plugin_outs and use it
55 - .travis.yml add enable plugins tests
Alex Bennée (21):
trace: add mmu_index to mem_info
docs/devel: add plugins.rst design document
configure: add --enable-plugins (MOVE TO END)
plugin: add implementation of the api
plugins: implement helpers for resolving hwaddr
tests/tcg/Makefile.target: fix path to config-host.mak
tests/tcg: set QEMU_OPTS for all cris runs
tests/tcg: move "virtual" tests to EXTRA_TESTS
tests/tcg: drop test-i386-fprem from TESTS when not SLOW
tests/tcg: enable plugin testing
tests/plugin: add a hotblocks plugin
plugin: add qemu_plugin_insn_disas helper
tests/plugin: add instruction execution breakdown
tests/plugin: add hotpages plugin to breakdown memory access patterns
accel/stubs: reduce headers from tcg-stub
include/exec: wrap cpu_ldst.h in CONFIG_TCG
plugins: expand the plugin_init function to include an info block
plugins: make howvec plugin more generic
plugins: add sparc64 instruction classification table
plugins: add qemu_plugin_outs and use it
.travis.yml: add --enable-plugins tests
Emilio G. Cota (32):
trace: expand mem_info:size_shift to 4 bits
cpu: introduce cpu_in_exclusive_context()
translate-all: use cpu_in_exclusive_work_context() in tb_flush
plugin: add user-facing API
plugin: add core code
queue: add QTAILQ_REMOVE_SEVERAL
cputlb: document get_page_addr_code
cputlb: introduce get_page_addr_code_hostp
tcg: add tcg_gen_st_ptr
plugin-gen: add module for TCG-related code
atomic_template: add inline trace/plugin helpers
tcg: let plugins instrument virtual memory accesses
translate-all: notify plugin code of tb_flush
*-user: notify plugin of exit
*-user: plugin syscalls
cpu: hook plugin vcpu events
plugin-gen: add plugin_insn_append
translator: add translator_ld{ub,sw,uw,l,q}
target/arm: fetch code with translator_ld
target/ppc: fetch code with translator_ld
target/sh4: fetch code with translator_ld
target/i386: fetch code with translator_ld
target/hppa: fetch code with translator_ld
target/m68k: fetch code with translator_ld
target/alpha: fetch code with translator_ld
target/riscv: fetch code with translator_ld
target/sparc: fetch code with translator_ld
target/xtensa: fetch code with translator_ld
target/openrisc: fetch code with translator_ld
translator: inject instrumentation from plugins
plugin: add API symbols to qemu-plugins.symbols
tests/plugin: add sample plugins
Lluís Vilanova (2):
vl: support -plugin option
linux-user: support -plugin option
.travis.yml | 15 +
Makefile | 16 +-
Makefile.target | 2 +
accel/stubs/tcg-stub.c | 1 -
accel/tcg/Makefile.objs | 1 +
accel/tcg/atomic_common.inc.c | 54 ++
accel/tcg/atomic_template.h | 94 ++-
accel/tcg/cpu-exec.c | 8 +-
accel/tcg/cputlb.c | 53 +-
accel/tcg/plugin-gen.c | 932 ++++++++++++++++++++++
accel/tcg/plugin-helpers.h | 5 +
accel/tcg/translate-all.c | 15 +-
accel/tcg/translator.c | 20 +
accel/tcg/user-exec.c | 3 +
bsd-user/syscall.c | 24 +-
configure | 86 ++
cpus-common.c | 4 +
cpus.c | 10 +
disas.c | 110 +++
docs/devel/index.rst | 1 +
docs/devel/plugins.rst | 112 +++
exec.c | 2 +
hw/core/cpu.c | 2 +
include/disas/disas.h | 2 +
include/exec/cpu-defs.h | 1 +
include/exec/cpu_ldst.h | 11 +
include/exec/cpu_ldst_template.h | 37 +-
include/exec/cpu_ldst_useronly_template.h | 29 +-
include/exec/exec-all.h | 84 +-
include/exec/helper-gen.h | 1 +
include/exec/helper-proto.h | 1 +
include/exec/helper-tcg.h | 1 +
include/exec/plugin-gen.h | 71 ++
include/exec/translator.h | 58 +-
include/hw/core/cpu.h | 19 +
include/qemu/bswap.h | 5 +
include/qemu/log.h | 1 +
include/qemu/plugin.h | 261 ++++++
include/qemu/qemu-plugin.h | 388 +++++++++
include/qemu/queue.h | 10 +
include/user/syscall-trace.h | 40 +
linux-user/exit.c | 1 +
linux-user/main.c | 18 +
linux-user/syscall.c | 7 +-
plugins/.gitignore | 2 +
plugins/Makefile.objs | 21 +
plugins/api.c | 334 ++++++++
plugins/core.c | 504 ++++++++++++
plugins/loader.c | 384 +++++++++
plugins/plugin.h | 95 +++
plugins/qemu-plugins.symbols | 40 +
qemu-options.hx | 17 +
scripts/tracetool/transform.py | 1 +
target/alpha/translate.c | 2 +-
target/arm/arm_ldst.h | 15 +-
target/hppa/translate.c | 2 +-
target/i386/translate.c | 10 +-
target/m68k/translate.c | 2 +-
target/openrisc/translate.c | 2 +-
target/ppc/translate.c | 8 +-
target/riscv/translate.c | 2 +-
target/sh4/translate.c | 4 +-
target/sparc/translate.c | 2 +-
target/xtensa/translate.c | 4 +-
tcg/tcg-op.c | 40 +-
tcg/tcg-op.h | 16 +
tcg/tcg-opc.h | 3 +
tcg/tcg.c | 22 +
tcg/tcg.h | 23 +
tests/Makefile.include | 11 +-
tests/plugin/Makefile | 31 +
tests/plugin/bb.c | 64 ++
tests/plugin/empty.c | 30 +
tests/plugin/hotblocks.c | 143 ++++
tests/plugin/hotpages.c | 174 ++++
tests/plugin/howvec.c | 351 ++++++++
tests/plugin/insn.c | 61 ++
tests/plugin/mem.c | 97 +++
tests/tcg/Makefile.target | 43 +-
tests/tcg/aarch64/Makefile.softmmu-target | 2 +-
tests/tcg/aarch64/Makefile.target | 6 +
tests/tcg/arm/Makefile.softmmu-target | 1 +
tests/tcg/arm/Makefile.target | 6 +
tests/tcg/cris/Makefile.target | 2 +-
tests/tcg/i386/Makefile.target | 11 +-
trace-events | 8 +-
trace/mem-internal.h | 39 +-
trace/mem.h | 7 +-
util/log.c | 3 +
vl.c | 11 +
90 files changed, 5111 insertions(+), 161 deletions(-)
create mode 100644 accel/tcg/atomic_common.inc.c
create mode 100644 accel/tcg/plugin-gen.c
create mode 100644 accel/tcg/plugin-helpers.h
create mode 100644 docs/devel/plugins.rst
create mode 100644 include/exec/plugin-gen.h
create mode 100644 include/qemu/plugin.h
create mode 100644 include/qemu/qemu-plugin.h
create mode 100644 include/user/syscall-trace.h
create mode 100644 plugins/.gitignore
create mode 100644 plugins/Makefile.objs
create mode 100644 plugins/api.c
create mode 100644 plugins/core.c
create mode 100644 plugins/loader.c
create mode 100644 plugins/plugin.h
create mode 100644 plugins/qemu-plugins.symbols
create mode 100644 tests/plugin/Makefile
create mode 100644 tests/plugin/bb.c
create mode 100644 tests/plugin/empty.c
create mode 100644 tests/plugin/hotblocks.c
create mode 100644 tests/plugin/hotpages.c
create mode 100644 tests/plugin/howvec.c
create mode 100644 tests/plugin/insn.c
create mode 100644 tests/plugin/mem.c
--
2.20.1
- [PATCH for 4.2 v5 00/55] Support for TCG plugins,
Alex Bennée <=
- [PATCH v5 01/55] trace: expand mem_info:size_shift to 4 bits, Alex Bennée, 2019/10/14
- [PATCH v5 04/55] translate-all: use cpu_in_exclusive_work_context() in tb_flush, Alex Bennée, 2019/10/14
- [PATCH v5 05/55] docs/devel: add plugins.rst design document, Alex Bennée, 2019/10/14
- [PATCH v5 03/55] cpu: introduce cpu_in_exclusive_context(), Alex Bennée, 2019/10/14
- [PATCH v5 06/55] configure: add --enable-plugins (MOVE TO END), Alex Bennée, 2019/10/14
- [PATCH v5 02/55] trace: add mmu_index to mem_info, Alex Bennée, 2019/10/14
- [PATCH v5 09/55] plugin: add implementation of the api, Alex Bennée, 2019/10/14