From: Ruslan Ruslichenko <[email protected]> The patch introduces qemu_plugin_flush_tb_cache() to the plugin API, allowing plugins to invalidate QEMU translate code cache.
If a plugin needs to dynamically register a new instruction or memory callback, the new hooks may not be triggered for code blocks that QEMU has already translated and cached. This API allows QEMU re-translate TB, so that new applied hooks will take effect. Signed-off-by: Ruslan Ruslichenko <[email protected]> --- include/plugins/qemu-plugin.h | 3 +++ plugins/api.c | 6 ++++++ plugins/core.c | 11 +++++++++++ plugins/plugin.h | 2 ++ 4 files changed, 22 insertions(+) diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h index bbd21e79c5..a68427536f 100644 --- a/include/plugins/qemu-plugin.h +++ b/include/plugins/qemu-plugin.h @@ -1246,6 +1246,9 @@ void qemu_plugin_u64_set(qemu_plugin_u64 entry, unsigned int vcpu_index, QEMU_PLUGIN_API uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry); +QEMU_PLUGIN_API +void qemu_plugin_flush_tb_cache(void); + QEMU_PLUGIN_API uint64_t qemu_plugin_get_virtual_clock_ns(void); diff --git a/plugins/api.c b/plugins/api.c index 609ea69293..fa650e1219 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -653,6 +653,12 @@ uint64_t qemu_plugin_u64_sum(qemu_plugin_u64 entry) return total; } +QEMU_PLUGIN_API +void qemu_plugin_flush_tb_cache(void) +{ + plugin_flush_tb_cache(); +} + typedef struct { void (*cb)(void *opaque); void* opaque; diff --git a/plugins/core.c b/plugins/core.c index 42fd986593..462f4bae81 100644 --- a/plugins/core.c +++ b/plugins/core.c @@ -21,6 +21,7 @@ #include "qemu/rcu.h" #include "exec/tb-flush.h" #include "tcg/tcg-op-common.h" +#include "qemu/main-loop.h" #include "plugin.h" struct qemu_plugin_cb { @@ -888,3 +889,13 @@ enum qemu_plugin_cb_flags tcg_call_to_qemu_plugin_cb_flags(int flags) return QEMU_PLUGIN_CB_RW_REGS; } } + +void plugin_flush_tb_cache(void) +{ + CPUState *cpu = qemu_get_cpu(0); + if (cpu) { + queue_tb_flush(cpu); + + qemu_cpu_kick(cpu); + } +} diff --git a/plugins/plugin.h b/plugins/plugin.h index 6fbc443b96..0bf819536b 100644 --- a/plugins/plugin.h +++ b/plugins/plugin.h @@ -125,4 +125,6 @@ void plugin_scoreboard_free(struct qemu_plugin_scoreboard *score); */ void qemu_plugin_fillin_mode_info(qemu_info_t *info); +void plugin_flush_tb_cache(void); + #endif /* PLUGIN_H */ -- 2.43.0
