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ée================ 7027e3332SAlex BennéeQEMU TCG Plugins 8027e3332SAlex Bennée================ 9027e3332SAlex Bennée 10027e3332SAlex BennéeQEMU TCG plugins provide a way for users to run experiments taking 11027e3332SAlex Bennéeadvantage of the total system control emulation can have over a guest. 12027e3332SAlex BennéeIt provides a mechanism for plugins to subscribe to events during 13027e3332SAlex Bennéetranslation and execution and optionally callback into the plugin 14027e3332SAlex Bennéeduring these events. TCG plugins are unable to change the system state 15027e3332SAlex Bennéeonly monitor it passively. However they can do this down to an 16027e3332SAlex Bennéeindividual instruction granularity including potentially subscribing 17027e3332SAlex Bennéeto all load and store operations. 18027e3332SAlex Bennée 19027e3332SAlex BennéeAPI Stability 20027e3332SAlex Bennée============= 21027e3332SAlex Bennée 22027e3332SAlex BennéeThis is a new feature for QEMU and it does allow people to develop 23027e3332SAlex Bennéeout-of-tree plugins that can be dynamically linked into a running QEMU 24027e3332SAlex Bennéeprocess. However the project reserves the right to change or break the 25027e3332SAlex BennéeAPI should it need to do so. The best way to avoid this is to submit 26027e3332SAlex Bennéeyour plugin upstream so they can be updated if/when the API changes. 27027e3332SAlex Bennée 285c6ecbdcSAlex BennéeAPI versioning 295c6ecbdcSAlex Bennée-------------- 305c6ecbdcSAlex Bennée 315c6ecbdcSAlex BennéeAll plugins need to declare a symbol which exports the plugin API 325c6ecbdcSAlex Bennéeversion they were built against. This can be done simply by:: 335c6ecbdcSAlex Bennée 345c6ecbdcSAlex Bennée QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION; 355c6ecbdcSAlex Bennée 365c6ecbdcSAlex BennéeThe core code will refuse to load a plugin that doesn't export a 375c6ecbdcSAlex Bennée`qemu_plugin_version` symbol or if plugin version is outside of QEMU's 385c6ecbdcSAlex Bennéesupported range of API versions. 395c6ecbdcSAlex Bennée 405c6ecbdcSAlex BennéeAdditionally the `qemu_info_t` structure which is passed to the 415c6ecbdcSAlex Bennée`qemu_plugin_install` method of a plugin will detail the minimum and 425c6ecbdcSAlex Bennéecurrent API versions supported by QEMU. The API version will be 435c6ecbdcSAlex Bennéeincremented if new APIs are added. The minimum API version will be 445c6ecbdcSAlex Bennéeincremented if existing APIs are changed or removed. 45027e3332SAlex Bennée 46027e3332SAlex BennéeExposure of QEMU internals 47027e3332SAlex Bennée-------------------------- 48027e3332SAlex Bennée 49027e3332SAlex BennéeThe plugin architecture actively avoids leaking implementation details 50027e3332SAlex Bennéeabout how QEMU's translation works to the plugins. While there are 51027e3332SAlex Bennéeconceptions such as translation time and translation blocks the 52027e3332SAlex Bennéedetails are opaque to plugins. The plugin is able to query select 53027e3332SAlex Bennéedetails of instructions and system configuration only through the 549675a9c6SAlex Bennéeexported *qemu_plugin* functions. 559675a9c6SAlex Bennée 569675a9c6SAlex BennéeQuery Handle Lifetime 579675a9c6SAlex Bennée--------------------- 589675a9c6SAlex Bennée 599675a9c6SAlex BennéeEach callback provides an opaque anonymous information handle which 609675a9c6SAlex Bennéecan usually be further queried to find out information about a 619675a9c6SAlex Bennéetranslation, instruction or operation. The handles themselves are only 629675a9c6SAlex Bennéevalid during the lifetime of the callback so it is important that any 639675a9c6SAlex Bennéeinformation that is needed is extracted during the callback and saved 649675a9c6SAlex Bennéeby the plugin. 65027e3332SAlex Bennée 66ca955bd7SAlex BennéeAPI 67ca955bd7SAlex Bennée=== 68ca955bd7SAlex Bennée 69ca955bd7SAlex Bennée.. kernel-doc:: include/qemu/qemu-plugin.h 70ca955bd7SAlex Bennée 71027e3332SAlex BennéeUsage 72027e3332SAlex Bennée===== 73027e3332SAlex Bennée 74*ba4dd2aaSAlex BennéeAny QEMU binary with TCG support has plugins enabled by default. 75*ba4dd2aaSAlex BennéeEarlier releases needed to be explicitly enabled with:: 76027e3332SAlex Bennée 77027e3332SAlex Bennée configure --enable-plugins 78027e3332SAlex Bennée 79027e3332SAlex BennéeOnce built a program can be run with multiple plugins loaded each with 805c6ecbdcSAlex Bennéetheir own arguments:: 81027e3332SAlex Bennée 82027e3332SAlex Bennée $QEMU $OTHER_QEMU_ARGS \ 83027e3332SAlex Bennée -plugin tests/plugin/libhowvec.so,arg=inline,arg=hint \ 84027e3332SAlex Bennée -plugin tests/plugin/libhotblocks.so 85027e3332SAlex Bennée 86027e3332SAlex BennéeArguments are plugin specific and can be used to modify their 87027e3332SAlex Bennéebehaviour. In this case the howvec plugin is being asked to use inline 88027e3332SAlex Bennéeops to count and break down the hint instructions by type. 89027e3332SAlex Bennée 90027e3332SAlex BennéePlugin Life cycle 91027e3332SAlex Bennée================= 92027e3332SAlex Bennée 93027e3332SAlex BennéeFirst the plugin is loaded and the public qemu_plugin_install function 94027e3332SAlex Bennéeis called. The plugin will then register callbacks for various plugin 95027e3332SAlex Bennéeevents. Generally plugins will register a handler for the *atexit* 96027e3332SAlex Bennéeif they want to dump a summary of collected information once the 97027e3332SAlex Bennéeprogram/system has finished running. 98027e3332SAlex Bennée 99027e3332SAlex BennéeWhen a registered event occurs the plugin callback is invoked. The 100027e3332SAlex Bennéecallbacks may provide additional information. In the case of a 101027e3332SAlex Bennéetranslation event the plugin has an option to enumerate the 102027e3332SAlex Bennéeinstructions in a block of instructions and optionally register 103027e3332SAlex Bennéecallbacks to some or all instructions when they are executed. 104027e3332SAlex Bennée 105027e3332SAlex BennéeThere is also a facility to add an inline event where code to 106027e3332SAlex Bennéeincrement a counter can be directly inlined with the translation. 107027e3332SAlex BennéeCurrently only a simple increment is supported. This is not atomic so 108027e3332SAlex Bennéecan miss counts. If you want absolute precision you should use a 109027e3332SAlex Bennéecallback which can then ensure atomicity itself. 110027e3332SAlex Bennée 111027e3332SAlex BennéeFinally when QEMU exits all the registered *atexit* callbacks are 112027e3332SAlex Bennéeinvoked. 113027e3332SAlex Bennée 114027e3332SAlex BennéeInternals 115027e3332SAlex Bennée========= 116027e3332SAlex Bennée 117027e3332SAlex BennéeLocking 118027e3332SAlex Bennée------- 119027e3332SAlex Bennée 120027e3332SAlex BennéeWe have to ensure we cannot deadlock, particularly under MTTCG. For 121027e3332SAlex Bennéethis we acquire a lock when called from plugin code. We also keep the 122027e3332SAlex Bennéelist of callbacks under RCU so that we do not have to hold the lock 123027e3332SAlex Bennéewhen calling the callbacks. This is also for performance, since some 124027e3332SAlex Bennéecallbacks (e.g. memory access callbacks) might be called very 125027e3332SAlex Bennéefrequently. 126027e3332SAlex Bennée 127027e3332SAlex Bennée * A consequence of this is that we keep our own list of CPUs, so that 128027e3332SAlex Bennée we do not have to worry about locking order wrt cpu_list_lock. 129027e3332SAlex Bennée * Use a recursive lock, since we can get registration calls from 130027e3332SAlex Bennée callbacks. 131027e3332SAlex Bennée 132027e3332SAlex BennéeAs a result registering/unregistering callbacks is "slow", since it 133027e3332SAlex Bennéetakes a lock. But this is very infrequent; we want performance when 134027e3332SAlex Bennéecalling (or not calling) callbacks, not when registering them. Using 135027e3332SAlex BennéeRCU is great for this. 136027e3332SAlex Bennée 137027e3332SAlex BennéeWe support the uninstallation of a plugin at any time (e.g. from 138027e3332SAlex Bennéeplugin callbacks). This allows plugins to remove themselves if they no 139027e3332SAlex Bennéelonger want to instrument the code. This operation is asynchronous 140027e3332SAlex Bennéewhich means callbacks may still occur after the uninstall operation is 141027e3332SAlex Bennéerequested. The plugin isn't completely uninstalled until the safe work 142027e3332SAlex Bennéehas executed while all vCPUs are quiescent. 143c17a386bSAlex Bennée 144c17a386bSAlex BennéeExample Plugins 145c17a386bSAlex Bennée=============== 146c17a386bSAlex Bennée 147c17a386bSAlex BennéeThere are a number of plugins included with QEMU and you are 148c17a386bSAlex Bennéeencouraged to contribute your own plugins plugins upstream. There is a 149c17a386bSAlex Bennée`contrib/plugins` directory where they can go. 150c17a386bSAlex Bennée 151c17a386bSAlex Bennée- tests/plugins 152c17a386bSAlex Bennée 153c17a386bSAlex BennéeThese are some basic plugins that are used to test and exercise the 154c17a386bSAlex BennéeAPI during the `make check-tcg` target. 155c17a386bSAlex Bennée 156c17a386bSAlex Bennée- contrib/plugins/hotblocks.c 157c17a386bSAlex Bennée 158c17a386bSAlex BennéeThe hotblocks plugin allows you to examine the where hot paths of 159c17a386bSAlex Bennéeexecution are in your program. Once the program has finished you will 160c17a386bSAlex Bennéeget a sorted list of blocks reporting the starting PC, translation 161c17a386bSAlex Bennéecount, number of instructions and execution count. This will work best 162c17a386bSAlex Bennéewith linux-user execution as system emulation tends to generate 163c17a386bSAlex Bennéere-translations as blocks from different programs get swapped in and 164c17a386bSAlex Bennéeout of system memory. 165c17a386bSAlex Bennée 166c17a386bSAlex BennéeIf your program is single-threaded you can use the `inline` option for 167c17a386bSAlex Bennéeslightly faster (but not thread safe) counters. 168c17a386bSAlex Bennée 169c17a386bSAlex BennéeExample:: 170c17a386bSAlex Bennée 171c17a386bSAlex Bennée ./aarch64-linux-user/qemu-aarch64 \ 172c17a386bSAlex Bennée -plugin contrib/plugins/libhotblocks.so -d plugin \ 173c17a386bSAlex Bennée ./tests/tcg/aarch64-linux-user/sha1 174c17a386bSAlex Bennée SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6 175c17a386bSAlex Bennée collected 903 entries in the hash table 176c17a386bSAlex Bennée pc, tcount, icount, ecount 177c17a386bSAlex Bennée 0x0000000041ed10, 1, 5, 66087 178c17a386bSAlex Bennée 0x000000004002b0, 1, 4, 66087 179c17a386bSAlex Bennée ... 180c17a386bSAlex Bennée 181c17a386bSAlex Bennée- contrib/plugins/hotpages.c 182c17a386bSAlex Bennée 183c17a386bSAlex BennéeSimilar to hotblocks but this time tracks memory accesses:: 184c17a386bSAlex Bennée 185c17a386bSAlex Bennée ./aarch64-linux-user/qemu-aarch64 \ 186c17a386bSAlex Bennée -plugin contrib/plugins/libhotpages.so -d plugin \ 187c17a386bSAlex Bennée ./tests/tcg/aarch64-linux-user/sha1 188c17a386bSAlex Bennée SHA1=15dd99a1991e0b3826fede3deffc1feba42278e6 189c17a386bSAlex Bennée Addr, RCPUs, Reads, WCPUs, Writes 190c17a386bSAlex Bennée 0x000055007fe000, 0x0001, 31747952, 0x0001, 8835161 191c17a386bSAlex Bennée 0x000055007ff000, 0x0001, 29001054, 0x0001, 8780625 192c17a386bSAlex Bennée 0x00005500800000, 0x0001, 687465, 0x0001, 335857 193c17a386bSAlex Bennée 0x0000000048b000, 0x0001, 130594, 0x0001, 355 194c17a386bSAlex Bennée 0x0000000048a000, 0x0001, 1826, 0x0001, 11 195c17a386bSAlex Bennée 196c17a386bSAlex Bennée- contrib/plugins/howvec.c 197c17a386bSAlex Bennée 198c17a386bSAlex BennéeThis is an instruction classifier so can be used to count different 199c17a386bSAlex Bennéetypes of instructions. It has a number of options to refine which get 200c17a386bSAlex Bennéecounted. You can give an argument for a class of instructions to break 201c17a386bSAlex Bennéeit down fully, so for example to see all the system registers 202c17a386bSAlex Bennéeaccesses:: 203c17a386bSAlex Bennée 204c17a386bSAlex Bennée ./aarch64-softmmu/qemu-system-aarch64 $(QEMU_ARGS) \ 205c17a386bSAlex Bennée -append "root=/dev/sda2 systemd.unit=benchmark.service" \ 206c17a386bSAlex Bennée -smp 4 -plugin ./contrib/plugins/libhowvec.so,arg=sreg -d plugin 207c17a386bSAlex Bennée 208c17a386bSAlex Bennéewhich will lead to a sorted list after the class breakdown:: 209c17a386bSAlex Bennée 210c17a386bSAlex Bennée Instruction Classes: 211c17a386bSAlex Bennée Class: UDEF not counted 212c17a386bSAlex Bennée Class: SVE (68 hits) 213c17a386bSAlex Bennée Class: PCrel addr (47789483 hits) 214c17a386bSAlex Bennée Class: Add/Sub (imm) (192817388 hits) 215c17a386bSAlex Bennée Class: Logical (imm) (93852565 hits) 216c17a386bSAlex Bennée Class: Move Wide (imm) (76398116 hits) 217c17a386bSAlex Bennée Class: Bitfield (44706084 hits) 218c17a386bSAlex Bennée Class: Extract (5499257 hits) 219c17a386bSAlex Bennée Class: Cond Branch (imm) (147202932 hits) 220c17a386bSAlex Bennée Class: Exception Gen (193581 hits) 221c17a386bSAlex Bennée Class: NOP not counted 222c17a386bSAlex Bennée Class: Hints (6652291 hits) 223c17a386bSAlex Bennée Class: Barriers (8001661 hits) 224c17a386bSAlex Bennée Class: PSTATE (1801695 hits) 225c17a386bSAlex Bennée Class: System Insn (6385349 hits) 226c17a386bSAlex Bennée Class: System Reg counted individually 227c17a386bSAlex Bennée Class: Branch (reg) (69497127 hits) 228c17a386bSAlex Bennée Class: Branch (imm) (84393665 hits) 229c17a386bSAlex Bennée Class: Cmp & Branch (110929659 hits) 230c17a386bSAlex Bennée Class: Tst & Branch (44681442 hits) 231c17a386bSAlex Bennée Class: AdvSimd ldstmult (736 hits) 232c17a386bSAlex Bennée Class: ldst excl (9098783 hits) 233c17a386bSAlex Bennée Class: Load Reg (lit) (87189424 hits) 234c17a386bSAlex Bennée Class: ldst noalloc pair (3264433 hits) 235c17a386bSAlex Bennée Class: ldst pair (412526434 hits) 236c17a386bSAlex Bennée Class: ldst reg (imm) (314734576 hits) 237c17a386bSAlex Bennée Class: Loads & Stores (2117774 hits) 238c17a386bSAlex Bennée Class: Data Proc Reg (223519077 hits) 239c17a386bSAlex Bennée Class: Scalar FP (31657954 hits) 240c17a386bSAlex Bennée Individual Instructions: 241c17a386bSAlex Bennée Instr: mrs x0, sp_el0 (2682661 hits) (op=0xd5384100/ System Reg) 242c17a386bSAlex Bennée Instr: mrs x1, tpidr_el2 (1789339 hits) (op=0xd53cd041/ System Reg) 243c17a386bSAlex Bennée Instr: mrs x2, tpidr_el2 (1513494 hits) (op=0xd53cd042/ System Reg) 244c17a386bSAlex Bennée Instr: mrs x0, tpidr_el2 (1490823 hits) (op=0xd53cd040/ System Reg) 245c17a386bSAlex Bennée Instr: mrs x1, sp_el0 (933793 hits) (op=0xd5384101/ System Reg) 246c17a386bSAlex Bennée Instr: mrs x2, sp_el0 (699516 hits) (op=0xd5384102/ System Reg) 247c17a386bSAlex Bennée Instr: mrs x4, tpidr_el2 (528437 hits) (op=0xd53cd044/ System Reg) 248c17a386bSAlex Bennée Instr: mrs x30, ttbr1_el1 (480776 hits) (op=0xd538203e/ System Reg) 249c17a386bSAlex Bennée Instr: msr ttbr1_el1, x30 (480713 hits) (op=0xd518203e/ System Reg) 250c17a386bSAlex Bennée Instr: msr vbar_el1, x30 (480671 hits) (op=0xd518c01e/ System Reg) 251c17a386bSAlex Bennée ... 252c17a386bSAlex Bennée 253c17a386bSAlex BennéeTo find the argument shorthand for the class you need to examine the 254c17a386bSAlex Bennéesource code of the plugin at the moment, specifically the `*opt` 255c17a386bSAlex Bennéeargument in the InsnClassExecCount tables. 256c17a386bSAlex Bennée 257c17a386bSAlex Bennée- contrib/plugins/lockstep.c 258c17a386bSAlex Bennée 259c17a386bSAlex BennéeThis is a debugging tool for developers who want to find out when and 260c17a386bSAlex Bennéewhere execution diverges after a subtle change to TCG code generation. 261c17a386bSAlex BennéeIt is not an exact science and results are likely to be mixed once 262c17a386bSAlex Bennéeasynchronous events are introduced. While the use of -icount can 263c17a386bSAlex Bennéeintroduce determinism to the execution flow it doesn't always follow 264c17a386bSAlex Bennéethe translation sequence will be exactly the same. Typically this is 265c17a386bSAlex Bennéecaused by a timer firing to service the GUI causing a block to end 266c17a386bSAlex Bennéeearly. However in some cases it has proved to be useful in pointing 267c17a386bSAlex Bennéepeople at roughly where execution diverges. The only argument you need 268c17a386bSAlex Bennéefor the plugin is a path for the socket the two instances will 269c17a386bSAlex Bennéecommunicate over:: 270c17a386bSAlex Bennée 271c17a386bSAlex Bennée 272c17a386bSAlex Bennée ./sparc-softmmu/qemu-system-sparc -monitor none -parallel none \ 273c17a386bSAlex Bennée -net none -M SS-20 -m 256 -kernel day11/zImage.elf \ 274c17a386bSAlex Bennée -plugin ./contrib/plugins/liblockstep.so,arg=lockstep-sparc.sock \ 275c17a386bSAlex Bennée -d plugin,nochain 276c17a386bSAlex Bennée 277c17a386bSAlex Bennéewhich will eventually report:: 278c17a386bSAlex Bennée 279c17a386bSAlex Bennée qemu-system-sparc: warning: nic lance.0 has no peer 280c17a386bSAlex Bennée @ 0x000000ffd06678 vs 0x000000ffd001e0 (2/1 since last) 281c17a386bSAlex Bennée @ 0x000000ffd07d9c vs 0x000000ffd06678 (3/1 since last) 282c17a386bSAlex Bennée Δ insn_count @ 0x000000ffd07d9c (809900609) vs 0x000000ffd06678 (809900612) 283c17a386bSAlex Bennée previously @ 0x000000ffd06678/10 (809900609 insns) 284c17a386bSAlex Bennée previously @ 0x000000ffd001e0/4 (809900599 insns) 285c17a386bSAlex Bennée previously @ 0x000000ffd080ac/2 (809900595 insns) 286c17a386bSAlex Bennée previously @ 0x000000ffd08098/5 (809900593 insns) 287c17a386bSAlex Bennée previously @ 0x000000ffd080c0/1 (809900588 insns) 288c17a386bSAlex Bennée 289a622d64eSAlex Bennée- contrib/plugins/hwprofile 290a622d64eSAlex Bennée 291a622d64eSAlex BennéeThe hwprofile tool can only be used with system emulation and allows 292a622d64eSAlex Bennéethe user to see what hardware is accessed how often. It has a number of options: 293a622d64eSAlex Bennée 294a622d64eSAlex Bennée * arg=read or arg=write 295a622d64eSAlex Bennée 296a622d64eSAlex Bennée By default the plugin tracks both reads and writes. You can use one 297a622d64eSAlex Bennée of these options to limit the tracking to just one class of accesses. 298a622d64eSAlex Bennée 299a622d64eSAlex Bennée * arg=source 300a622d64eSAlex Bennée 301a622d64eSAlex Bennée Will include a detailed break down of what the guest PC that made the 302a622d64eSAlex Bennée access was. Not compatible with arg=pattern. Example output:: 303a622d64eSAlex Bennée 304a622d64eSAlex Bennée cirrus-low-memory @ 0xfffffd00000a0000 305a622d64eSAlex Bennée pc:fffffc0000005cdc, 1, 256 306a622d64eSAlex Bennée pc:fffffc0000005ce8, 1, 256 307a622d64eSAlex Bennée pc:fffffc0000005cec, 1, 256 308a622d64eSAlex Bennée 309a622d64eSAlex Bennée * arg=pattern 310a622d64eSAlex Bennée 311a622d64eSAlex Bennée Instead break down the accesses based on the offset into the HW 312a622d64eSAlex Bennée region. This can be useful for seeing the most used registers of a 313a622d64eSAlex Bennée device. Example output:: 314a622d64eSAlex Bennée 315a622d64eSAlex Bennée pci0-conf @ 0xfffffd01fe000000 316a622d64eSAlex Bennée off:00000004, 1, 1 317a622d64eSAlex Bennée off:00000010, 1, 3 318a622d64eSAlex Bennée off:00000014, 1, 3 319a622d64eSAlex Bennée off:00000018, 1, 2 320a622d64eSAlex Bennée off:0000001c, 1, 2 321a622d64eSAlex Bennée off:00000020, 1, 2 322a622d64eSAlex Bennée ... 323