xref: /openbmc/qemu/docs/devel/tcg-plugins.rst (revision b0b3c0f56258b697dd3faca389e98d0022bc7727)
18ea6abf0SAlex Bennée..
28ea6abf0SAlex Bennée   Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
38ea6abf0SAlex Bennée   Copyright (c) 2019, Linaro Limited
48ea6abf0SAlex Bennée   Written by Emilio Cota and Alex Bennée
58ea6abf0SAlex Bennée
6a0a6754bSAlex Bennée.. _TCG Plugins:
7a0a6754bSAlex Bennée
88ea6abf0SAlex BennéeQEMU TCG Plugins
98ea6abf0SAlex Bennée================
108ea6abf0SAlex Bennée
118ea6abf0SAlex BennéeQEMU TCG plugins provide a way for users to run experiments taking
128ea6abf0SAlex Bennéeadvantage of the total system control emulation can have over a guest.
138ea6abf0SAlex BennéeIt provides a mechanism for plugins to subscribe to events during
148ea6abf0SAlex Bennéetranslation and execution and optionally callback into the plugin
158ea6abf0SAlex Bennéeduring these events. TCG plugins are unable to change the system state
168ea6abf0SAlex Bennéeonly monitor it passively. However they can do this down to an
178ea6abf0SAlex Bennéeindividual instruction granularity including potentially subscribing
188ea6abf0SAlex Bennéeto all load and store operations.
198ea6abf0SAlex Bennée
208ea6abf0SAlex BennéeUsage
21e9adb4acSPaolo Bonzini-----
228ea6abf0SAlex Bennée
23ba4dd2aaSAlex BennéeAny QEMU binary with TCG support has plugins enabled by default.
24ba4dd2aaSAlex BennéeEarlier releases needed to be explicitly enabled with::
258ea6abf0SAlex Bennée
268ea6abf0SAlex Bennée  configure --enable-plugins
278ea6abf0SAlex Bennée
288ea6abf0SAlex BennéeOnce built a program can be run with multiple plugins loaded each with
295c6ecbdcSAlex Bennéetheir own arguments::
308ea6abf0SAlex Bennée
318ea6abf0SAlex Bennée  $QEMU $OTHER_QEMU_ARGS \
320f37cf2fSChristoph Muellner      -plugin contrib/plugin/libhowvec.so,inline=on,count=hint \
330f37cf2fSChristoph Muellner      -plugin contrib/plugin/libhotblocks.so
348ea6abf0SAlex Bennée
358ea6abf0SAlex BennéeArguments are plugin specific and can be used to modify their
368ea6abf0SAlex Bennéebehaviour. In this case the howvec plugin is being asked to use inline
378ea6abf0SAlex Bennéeops to count and break down the hint instructions by type.
388ea6abf0SAlex Bennée
390f37cf2fSChristoph MuellnerLinux user-mode emulation also evaluates the environment variable
400f37cf2fSChristoph Muellner``QEMU_PLUGIN``::
410f37cf2fSChristoph Muellner
420f37cf2fSChristoph Muellner  QEMU_PLUGIN="file=contrib/plugins/libhowvec.so,inline=on,count=hint" $QEMU
430f37cf2fSChristoph Muellner
44e9adb4acSPaolo BonziniWriting plugins
45e9adb4acSPaolo Bonzini---------------
46e9adb4acSPaolo Bonzini
47e9adb4acSPaolo BonziniAPI versioning
48e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~
49e9adb4acSPaolo Bonzini
50e9adb4acSPaolo BonziniThis is a new feature for QEMU and it does allow people to develop
51e9adb4acSPaolo Bonziniout-of-tree plugins that can be dynamically linked into a running QEMU
52e9adb4acSPaolo Bonziniprocess. However the project reserves the right to change or break the
53e9adb4acSPaolo BonziniAPI should it need to do so. The best way to avoid this is to submit
54e9adb4acSPaolo Bonziniyour plugin upstream so they can be updated if/when the API changes.
55e9adb4acSPaolo Bonzini
56e9adb4acSPaolo BonziniAll plugins need to declare a symbol which exports the plugin API
57e9adb4acSPaolo Bonziniversion they were built against. This can be done simply by::
58e9adb4acSPaolo Bonzini
59e9adb4acSPaolo Bonzini  QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
60e9adb4acSPaolo Bonzini
61e9adb4acSPaolo BonziniThe core code will refuse to load a plugin that doesn't export a
62e9adb4acSPaolo Bonzini``qemu_plugin_version`` symbol or if plugin version is outside of QEMU's
63e9adb4acSPaolo Bonzinisupported range of API versions.
64e9adb4acSPaolo Bonzini
65e9adb4acSPaolo BonziniAdditionally the ``qemu_info_t`` structure which is passed to the
66e9adb4acSPaolo Bonzini``qemu_plugin_install`` method of a plugin will detail the minimum and
67e9adb4acSPaolo Bonzinicurrent API versions supported by QEMU. The API version will be
68e9adb4acSPaolo Bonziniincremented if new APIs are added. The minimum API version will be
69e9adb4acSPaolo Bonziniincremented if existing APIs are changed or removed.
70e9adb4acSPaolo Bonzini
71e9adb4acSPaolo BonziniLifetime of the query handle
72e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~~~~~~~~~~~~
73e9adb4acSPaolo Bonzini
74e9adb4acSPaolo BonziniEach callback provides an opaque anonymous information handle which
75e9adb4acSPaolo Bonzinican usually be further queried to find out information about a
76e9adb4acSPaolo Bonzinitranslation, instruction or operation. The handles themselves are only
77e9adb4acSPaolo Bonzinivalid during the lifetime of the callback so it is important that any
78e9adb4acSPaolo Bonziniinformation that is needed is extracted during the callback and saved
79e9adb4acSPaolo Bonziniby the plugin.
80e9adb4acSPaolo Bonzini
81e9adb4acSPaolo BonziniPlugin life cycle
82e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~
838ea6abf0SAlex Bennée
848ea6abf0SAlex BennéeFirst the plugin is loaded and the public qemu_plugin_install function
858ea6abf0SAlex Bennéeis called. The plugin will then register callbacks for various plugin
868ea6abf0SAlex Bennéeevents. Generally plugins will register a handler for the *atexit*
878ea6abf0SAlex Bennéeif they want to dump a summary of collected information once the
888ea6abf0SAlex Bennéeprogram/system has finished running.
898ea6abf0SAlex Bennée
908ea6abf0SAlex BennéeWhen a registered event occurs the plugin callback is invoked. The
918ea6abf0SAlex Bennéecallbacks may provide additional information. In the case of a
928ea6abf0SAlex Bennéetranslation event the plugin has an option to enumerate the
938ea6abf0SAlex Bennéeinstructions in a block of instructions and optionally register
948ea6abf0SAlex Bennéecallbacks to some or all instructions when they are executed.
958ea6abf0SAlex Bennée
968ea6abf0SAlex BennéeThere is also a facility to add an inline event where code to
978ea6abf0SAlex Bennéeincrement a counter can be directly inlined with the translation.
988ea6abf0SAlex BennéeCurrently only a simple increment is supported. This is not atomic so
998ea6abf0SAlex Bennéecan miss counts. If you want absolute precision you should use a
1008ea6abf0SAlex Bennéecallback which can then ensure atomicity itself.
1018ea6abf0SAlex Bennée
1028ea6abf0SAlex BennéeFinally when QEMU exits all the registered *atexit* callbacks are
1038ea6abf0SAlex Bennéeinvoked.
1048ea6abf0SAlex Bennée
105e9adb4acSPaolo BonziniExposure of QEMU internals
106e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~~~~~~~~~~
107e9adb4acSPaolo Bonzini
108e9adb4acSPaolo BonziniThe plugin architecture actively avoids leaking implementation details
109e9adb4acSPaolo Bonziniabout how QEMU's translation works to the plugins. While there are
110e9adb4acSPaolo Bonziniconceptions such as translation time and translation blocks the
111e9adb4acSPaolo Bonzinidetails are opaque to plugins. The plugin is able to query select
112e9adb4acSPaolo Bonzinidetails of instructions and system configuration only through the
113e9adb4acSPaolo Bonziniexported *qemu_plugin* functions.
114e9adb4acSPaolo Bonzini
1158ea6abf0SAlex BennéeInternals
116e9adb4acSPaolo Bonzini---------
1178ea6abf0SAlex Bennée
1188ea6abf0SAlex BennéeLocking
119e9adb4acSPaolo Bonzini~~~~~~~
1208ea6abf0SAlex Bennée
1218ea6abf0SAlex BennéeWe have to ensure we cannot deadlock, particularly under MTTCG. For
1228ea6abf0SAlex Bennéethis we acquire a lock when called from plugin code. We also keep the
1238ea6abf0SAlex Bennéelist of callbacks under RCU so that we do not have to hold the lock
1248ea6abf0SAlex Bennéewhen calling the callbacks. This is also for performance, since some
1258ea6abf0SAlex Bennéecallbacks (e.g. memory access callbacks) might be called very
1268ea6abf0SAlex Bennéefrequently.
1278ea6abf0SAlex Bennée
1288ea6abf0SAlex Bennée  * A consequence of this is that we keep our own list of CPUs, so that
1298ea6abf0SAlex Bennée    we do not have to worry about locking order wrt cpu_list_lock.
1308ea6abf0SAlex Bennée  * Use a recursive lock, since we can get registration calls from
1318ea6abf0SAlex Bennée    callbacks.
1328ea6abf0SAlex Bennée
1338ea6abf0SAlex BennéeAs a result registering/unregistering callbacks is "slow", since it
1348ea6abf0SAlex Bennéetakes a lock. But this is very infrequent; we want performance when
1358ea6abf0SAlex Bennéecalling (or not calling) callbacks, not when registering them. Using
1368ea6abf0SAlex BennéeRCU is great for this.
1378ea6abf0SAlex Bennée
1388ea6abf0SAlex BennéeWe support the uninstallation of a plugin at any time (e.g. from
1398ea6abf0SAlex Bennéeplugin callbacks). This allows plugins to remove themselves if they no
1408ea6abf0SAlex Bennéelonger want to instrument the code. This operation is asynchronous
1418ea6abf0SAlex Bennéewhich means callbacks may still occur after the uninstall operation is
1428ea6abf0SAlex Bennéerequested. The plugin isn't completely uninstalled until the safe work
1438ea6abf0SAlex Bennéehas executed while all vCPUs are quiescent.
144c17a386bSAlex Bennée
145c17a386bSAlex BennéeExample Plugins
146*b0b3c0f5SAlex Bennée===============
147c17a386bSAlex Bennée
148c17a386bSAlex BennéeThere are a number of plugins included with QEMU and you are
149c17a386bSAlex Bennéeencouraged to contribute your own plugins plugins upstream. There is a
15059195c65SAlex Bennée``contrib/plugins`` directory where they can go. There are also some
15159195c65SAlex Bennéebasic plugins that are used to test and exercise the API during the
15259195c65SAlex Bennée``make check-tcg`` target in ``tests\plugins``.
153c17a386bSAlex Bennée
15459195c65SAlex Bennée- tests/plugins/empty.c
155c17a386bSAlex Bennée
15659195c65SAlex BennéePurely a test plugin for measuring the overhead of the plugins system
15759195c65SAlex Bennéeitself. Does no instrumentation.
15859195c65SAlex Bennée
15959195c65SAlex Bennée- tests/plugins/bb.c
16059195c65SAlex Bennée
16159195c65SAlex BennéeA very basic plugin which will measure execution in course terms as
16259195c65SAlex Bennéeeach basic block is executed. By default the results are shown once
16359195c65SAlex Bennéeexecution finishes::
16459195c65SAlex Bennée
16559195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libbb.so \
16659195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/sha1
16759195c65SAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
16859195c65SAlex Bennée  bb's: 2277338, insns: 158483046
16959195c65SAlex Bennée
17059195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
17159195c65SAlex Bennée
17259195c65SAlex Bennée * inline=true|false
17359195c65SAlex Bennée
17459195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
17559195c65SAlex Bennée thread safe.
17659195c65SAlex Bennée
17759195c65SAlex Bennée * idle=true|false
17859195c65SAlex Bennée
17959195c65SAlex Bennée Dump the current execution stats whenever the guest vCPU idles
18059195c65SAlex Bennée
18159195c65SAlex Bennée- tests/plugins/insn.c
18259195c65SAlex Bennée
18359195c65SAlex BennéeThis is a basic instruction level instrumentation which can count the
18459195c65SAlex Bennéenumber of instructions executed on each core/thread::
18559195c65SAlex Bennée
18659195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libinsn.so \
18759195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/threadcount
18859195c65SAlex Bennée  Created 10 threads
18959195c65SAlex Bennée  Done
19059195c65SAlex Bennée  cpu 0 insns: 46765
19159195c65SAlex Bennée  cpu 1 insns: 3694
19259195c65SAlex Bennée  cpu 2 insns: 3694
19359195c65SAlex Bennée  cpu 3 insns: 2994
19459195c65SAlex Bennée  cpu 4 insns: 1497
19559195c65SAlex Bennée  cpu 5 insns: 1497
19659195c65SAlex Bennée  cpu 6 insns: 1497
19759195c65SAlex Bennée  cpu 7 insns: 1497
19859195c65SAlex Bennée  total insns: 63135
19959195c65SAlex Bennée
20059195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
20159195c65SAlex Bennée
20259195c65SAlex Bennée * inline=true|false
20359195c65SAlex Bennée
20459195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
20559195c65SAlex Bennée thread safe.
20659195c65SAlex Bennée
20759195c65SAlex Bennée * sizes=true|false
20859195c65SAlex Bennée
20959195c65SAlex Bennée Give a summary of the instruction sizes for the execution
21059195c65SAlex Bennée
21159195c65SAlex Bennée * match=<string>
21259195c65SAlex Bennée
21359195c65SAlex Bennée Only instrument instructions matching the string prefix. Will show
21459195c65SAlex Bennée some basic stats including how many instructions have executed since
21559195c65SAlex Bennée the last execution. For example::
21659195c65SAlex Bennée
21759195c65SAlex Bennée   $ qemu-aarch64 -plugin tests/plugin/libinsn.so,match=bl \
21859195c65SAlex Bennée       -d plugin ./tests/tcg/aarch64-linux-user/sha512-vector
21959195c65SAlex Bennée   ...
22059195c65SAlex Bennée   0x40069c, 'bl #0x4002b0', 10 hits, 1093 match hits, Δ+1257 since last match, 98 avg insns/match
22159195c65SAlex Bennée   0x4006ac, 'bl #0x403690', 10 hits, 1094 match hits, Δ+47 since last match, 98 avg insns/match
22259195c65SAlex Bennée   0x4037fc, 'bl #0x4002b0', 18 hits, 1095 match hits, Δ+22 since last match, 98 avg insns/match
22359195c65SAlex Bennée   0x400720, 'bl #0x403690', 10 hits, 1096 match hits, Δ+58 since last match, 98 avg insns/match
22459195c65SAlex Bennée   0x4037fc, 'bl #0x4002b0', 19 hits, 1097 match hits, Δ+22 since last match, 98 avg insns/match
22559195c65SAlex Bennée   0x400730, 'bl #0x403690', 10 hits, 1098 match hits, Δ+33 since last match, 98 avg insns/match
22659195c65SAlex Bennée   0x4037ac, 'bl #0x4002b0', 12 hits, 1099 match hits, Δ+20 since last match, 98 avg insns/match
22759195c65SAlex Bennée   ...
22859195c65SAlex Bennée
22959195c65SAlex BennéeFor more detailed execution tracing see the ``execlog`` plugin for
23059195c65SAlex Bennéeother options.
23159195c65SAlex Bennée
23259195c65SAlex Bennée- tests/plugins/mem.c
23359195c65SAlex Bennée
23459195c65SAlex BennéeBasic instruction level memory instrumentation::
23559195c65SAlex Bennée
23659195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libmem.so,inline=true \
23759195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/sha1
23859195c65SAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
23959195c65SAlex Bennée  inline mem accesses: 79525013
24059195c65SAlex Bennée
24159195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
24259195c65SAlex Bennée
24359195c65SAlex Bennée * inline=true|false
24459195c65SAlex Bennée
24559195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
24659195c65SAlex Bennée thread safe.
24759195c65SAlex Bennée
24859195c65SAlex Bennée * callback=true|false
24959195c65SAlex Bennée
25059195c65SAlex Bennée Use callbacks on each memory instrumentation.
25159195c65SAlex Bennée
25259195c65SAlex Bennée * hwaddr=true|false
25359195c65SAlex Bennée
25459195c65SAlex Bennée Count IO accesses (only for system emulation)
25559195c65SAlex Bennée
25659195c65SAlex Bennée- tests/plugins/syscall.c
25759195c65SAlex Bennée
25859195c65SAlex BennéeA basic syscall tracing plugin. This only works for user-mode. By
25959195c65SAlex Bennéedefault it will give a summary of syscall stats at the end of the
26059195c65SAlex Bennéerun::
26159195c65SAlex Bennée
26259195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libsyscall \
26359195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/threadcount
26459195c65SAlex Bennée  Created 10 threads
26559195c65SAlex Bennée  Done
26659195c65SAlex Bennée  syscall no.  calls  errors
26759195c65SAlex Bennée  226          12     0
26859195c65SAlex Bennée  99           11     11
26959195c65SAlex Bennée  115          11     0
27059195c65SAlex Bennée  222          11     0
27159195c65SAlex Bennée  93           10     0
27259195c65SAlex Bennée  220          10     0
27359195c65SAlex Bennée  233          10     0
27459195c65SAlex Bennée  215          8      0
27559195c65SAlex Bennée  214          4      0
27659195c65SAlex Bennée  134          2      0
27759195c65SAlex Bennée  64           2      0
27859195c65SAlex Bennée  96           1      0
27959195c65SAlex Bennée  94           1      0
28059195c65SAlex Bennée  80           1      0
28159195c65SAlex Bennée  261          1      0
28259195c65SAlex Bennée  78           1      0
28359195c65SAlex Bennée  160          1      0
28459195c65SAlex Bennée  135          1      0
285c17a386bSAlex Bennée
286c17a386bSAlex Bennée- contrib/plugins/hotblocks.c
287c17a386bSAlex Bennée
288c17a386bSAlex BennéeThe hotblocks plugin allows you to examine the where hot paths of
289c17a386bSAlex Bennéeexecution are in your program. Once the program has finished you will
290c17a386bSAlex Bennéeget a sorted list of blocks reporting the starting PC, translation
291c17a386bSAlex Bennéecount, number of instructions and execution count. This will work best
292c17a386bSAlex Bennéewith linux-user execution as system emulation tends to generate
293c17a386bSAlex Bennéere-translations as blocks from different programs get swapped in and
294c17a386bSAlex Bennéeout of system memory.
295c17a386bSAlex Bennée
2961e235edaSPeter MaydellIf your program is single-threaded you can use the ``inline`` option for
297c17a386bSAlex Bennéeslightly faster (but not thread safe) counters.
298c17a386bSAlex Bennée
299c17a386bSAlex BennéeExample::
300c17a386bSAlex Bennée
3011d0603a9SAlex Bennée  $ qemu-aarch64 \
302c17a386bSAlex Bennée    -plugin contrib/plugins/libhotblocks.so -d plugin \
303c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
304c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
305c17a386bSAlex Bennée  collected 903 entries in the hash table
306c17a386bSAlex Bennée  pc, tcount, icount, ecount
307c17a386bSAlex Bennée  0x0000000041ed10, 1, 5, 66087
308c17a386bSAlex Bennée  0x000000004002b0, 1, 4, 66087
309c17a386bSAlex Bennée  ...
310c17a386bSAlex Bennée
311c17a386bSAlex Bennée- contrib/plugins/hotpages.c
312c17a386bSAlex Bennée
313c17a386bSAlex BennéeSimilar to hotblocks but this time tracks memory accesses::
314c17a386bSAlex Bennée
3151d0603a9SAlex Bennée  $ qemu-aarch64 \
316c17a386bSAlex Bennée    -plugin contrib/plugins/libhotpages.so -d plugin \
317c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
318c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
319c17a386bSAlex Bennée  Addr, RCPUs, Reads, WCPUs, Writes
320c17a386bSAlex Bennée  0x000055007fe000, 0x0001, 31747952, 0x0001, 8835161
321c17a386bSAlex Bennée  0x000055007ff000, 0x0001, 29001054, 0x0001, 8780625
322c17a386bSAlex Bennée  0x00005500800000, 0x0001, 687465, 0x0001, 335857
323c17a386bSAlex Bennée  0x0000000048b000, 0x0001, 130594, 0x0001, 355
324c17a386bSAlex Bennée  0x0000000048a000, 0x0001, 1826, 0x0001, 11
325c17a386bSAlex Bennée
326f698d5efSMahmoud MandourThe hotpages plugin can be configured using the following arguments:
327f698d5efSMahmoud Mandour
328f698d5efSMahmoud Mandour  * sortby=reads|writes|address
329f698d5efSMahmoud Mandour
330f698d5efSMahmoud Mandour  Log the data sorted by either the number of reads, the number of writes, or
331f698d5efSMahmoud Mandour  memory address. (Default: entries are sorted by the sum of reads and writes)
332f698d5efSMahmoud Mandour
333f698d5efSMahmoud Mandour  * io=on
334f698d5efSMahmoud Mandour
335f698d5efSMahmoud Mandour  Track IO addresses. Only relevant to full system emulation. (Default: off)
336f698d5efSMahmoud Mandour
337f698d5efSMahmoud Mandour  * pagesize=N
338f698d5efSMahmoud Mandour
339f698d5efSMahmoud Mandour  The page size used. (Default: N = 4096)
340f698d5efSMahmoud Mandour
341c17a386bSAlex Bennée- contrib/plugins/howvec.c
342c17a386bSAlex Bennée
343c17a386bSAlex BennéeThis is an instruction classifier so can be used to count different
344c17a386bSAlex Bennéetypes of instructions. It has a number of options to refine which get
345450e0f28SJohn Snowcounted. You can give a value to the ``count`` argument for a class of
346d8525358SMahmoud Mandourinstructions to break it down fully, so for example to see all the system
347d8525358SMahmoud Mandourregisters accesses::
348c17a386bSAlex Bennée
3491d0603a9SAlex Bennée  $ qemu-system-aarch64 $(QEMU_ARGS) \
350c17a386bSAlex Bennée    -append "root=/dev/sda2 systemd.unit=benchmark.service" \
351d8525358SMahmoud Mandour    -smp 4 -plugin ./contrib/plugins/libhowvec.so,count=sreg -d plugin
352c17a386bSAlex Bennée
353c17a386bSAlex Bennéewhich will lead to a sorted list after the class breakdown::
354c17a386bSAlex Bennée
355c17a386bSAlex Bennée  Instruction Classes:
356c17a386bSAlex Bennée  Class:   UDEF                   not counted
357c17a386bSAlex Bennée  Class:   SVE                    (68 hits)
358c17a386bSAlex Bennée  Class:   PCrel addr             (47789483 hits)
359c17a386bSAlex Bennée  Class:   Add/Sub (imm)          (192817388 hits)
360c17a386bSAlex Bennée  Class:   Logical (imm)          (93852565 hits)
361c17a386bSAlex Bennée  Class:   Move Wide (imm)        (76398116 hits)
362c17a386bSAlex Bennée  Class:   Bitfield               (44706084 hits)
363c17a386bSAlex Bennée  Class:   Extract                (5499257 hits)
364c17a386bSAlex Bennée  Class:   Cond Branch (imm)      (147202932 hits)
365c17a386bSAlex Bennée  Class:   Exception Gen          (193581 hits)
366c17a386bSAlex Bennée  Class:     NOP                  not counted
367c17a386bSAlex Bennée  Class:   Hints                  (6652291 hits)
368c17a386bSAlex Bennée  Class:   Barriers               (8001661 hits)
369c17a386bSAlex Bennée  Class:   PSTATE                 (1801695 hits)
370c17a386bSAlex Bennée  Class:   System Insn            (6385349 hits)
371c17a386bSAlex Bennée  Class:   System Reg             counted individually
372c17a386bSAlex Bennée  Class:   Branch (reg)           (69497127 hits)
373c17a386bSAlex Bennée  Class:   Branch (imm)           (84393665 hits)
374c17a386bSAlex Bennée  Class:   Cmp & Branch           (110929659 hits)
375c17a386bSAlex Bennée  Class:   Tst & Branch           (44681442 hits)
376c17a386bSAlex Bennée  Class:   AdvSimd ldstmult       (736 hits)
377c17a386bSAlex Bennée  Class:   ldst excl              (9098783 hits)
378c17a386bSAlex Bennée  Class:   Load Reg (lit)         (87189424 hits)
379c17a386bSAlex Bennée  Class:   ldst noalloc pair      (3264433 hits)
380c17a386bSAlex Bennée  Class:   ldst pair              (412526434 hits)
381c17a386bSAlex Bennée  Class:   ldst reg (imm)         (314734576 hits)
382c17a386bSAlex Bennée  Class: Loads & Stores           (2117774 hits)
383c17a386bSAlex Bennée  Class: Data Proc Reg            (223519077 hits)
384c17a386bSAlex Bennée  Class: Scalar FP                (31657954 hits)
385c17a386bSAlex Bennée  Individual Instructions:
386c17a386bSAlex Bennée  Instr: mrs x0, sp_el0           (2682661 hits)  (op=0xd5384100/  System Reg)
387c17a386bSAlex Bennée  Instr: mrs x1, tpidr_el2        (1789339 hits)  (op=0xd53cd041/  System Reg)
388c17a386bSAlex Bennée  Instr: mrs x2, tpidr_el2        (1513494 hits)  (op=0xd53cd042/  System Reg)
389c17a386bSAlex Bennée  Instr: mrs x0, tpidr_el2        (1490823 hits)  (op=0xd53cd040/  System Reg)
390c17a386bSAlex Bennée  Instr: mrs x1, sp_el0           (933793 hits)   (op=0xd5384101/  System Reg)
391c17a386bSAlex Bennée  Instr: mrs x2, sp_el0           (699516 hits)   (op=0xd5384102/  System Reg)
392c17a386bSAlex Bennée  Instr: mrs x4, tpidr_el2        (528437 hits)   (op=0xd53cd044/  System Reg)
393c17a386bSAlex Bennée  Instr: mrs x30, ttbr1_el1       (480776 hits)   (op=0xd538203e/  System Reg)
394c17a386bSAlex Bennée  Instr: msr ttbr1_el1, x30       (480713 hits)   (op=0xd518203e/  System Reg)
395c17a386bSAlex Bennée  Instr: msr vbar_el1, x30        (480671 hits)   (op=0xd518c01e/  System Reg)
396c17a386bSAlex Bennée  ...
397c17a386bSAlex Bennée
398c17a386bSAlex BennéeTo find the argument shorthand for the class you need to examine the
3991e235edaSPeter Maydellsource code of the plugin at the moment, specifically the ``*opt``
400c17a386bSAlex Bennéeargument in the InsnClassExecCount tables.
401c17a386bSAlex Bennée
402c17a386bSAlex Bennée- contrib/plugins/lockstep.c
403c17a386bSAlex Bennée
404c17a386bSAlex BennéeThis is a debugging tool for developers who want to find out when and
405c17a386bSAlex Bennéewhere execution diverges after a subtle change to TCG code generation.
406c17a386bSAlex BennéeIt is not an exact science and results are likely to be mixed once
407c17a386bSAlex Bennéeasynchronous events are introduced. While the use of -icount can
408c17a386bSAlex Bennéeintroduce determinism to the execution flow it doesn't always follow
409c17a386bSAlex Bennéethe translation sequence will be exactly the same. Typically this is
410c17a386bSAlex Bennéecaused by a timer firing to service the GUI causing a block to end
411c17a386bSAlex Bennéeearly. However in some cases it has proved to be useful in pointing
412c17a386bSAlex Bennéepeople at roughly where execution diverges. The only argument you need
413c17a386bSAlex Bennéefor the plugin is a path for the socket the two instances will
414c17a386bSAlex Bennéecommunicate over::
415c17a386bSAlex Bennée
416c17a386bSAlex Bennée
4171d0603a9SAlex Bennée  $ qemu-system-sparc -monitor none -parallel none \
418c17a386bSAlex Bennée    -net none -M SS-20 -m 256 -kernel day11/zImage.elf \
419b18a0cadSMahmoud Mandour    -plugin ./contrib/plugins/liblockstep.so,sockpath=lockstep-sparc.sock \
420c17a386bSAlex Bennée    -d plugin,nochain
421c17a386bSAlex Bennée
422c17a386bSAlex Bennéewhich will eventually report::
423c17a386bSAlex Bennée
424c17a386bSAlex Bennée  qemu-system-sparc: warning: nic lance.0 has no peer
425c17a386bSAlex Bennée  @ 0x000000ffd06678 vs 0x000000ffd001e0 (2/1 since last)
426c17a386bSAlex Bennée  @ 0x000000ffd07d9c vs 0x000000ffd06678 (3/1 since last)
427c17a386bSAlex Bennée  Δ insn_count @ 0x000000ffd07d9c (809900609) vs 0x000000ffd06678 (809900612)
428c17a386bSAlex Bennée    previously @ 0x000000ffd06678/10 (809900609 insns)
429c17a386bSAlex Bennée    previously @ 0x000000ffd001e0/4 (809900599 insns)
430c17a386bSAlex Bennée    previously @ 0x000000ffd080ac/2 (809900595 insns)
431c17a386bSAlex Bennée    previously @ 0x000000ffd08098/5 (809900593 insns)
432c17a386bSAlex Bennée    previously @ 0x000000ffd080c0/1 (809900588 insns)
433c17a386bSAlex Bennée
434a35af836SMahmoud Mandour- contrib/plugins/hwprofile.c
435a622d64eSAlex Bennée
436a622d64eSAlex BennéeThe hwprofile tool can only be used with system emulation and allows
437a622d64eSAlex Bennéethe user to see what hardware is accessed how often. It has a number of options:
438a622d64eSAlex Bennée
43960753843SMahmoud Mandour * track=read or track=write
440a622d64eSAlex Bennée
441a622d64eSAlex Bennée By default the plugin tracks both reads and writes. You can use one
442a622d64eSAlex Bennée of these options to limit the tracking to just one class of accesses.
443a622d64eSAlex Bennée
44460753843SMahmoud Mandour * source
445a622d64eSAlex Bennée
446a622d64eSAlex Bennée Will include a detailed break down of what the guest PC that made the
44760753843SMahmoud Mandour access was. Not compatible with the pattern option. Example output::
448a622d64eSAlex Bennée
449a622d64eSAlex Bennée   cirrus-low-memory @ 0xfffffd00000a0000
450a622d64eSAlex Bennée    pc:fffffc0000005cdc, 1, 256
451a622d64eSAlex Bennée    pc:fffffc0000005ce8, 1, 256
452a622d64eSAlex Bennée    pc:fffffc0000005cec, 1, 256
453a622d64eSAlex Bennée
45460753843SMahmoud Mandour * pattern
455a622d64eSAlex Bennée
456a622d64eSAlex Bennée Instead break down the accesses based on the offset into the HW
457a622d64eSAlex Bennée region. This can be useful for seeing the most used registers of a
458a622d64eSAlex Bennée device. Example output::
459a622d64eSAlex Bennée
460a622d64eSAlex Bennée    pci0-conf @ 0xfffffd01fe000000
461a622d64eSAlex Bennée      off:00000004, 1, 1
462a622d64eSAlex Bennée      off:00000010, 1, 3
463a622d64eSAlex Bennée      off:00000014, 1, 3
464a622d64eSAlex Bennée      off:00000018, 1, 2
465a622d64eSAlex Bennée      off:0000001c, 1, 2
466a622d64eSAlex Bennée      off:00000020, 1, 2
467a622d64eSAlex Bennée      ...
468307ce0aaSAlexandre Iooss
469307ce0aaSAlexandre Iooss- contrib/plugins/execlog.c
470307ce0aaSAlexandre Iooss
471307ce0aaSAlexandre IoossThe execlog tool traces executed instructions with memory access. It can be used
472307ce0aaSAlexandre Ioossfor debugging and security analysis purposes.
473307ce0aaSAlexandre IoossPlease be aware that this will generate a lot of output.
474307ce0aaSAlexandre Iooss
475b7855bf6SAlex BennéeThe plugin needs default argument::
476307ce0aaSAlexandre Iooss
4771d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
478307ce0aaSAlexandre Iooss    -plugin ./contrib/plugins/libexeclog.so -d plugin
479307ce0aaSAlexandre Iooss
480307ce0aaSAlexandre Ioosswhich will output an execution trace following this structure::
481307ce0aaSAlexandre Iooss
482307ce0aaSAlexandre Iooss  # vCPU, vAddr, opcode, disassembly[, load/store, memory addr, device]...
483307ce0aaSAlexandre Iooss  0, 0xa12, 0xf8012400, "movs r4, #0"
484307ce0aaSAlexandre Iooss  0, 0xa14, 0xf87f42b4, "cmp r4, r6"
485307ce0aaSAlexandre Iooss  0, 0xa16, 0xd206, "bhs #0xa26"
486307ce0aaSAlexandre Iooss  0, 0xa18, 0xfff94803, "ldr r0, [pc, #0xc]", load, 0x00010a28, RAM
487307ce0aaSAlexandre Iooss  0, 0xa1a, 0xf989f000, "bl #0xd30"
488307ce0aaSAlexandre Iooss  0, 0xd30, 0xfff9b510, "push {r4, lr}", store, 0x20003ee0, RAM, store, 0x20003ee4, RAM
489307ce0aaSAlexandre Iooss  0, 0xd32, 0xf9893014, "adds r0, #0x14"
490307ce0aaSAlexandre Iooss  0, 0xd34, 0xf9c8f000, "bl #0x10c8"
491307ce0aaSAlexandre Iooss  0, 0x10c8, 0xfff96c43, "ldr r3, [r0, #0x44]", load, 0x200000e4, RAM
4924c125f3bSMahmoud Mandour
493b7855bf6SAlex Bennéethe output can be filtered to only track certain instructions or
4941d0603a9SAlex Bennéeaddresses using the ``ifilter`` or ``afilter`` options. You can stack the
495b7855bf6SAlex Bennéearguments if required::
496b7855bf6SAlex Bennée
4971d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
498b7855bf6SAlex Bennée    -plugin ./contrib/plugins/libexeclog.so,ifilter=st1w,afilter=0x40001808 -d plugin
499b7855bf6SAlex Bennée
500af6e4e0aSAlex BennéeThis plugin can also dump registers when they change value. Specify the name of the
501af6e4e0aSAlex Bennéeregisters with multiple ``reg`` options. You can also use glob style matching if you wish::
502af6e4e0aSAlex Bennée
503af6e4e0aSAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
504af6e4e0aSAlex Bennée    -plugin ./contrib/plugins/libexeclog.so,reg=\*_el2,reg=sp -d plugin
505af6e4e0aSAlex Bennée
506af6e4e0aSAlex BennéeBe aware that each additional register to check will slow down
507af6e4e0aSAlex Bennéeexecution quite considerably. You can optimise the number of register
508af6e4e0aSAlex Bennéechecks done by using the rdisas option. This will only instrument
509af6e4e0aSAlex Bennéeinstructions that mention the registers in question in disassembly.
510af6e4e0aSAlex BennéeThis is not foolproof as some instructions implicitly change
511af6e4e0aSAlex Bennéeinstructions. You can use the ifilter to catch these cases:
512af6e4e0aSAlex Bennée
513af6e4e0aSAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
514af6e4e0aSAlex Bennée    -plugin ./contrib/plugins/libexeclog.so,ifilter=msr,ifilter=blr,reg=x30,reg=\*_el1,rdisas=on
515af6e4e0aSAlex Bennée
516a35af836SMahmoud Mandour- contrib/plugins/cache.c
5174c125f3bSMahmoud Mandour
518b8312e04SMahmoud MandourCache modelling plugin that measures the performance of a given L1 cache
519b8312e04SMahmoud Mandourconfiguration, and optionally a unified L2 per-core cache when a given working
520b8312e04SMahmoud Mandourset is run::
5214c125f3bSMahmoud Mandour
5221d0603a9SAlex Bennée  $ qemu-x86_64 -plugin ./contrib/plugins/libcache.so \
5234c125f3bSMahmoud Mandour      -d plugin -D cache.log ./tests/tcg/x86_64-linux-user/float_convs
5244c125f3bSMahmoud Mandour
5254c125f3bSMahmoud Mandourwill report the following::
5264c125f3bSMahmoud Mandour
5275397acb8SMahmoud Mandour    core #, data accesses, data misses, dmiss rate, insn accesses, insn misses, imiss rate
5285397acb8SMahmoud Mandour    0       996695         508             0.0510%  2642799        18617           0.7044%
5294c125f3bSMahmoud Mandour
5304c125f3bSMahmoud Mandour    address, data misses, instruction
5314c125f3bSMahmoud Mandour    0x424f1e (_int_malloc), 109, movq %rax, 8(%rcx)
5324c125f3bSMahmoud Mandour    0x41f395 (_IO_default_xsputn), 49, movb %dl, (%rdi, %rax)
5334c125f3bSMahmoud Mandour    0x42584d (ptmalloc_init.part.0), 33, movaps %xmm0, (%rax)
5344c125f3bSMahmoud Mandour    0x454d48 (__tunables_init), 20, cmpb $0, (%r8)
5354c125f3bSMahmoud Mandour    ...
5364c125f3bSMahmoud Mandour
5374c125f3bSMahmoud Mandour    address, fetch misses, instruction
5384c125f3bSMahmoud Mandour    0x4160a0 (__vfprintf_internal), 744, movl $1, %ebx
5394c125f3bSMahmoud Mandour    0x41f0a0 (_IO_setb), 744, endbr64
5404c125f3bSMahmoud Mandour    0x415882 (__vfprintf_internal), 744, movq %r12, %rdi
5414c125f3bSMahmoud Mandour    0x4268a0 (__malloc), 696, andq $0xfffffffffffffff0, %rax
5424c125f3bSMahmoud Mandour    ...
5434c125f3bSMahmoud Mandour
5444c125f3bSMahmoud MandourThe plugin has a number of arguments, all of them are optional:
5454c125f3bSMahmoud Mandour
5462dd3fef8SMahmoud Mandour  * limit=N
5474c125f3bSMahmoud Mandour
5484c125f3bSMahmoud Mandour  Print top N icache and dcache thrashing instructions along with their
5494c125f3bSMahmoud Mandour  address, number of misses, and its disassembly. (default: 32)
5504c125f3bSMahmoud Mandour
5512dd3fef8SMahmoud Mandour  * icachesize=N
5522dd3fef8SMahmoud Mandour  * iblksize=B
5532dd3fef8SMahmoud Mandour  * iassoc=A
5544c125f3bSMahmoud Mandour
5554c125f3bSMahmoud Mandour  Instruction cache configuration arguments. They specify the cache size, block
5564c125f3bSMahmoud Mandour  size, and associativity of the instruction cache, respectively.
5574c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
5584c125f3bSMahmoud Mandour
5592dd3fef8SMahmoud Mandour  * dcachesize=N
5602dd3fef8SMahmoud Mandour  * dblksize=B
5612dd3fef8SMahmoud Mandour  * dassoc=A
5624c125f3bSMahmoud Mandour
5634c125f3bSMahmoud Mandour  Data cache configuration arguments. They specify the cache size, block size,
5644c125f3bSMahmoud Mandour  and associativity of the data cache, respectively.
5654c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
5664c125f3bSMahmoud Mandour
5672dd3fef8SMahmoud Mandour  * evict=POLICY
5684c125f3bSMahmoud Mandour
5694c125f3bSMahmoud Mandour  Sets the eviction policy to POLICY. Available policies are: :code:`lru`,
5704c125f3bSMahmoud Mandour  :code:`fifo`, and :code:`rand`. The plugin will use the specified policy for
5714c125f3bSMahmoud Mandour  both instruction and data caches. (default: POLICY = :code:`lru`)
5725397acb8SMahmoud Mandour
5732dd3fef8SMahmoud Mandour  * cores=N
5745397acb8SMahmoud Mandour
5755397acb8SMahmoud Mandour  Sets the number of cores for which we maintain separate icache and dcache.
5765397acb8SMahmoud Mandour  (default: for linux-user, N = 1, for full system emulation: N = cores
5775397acb8SMahmoud Mandour  available to guest)
578b8312e04SMahmoud Mandour
579b8312e04SMahmoud Mandour  * l2=on
580b8312e04SMahmoud Mandour
581b8312e04SMahmoud Mandour  Simulates a unified L2 cache (stores blocks for both instructions and data)
582b8312e04SMahmoud Mandour  using the default L2 configuration (cache size = 2MB, associativity = 16-way,
583b8312e04SMahmoud Mandour  block size = 64B).
584b8312e04SMahmoud Mandour
585b8312e04SMahmoud Mandour  * l2cachesize=N
586b8312e04SMahmoud Mandour  * l2blksize=B
587b8312e04SMahmoud Mandour  * l2assoc=A
588b8312e04SMahmoud Mandour
589b8312e04SMahmoud Mandour  L2 cache configuration arguments. They specify the cache size, block size, and
590b8312e04SMahmoud Mandour  associativity of the L2 cache, respectively. Setting any of the L2
591b8312e04SMahmoud Mandour  configuration arguments implies ``l2=on``.
592b8312e04SMahmoud Mandour  (default: N = 2097152 (2MB), B = 64, A = 16)
5937f522743SAlex Bennée
594*b0b3c0f5SAlex BennéePlugin API
595*b0b3c0f5SAlex Bennée==========
5967f522743SAlex Bennée
5977f522743SAlex BennéeThe following API is generated from the inline documentation in
5987f522743SAlex Bennée``include/qemu/qemu-plugin.h``. Please ensure any updates to the API
5997f522743SAlex Bennéeinclude the full kernel-doc annotations.
6007f522743SAlex Bennée
6017f522743SAlex Bennée.. kernel-doc:: include/qemu/qemu-plugin.h
602