diff mbox series

[v3,07/11] contrib/plugins/hotblocks: fix 32-bit build

Message ID 20241217224306.2900490-8-pierrick.bouvier@linaro.org
State New
Headers show
Series Fix 32-bit build for plugins | expand

Commit Message

Pierrick Bouvier Dec. 17, 2024, 10:43 p.m. UTC
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 contrib/plugins/hotblocks.c | 29 ++++++++++++++++++++++++-----
 1 file changed, 24 insertions(+), 5 deletions(-)

Comments

Richard Henderson Dec. 18, 2024, 5:54 p.m. UTC | #1
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 mbox series

Patch

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);