[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH v6 00/22] instrument: Add basic event instrumentatio
From: |
Lluís Vilanova |
Subject: |
[Qemu-devel] [PATCH v6 00/22] instrument: Add basic event instrumentation |
Date: |
Wed, 13 Sep 2017 12:53:43 +0300 |
User-agent: |
StGit/0.18 |
This series adds an API to add instrumentation events.
It also provides additional APIs for:
* Controlling tracing events.
* Peek/poke guest memory.
TODO:
* Replace qi_event_gen_* with generating calls to arbitrary functions (e.g.,
qi_event_gen_call(num_args, va_list)).
* Flush all TBs when an execution-time event is unset (to ensure it won't be
called in the future).
* Flush all TBs when a translation-time event is set (to ensure no future events
will be lost).
Undecided:
* Alternatively to the two last points above, provide an API to request a TB
flush (much more flexible and can be more efficient, but requires instrumentor
to clearly know differences between translation and execution).
* Pass a user-provided pointer to events (i.e., to avoid using global
variables).
* Provide something like tracing's per-vCPU trace states (i.e., so that each
vCPU can have different instrumentation code). Useful mainly for sampling
(enable/disable instrumentation multiple times without re-translating guest
code) and more complex use cases like tracing a guest process in softmmu mode.
It's still not clear to me if we should extend the per-vCPU bitmap with
instrumentation events, or otherwise somehow reuse the bits in tracing events
(since they're currently limited).
* Allow multiple callbacks per event (both to support multiple callbacks
installed by a library, and multiple libraries at the same time).
* Allow instr libraries to iterate on the list of guest CPUs (info is already
available through guest_cpu_enter/guest_cpu_exit, but forces libs to be
prepared for hot-plugging guest CPUs).
Future APIs (for later series):
* Peek/poke guest registers.
* Add breakpoints to trigger instrumentation functions.
* Trigger instrumentation functions from guest code (former hypertrace).
* Add events for guest code translation/execution (once the respective tracing
events are accepted upstream).
* Add events for exceptions/syscalls.
* Add events for TB invalidation (necessary for libraries to deallocate any data
they might have allocated for the TBs they instrumented).
The instrumentation code is dynamically loaded as a library into QEMU either
when it starts or later using its remote control interfaces. The loaded code
only has access to function explicitly exported through the QI_VPUBLIC macro.
This series is branch 'devel-instrument' in
https://code.gso.ac.upc.edu/git/qemu-dbi.
Signed-off-by: Lluís Vilanova <address@hidden>
---
Changes in v6
=============
* Fix a minor style warning.
* Fix a minor compilation error.
Changes in v5
=============
* Rebase on fcea73709b.
* Minor changes to pass checkpatch.
* Fix symbol availability to external libraries by adding missing default symbol
visibility flag.
* Use a string to identify instrumentation handles [Markus Armbruster].
* Use stubs for command line initialization.
* Use stubs to signal unsupported QAPI commands [Markus Armbruster].
* Use error messages instead of codes in QAPI commands [Markus Armbruster].
* Move symbol visibility macros to internal "qemu/compiler.h" header.
* Trigger event 'guest_cpu_enter' when library is loaded.
* Trigger event 'guest_cpu_exit' and flush TBs when library is unloaded.
* Rename instr_cpu_get/instr_cpu_set into clearer
instr_cpu_to_qicpu/instr_cpu_from_qicpu.
* Rename handle_get/handle_put to clearer handle_new/handle_destroy.
* Ensure qi_event_set_* are called only on the proper mode and targets.
Changes in v4
=============
* Add missing stub function.
Changes in v3
=============
* Use a separate event set for instrumentation (i.e., do not instrument tracing
events) [Stefan Hajnoczi].
* Add API for peek/poke guest memory.
Changes in v2
=============
* Update QEMU version in QAPI [Eric Blake].
* Clarify 'msg' result in QAPI is for humans only.
* Make 'msg' and 'handle' results optional in QAPI.
* Use a list of 'str' in 'instr-load' QAPI command.
* Update MAINTAINERS.
* Add macros for error-reporting in API.
Lluís Vilanova (22):
instrument: Add documentation
instrument: Add configure-time flag
instrument: Add generic library loader
instrument: [linux-user] Add command line library loader
instrument: [bsd-user] Add command line library loader
instrument: [softmmu] Add command line library loader
instrument: [qapi] Add library loader
instrument: [hmp] Add library loader
instrument: Add basic control interface
instrument: Add support for tracing events
instrument: Track vCPUs
instrument: Add event 'guest_cpu_enter'
instrument: Support synchronous modification of vCPU state
exec: Add function to synchronously flush TB on a stopped vCPU
instrument: Add event 'guest_cpu_exit'
instrument: Add event 'guest_cpu_reset'
trace: Introduce a proper structure to describe memory accesses
instrument: Add event 'guest_mem_before_trans'
instrument: Add event 'guest_mem_before_exec'
instrument: Add event 'guest_user_syscall'
instrument: Add event 'guest_user_syscall_ret'
instrument: Add API to manipulate guest memory
.gitignore | 1
MAINTAINERS | 8 +
Makefile | 8 +
Makefile.objs | 4 +
Makefile.target | 1
accel/stubs/tcg-stub.c | 3
accel/tcg/translate-all.c | 7 +
bsd-user/main.c | 17 ++
bsd-user/syscall.c | 14 ++
configure | 13 ++
cpus-common.c | 9 +
docs/instrument.txt | 173 ++++++++++++++++++++++
hmp-commands.hx | 32 ++++
include/exec/cpu_ldst_template.h | 19 +-
include/exec/cpu_ldst_useronly_template.h | 19 +-
include/exec/exec-all.h | 1
include/exec/helper-gen.h | 1
include/exec/helper-proto.h | 1
include/exec/helper-tcg.h | 1
include/qemu/compiler.h | 19 ++
instrument/Makefile.objs | 8 +
instrument/cmdline.c | 128 ++++++++++++++++
instrument/cmdline.h | 51 ++++++
instrument/control.c | 228 +++++++++++++++++++++++++++++
instrument/control.h | 153 +++++++++++++++++++
instrument/control.inc.h | 67 +++++++++
instrument/error.h | 34 ++++
instrument/events.h | 86 +++++++++++
instrument/events.inc.h | 109 ++++++++++++++
instrument/helpers.h | 2
instrument/load.c | 210 +++++++++++++++++++++++++++
instrument/load.h | 88 +++++++++++
instrument/qemu-instr/control.h | 177 +++++++++++++++++++++++
instrument/qemu-instr/state.h | 104 +++++++++++++
instrument/qemu-instr/types.h | 115 +++++++++++++++
instrument/qemu-instr/types.inc.h | 15 ++
instrument/qmp.c | 82 ++++++++++
instrument/state.c | 73 +++++++++
instrument/trace.c | 125 ++++++++++++++++
linux-user/main.c | 21 +++
linux-user/syscall.c | 7 +
monitor.c | 43 +++++
qapi-schema.json | 3
qapi/instrument.json | 49 ++++++
qemu-options.hx | 19 ++
qom/cpu.c | 2
stubs/Makefile.objs | 1
stubs/instrument.c | 73 +++++++++
tcg/tcg-op.c | 27 ++-
trace/control-target.c | 2
trace/control.c | 4 -
trace/control.h | 24 +++
trace/mem-internal.h | 22 ++-
trace/mem.h | 8 +
vl.c | 15 ++
55 files changed, 2486 insertions(+), 40 deletions(-)
create mode 100644 docs/instrument.txt
create mode 100644 instrument/Makefile.objs
create mode 100644 instrument/cmdline.c
create mode 100644 instrument/cmdline.h
create mode 100644 instrument/control.c
create mode 100644 instrument/control.h
create mode 100644 instrument/control.inc.h
create mode 100644 instrument/error.h
create mode 100644 instrument/events.h
create mode 100644 instrument/events.inc.h
create mode 100644 instrument/helpers.h
create mode 100644 instrument/load.c
create mode 100644 instrument/load.h
create mode 100644 instrument/qemu-instr/control.h
create mode 100644 instrument/qemu-instr/state.h
create mode 100644 instrument/qemu-instr/types.h
create mode 100644 instrument/qemu-instr/types.inc.h
create mode 100644 instrument/qmp.c
create mode 100644 instrument/state.c
create mode 100644 instrument/trace.c
create mode 100644 qapi/instrument.json
create mode 100644 stubs/instrument.c
To: address@hidden
Cc: Stefan Hajnoczi <address@hidden>
Cc: Emilio G. Cota <address@hidden>
Cc: Eric Blake <address@hidden>
Cc: Markus Armbruster <address@hidden>
- [Qemu-devel] [PATCH v6 00/22] instrument: Add basic event instrumentation,
Lluís Vilanova <=
- [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Lluís Vilanova, 2017/09/13
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Peter Maydell, 2017/09/14
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Lluís Vilanova, 2017/09/15
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Peter Maydell, 2017/09/18
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Lluís Vilanova, 2017/09/18
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Peter Maydell, 2017/09/18
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Emilio G. Cota, 2017/09/19
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Lluís Vilanova, 2017/09/25
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Emilio G. Cota, 2017/09/25
- Re: [Qemu-devel] [PATCH v6 01/22] instrument: Add documentation, Lluís Vilanova, 2017/09/26