id = 2035 title = "TCG Plugin exit callback not executing" state = "opened" created_at = "2023-12-13T15:46:34.693Z" closed_at = "n/a" labels = ["TCG plugins", "workflow::Needs Info"] url = "https://gitlab.com/qemu-project/qemu/-/issues/2035" host-os = "RHEL 8" host-arch = "x86" qemu-version = "master, 8.1.3" guest-os = "n/a" guest-arch = "n/a" description = """I cannot get the plugin exit callback to register/execute. I should see "Goodbye from plugin" but dont. I have also tried using `qemu_plugin_outs` without success. **Update: If I make my test binary an infinite loop and kill it with CTRL-C, then the callback is called as expected. Am I just using it wrong?**""" reproduce = """1. Configured QEMU with `--target-list=riscv32-linux-user,riscv64-linux-user --enable-plugins --disable-system` 2. Compiled plugin with ``` gcc -I./qemu/include/qemu `pkg-config --libs glib-2.0` -O0 -fvisibility=hidden -Wall -shared -fPIC `pkg-config --cflags glib-2.0` ``` 3. Compiled test binary (just a hello world) with `riscv64-unknown-elf-gcc test_qemu.c -o test_qemu` 4. Ran ./qemu/build/qemu-riscv64 -plugin ./test_plugin.so -d plugin ./test_qemu""" additional = """test_plugin.c ``` #include #include #include #include #include #include #include QEMU_PLUGIN_EXPORT int qemu_plugin_version = QEMU_PLUGIN_VERSION; static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) { int n_insns = qemu_plugin_tb_n_insns(tb); printf("> New TB of size %d\\n", n_insns); for (int i = 0; i < n_insns; i++) { struct qemu_plugin_insn * insn = qemu_plugin_tb_get_insn(tb, i); char * disassembly = qemu_plugin_insn_disas(insn); printf(" > Instruciton: %s\\n", disassembly); } } static void plugin_exit(qemu_plugin_id_t id, void *p) { printf("> Goodbye from plugin. %d\\n", id); } QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, const qemu_info_t *info, int argc, char **argv) { printf("> Hello From Plugin!\\n"); qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); qemu_plugin_register_atexit_cb(id, plugin_exit, NULL); printf("> Everything was registered\\n"); return 0; } ```"""