Message ID | 20241217224306.2900490-8-pierrick.bouvier@linaro.org |
---|---|
State | New |
Headers | show |
Series | Fix 32-bit build for plugins | expand |
On 12/17/24 16:43, Pierrick Bouvier wrote: > Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> > --- > contrib/plugins/hotblocks.c | 29 ++++++++++++++++++++++++----- > 1 file changed, 24 insertions(+), 5 deletions(-) Reviewed-by: Richard Henderson <richard.henderson@linaro.org> r~ > > diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c > index 02bc5078bdd..f12bfb7a267 100644 > --- a/contrib/plugins/hotblocks.c > +++ b/contrib/plugins/hotblocks.c > @@ -29,7 +29,7 @@ static guint64 limit = 20; > * > * The internals of the TCG are not exposed to plugins so we can only > * get the starting PC for each block. We cheat this slightly by > - * xor'ing the number of instructions to the hash to help > + * checking the number of instructions as well to help > * differentiate. > */ > typedef struct { > @@ -50,6 +50,20 @@ static gint cmp_exec_count(gconstpointer a, gconstpointer b) > return count_a > count_b ? -1 : 1; > } > > +static guint exec_count_hash(gconstpointer v) > +{ > + const ExecCount *e = v; > + return e->start_addr ^ e->insns; > +} > + > +static gboolean exec_count_equal(gconstpointer v1, gconstpointer v2) > +{ > + const ExecCount *ea = v1; > + const ExecCount *eb = v2; > + return (ea->start_addr == eb->start_addr) && > + (ea->insns == eb->insns); > +} > + > static void exec_count_free(gpointer key, gpointer value, gpointer user_data) > { > ExecCount *cnt = value; > @@ -91,7 +105,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p) > > static void plugin_init(void) > { > - hotblocks = g_hash_table_new(NULL, g_direct_equal); > + hotblocks = g_hash_table_new(exec_count_hash, exec_count_equal); > } > > static void vcpu_tb_exec(unsigned int cpu_index, void *udata) > @@ -111,10 +125,15 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) > ExecCount *cnt; > uint64_t pc = qemu_plugin_tb_vaddr(tb); > size_t insns = qemu_plugin_tb_n_insns(tb); > - uint64_t hash = pc ^ insns; > > g_mutex_lock(&lock); > - cnt = (ExecCount *) g_hash_table_lookup(hotblocks, (gconstpointer) hash); > + { > + ExecCount e; > + e.start_addr = pc; > + e.insns = insns; > + cnt = (ExecCount *) g_hash_table_lookup(hotblocks, &e); > + } > + > if (cnt) { > cnt->trans_count++; > } else { > @@ -123,7 +142,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) > cnt->trans_count = 1; > cnt->insns = insns; > cnt->exec_count = qemu_plugin_scoreboard_new(sizeof(uint64_t)); > - g_hash_table_insert(hotblocks, (gpointer) hash, (gpointer) cnt); > + g_hash_table_insert(hotblocks, cnt, cnt); > } > > g_mutex_unlock(&lock);
diff --git a/contrib/plugins/hotblocks.c b/contrib/plugins/hotblocks.c index 02bc5078bdd..f12bfb7a267 100644 --- a/contrib/plugins/hotblocks.c +++ b/contrib/plugins/hotblocks.c @@ -29,7 +29,7 @@ static guint64 limit = 20; * * The internals of the TCG are not exposed to plugins so we can only * get the starting PC for each block. We cheat this slightly by - * xor'ing the number of instructions to the hash to help + * checking the number of instructions as well to help * differentiate. */ typedef struct { @@ -50,6 +50,20 @@ static gint cmp_exec_count(gconstpointer a, gconstpointer b) return count_a > count_b ? -1 : 1; } +static guint exec_count_hash(gconstpointer v) +{ + const ExecCount *e = v; + return e->start_addr ^ e->insns; +} + +static gboolean exec_count_equal(gconstpointer v1, gconstpointer v2) +{ + const ExecCount *ea = v1; + const ExecCount *eb = v2; + return (ea->start_addr == eb->start_addr) && + (ea->insns == eb->insns); +} + static void exec_count_free(gpointer key, gpointer value, gpointer user_data) { ExecCount *cnt = value; @@ -91,7 +105,7 @@ static void plugin_exit(qemu_plugin_id_t id, void *p) static void plugin_init(void) { - hotblocks = g_hash_table_new(NULL, g_direct_equal); + hotblocks = g_hash_table_new(exec_count_hash, exec_count_equal); } static void vcpu_tb_exec(unsigned int cpu_index, void *udata) @@ -111,10 +125,15 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) ExecCount *cnt; uint64_t pc = qemu_plugin_tb_vaddr(tb); size_t insns = qemu_plugin_tb_n_insns(tb); - uint64_t hash = pc ^ insns; g_mutex_lock(&lock); - cnt = (ExecCount *) g_hash_table_lookup(hotblocks, (gconstpointer) hash); + { + ExecCount e; + e.start_addr = pc; + e.insns = insns; + cnt = (ExecCount *) g_hash_table_lookup(hotblocks, &e); + } + if (cnt) { cnt->trans_count++; } else { @@ -123,7 +142,7 @@ static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb) cnt->trans_count = 1; cnt->insns = insns; cnt->exec_count = qemu_plugin_scoreboard_new(sizeof(uint64_t)); - g_hash_table_insert(hotblocks, (gpointer) hash, (gpointer) cnt); + g_hash_table_insert(hotblocks, cnt, cnt); } g_mutex_unlock(&lock);
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> --- contrib/plugins/hotblocks.c | 29 ++++++++++++++++++++++++----- 1 file changed, 24 insertions(+), 5 deletions(-)