From: Harry van Haaren <[email protected]> Executed instructions are cached in string format inside the execlog plugin. These strings are flushed on exit of a TB, improving performance. This causes executed instructions to be lost when an 'ecall' (riscv system call) occurs that causes the thread to terminate.
The fix in this patch registers an 'on_exit()' callback, and flushes any content in the c->last_exec buffer, to ensure all instructions are present in the final instruction log. A mutex lock/unlock is added around the plugin exit, to ensure the lines are not corrupted. Signed-off-by: Harry van Haaren <[email protected]> --- Please note that LLMs were used to investigate and fix this bug, but all code in this patch has been reviewed by me, and I believe it to be a good solution. --- contrib/plugins/execlog.c | 26 +++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/contrib/plugins/execlog.c b/contrib/plugins/execlog.c index e51af9f2df..f362b38268 100644 --- a/contrib/plugins/execlog.c +++ b/contrib/plugins/execlog.c @@ -388,7 +388,28 @@ static void vcpu_init(qemu_plugin_id_t id, unsigned int vcpu_index) } /** - * On plugin exit, print last instruction in cache + * On vCPU exit, flush the last cached instruction for this vCPU. + * + * The one-instruction-delay pattern stores each instruction in last_exec and + * only prints it when the *next* callback fires. When a thread exits via + * syscall (e.g. ecall/exit), no subsequent callback fires for that vCPU and + * the final instruction is silently dropped. Flushing here guarantees it is + * written before the vCPU is torn down. + */ +static void vcpu_exit(qemu_plugin_id_t id, unsigned int vcpu_index) +{ + CPU *c = qemu_plugin_scoreboard_find(cpus, vcpu_index); + if (c->last_exec && c->last_exec->len) { + g_mutex_lock(&execlog_output_mutex); + qemu_plugin_outs(c->last_exec->str); + qemu_plugin_outs("\n"); + g_mutex_unlock(&execlog_output_mutex); + g_string_truncate(c->last_exec, 0); + } +} + +/** + * On plugin exit, flush any remaining cached instructions and free state. */ static void plugin_exit(qemu_plugin_id_t id, void *p) { @@ -396,8 +417,10 @@ static void plugin_exit(qemu_plugin_id_t id, void *p) for (int i = 0; i < n; i++) { CPU *c = qemu_plugin_scoreboard_find(cpus, i); if (c->last_exec && c->last_exec->len) { + g_mutex_lock(&execlog_output_mutex); qemu_plugin_outs(c->last_exec->str); qemu_plugin_outs("\n"); + g_mutex_unlock(&execlog_output_mutex); } } qemu_plugin_scoreboard_free(cpus); @@ -467,6 +490,7 @@ QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id, /* Register init, translation block and exit callbacks */ qemu_plugin_register_vcpu_init_cb(id, vcpu_init); + qemu_plugin_register_vcpu_exit_cb(id, vcpu_exit); qemu_plugin_register_vcpu_tb_trans_cb(id, vcpu_tb_trans); qemu_plugin_register_atexit_cb(id, plugin_exit, NULL); -- 2.54.0 The content, data, and any attached documents to this email are addressed exclusively to the addressee and are confidential and/or may be subject to a non-disclosure agreement. Any use, forwarding, disclosure, and/or copying, in whole or in part, without authorization is prohibited. If you have received this email in error, we apologize and, please notify the sender or Openchip immediately, and delete it from your system. El contenido, los datos y cualquier documento adjunto a este correo electrónico están dirigidos exclusivamente al destinatario y son confidenciales y/o pueden estar sujetas a un acuerdo de no revelación. Está prohibido cualquier uso, reenvío, divulgación o copia, total o parcial, sin autorización. Si has recibido este correo por error, te pedimos disculpas y agradecemos que lo notifiques de inmediato al remitente o a Openchip, y lo elimines de tu sistema. El contingut, les dades i qualsevol document adjunt a aquest correu electrònic estan dirigits exclusivament al destinatari i són confidencials i/o poden estar subjectes a un acord de no revelació. Està prohibit qualsevol ús, reenviament, divulgació o còpia, total o parcial, sense autorització. Si has rebut aquest correu per error, et demanem disculpes i agraïm que ho notifiquis d'immediat al remitent o a Openchip, i l'eliminis del teu sistema
