xref: /qemu/docs/devel/tcg-plugins.rst (revision 59195c6558913dcc6ec6d8cfb71f0461a7769174)
1027e3332SAlex Bennée..
2027e3332SAlex Bennée   Copyright (C) 2017, Emilio G. Cota <cota@braap.org>
3027e3332SAlex Bennée   Copyright (c) 2019, Linaro Limited
4027e3332SAlex Bennée   Written by Emilio Cota and Alex Bennée
5027e3332SAlex Bennée
6027e3332SAlex BennéeQEMU TCG Plugins
7027e3332SAlex Bennée================
8027e3332SAlex Bennée
9027e3332SAlex BennéeQEMU TCG plugins provide a way for users to run experiments taking
10027e3332SAlex Bennéeadvantage of the total system control emulation can have over a guest.
11027e3332SAlex BennéeIt provides a mechanism for plugins to subscribe to events during
12027e3332SAlex Bennéetranslation and execution and optionally callback into the plugin
13027e3332SAlex Bennéeduring these events. TCG plugins are unable to change the system state
14027e3332SAlex Bennéeonly monitor it passively. However they can do this down to an
15027e3332SAlex Bennéeindividual instruction granularity including potentially subscribing
16027e3332SAlex Bennéeto all load and store operations.
17027e3332SAlex Bennée
18027e3332SAlex BennéeUsage
19e9adb4acSPaolo Bonzini-----
20027e3332SAlex Bennée
21ba4dd2aaSAlex BennéeAny QEMU binary with TCG support has plugins enabled by default.
22ba4dd2aaSAlex BennéeEarlier releases needed to be explicitly enabled with::
23027e3332SAlex Bennée
24027e3332SAlex Bennée  configure --enable-plugins
25027e3332SAlex Bennée
26027e3332SAlex BennéeOnce built a program can be run with multiple plugins loaded each with
275c6ecbdcSAlex Bennéetheir own arguments::
28027e3332SAlex Bennée
29027e3332SAlex Bennée  $QEMU $OTHER_QEMU_ARGS \
300f37cf2fSChristoph Muellner      -plugin contrib/plugin/libhowvec.so,inline=on,count=hint \
310f37cf2fSChristoph Muellner      -plugin contrib/plugin/libhotblocks.so
32027e3332SAlex Bennée
33027e3332SAlex BennéeArguments are plugin specific and can be used to modify their
34027e3332SAlex Bennéebehaviour. In this case the howvec plugin is being asked to use inline
35027e3332SAlex Bennéeops to count and break down the hint instructions by type.
36027e3332SAlex Bennée
370f37cf2fSChristoph MuellnerLinux user-mode emulation also evaluates the environment variable
380f37cf2fSChristoph Muellner``QEMU_PLUGIN``::
390f37cf2fSChristoph Muellner
400f37cf2fSChristoph Muellner  QEMU_PLUGIN="file=contrib/plugins/libhowvec.so,inline=on,count=hint" $QEMU
410f37cf2fSChristoph Muellner
42e9adb4acSPaolo BonziniWriting plugins
43e9adb4acSPaolo Bonzini---------------
44e9adb4acSPaolo Bonzini
45e9adb4acSPaolo BonziniAPI versioning
46e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~
47e9adb4acSPaolo Bonzini
48e9adb4acSPaolo BonziniThis is a new feature for QEMU and it does allow people to develop
49e9adb4acSPaolo Bonziniout-of-tree plugins that can be dynamically linked into a running QEMU
50e9adb4acSPaolo Bonziniprocess. However the project reserves the right to change or break the
51e9adb4acSPaolo BonziniAPI should it need to do so. The best way to avoid this is to submit
52e9adb4acSPaolo Bonziniyour plugin upstream so they can be updated if/when the API changes.
53e9adb4acSPaolo Bonzini
54e9adb4acSPaolo BonziniAll plugins need to declare a symbol which exports the plugin API
55e9adb4acSPaolo Bonziniversion they were built against. This can be done simply by::
56e9adb4acSPaolo Bonzini
57e9adb4acSPaolo Bonzini  QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION;
58e9adb4acSPaolo Bonzini
59e9adb4acSPaolo BonziniThe core code will refuse to load a plugin that doesn't export a
60e9adb4acSPaolo Bonzini``qemu_plugin_version`` symbol or if plugin version is outside of QEMU's
61e9adb4acSPaolo Bonzinisupported range of API versions.
62e9adb4acSPaolo Bonzini
63e9adb4acSPaolo BonziniAdditionally the ``qemu_info_t`` structure which is passed to the
64e9adb4acSPaolo Bonzini``qemu_plugin_install`` method of a plugin will detail the minimum and
65e9adb4acSPaolo Bonzinicurrent API versions supported by QEMU. The API version will be
66e9adb4acSPaolo Bonziniincremented if new APIs are added. The minimum API version will be
67e9adb4acSPaolo Bonziniincremented if existing APIs are changed or removed.
68e9adb4acSPaolo Bonzini
69e9adb4acSPaolo BonziniLifetime of the query handle
70e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~~~~~~~~~~~~
71e9adb4acSPaolo Bonzini
72e9adb4acSPaolo BonziniEach callback provides an opaque anonymous information handle which
73e9adb4acSPaolo Bonzinican usually be further queried to find out information about a
74e9adb4acSPaolo Bonzinitranslation, instruction or operation. The handles themselves are only
75e9adb4acSPaolo Bonzinivalid during the lifetime of the callback so it is important that any
76e9adb4acSPaolo Bonziniinformation that is needed is extracted during the callback and saved
77e9adb4acSPaolo Bonziniby the plugin.
78e9adb4acSPaolo Bonzini
79e9adb4acSPaolo BonziniPlugin life cycle
80e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~
81027e3332SAlex Bennée
82027e3332SAlex BennéeFirst the plugin is loaded and the public qemu_plugin_install function
83027e3332SAlex Bennéeis called. The plugin will then register callbacks for various plugin
84027e3332SAlex Bennéeevents. Generally plugins will register a handler for the *atexit*
85027e3332SAlex Bennéeif they want to dump a summary of collected information once the
86027e3332SAlex Bennéeprogram/system has finished running.
87027e3332SAlex Bennée
88027e3332SAlex BennéeWhen a registered event occurs the plugin callback is invoked. The
89027e3332SAlex Bennéecallbacks may provide additional information. In the case of a
90027e3332SAlex Bennéetranslation event the plugin has an option to enumerate the
91027e3332SAlex Bennéeinstructions in a block of instructions and optionally register
92027e3332SAlex Bennéecallbacks to some or all instructions when they are executed.
93027e3332SAlex Bennée
94027e3332SAlex BennéeThere is also a facility to add an inline event where code to
95027e3332SAlex Bennéeincrement a counter can be directly inlined with the translation.
96027e3332SAlex BennéeCurrently only a simple increment is supported. This is not atomic so
97027e3332SAlex Bennéecan miss counts. If you want absolute precision you should use a
98027e3332SAlex Bennéecallback which can then ensure atomicity itself.
99027e3332SAlex Bennée
100027e3332SAlex BennéeFinally when QEMU exits all the registered *atexit* callbacks are
101027e3332SAlex Bennéeinvoked.
102027e3332SAlex Bennée
103e9adb4acSPaolo BonziniExposure of QEMU internals
104e9adb4acSPaolo Bonzini~~~~~~~~~~~~~~~~~~~~~~~~~~
105e9adb4acSPaolo Bonzini
106e9adb4acSPaolo BonziniThe plugin architecture actively avoids leaking implementation details
107e9adb4acSPaolo Bonziniabout how QEMU's translation works to the plugins. While there are
108e9adb4acSPaolo Bonziniconceptions such as translation time and translation blocks the
109e9adb4acSPaolo Bonzinidetails are opaque to plugins. The plugin is able to query select
110e9adb4acSPaolo Bonzinidetails of instructions and system configuration only through the
111e9adb4acSPaolo Bonziniexported *qemu_plugin* functions.
112e9adb4acSPaolo Bonzini
113027e3332SAlex BennéeInternals
114e9adb4acSPaolo Bonzini---------
115027e3332SAlex Bennée
116027e3332SAlex BennéeLocking
117e9adb4acSPaolo Bonzini~~~~~~~
118027e3332SAlex Bennée
119027e3332SAlex BennéeWe have to ensure we cannot deadlock, particularly under MTTCG. For
120027e3332SAlex Bennéethis we acquire a lock when called from plugin code. We also keep the
121027e3332SAlex Bennéelist of callbacks under RCU so that we do not have to hold the lock
122027e3332SAlex Bennéewhen calling the callbacks. This is also for performance, since some
123027e3332SAlex Bennéecallbacks (e.g. memory access callbacks) might be called very
124027e3332SAlex Bennéefrequently.
125027e3332SAlex Bennée
126027e3332SAlex Bennée  * A consequence of this is that we keep our own list of CPUs, so that
127027e3332SAlex Bennée    we do not have to worry about locking order wrt cpu_list_lock.
128027e3332SAlex Bennée  * Use a recursive lock, since we can get registration calls from
129027e3332SAlex Bennée    callbacks.
130027e3332SAlex Bennée
131027e3332SAlex BennéeAs a result registering/unregistering callbacks is "slow", since it
132027e3332SAlex Bennéetakes a lock. But this is very infrequent; we want performance when
133027e3332SAlex Bennéecalling (or not calling) callbacks, not when registering them. Using
134027e3332SAlex BennéeRCU is great for this.
135027e3332SAlex Bennée
136027e3332SAlex BennéeWe support the uninstallation of a plugin at any time (e.g. from
137027e3332SAlex Bennéeplugin callbacks). This allows plugins to remove themselves if they no
138027e3332SAlex Bennéelonger want to instrument the code. This operation is asynchronous
139027e3332SAlex Bennéewhich means callbacks may still occur after the uninstall operation is
140027e3332SAlex Bennéerequested. The plugin isn't completely uninstalled until the safe work
141027e3332SAlex Bennéehas executed while all vCPUs are quiescent.
142c17a386bSAlex Bennée
143c17a386bSAlex BennéeExample Plugins
144e9adb4acSPaolo Bonzini---------------
145c17a386bSAlex Bennée
146c17a386bSAlex BennéeThere are a number of plugins included with QEMU and you are
147c17a386bSAlex Bennéeencouraged to contribute your own plugins plugins upstream. There is a
148*59195c65SAlex Bennée``contrib/plugins`` directory where they can go. There are also some
149*59195c65SAlex Bennéebasic plugins that are used to test and exercise the API during the
150*59195c65SAlex Bennée``make check-tcg`` target in ``tests\plugins``.
151c17a386bSAlex Bennée
152*59195c65SAlex Bennée- tests/plugins/empty.c
153c17a386bSAlex Bennée
154*59195c65SAlex BennéePurely a test plugin for measuring the overhead of the plugins system
155*59195c65SAlex Bennéeitself. Does no instrumentation.
156*59195c65SAlex Bennée
157*59195c65SAlex Bennée- tests/plugins/bb.c
158*59195c65SAlex Bennée
159*59195c65SAlex BennéeA very basic plugin which will measure execution in course terms as
160*59195c65SAlex Bennéeeach basic block is executed. By default the results are shown once
161*59195c65SAlex Bennéeexecution finishes::
162*59195c65SAlex Bennée
163*59195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libbb.so \
164*59195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/sha1
165*59195c65SAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
166*59195c65SAlex Bennée  bb's: 2277338, insns: 158483046
167*59195c65SAlex Bennée
168*59195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
169*59195c65SAlex Bennée
170*59195c65SAlex Bennée * inline=true|false
171*59195c65SAlex Bennée
172*59195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
173*59195c65SAlex Bennée thread safe.
174*59195c65SAlex Bennée
175*59195c65SAlex Bennée * idle=true|false
176*59195c65SAlex Bennée
177*59195c65SAlex Bennée Dump the current execution stats whenever the guest vCPU idles
178*59195c65SAlex Bennée
179*59195c65SAlex Bennée- tests/plugins/insn.c
180*59195c65SAlex Bennée
181*59195c65SAlex BennéeThis is a basic instruction level instrumentation which can count the
182*59195c65SAlex Bennéenumber of instructions executed on each core/thread::
183*59195c65SAlex Bennée
184*59195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libinsn.so \
185*59195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/threadcount
186*59195c65SAlex Bennée  Created 10 threads
187*59195c65SAlex Bennée  Done
188*59195c65SAlex Bennée  cpu 0 insns: 46765
189*59195c65SAlex Bennée  cpu 1 insns: 3694
190*59195c65SAlex Bennée  cpu 2 insns: 3694
191*59195c65SAlex Bennée  cpu 3 insns: 2994
192*59195c65SAlex Bennée  cpu 4 insns: 1497
193*59195c65SAlex Bennée  cpu 5 insns: 1497
194*59195c65SAlex Bennée  cpu 6 insns: 1497
195*59195c65SAlex Bennée  cpu 7 insns: 1497
196*59195c65SAlex Bennée  total insns: 63135
197*59195c65SAlex Bennée
198*59195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
199*59195c65SAlex Bennée
200*59195c65SAlex Bennée * inline=true|false
201*59195c65SAlex Bennée
202*59195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
203*59195c65SAlex Bennée thread safe.
204*59195c65SAlex Bennée
205*59195c65SAlex Bennée * sizes=true|false
206*59195c65SAlex Bennée
207*59195c65SAlex Bennée Give a summary of the instruction sizes for the execution
208*59195c65SAlex Bennée
209*59195c65SAlex Bennée * match=<string>
210*59195c65SAlex Bennée
211*59195c65SAlex Bennée Only instrument instructions matching the string prefix. Will show
212*59195c65SAlex Bennée some basic stats including how many instructions have executed since
213*59195c65SAlex Bennée the last execution. For example::
214*59195c65SAlex Bennée
215*59195c65SAlex Bennée   $ qemu-aarch64 -plugin tests/plugin/libinsn.so,match=bl \
216*59195c65SAlex Bennée       -d plugin ./tests/tcg/aarch64-linux-user/sha512-vector
217*59195c65SAlex Bennée   ...
218*59195c65SAlex Bennée   0x40069c, 'bl #0x4002b0', 10 hits, 1093 match hits, Δ+1257 since last match, 98 avg insns/match
219*59195c65SAlex Bennée   0x4006ac, 'bl #0x403690', 10 hits, 1094 match hits, Δ+47 since last match, 98 avg insns/match
220*59195c65SAlex Bennée   0x4037fc, 'bl #0x4002b0', 18 hits, 1095 match hits, Δ+22 since last match, 98 avg insns/match
221*59195c65SAlex Bennée   0x400720, 'bl #0x403690', 10 hits, 1096 match hits, Δ+58 since last match, 98 avg insns/match
222*59195c65SAlex Bennée   0x4037fc, 'bl #0x4002b0', 19 hits, 1097 match hits, Δ+22 since last match, 98 avg insns/match
223*59195c65SAlex Bennée   0x400730, 'bl #0x403690', 10 hits, 1098 match hits, Δ+33 since last match, 98 avg insns/match
224*59195c65SAlex Bennée   0x4037ac, 'bl #0x4002b0', 12 hits, 1099 match hits, Δ+20 since last match, 98 avg insns/match
225*59195c65SAlex Bennée   ...
226*59195c65SAlex Bennée
227*59195c65SAlex BennéeFor more detailed execution tracing see the ``execlog`` plugin for
228*59195c65SAlex Bennéeother options.
229*59195c65SAlex Bennée
230*59195c65SAlex Bennée- tests/plugins/mem.c
231*59195c65SAlex Bennée
232*59195c65SAlex BennéeBasic instruction level memory instrumentation::
233*59195c65SAlex Bennée
234*59195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libmem.so,inline=true \
235*59195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/sha1
236*59195c65SAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
237*59195c65SAlex Bennée  inline mem accesses: 79525013
238*59195c65SAlex Bennée
239*59195c65SAlex BennéeBehaviour can be tweaked with the following arguments:
240*59195c65SAlex Bennée
241*59195c65SAlex Bennée * inline=true|false
242*59195c65SAlex Bennée
243*59195c65SAlex Bennée Use faster inline addition of a single counter. Not per-cpu and not
244*59195c65SAlex Bennée thread safe.
245*59195c65SAlex Bennée
246*59195c65SAlex Bennée * callback=true|false
247*59195c65SAlex Bennée
248*59195c65SAlex Bennée Use callbacks on each memory instrumentation.
249*59195c65SAlex Bennée
250*59195c65SAlex Bennée * hwaddr=true|false
251*59195c65SAlex Bennée
252*59195c65SAlex Bennée Count IO accesses (only for system emulation)
253*59195c65SAlex Bennée
254*59195c65SAlex Bennée- tests/plugins/syscall.c
255*59195c65SAlex Bennée
256*59195c65SAlex BennéeA basic syscall tracing plugin. This only works for user-mode. By
257*59195c65SAlex Bennéedefault it will give a summary of syscall stats at the end of the
258*59195c65SAlex Bennéerun::
259*59195c65SAlex Bennée
260*59195c65SAlex Bennée  $ qemu-aarch64 -plugin tests/plugin/libsyscall \
261*59195c65SAlex Bennée      -d plugin ./tests/tcg/aarch64-linux-user/threadcount
262*59195c65SAlex Bennée  Created 10 threads
263*59195c65SAlex Bennée  Done
264*59195c65SAlex Bennée  syscall no.  calls  errors
265*59195c65SAlex Bennée  226          12     0
266*59195c65SAlex Bennée  99           11     11
267*59195c65SAlex Bennée  115          11     0
268*59195c65SAlex Bennée  222          11     0
269*59195c65SAlex Bennée  93           10     0
270*59195c65SAlex Bennée  220          10     0
271*59195c65SAlex Bennée  233          10     0
272*59195c65SAlex Bennée  215          8      0
273*59195c65SAlex Bennée  214          4      0
274*59195c65SAlex Bennée  134          2      0
275*59195c65SAlex Bennée  64           2      0
276*59195c65SAlex Bennée  96           1      0
277*59195c65SAlex Bennée  94           1      0
278*59195c65SAlex Bennée  80           1      0
279*59195c65SAlex Bennée  261          1      0
280*59195c65SAlex Bennée  78           1      0
281*59195c65SAlex Bennée  160          1      0
282*59195c65SAlex Bennée  135          1      0
283c17a386bSAlex Bennée
284c17a386bSAlex Bennée- contrib/plugins/hotblocks.c
285c17a386bSAlex Bennée
286c17a386bSAlex BennéeThe hotblocks plugin allows you to examine the where hot paths of
287c17a386bSAlex Bennéeexecution are in your program. Once the program has finished you will
288c17a386bSAlex Bennéeget a sorted list of blocks reporting the starting PC, translation
289c17a386bSAlex Bennéecount, number of instructions and execution count. This will work best
290c17a386bSAlex Bennéewith linux-user execution as system emulation tends to generate
291c17a386bSAlex Bennéere-translations as blocks from different programs get swapped in and
292c17a386bSAlex Bennéeout of system memory.
293c17a386bSAlex Bennée
2941e235edaSPeter MaydellIf your program is single-threaded you can use the ``inline`` option for
295c17a386bSAlex Bennéeslightly faster (but not thread safe) counters.
296c17a386bSAlex Bennée
297c17a386bSAlex BennéeExample::
298c17a386bSAlex Bennée
2991d0603a9SAlex Bennée  $ qemu-aarch64 \
300c17a386bSAlex Bennée    -plugin contrib/plugins/libhotblocks.so -d plugin \
301c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
302c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
303c17a386bSAlex Bennée  collected 903 entries in the hash table
304c17a386bSAlex Bennée  pc, tcount, icount, ecount
305c17a386bSAlex Bennée  0x0000000041ed10, 1, 5, 66087
306c17a386bSAlex Bennée  0x000000004002b0, 1, 4, 66087
307c17a386bSAlex Bennée  ...
308c17a386bSAlex Bennée
309c17a386bSAlex Bennée- contrib/plugins/hotpages.c
310c17a386bSAlex Bennée
311c17a386bSAlex BennéeSimilar to hotblocks but this time tracks memory accesses::
312c17a386bSAlex Bennée
3131d0603a9SAlex Bennée  $ qemu-aarch64 \
314c17a386bSAlex Bennée    -plugin contrib/plugins/libhotpages.so -d plugin \
315c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
316c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
317c17a386bSAlex Bennée  Addr, RCPUs, Reads, WCPUs, Writes
318c17a386bSAlex Bennée  0x000055007fe000, 0x0001, 31747952, 0x0001, 8835161
319c17a386bSAlex Bennée  0x000055007ff000, 0x0001, 29001054, 0x0001, 8780625
320c17a386bSAlex Bennée  0x00005500800000, 0x0001, 687465, 0x0001, 335857
321c17a386bSAlex Bennée  0x0000000048b000, 0x0001, 130594, 0x0001, 355
322c17a386bSAlex Bennée  0x0000000048a000, 0x0001, 1826, 0x0001, 11
323c17a386bSAlex Bennée
324f698d5efSMahmoud MandourThe hotpages plugin can be configured using the following arguments:
325f698d5efSMahmoud Mandour
326f698d5efSMahmoud Mandour  * sortby=reads|writes|address
327f698d5efSMahmoud Mandour
328f698d5efSMahmoud Mandour  Log the data sorted by either the number of reads, the number of writes, or
329f698d5efSMahmoud Mandour  memory address. (Default: entries are sorted by the sum of reads and writes)
330f698d5efSMahmoud Mandour
331f698d5efSMahmoud Mandour  * io=on
332f698d5efSMahmoud Mandour
333f698d5efSMahmoud Mandour  Track IO addresses. Only relevant to full system emulation. (Default: off)
334f698d5efSMahmoud Mandour
335f698d5efSMahmoud Mandour  * pagesize=N
336f698d5efSMahmoud Mandour
337f698d5efSMahmoud Mandour  The page size used. (Default: N = 4096)
338f698d5efSMahmoud Mandour
339c17a386bSAlex Bennée- contrib/plugins/howvec.c
340c17a386bSAlex Bennée
341c17a386bSAlex BennéeThis is an instruction classifier so can be used to count different
342c17a386bSAlex Bennéetypes of instructions. It has a number of options to refine which get
343450e0f28SJohn Snowcounted. You can give a value to the ``count`` argument for a class of
344d8525358SMahmoud Mandourinstructions to break it down fully, so for example to see all the system
345d8525358SMahmoud Mandourregisters accesses::
346c17a386bSAlex Bennée
3471d0603a9SAlex Bennée  $ qemu-system-aarch64 $(QEMU_ARGS) \
348c17a386bSAlex Bennée    -append "root=/dev/sda2 systemd.unit=benchmark.service" \
349d8525358SMahmoud Mandour    -smp 4 -plugin ./contrib/plugins/libhowvec.so,count=sreg -d plugin
350c17a386bSAlex Bennée
351c17a386bSAlex Bennéewhich will lead to a sorted list after the class breakdown::
352c17a386bSAlex Bennée
353c17a386bSAlex Bennée  Instruction Classes:
354c17a386bSAlex Bennée  Class:   UDEF                   not counted
355c17a386bSAlex Bennée  Class:   SVE                    (68 hits)
356c17a386bSAlex Bennée  Class:   PCrel addr             (47789483 hits)
357c17a386bSAlex Bennée  Class:   Add/Sub (imm)          (192817388 hits)
358c17a386bSAlex Bennée  Class:   Logical (imm)          (93852565 hits)
359c17a386bSAlex Bennée  Class:   Move Wide (imm)        (76398116 hits)
360c17a386bSAlex Bennée  Class:   Bitfield               (44706084 hits)
361c17a386bSAlex Bennée  Class:   Extract                (5499257 hits)
362c17a386bSAlex Bennée  Class:   Cond Branch (imm)      (147202932 hits)
363c17a386bSAlex Bennée  Class:   Exception Gen          (193581 hits)
364c17a386bSAlex Bennée  Class:     NOP                  not counted
365c17a386bSAlex Bennée  Class:   Hints                  (6652291 hits)
366c17a386bSAlex Bennée  Class:   Barriers               (8001661 hits)
367c17a386bSAlex Bennée  Class:   PSTATE                 (1801695 hits)
368c17a386bSAlex Bennée  Class:   System Insn            (6385349 hits)
369c17a386bSAlex Bennée  Class:   System Reg             counted individually
370c17a386bSAlex Bennée  Class:   Branch (reg)           (69497127 hits)
371c17a386bSAlex Bennée  Class:   Branch (imm)           (84393665 hits)
372c17a386bSAlex Bennée  Class:   Cmp & Branch           (110929659 hits)
373c17a386bSAlex Bennée  Class:   Tst & Branch           (44681442 hits)
374c17a386bSAlex Bennée  Class:   AdvSimd ldstmult       (736 hits)
375c17a386bSAlex Bennée  Class:   ldst excl              (9098783 hits)
376c17a386bSAlex Bennée  Class:   Load Reg (lit)         (87189424 hits)
377c17a386bSAlex Bennée  Class:   ldst noalloc pair      (3264433 hits)
378c17a386bSAlex Bennée  Class:   ldst pair              (412526434 hits)
379c17a386bSAlex Bennée  Class:   ldst reg (imm)         (314734576 hits)
380c17a386bSAlex Bennée  Class: Loads & Stores           (2117774 hits)
381c17a386bSAlex Bennée  Class: Data Proc Reg            (223519077 hits)
382c17a386bSAlex Bennée  Class: Scalar FP                (31657954 hits)
383c17a386bSAlex Bennée  Individual Instructions:
384c17a386bSAlex Bennée  Instr: mrs x0, sp_el0           (2682661 hits)  (op=0xd5384100/  System Reg)
385c17a386bSAlex Bennée  Instr: mrs x1, tpidr_el2        (1789339 hits)  (op=0xd53cd041/  System Reg)
386c17a386bSAlex Bennée  Instr: mrs x2, tpidr_el2        (1513494 hits)  (op=0xd53cd042/  System Reg)
387c17a386bSAlex Bennée  Instr: mrs x0, tpidr_el2        (1490823 hits)  (op=0xd53cd040/  System Reg)
388c17a386bSAlex Bennée  Instr: mrs x1, sp_el0           (933793 hits)   (op=0xd5384101/  System Reg)
389c17a386bSAlex Bennée  Instr: mrs x2, sp_el0           (699516 hits)   (op=0xd5384102/  System Reg)
390c17a386bSAlex Bennée  Instr: mrs x4, tpidr_el2        (528437 hits)   (op=0xd53cd044/  System Reg)
391c17a386bSAlex Bennée  Instr: mrs x30, ttbr1_el1       (480776 hits)   (op=0xd538203e/  System Reg)
392c17a386bSAlex Bennée  Instr: msr ttbr1_el1, x30       (480713 hits)   (op=0xd518203e/  System Reg)
393c17a386bSAlex Bennée  Instr: msr vbar_el1, x30        (480671 hits)   (op=0xd518c01e/  System Reg)
394c17a386bSAlex Bennée  ...
395c17a386bSAlex Bennée
396c17a386bSAlex BennéeTo find the argument shorthand for the class you need to examine the
3971e235edaSPeter Maydellsource code of the plugin at the moment, specifically the ``*opt``
398c17a386bSAlex Bennéeargument in the InsnClassExecCount tables.
399c17a386bSAlex Bennée
400c17a386bSAlex Bennée- contrib/plugins/lockstep.c
401c17a386bSAlex Bennée
402c17a386bSAlex BennéeThis is a debugging tool for developers who want to find out when and
403c17a386bSAlex Bennéewhere execution diverges after a subtle change to TCG code generation.
404c17a386bSAlex BennéeIt is not an exact science and results are likely to be mixed once
405c17a386bSAlex Bennéeasynchronous events are introduced. While the use of -icount can
406c17a386bSAlex Bennéeintroduce determinism to the execution flow it doesn't always follow
407c17a386bSAlex Bennéethe translation sequence will be exactly the same. Typically this is
408c17a386bSAlex Bennéecaused by a timer firing to service the GUI causing a block to end
409c17a386bSAlex Bennéeearly. However in some cases it has proved to be useful in pointing
410c17a386bSAlex Bennéepeople at roughly where execution diverges. The only argument you need
411c17a386bSAlex Bennéefor the plugin is a path for the socket the two instances will
412c17a386bSAlex Bennéecommunicate over::
413c17a386bSAlex Bennée
414c17a386bSAlex Bennée
4151d0603a9SAlex Bennée  $ qemu-system-sparc -monitor none -parallel none \
416c17a386bSAlex Bennée    -net none -M SS-20 -m 256 -kernel day11/zImage.elf \
417b18a0cadSMahmoud Mandour    -plugin ./contrib/plugins/liblockstep.so,sockpath=lockstep-sparc.sock \
418c17a386bSAlex Bennée    -d plugin,nochain
419c17a386bSAlex Bennée
420c17a386bSAlex Bennéewhich will eventually report::
421c17a386bSAlex Bennée
422c17a386bSAlex Bennée  qemu-system-sparc: warning: nic lance.0 has no peer
423c17a386bSAlex Bennée  @ 0x000000ffd06678 vs 0x000000ffd001e0 (2/1 since last)
424c17a386bSAlex Bennée  @ 0x000000ffd07d9c vs 0x000000ffd06678 (3/1 since last)
425c17a386bSAlex Bennée  Δ insn_count @ 0x000000ffd07d9c (809900609) vs 0x000000ffd06678 (809900612)
426c17a386bSAlex Bennée    previously @ 0x000000ffd06678/10 (809900609 insns)
427c17a386bSAlex Bennée    previously @ 0x000000ffd001e0/4 (809900599 insns)
428c17a386bSAlex Bennée    previously @ 0x000000ffd080ac/2 (809900595 insns)
429c17a386bSAlex Bennée    previously @ 0x000000ffd08098/5 (809900593 insns)
430c17a386bSAlex Bennée    previously @ 0x000000ffd080c0/1 (809900588 insns)
431c17a386bSAlex Bennée
432a35af836SMahmoud Mandour- contrib/plugins/hwprofile.c
433a622d64eSAlex Bennée
434a622d64eSAlex BennéeThe hwprofile tool can only be used with system emulation and allows
435a622d64eSAlex Bennéethe user to see what hardware is accessed how often. It has a number of options:
436a622d64eSAlex Bennée
43760753843SMahmoud Mandour * track=read or track=write
438a622d64eSAlex Bennée
439a622d64eSAlex Bennée By default the plugin tracks both reads and writes. You can use one
440a622d64eSAlex Bennée of these options to limit the tracking to just one class of accesses.
441a622d64eSAlex Bennée
44260753843SMahmoud Mandour * source
443a622d64eSAlex Bennée
444a622d64eSAlex Bennée Will include a detailed break down of what the guest PC that made the
44560753843SMahmoud Mandour access was. Not compatible with the pattern option. Example output::
446a622d64eSAlex Bennée
447a622d64eSAlex Bennée   cirrus-low-memory @ 0xfffffd00000a0000
448a622d64eSAlex Bennée    pc:fffffc0000005cdc, 1, 256
449a622d64eSAlex Bennée    pc:fffffc0000005ce8, 1, 256
450a622d64eSAlex Bennée    pc:fffffc0000005cec, 1, 256
451a622d64eSAlex Bennée
45260753843SMahmoud Mandour * pattern
453a622d64eSAlex Bennée
454a622d64eSAlex Bennée Instead break down the accesses based on the offset into the HW
455a622d64eSAlex Bennée region. This can be useful for seeing the most used registers of a
456a622d64eSAlex Bennée device. Example output::
457a622d64eSAlex Bennée
458a622d64eSAlex Bennée    pci0-conf @ 0xfffffd01fe000000
459a622d64eSAlex Bennée      off:00000004, 1, 1
460a622d64eSAlex Bennée      off:00000010, 1, 3
461a622d64eSAlex Bennée      off:00000014, 1, 3
462a622d64eSAlex Bennée      off:00000018, 1, 2
463a622d64eSAlex Bennée      off:0000001c, 1, 2
464a622d64eSAlex Bennée      off:00000020, 1, 2
465a622d64eSAlex Bennée      ...
466307ce0aaSAlexandre Iooss
467307ce0aaSAlexandre Iooss- contrib/plugins/execlog.c
468307ce0aaSAlexandre Iooss
469307ce0aaSAlexandre IoossThe execlog tool traces executed instructions with memory access. It can be used
470307ce0aaSAlexandre Ioossfor debugging and security analysis purposes.
471307ce0aaSAlexandre IoossPlease be aware that this will generate a lot of output.
472307ce0aaSAlexandre Iooss
473b7855bf6SAlex BennéeThe plugin needs default argument::
474307ce0aaSAlexandre Iooss
4751d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
476307ce0aaSAlexandre Iooss    -plugin ./contrib/plugins/libexeclog.so -d plugin
477307ce0aaSAlexandre Iooss
478307ce0aaSAlexandre Ioosswhich will output an execution trace following this structure::
479307ce0aaSAlexandre Iooss
480307ce0aaSAlexandre Iooss  # vCPU, vAddr, opcode, disassembly[, load/store, memory addr, device]...
481307ce0aaSAlexandre Iooss  0, 0xa12, 0xf8012400, "movs r4, #0"
482307ce0aaSAlexandre Iooss  0, 0xa14, 0xf87f42b4, "cmp r4, r6"
483307ce0aaSAlexandre Iooss  0, 0xa16, 0xd206, "bhs #0xa26"
484307ce0aaSAlexandre Iooss  0, 0xa18, 0xfff94803, "ldr r0, [pc, #0xc]", load, 0x00010a28, RAM
485307ce0aaSAlexandre Iooss  0, 0xa1a, 0xf989f000, "bl #0xd30"
486307ce0aaSAlexandre Iooss  0, 0xd30, 0xfff9b510, "push {r4, lr}", store, 0x20003ee0, RAM, store, 0x20003ee4, RAM
487307ce0aaSAlexandre Iooss  0, 0xd32, 0xf9893014, "adds r0, #0x14"
488307ce0aaSAlexandre Iooss  0, 0xd34, 0xf9c8f000, "bl #0x10c8"
489307ce0aaSAlexandre Iooss  0, 0x10c8, 0xfff96c43, "ldr r3, [r0, #0x44]", load, 0x200000e4, RAM
4904c125f3bSMahmoud Mandour
491b7855bf6SAlex Bennéethe output can be filtered to only track certain instructions or
4921d0603a9SAlex Bennéeaddresses using the ``ifilter`` or ``afilter`` options. You can stack the
493b7855bf6SAlex Bennéearguments if required::
494b7855bf6SAlex Bennée
4951d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
496b7855bf6SAlex Bennée    -plugin ./contrib/plugins/libexeclog.so,ifilter=st1w,afilter=0x40001808 -d plugin
497b7855bf6SAlex Bennée
498a35af836SMahmoud Mandour- contrib/plugins/cache.c
4994c125f3bSMahmoud Mandour
500b8312e04SMahmoud MandourCache modelling plugin that measures the performance of a given L1 cache
501b8312e04SMahmoud Mandourconfiguration, and optionally a unified L2 per-core cache when a given working
502b8312e04SMahmoud Mandourset is run::
5034c125f3bSMahmoud Mandour
5041d0603a9SAlex Bennée  $ qemu-x86_64 -plugin ./contrib/plugins/libcache.so \
5054c125f3bSMahmoud Mandour      -d plugin -D cache.log ./tests/tcg/x86_64-linux-user/float_convs
5064c125f3bSMahmoud Mandour
5074c125f3bSMahmoud Mandourwill report the following::
5084c125f3bSMahmoud Mandour
5095397acb8SMahmoud Mandour    core #, data accesses, data misses, dmiss rate, insn accesses, insn misses, imiss rate
5105397acb8SMahmoud Mandour    0       996695         508             0.0510%  2642799        18617           0.7044%
5114c125f3bSMahmoud Mandour
5124c125f3bSMahmoud Mandour    address, data misses, instruction
5134c125f3bSMahmoud Mandour    0x424f1e (_int_malloc), 109, movq %rax, 8(%rcx)
5144c125f3bSMahmoud Mandour    0x41f395 (_IO_default_xsputn), 49, movb %dl, (%rdi, %rax)
5154c125f3bSMahmoud Mandour    0x42584d (ptmalloc_init.part.0), 33, movaps %xmm0, (%rax)
5164c125f3bSMahmoud Mandour    0x454d48 (__tunables_init), 20, cmpb $0, (%r8)
5174c125f3bSMahmoud Mandour    ...
5184c125f3bSMahmoud Mandour
5194c125f3bSMahmoud Mandour    address, fetch misses, instruction
5204c125f3bSMahmoud Mandour    0x4160a0 (__vfprintf_internal), 744, movl $1, %ebx
5214c125f3bSMahmoud Mandour    0x41f0a0 (_IO_setb), 744, endbr64
5224c125f3bSMahmoud Mandour    0x415882 (__vfprintf_internal), 744, movq %r12, %rdi
5234c125f3bSMahmoud Mandour    0x4268a0 (__malloc), 696, andq $0xfffffffffffffff0, %rax
5244c125f3bSMahmoud Mandour    ...
5254c125f3bSMahmoud Mandour
5264c125f3bSMahmoud MandourThe plugin has a number of arguments, all of them are optional:
5274c125f3bSMahmoud Mandour
5282dd3fef8SMahmoud Mandour  * limit=N
5294c125f3bSMahmoud Mandour
5304c125f3bSMahmoud Mandour  Print top N icache and dcache thrashing instructions along with their
5314c125f3bSMahmoud Mandour  address, number of misses, and its disassembly. (default: 32)
5324c125f3bSMahmoud Mandour
5332dd3fef8SMahmoud Mandour  * icachesize=N
5342dd3fef8SMahmoud Mandour  * iblksize=B
5352dd3fef8SMahmoud Mandour  * iassoc=A
5364c125f3bSMahmoud Mandour
5374c125f3bSMahmoud Mandour  Instruction cache configuration arguments. They specify the cache size, block
5384c125f3bSMahmoud Mandour  size, and associativity of the instruction cache, respectively.
5394c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
5404c125f3bSMahmoud Mandour
5412dd3fef8SMahmoud Mandour  * dcachesize=N
5422dd3fef8SMahmoud Mandour  * dblksize=B
5432dd3fef8SMahmoud Mandour  * dassoc=A
5444c125f3bSMahmoud Mandour
5454c125f3bSMahmoud Mandour  Data cache configuration arguments. They specify the cache size, block size,
5464c125f3bSMahmoud Mandour  and associativity of the data cache, respectively.
5474c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
5484c125f3bSMahmoud Mandour
5492dd3fef8SMahmoud Mandour  * evict=POLICY
5504c125f3bSMahmoud Mandour
5514c125f3bSMahmoud Mandour  Sets the eviction policy to POLICY. Available policies are: :code:`lru`,
5524c125f3bSMahmoud Mandour  :code:`fifo`, and :code:`rand`. The plugin will use the specified policy for
5534c125f3bSMahmoud Mandour  both instruction and data caches. (default: POLICY = :code:`lru`)
5545397acb8SMahmoud Mandour
5552dd3fef8SMahmoud Mandour  * cores=N
5565397acb8SMahmoud Mandour
5575397acb8SMahmoud Mandour  Sets the number of cores for which we maintain separate icache and dcache.
5585397acb8SMahmoud Mandour  (default: for linux-user, N = 1, for full system emulation: N = cores
5595397acb8SMahmoud Mandour  available to guest)
560b8312e04SMahmoud Mandour
561b8312e04SMahmoud Mandour  * l2=on
562b8312e04SMahmoud Mandour
563b8312e04SMahmoud Mandour  Simulates a unified L2 cache (stores blocks for both instructions and data)
564b8312e04SMahmoud Mandour  using the default L2 configuration (cache size = 2MB, associativity = 16-way,
565b8312e04SMahmoud Mandour  block size = 64B).
566b8312e04SMahmoud Mandour
567b8312e04SMahmoud Mandour  * l2cachesize=N
568b8312e04SMahmoud Mandour  * l2blksize=B
569b8312e04SMahmoud Mandour  * l2assoc=A
570b8312e04SMahmoud Mandour
571b8312e04SMahmoud Mandour  L2 cache configuration arguments. They specify the cache size, block size, and
572b8312e04SMahmoud Mandour  associativity of the L2 cache, respectively. Setting any of the L2
573b8312e04SMahmoud Mandour  configuration arguments implies ``l2=on``.
574b8312e04SMahmoud Mandour  (default: N = 2097152 (2MB), B = 64, A = 16)
5757f522743SAlex Bennée
5767f522743SAlex BennéeAPI
5777f522743SAlex Bennée---
5787f522743SAlex Bennée
5797f522743SAlex BennéeThe following API is generated from the inline documentation in
5807f522743SAlex Bennée``include/qemu/qemu-plugin.h``. Please ensure any updates to the API
5817f522743SAlex Bennéeinclude the full kernel-doc annotations.
5827f522743SAlex Bennée
5837f522743SAlex Bennée.. kernel-doc:: include/qemu/qemu-plugin.h
5847f522743SAlex Bennée
585