diff mbox series

[v2,6/7] tests/plugin/mem: add option to print memory accesses

Message ID 20240626233757.375083-7-pierrick.bouvier@linaro.org
State New
Headers show
Series plugins: access values during a memory read/write | expand

Commit Message

Pierrick Bouvier June 26, 2024, 11:37 p.m. UTC
By using "print-accesses=true" option, mem plugin will now print every
value accessed, with associated size, type (store vs load) and symbol
where this happens.

Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
---
 tests/plugin/mem.c | 28 +++++++++++++++++++++++++++-
 1 file changed, 27 insertions(+), 1 deletion(-)

Comments

Xingtao Yao (Fujitsu)" via June 27, 2024, 3:17 a.m. UTC | #1
Hi, Pierrick

> +static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t
> meminfo,
> +                         uint64_t vaddr, void *udata)
> +{
> +    unsigned size = 8 << qemu_plugin_mem_size_shift(meminfo);
> +    const char *type = qemu_plugin_mem_is_store(meminfo) ? "store" : "load";
> +    uint64_t upper = qemu_plugin_mem_get_value_upper_bits(meminfo);
> +    uint64_t lower = qemu_plugin_mem_get_value_lower_bits(meminfo);
> +    const char *sym = udata ? udata : "";
> +    g_autoptr(GString) out = g_string_new("");
> +    g_string_printf(out, "access: 0x%.0"PRIx64"%"PRIx64",%d,%s,%s\n",
> +                    upper, lower, size, type, sym);
> +    qemu_plugin_outs(out->str);
> +}
I think it may be helpful to output the GVA and GPA, can you append these information?


Thanks
Xingtao
Pierrick Bouvier June 27, 2024, 5:29 a.m. UTC | #2
Hi Xingtao,

On 6/26/24 20:17, Xingtao Yao (Fujitsu) wrote:
> Hi, Pierrick
> 
>> +static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t
>> meminfo,
>> +                         uint64_t vaddr, void *udata)
>> +{
>> +    unsigned size = 8 << qemu_plugin_mem_size_shift(meminfo);
>> +    const char *type = qemu_plugin_mem_is_store(meminfo) ? "store" : "load";
>> +    uint64_t upper = qemu_plugin_mem_get_value_upper_bits(meminfo);
>> +    uint64_t lower = qemu_plugin_mem_get_value_lower_bits(meminfo);
>> +    const char *sym = udata ? udata : "";
>> +    g_autoptr(GString) out = g_string_new("");
>> +    g_string_printf(out, "access: 0x%.0"PRIx64"%"PRIx64",%d,%s,%s\n",
>> +                    upper, lower, size, type, sym);
>> +    qemu_plugin_outs(out->str);
>> +}
> I think it may be helpful to output the GVA and GPA, can you append these information?
> 

You mean virtual and physical addresses?

> 
> Thanks
> Xingtao
Xingtao Yao (Fujitsu)" via June 27, 2024, 6:04 a.m. UTC | #3
> -----Original Message-----
> From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
> Sent: Thursday, June 27, 2024 1:29 PM
> To: Yao, Xingtao/姚 幸涛 <yaoxt.fnst@fujitsu.com>; qemu-devel@nongnu.org
> Cc: Alexandre Iooss <erdnaxe@crans.org>; Philippe Mathieu-Daudé
> <philmd@linaro.org>; Mahmoud Mandour <ma.mandourr@gmail.com>; Paolo
> Bonzini <pbonzini@redhat.com>; Eduardo Habkost <eduardo@habkost.net>;
> Richard Henderson <richard.henderson@linaro.org>; Alex Bennée
> <alex.bennee@linaro.org>
> Subject: Re: [PATCH v2 6/7] tests/plugin/mem: add option to print memory
> accesses
> 
> Hi Xingtao,
> 
> On 6/26/24 20:17, Xingtao Yao (Fujitsu) wrote:
> > Hi, Pierrick
> >
> >> +static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t
> >> meminfo,
> >> +                         uint64_t vaddr, void *udata)
> >> +{
> >> +    unsigned size = 8 << qemu_plugin_mem_size_shift(meminfo);
> >> +    const char *type = qemu_plugin_mem_is_store(meminfo) ? "store" :
> "load";
> >> +    uint64_t upper = qemu_plugin_mem_get_value_upper_bits(meminfo);
> >> +    uint64_t lower = qemu_plugin_mem_get_value_lower_bits(meminfo);
> >> +    const char *sym = udata ? udata : "";
> >> +    g_autoptr(GString) out = g_string_new("");
> >> +    g_string_printf(out, "access: 0x%.0"PRIx64"%"PRIx64",%d,%s,%s\n",
> >> +                    upper, lower, size, type, sym);
> >> +    qemu_plugin_outs(out->str);
> >> +}
> > I think it may be helpful to output the GVA and GPA, can you append these
> information?
> >
> 
> You mean virtual and physical addresses?
Yes. currently we only known the memory value, appending these info may help us to trace the 
memory access.

> 
> >
> > Thanks
> > Xingtao
Pierrick Bouvier June 27, 2024, 6:31 p.m. UTC | #4
On 6/26/24 23:04, Xingtao Yao (Fujitsu) wrote:
> 
> 
>> -----Original Message-----
>> From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
>> Sent: Thursday, June 27, 2024 1:29 PM
>> To: Yao, Xingtao/姚 幸涛 <yaoxt.fnst@fujitsu.com>; qemu-devel@nongnu.org
>> Cc: Alexandre Iooss <erdnaxe@crans.org>; Philippe Mathieu-Daudé
>> <philmd@linaro.org>; Mahmoud Mandour <ma.mandourr@gmail.com>; Paolo
>> Bonzini <pbonzini@redhat.com>; Eduardo Habkost <eduardo@habkost.net>;
>> Richard Henderson <richard.henderson@linaro.org>; Alex Bennée
>> <alex.bennee@linaro.org>
>> Subject: Re: [PATCH v2 6/7] tests/plugin/mem: add option to print memory
>> accesses
>>
>> Hi Xingtao,
>>
>> On 6/26/24 20:17, Xingtao Yao (Fujitsu) wrote:
>>> Hi, Pierrick
>>>
>>>> +static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t
>>>> meminfo,
>>>> +                         uint64_t vaddr, void *udata)
>>>> +{
>>>> +    unsigned size = 8 << qemu_plugin_mem_size_shift(meminfo);
>>>> +    const char *type = qemu_plugin_mem_is_store(meminfo) ? "store" :
>> "load";
>>>> +    uint64_t upper = qemu_plugin_mem_get_value_upper_bits(meminfo);
>>>> +    uint64_t lower = qemu_plugin_mem_get_value_lower_bits(meminfo);
>>>> +    const char *sym = udata ? udata : "";
>>>> +    g_autoptr(GString) out = g_string_new("");
>>>> +    g_string_printf(out, "access: 0x%.0"PRIx64"%"PRIx64",%d,%s,%s\n",
>>>> +                    upper, lower, size, type, sym);
>>>> +    qemu_plugin_outs(out->str);
>>>> +}
>>> I think it may be helpful to output the GVA and GPA, can you append these
>> information?
>>>
>>
>> You mean virtual and physical addresses?
> Yes. currently we only known the memory value, appending these info may help us to trace the
> memory access.
> 

Sounds good, I'll add this in v3.

>>
>>>
>>> Thanks
>>> Xingtao
diff mbox series

Patch

diff --git a/tests/plugin/mem.c b/tests/plugin/mem.c
index b650dddcce1..d897034a044 100644
--- a/tests/plugin/mem.c
+++ b/tests/plugin/mem.c
@@ -24,7 +24,7 @@  typedef struct {
 static struct qemu_plugin_scoreboard *counts;
 static qemu_plugin_u64 mem_count;
 static qemu_plugin_u64 io_count;
-static bool do_inline, do_callback;
+static bool do_inline, do_callback, do_print_accesses;
 static bool do_haddr;
 static enum qemu_plugin_mem_rw rw = QEMU_PLUGIN_MEM_RW;
 
@@ -60,6 +60,20 @@  static void vcpu_mem(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
     }
 }
 
+static void print_access(unsigned int cpu_index, qemu_plugin_meminfo_t meminfo,
+                         uint64_t vaddr, void *udata)
+{
+    unsigned size = 8 << qemu_plugin_mem_size_shift(meminfo);
+    const char *type = qemu_plugin_mem_is_store(meminfo) ? "store" : "load";
+    uint64_t upper = qemu_plugin_mem_get_value_upper_bits(meminfo);
+    uint64_t lower = qemu_plugin_mem_get_value_lower_bits(meminfo);
+    const char *sym = udata ? udata : "";
+    g_autoptr(GString) out = g_string_new("");
+    g_string_printf(out, "access: 0x%.0"PRIx64"%"PRIx64",%d,%s,%s\n",
+                    upper, lower, size, type, sym);
+    qemu_plugin_outs(out->str);
+}
+
 static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
 {
     size_t n = qemu_plugin_tb_n_insns(tb);
@@ -79,6 +93,12 @@  static void vcpu_tb_trans(qemu_plugin_id_t id, struct qemu_plugin_tb *tb)
                                              QEMU_PLUGIN_CB_NO_REGS,
                                              rw, NULL);
         }
+        if (do_print_accesses) {
+            const char *sym = qemu_plugin_insn_symbol(insn);
+            qemu_plugin_register_vcpu_mem_cb(insn, print_access,
+                                             QEMU_PLUGIN_CB_NO_REGS,
+                                             rw, (void *) sym);
+        }
     }
 }
 
@@ -117,6 +137,12 @@  QEMU_PLUGIN_EXPORT int qemu_plugin_install(qemu_plugin_id_t id,
                 fprintf(stderr, "boolean argument parsing failed: %s\n", opt);
                 return -1;
             }
+        } else if (g_strcmp0(tokens[0], "print-accesses") == 0) {
+            if (!qemu_plugin_bool_parse(tokens[0], tokens[1],
+                                        &do_print_accesses)) {
+                fprintf(stderr, "boolean argument parsing failed: %s\n", opt);
+                return -1;
+            }
         } else {
             fprintf(stderr, "option parsing failed: %s\n", opt);
             return -1;