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