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