xref: /qemu/docs/devel/tcg-plugins.rst (revision 7f522743dfcea095fe77755386e980cbb5db4ef4)
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
1481e235edaSPeter Maydell``contrib/plugins`` directory where they can go.
149c17a386bSAlex Bennée
150c17a386bSAlex Bennée- tests/plugins
151c17a386bSAlex Bennée
152c17a386bSAlex BennéeThese are some basic plugins that are used to test and exercise the
1531e235edaSPeter MaydellAPI during the ``make check-tcg`` target.
154c17a386bSAlex Bennée
155c17a386bSAlex Bennée- contrib/plugins/hotblocks.c
156c17a386bSAlex Bennée
157c17a386bSAlex BennéeThe hotblocks plugin allows you to examine the where hot paths of
158c17a386bSAlex Bennéeexecution are in your program. Once the program has finished you will
159c17a386bSAlex Bennéeget a sorted list of blocks reporting the starting PC, translation
160c17a386bSAlex Bennéecount, number of instructions and execution count. This will work best
161c17a386bSAlex Bennéewith linux-user execution as system emulation tends to generate
162c17a386bSAlex Bennéere-translations as blocks from different programs get swapped in and
163c17a386bSAlex Bennéeout of system memory.
164c17a386bSAlex Bennée
1651e235edaSPeter MaydellIf your program is single-threaded you can use the ``inline`` option for
166c17a386bSAlex Bennéeslightly faster (but not thread safe) counters.
167c17a386bSAlex Bennée
168c17a386bSAlex BennéeExample::
169c17a386bSAlex Bennée
1701d0603a9SAlex Bennée  $ qemu-aarch64 \
171c17a386bSAlex Bennée    -plugin contrib/plugins/libhotblocks.so -d plugin \
172c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
173c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
174c17a386bSAlex Bennée  collected 903 entries in the hash table
175c17a386bSAlex Bennée  pc, tcount, icount, ecount
176c17a386bSAlex Bennée  0x0000000041ed10, 1, 5, 66087
177c17a386bSAlex Bennée  0x000000004002b0, 1, 4, 66087
178c17a386bSAlex Bennée  ...
179c17a386bSAlex Bennée
180c17a386bSAlex Bennée- contrib/plugins/hotpages.c
181c17a386bSAlex Bennée
182c17a386bSAlex BennéeSimilar to hotblocks but this time tracks memory accesses::
183c17a386bSAlex Bennée
1841d0603a9SAlex Bennée  $ qemu-aarch64 \
185c17a386bSAlex Bennée    -plugin contrib/plugins/libhotpages.so -d plugin \
186c17a386bSAlex Bennée    ./tests/tcg/aarch64-linux-user/sha1
187c17a386bSAlex Bennée  SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6
188c17a386bSAlex Bennée  Addr, RCPUs, Reads, WCPUs, Writes
189c17a386bSAlex Bennée  0x000055007fe000, 0x0001, 31747952, 0x0001, 8835161
190c17a386bSAlex Bennée  0x000055007ff000, 0x0001, 29001054, 0x0001, 8780625
191c17a386bSAlex Bennée  0x00005500800000, 0x0001, 687465, 0x0001, 335857
192c17a386bSAlex Bennée  0x0000000048b000, 0x0001, 130594, 0x0001, 355
193c17a386bSAlex Bennée  0x0000000048a000, 0x0001, 1826, 0x0001, 11
194c17a386bSAlex Bennée
195f698d5efSMahmoud MandourThe hotpages plugin can be configured using the following arguments:
196f698d5efSMahmoud Mandour
197f698d5efSMahmoud Mandour  * sortby=reads|writes|address
198f698d5efSMahmoud Mandour
199f698d5efSMahmoud Mandour  Log the data sorted by either the number of reads, the number of writes, or
200f698d5efSMahmoud Mandour  memory address. (Default: entries are sorted by the sum of reads and writes)
201f698d5efSMahmoud Mandour
202f698d5efSMahmoud Mandour  * io=on
203f698d5efSMahmoud Mandour
204f698d5efSMahmoud Mandour  Track IO addresses. Only relevant to full system emulation. (Default: off)
205f698d5efSMahmoud Mandour
206f698d5efSMahmoud Mandour  * pagesize=N
207f698d5efSMahmoud Mandour
208f698d5efSMahmoud Mandour  The page size used. (Default: N = 4096)
209f698d5efSMahmoud Mandour
210c17a386bSAlex Bennée- contrib/plugins/howvec.c
211c17a386bSAlex Bennée
212c17a386bSAlex BennéeThis is an instruction classifier so can be used to count different
213c17a386bSAlex Bennéetypes of instructions. It has a number of options to refine which get
214450e0f28SJohn Snowcounted. You can give a value to the ``count`` argument for a class of
215d8525358SMahmoud Mandourinstructions to break it down fully, so for example to see all the system
216d8525358SMahmoud Mandourregisters accesses::
217c17a386bSAlex Bennée
2181d0603a9SAlex Bennée  $ qemu-system-aarch64 $(QEMU_ARGS) \
219c17a386bSAlex Bennée    -append "root=/dev/sda2 systemd.unit=benchmark.service" \
220d8525358SMahmoud Mandour    -smp 4 -plugin ./contrib/plugins/libhowvec.so,count=sreg -d plugin
221c17a386bSAlex Bennée
222c17a386bSAlex Bennéewhich will lead to a sorted list after the class breakdown::
223c17a386bSAlex Bennée
224c17a386bSAlex Bennée  Instruction Classes:
225c17a386bSAlex Bennée  Class:   UDEF                   not counted
226c17a386bSAlex Bennée  Class:   SVE                    (68 hits)
227c17a386bSAlex Bennée  Class:   PCrel addr             (47789483 hits)
228c17a386bSAlex Bennée  Class:   Add/Sub (imm)          (192817388 hits)
229c17a386bSAlex Bennée  Class:   Logical (imm)          (93852565 hits)
230c17a386bSAlex Bennée  Class:   Move Wide (imm)        (76398116 hits)
231c17a386bSAlex Bennée  Class:   Bitfield               (44706084 hits)
232c17a386bSAlex Bennée  Class:   Extract                (5499257 hits)
233c17a386bSAlex Bennée  Class:   Cond Branch (imm)      (147202932 hits)
234c17a386bSAlex Bennée  Class:   Exception Gen          (193581 hits)
235c17a386bSAlex Bennée  Class:     NOP                  not counted
236c17a386bSAlex Bennée  Class:   Hints                  (6652291 hits)
237c17a386bSAlex Bennée  Class:   Barriers               (8001661 hits)
238c17a386bSAlex Bennée  Class:   PSTATE                 (1801695 hits)
239c17a386bSAlex Bennée  Class:   System Insn            (6385349 hits)
240c17a386bSAlex Bennée  Class:   System Reg             counted individually
241c17a386bSAlex Bennée  Class:   Branch (reg)           (69497127 hits)
242c17a386bSAlex Bennée  Class:   Branch (imm)           (84393665 hits)
243c17a386bSAlex Bennée  Class:   Cmp & Branch           (110929659 hits)
244c17a386bSAlex Bennée  Class:   Tst & Branch           (44681442 hits)
245c17a386bSAlex Bennée  Class:   AdvSimd ldstmult       (736 hits)
246c17a386bSAlex Bennée  Class:   ldst excl              (9098783 hits)
247c17a386bSAlex Bennée  Class:   Load Reg (lit)         (87189424 hits)
248c17a386bSAlex Bennée  Class:   ldst noalloc pair      (3264433 hits)
249c17a386bSAlex Bennée  Class:   ldst pair              (412526434 hits)
250c17a386bSAlex Bennée  Class:   ldst reg (imm)         (314734576 hits)
251c17a386bSAlex Bennée  Class: Loads & Stores           (2117774 hits)
252c17a386bSAlex Bennée  Class: Data Proc Reg            (223519077 hits)
253c17a386bSAlex Bennée  Class: Scalar FP                (31657954 hits)
254c17a386bSAlex Bennée  Individual Instructions:
255c17a386bSAlex Bennée  Instr: mrs x0, sp_el0           (2682661 hits)  (op=0xd5384100/  System Reg)
256c17a386bSAlex Bennée  Instr: mrs x1, tpidr_el2        (1789339 hits)  (op=0xd53cd041/  System Reg)
257c17a386bSAlex Bennée  Instr: mrs x2, tpidr_el2        (1513494 hits)  (op=0xd53cd042/  System Reg)
258c17a386bSAlex Bennée  Instr: mrs x0, tpidr_el2        (1490823 hits)  (op=0xd53cd040/  System Reg)
259c17a386bSAlex Bennée  Instr: mrs x1, sp_el0           (933793 hits)   (op=0xd5384101/  System Reg)
260c17a386bSAlex Bennée  Instr: mrs x2, sp_el0           (699516 hits)   (op=0xd5384102/  System Reg)
261c17a386bSAlex Bennée  Instr: mrs x4, tpidr_el2        (528437 hits)   (op=0xd53cd044/  System Reg)
262c17a386bSAlex Bennée  Instr: mrs x30, ttbr1_el1       (480776 hits)   (op=0xd538203e/  System Reg)
263c17a386bSAlex Bennée  Instr: msr ttbr1_el1, x30       (480713 hits)   (op=0xd518203e/  System Reg)
264c17a386bSAlex Bennée  Instr: msr vbar_el1, x30        (480671 hits)   (op=0xd518c01e/  System Reg)
265c17a386bSAlex Bennée  ...
266c17a386bSAlex Bennée
267c17a386bSAlex BennéeTo find the argument shorthand for the class you need to examine the
2681e235edaSPeter Maydellsource code of the plugin at the moment, specifically the ``*opt``
269c17a386bSAlex Bennéeargument in the InsnClassExecCount tables.
270c17a386bSAlex Bennée
271c17a386bSAlex Bennée- contrib/plugins/lockstep.c
272c17a386bSAlex Bennée
273c17a386bSAlex BennéeThis is a debugging tool for developers who want to find out when and
274c17a386bSAlex Bennéewhere execution diverges after a subtle change to TCG code generation.
275c17a386bSAlex BennéeIt is not an exact science and results are likely to be mixed once
276c17a386bSAlex Bennéeasynchronous events are introduced. While the use of -icount can
277c17a386bSAlex Bennéeintroduce determinism to the execution flow it doesn't always follow
278c17a386bSAlex Bennéethe translation sequence will be exactly the same. Typically this is
279c17a386bSAlex Bennéecaused by a timer firing to service the GUI causing a block to end
280c17a386bSAlex Bennéeearly. However in some cases it has proved to be useful in pointing
281c17a386bSAlex Bennéepeople at roughly where execution diverges. The only argument you need
282c17a386bSAlex Bennéefor the plugin is a path for the socket the two instances will
283c17a386bSAlex Bennéecommunicate over::
284c17a386bSAlex Bennée
285c17a386bSAlex Bennée
2861d0603a9SAlex Bennée  $ qemu-system-sparc -monitor none -parallel none \
287c17a386bSAlex Bennée    -net none -M SS-20 -m 256 -kernel day11/zImage.elf \
288b18a0cadSMahmoud Mandour    -plugin ./contrib/plugins/liblockstep.so,sockpath=lockstep-sparc.sock \
289c17a386bSAlex Bennée    -d plugin,nochain
290c17a386bSAlex Bennée
291c17a386bSAlex Bennéewhich will eventually report::
292c17a386bSAlex Bennée
293c17a386bSAlex Bennée  qemu-system-sparc: warning: nic lance.0 has no peer
294c17a386bSAlex Bennée  @ 0x000000ffd06678 vs 0x000000ffd001e0 (2/1 since last)
295c17a386bSAlex Bennée  @ 0x000000ffd07d9c vs 0x000000ffd06678 (3/1 since last)
296c17a386bSAlex Bennée  Δ insn_count @ 0x000000ffd07d9c (809900609) vs 0x000000ffd06678 (809900612)
297c17a386bSAlex Bennée    previously @ 0x000000ffd06678/10 (809900609 insns)
298c17a386bSAlex Bennée    previously @ 0x000000ffd001e0/4 (809900599 insns)
299c17a386bSAlex Bennée    previously @ 0x000000ffd080ac/2 (809900595 insns)
300c17a386bSAlex Bennée    previously @ 0x000000ffd08098/5 (809900593 insns)
301c17a386bSAlex Bennée    previously @ 0x000000ffd080c0/1 (809900588 insns)
302c17a386bSAlex Bennée
303a35af836SMahmoud Mandour- contrib/plugins/hwprofile.c
304a622d64eSAlex Bennée
305a622d64eSAlex BennéeThe hwprofile tool can only be used with system emulation and allows
306a622d64eSAlex Bennéethe user to see what hardware is accessed how often. It has a number of options:
307a622d64eSAlex Bennée
30860753843SMahmoud Mandour * track=read or track=write
309a622d64eSAlex Bennée
310a622d64eSAlex Bennée By default the plugin tracks both reads and writes. You can use one
311a622d64eSAlex Bennée of these options to limit the tracking to just one class of accesses.
312a622d64eSAlex Bennée
31360753843SMahmoud Mandour * source
314a622d64eSAlex Bennée
315a622d64eSAlex Bennée Will include a detailed break down of what the guest PC that made the
31660753843SMahmoud Mandour access was. Not compatible with the pattern option. Example output::
317a622d64eSAlex Bennée
318a622d64eSAlex Bennée   cirrus-low-memory @ 0xfffffd00000a0000
319a622d64eSAlex Bennée    pc:fffffc0000005cdc, 1, 256
320a622d64eSAlex Bennée    pc:fffffc0000005ce8, 1, 256
321a622d64eSAlex Bennée    pc:fffffc0000005cec, 1, 256
322a622d64eSAlex Bennée
32360753843SMahmoud Mandour * pattern
324a622d64eSAlex Bennée
325a622d64eSAlex Bennée Instead break down the accesses based on the offset into the HW
326a622d64eSAlex Bennée region. This can be useful for seeing the most used registers of a
327a622d64eSAlex Bennée device. Example output::
328a622d64eSAlex Bennée
329a622d64eSAlex Bennée    pci0-conf @ 0xfffffd01fe000000
330a622d64eSAlex Bennée      off:00000004, 1, 1
331a622d64eSAlex Bennée      off:00000010, 1, 3
332a622d64eSAlex Bennée      off:00000014, 1, 3
333a622d64eSAlex Bennée      off:00000018, 1, 2
334a622d64eSAlex Bennée      off:0000001c, 1, 2
335a622d64eSAlex Bennée      off:00000020, 1, 2
336a622d64eSAlex Bennée      ...
337307ce0aaSAlexandre Iooss
338307ce0aaSAlexandre Iooss- contrib/plugins/execlog.c
339307ce0aaSAlexandre Iooss
340307ce0aaSAlexandre IoossThe execlog tool traces executed instructions with memory access. It can be used
341307ce0aaSAlexandre Ioossfor debugging and security analysis purposes.
342307ce0aaSAlexandre IoossPlease be aware that this will generate a lot of output.
343307ce0aaSAlexandre Iooss
344b7855bf6SAlex BennéeThe plugin needs default argument::
345307ce0aaSAlexandre Iooss
3461d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
347307ce0aaSAlexandre Iooss    -plugin ./contrib/plugins/libexeclog.so -d plugin
348307ce0aaSAlexandre Iooss
349307ce0aaSAlexandre Ioosswhich will output an execution trace following this structure::
350307ce0aaSAlexandre Iooss
351307ce0aaSAlexandre Iooss  # vCPU, vAddr, opcode, disassembly[, load/store, memory addr, device]...
352307ce0aaSAlexandre Iooss  0, 0xa12, 0xf8012400, "movs r4, #0"
353307ce0aaSAlexandre Iooss  0, 0xa14, 0xf87f42b4, "cmp r4, r6"
354307ce0aaSAlexandre Iooss  0, 0xa16, 0xd206, "bhs #0xa26"
355307ce0aaSAlexandre Iooss  0, 0xa18, 0xfff94803, "ldr r0, [pc, #0xc]", load, 0x00010a28, RAM
356307ce0aaSAlexandre Iooss  0, 0xa1a, 0xf989f000, "bl #0xd30"
357307ce0aaSAlexandre Iooss  0, 0xd30, 0xfff9b510, "push {r4, lr}", store, 0x20003ee0, RAM, store, 0x20003ee4, RAM
358307ce0aaSAlexandre Iooss  0, 0xd32, 0xf9893014, "adds r0, #0x14"
359307ce0aaSAlexandre Iooss  0, 0xd34, 0xf9c8f000, "bl #0x10c8"
360307ce0aaSAlexandre Iooss  0, 0x10c8, 0xfff96c43, "ldr r3, [r0, #0x44]", load, 0x200000e4, RAM
3614c125f3bSMahmoud Mandour
362b7855bf6SAlex Bennéethe output can be filtered to only track certain instructions or
3631d0603a9SAlex Bennéeaddresses using the ``ifilter`` or ``afilter`` options. You can stack the
364b7855bf6SAlex Bennéearguments if required::
365b7855bf6SAlex Bennée
3661d0603a9SAlex Bennée  $ qemu-system-arm $(QEMU_ARGS) \
367b7855bf6SAlex Bennée    -plugin ./contrib/plugins/libexeclog.so,ifilter=st1w,afilter=0x40001808 -d plugin
368b7855bf6SAlex Bennée
369a35af836SMahmoud Mandour- contrib/plugins/cache.c
3704c125f3bSMahmoud Mandour
371b8312e04SMahmoud MandourCache modelling plugin that measures the performance of a given L1 cache
372b8312e04SMahmoud Mandourconfiguration, and optionally a unified L2 per-core cache when a given working
373b8312e04SMahmoud Mandourset is run::
3744c125f3bSMahmoud Mandour
3751d0603a9SAlex Bennée  $ qemu-x86_64 -plugin ./contrib/plugins/libcache.so \
3764c125f3bSMahmoud Mandour      -d plugin -D cache.log ./tests/tcg/x86_64-linux-user/float_convs
3774c125f3bSMahmoud Mandour
3784c125f3bSMahmoud Mandourwill report the following::
3794c125f3bSMahmoud Mandour
3805397acb8SMahmoud Mandour    core #, data accesses, data misses, dmiss rate, insn accesses, insn misses, imiss rate
3815397acb8SMahmoud Mandour    0       996695         508             0.0510%  2642799        18617           0.7044%
3824c125f3bSMahmoud Mandour
3834c125f3bSMahmoud Mandour    address, data misses, instruction
3844c125f3bSMahmoud Mandour    0x424f1e (_int_malloc), 109, movq %rax, 8(%rcx)
3854c125f3bSMahmoud Mandour    0x41f395 (_IO_default_xsputn), 49, movb %dl, (%rdi, %rax)
3864c125f3bSMahmoud Mandour    0x42584d (ptmalloc_init.part.0), 33, movaps %xmm0, (%rax)
3874c125f3bSMahmoud Mandour    0x454d48 (__tunables_init), 20, cmpb $0, (%r8)
3884c125f3bSMahmoud Mandour    ...
3894c125f3bSMahmoud Mandour
3904c125f3bSMahmoud Mandour    address, fetch misses, instruction
3914c125f3bSMahmoud Mandour    0x4160a0 (__vfprintf_internal), 744, movl $1, %ebx
3924c125f3bSMahmoud Mandour    0x41f0a0 (_IO_setb), 744, endbr64
3934c125f3bSMahmoud Mandour    0x415882 (__vfprintf_internal), 744, movq %r12, %rdi
3944c125f3bSMahmoud Mandour    0x4268a0 (__malloc), 696, andq $0xfffffffffffffff0, %rax
3954c125f3bSMahmoud Mandour    ...
3964c125f3bSMahmoud Mandour
3974c125f3bSMahmoud MandourThe plugin has a number of arguments, all of them are optional:
3984c125f3bSMahmoud Mandour
3992dd3fef8SMahmoud Mandour  * limit=N
4004c125f3bSMahmoud Mandour
4014c125f3bSMahmoud Mandour  Print top N icache and dcache thrashing instructions along with their
4024c125f3bSMahmoud Mandour  address, number of misses, and its disassembly. (default: 32)
4034c125f3bSMahmoud Mandour
4042dd3fef8SMahmoud Mandour  * icachesize=N
4052dd3fef8SMahmoud Mandour  * iblksize=B
4062dd3fef8SMahmoud Mandour  * iassoc=A
4074c125f3bSMahmoud Mandour
4084c125f3bSMahmoud Mandour  Instruction cache configuration arguments. They specify the cache size, block
4094c125f3bSMahmoud Mandour  size, and associativity of the instruction cache, respectively.
4104c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
4114c125f3bSMahmoud Mandour
4122dd3fef8SMahmoud Mandour  * dcachesize=N
4132dd3fef8SMahmoud Mandour  * dblksize=B
4142dd3fef8SMahmoud Mandour  * dassoc=A
4154c125f3bSMahmoud Mandour
4164c125f3bSMahmoud Mandour  Data cache configuration arguments. They specify the cache size, block size,
4174c125f3bSMahmoud Mandour  and associativity of the data cache, respectively.
4184c125f3bSMahmoud Mandour  (default: N = 16384, B = 64, A = 8)
4194c125f3bSMahmoud Mandour
4202dd3fef8SMahmoud Mandour  * evict=POLICY
4214c125f3bSMahmoud Mandour
4224c125f3bSMahmoud Mandour  Sets the eviction policy to POLICY. Available policies are: :code:`lru`,
4234c125f3bSMahmoud Mandour  :code:`fifo`, and :code:`rand`. The plugin will use the specified policy for
4244c125f3bSMahmoud Mandour  both instruction and data caches. (default: POLICY = :code:`lru`)
4255397acb8SMahmoud Mandour
4262dd3fef8SMahmoud Mandour  * cores=N
4275397acb8SMahmoud Mandour
4285397acb8SMahmoud Mandour  Sets the number of cores for which we maintain separate icache and dcache.
4295397acb8SMahmoud Mandour  (default: for linux-user, N = 1, for full system emulation: N = cores
4305397acb8SMahmoud Mandour  available to guest)
431b8312e04SMahmoud Mandour
432b8312e04SMahmoud Mandour  * l2=on
433b8312e04SMahmoud Mandour
434b8312e04SMahmoud Mandour  Simulates a unified L2 cache (stores blocks for both instructions and data)
435b8312e04SMahmoud Mandour  using the default L2 configuration (cache size = 2MB, associativity = 16-way,
436b8312e04SMahmoud Mandour  block size = 64B).
437b8312e04SMahmoud Mandour
438b8312e04SMahmoud Mandour  * l2cachesize=N
439b8312e04SMahmoud Mandour  * l2blksize=B
440b8312e04SMahmoud Mandour  * l2assoc=A
441b8312e04SMahmoud Mandour
442b8312e04SMahmoud Mandour  L2 cache configuration arguments. They specify the cache size, block size, and
443b8312e04SMahmoud Mandour  associativity of the L2 cache, respectively. Setting any of the L2
444b8312e04SMahmoud Mandour  configuration arguments implies ``l2=on``.
445b8312e04SMahmoud Mandour  (default: N = 2097152 (2MB), B = 64, A = 16)
446*7f522743SAlex Bennée
447*7f522743SAlex BennéeAPI
448*7f522743SAlex Bennée---
449*7f522743SAlex Bennée
450*7f522743SAlex BennéeThe following API is generated from the inline documentation in
451*7f522743SAlex Bennée``include/qemu/qemu-plugin.h``. Please ensure any updates to the API
452*7f522743SAlex Bennéeinclude the full kernel-doc annotations.
453*7f522743SAlex Bennée
454*7f522743SAlex Bennée.. kernel-doc:: include/qemu/qemu-plugin.h
455*7f522743SAlex Bennée
456