RE: TCG asserts on some of translation blocks with plugin memory callback

Mikhail Tyutin posted 1 patch 1 year, 2 months ago
Failed in applying to current master (apply log)
RE: TCG asserts on some of translation blocks with plugin memory callback
Posted by Mikhail Tyutin 1 year, 2 months ago
> I have been testing TCG plugin patch on latest Qemu build but noticed that it
> fails with assert on some of the applications.
> 
>    ERROR:../accel/tcg/cpu-exec.c:983:cpu_exec_loop:
>        assertion failed: (cpu->plugin_mem_cbs == ((void *)0))
> 

It seems that the problem is around tcg_ctx->plugin_tb->mem_helper flag. It is set to true
by inject_mem_enable_helper() if plugin requests memory callbacks injection and checked
by inject_mem_disable_helper() to insert appropriate cleanup code at the end. It works if
translation block has single exit point. However if translation block has branches or exits,
inject_mem_disable_helper() is called during code generation prepending all tb exits.
Unfortunately it happens before inject_mem_enable_helper() initializes mem_helper flag for
that block.

I’ve tried quick fix by commenting out this check in inject_mem_disable_helper() so that clean
up code is inserted unconditionally on every exit. The assert is gone.
What would be a better way to fix it?


diff --git a/accel/tcg/plugin-gen.c b/accel/tcg/plugin-gen.c
index 17a686bd9e..6651874c0f 100644
--- a/accel/tcg/plugin-gen.c
+++ b/accel/tcg/plugin-gen.c
@@ -637,9 +637,9 @@ void plugin_gen_disable_mem_helpers(void)
      * Note: we do not reset plugin_tb->mem_helper here; a TB might have several
      * exit points, and we want to emit the clearing from all of them.
      */
-    if (!tcg_ctx->plugin_tb->mem_helper) {
-        return;
-    }
+    // if (!tcg_ctx->plugin_tb->mem_helper) {
+    //     return;
+    // }
     ptr = tcg_const_ptr(NULL);
     tcg_gen_st_ptr(ptr, cpu_env, offsetof(CPUState, plugin_mem_cbs) -
                                  offsetof(ArchCPU, env));