From: "Alex Bennée" <alex.bennee@linaro.org>
To: qemu-devel@nongnu.org
Cc: "Eduardo Habkost" <eduardo@habkost.net>,
"Zhao Liu" <zhao1.liu@intel.com>,
"Marcel Apfelbaum" <marcel.apfelbaum@gmail.com>,
"Beraldo Leal" <bleal@redhat.com>,
"Philippe Mathieu-Daudé" <philmd@linaro.org>,
"Alexandre Iooss" <erdnaxe@crans.org>,
"Alex Bennée" <alex.bennee@linaro.org>,
"Pierrick Bouvier" <pierrick.bouvier@linaro.org>,
"Yanan Wang" <wangyanan55@huawei.com>,
"Peter Maydell" <peter.maydell@linaro.org>,
"Mahmoud Mandour" <ma.mandourr@gmail.com>,
"Thomas Huth" <thuth@redhat.com>,
qemu-arm@nongnu.org, devel@lists.libvirt.org,
"Jiaxun Yang" <jiaxun.yang@flygoat.com>,
"Paolo Bonzini" <pbonzini@redhat.com>,
"Richard Henderson" <richard.henderson@linaro.org>,
"Wainer dos Santos Moschetta" <wainersm@redhat.com>,
"Xingtao Yao" <yaoxt.fnst@fujitsu.com>
Subject: [PATCH 15/26] plugins: extend API to get latest memory value accessed
Date: Tue, 10 Sep 2024 15:07:22 +0100 [thread overview]
Message-ID: <20240910140733.4007719-16-alex.bennee@linaro.org> (raw)
In-Reply-To: <20240910140733.4007719-1-alex.bennee@linaro.org>
From: Pierrick Bouvier <pierrick.bouvier@linaro.org>
This value can be accessed only during a memory callback, using
new qemu_plugin_mem_get_value function.
Returned value can be extended when QEMU will support accesses wider
than 128 bits.
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/1719
Resolves: https://gitlab.com/qemu-project/qemu/-/issues/2152
Reviewed-by: Richard Henderson <richard.henderson@linaro.org>
Reviewed-by: Xingtao Yao <yaoxt.fnst@fujitsu.com>
Reviewed-by: Alex Bennée <alex.bennee@linaro.org>
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Message-Id: <20240724194708.1843704-3-pierrick.bouvier@linaro.org>
Signed-off-by: Alex Bennée <alex.bennee@linaro.org>
---
include/qemu/qemu-plugin.h | 32 ++++++++++++++++++++++++++++++++
plugins/api.c | 33 +++++++++++++++++++++++++++++++++
plugins/qemu-plugins.symbols | 1 +
3 files changed, 66 insertions(+)
diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h
index c71c705b69..649ce89815 100644
--- a/include/qemu/qemu-plugin.h
+++ b/include/qemu/qemu-plugin.h
@@ -262,6 +262,29 @@ enum qemu_plugin_mem_rw {
QEMU_PLUGIN_MEM_RW,
};
+enum qemu_plugin_mem_value_type {
+ QEMU_PLUGIN_MEM_VALUE_U8,
+ QEMU_PLUGIN_MEM_VALUE_U16,
+ QEMU_PLUGIN_MEM_VALUE_U32,
+ QEMU_PLUGIN_MEM_VALUE_U64,
+ QEMU_PLUGIN_MEM_VALUE_U128,
+};
+
+/* typedef qemu_plugin_mem_value - value accessed during a load/store */
+typedef struct {
+ enum qemu_plugin_mem_value_type type;
+ union {
+ uint8_t u8;
+ uint16_t u16;
+ uint32_t u32;
+ uint64_t u64;
+ struct {
+ uint64_t low;
+ uint64_t high;
+ } u128;
+ } data;
+} qemu_plugin_mem_value;
+
/**
* enum qemu_plugin_cond - condition to enable callback
*
@@ -551,6 +574,15 @@ bool qemu_plugin_mem_is_big_endian(qemu_plugin_meminfo_t info);
QEMU_PLUGIN_API
bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info);
+/**
+ * qemu_plugin_mem_get_mem_value() - return last value loaded/stored
+ * @info: opaque memory transaction handle
+ *
+ * Returns: memory value
+ */
+QEMU_PLUGIN_API
+qemu_plugin_mem_value qemu_plugin_mem_get_value(qemu_plugin_meminfo_t info);
+
/**
* qemu_plugin_get_hwaddr() - return handle for memory operation
* @info: opaque memory info structure
diff --git a/plugins/api.c b/plugins/api.c
index 2ff13d09de..3316d4a04d 100644
--- a/plugins/api.c
+++ b/plugins/api.c
@@ -351,6 +351,39 @@ bool qemu_plugin_mem_is_store(qemu_plugin_meminfo_t info)
return get_plugin_meminfo_rw(info) & QEMU_PLUGIN_MEM_W;
}
+qemu_plugin_mem_value qemu_plugin_mem_get_value(qemu_plugin_meminfo_t info)
+{
+ uint64_t low = current_cpu->neg.plugin_mem_value_low;
+ qemu_plugin_mem_value value;
+
+ switch (qemu_plugin_mem_size_shift(info)) {
+ case 0:
+ value.type = QEMU_PLUGIN_MEM_VALUE_U8;
+ value.data.u8 = (uint8_t)low;
+ break;
+ case 1:
+ value.type = QEMU_PLUGIN_MEM_VALUE_U16;
+ value.data.u16 = (uint16_t)low;
+ break;
+ case 2:
+ value.type = QEMU_PLUGIN_MEM_VALUE_U32;
+ value.data.u32 = (uint32_t)low;
+ break;
+ case 3:
+ value.type = QEMU_PLUGIN_MEM_VALUE_U64;
+ value.data.u64 = low;
+ break;
+ case 4:
+ value.type = QEMU_PLUGIN_MEM_VALUE_U128;
+ value.data.u128.low = low;
+ value.data.u128.high = current_cpu->neg.plugin_mem_value_high;
+ break;
+ default:
+ g_assert_not_reached();
+ }
+ return value;
+}
+
/*
* Virtual Memory queries
*/
diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols
index ca773d8d9f..eed9d8abd9 100644
--- a/plugins/qemu-plugins.symbols
+++ b/plugins/qemu-plugins.symbols
@@ -13,6 +13,7 @@
qemu_plugin_insn_size;
qemu_plugin_insn_symbol;
qemu_plugin_insn_vaddr;
+ qemu_plugin_mem_get_value;
qemu_plugin_mem_is_big_endian;
qemu_plugin_mem_is_sign_extended;
qemu_plugin_mem_is_store;
--
2.39.2
next prev parent reply other threads:[~2024-09-10 14:09 UTC|newest]
Thread overview: 36+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-09-10 14:07 [PATCH 00/26] Maintainer updates (testing, gdbstub, plugins) Alex Bennée
2024-09-10 14:07 ` [PATCH 01/26] tests/docker: remove debian-armel-cross Alex Bennée
2024-09-10 14:42 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 02/26] tests/docker: update debian i686 and mipsel images to bookworm Alex Bennée
2024-09-10 14:42 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 03/26] docs/devel: fix duplicate line Alex Bennée
2024-09-10 14:42 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 04/26] scripts/ci: update the gitlab-runner playbook Alex Bennée
2024-09-10 14:43 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 05/26] gdbstub: Use specific MMU index when probing MTE addresses Alex Bennée
2024-09-10 14:07 ` [PATCH 06/26] gdbstub: Add support for MTE in system mode Alex Bennée
2024-09-10 14:07 ` [PATCH 07/26] tests/guest-debug: Support passing arguments to the GDB test script Alex Bennée
2024-09-10 14:07 ` [PATCH 08/26] tests/tcg/aarch64: Improve linker script organization Alex Bennée
2024-09-10 14:07 ` [PATCH 09/26] tests/tcg/aarch64: Extend MTE gdbstub tests to system mode Alex Bennée
2024-09-10 14:07 ` [PATCH 10/26] contrib/plugins/Makefile: Add a 'distclean' target Alex Bennée
2024-09-10 14:07 ` [PATCH 11/26] deprecation: don't enable TCG plugins by default on 32 bit hosts Alex Bennée
2024-09-10 14:45 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 12/26] deprecation: don't enable TCG plugins by default with TCI Alex Bennée
2024-09-10 14:45 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 13/26] contrib/plugins: control flow plugin Alex Bennée
2024-09-10 14:52 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 14/26] plugins: save value during memory accesses Alex Bennée
2024-09-10 14:07 ` Alex Bennée [this message]
2024-09-10 14:07 ` [PATCH 16/26] tests/tcg: add mechanism to run specific tests with plugins Alex Bennée
2024-09-10 14:07 ` [PATCH 17/26] tests/tcg: allow to check output of plugins Alex Bennée
2024-09-10 14:07 ` [PATCH 18/26] tests/plugin/mem: add option to print memory accesses Alex Bennée
2024-09-10 14:07 ` [PATCH 19/26] tests/tcg: clean up output of memory system test Alex Bennée
2024-09-10 14:47 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 20/26] tests/tcg: only read/write 64 bit words on 64 bit systems Alex Bennée
2024-09-10 14:48 ` Pierrick Bouvier
2024-09-10 14:07 ` [PATCH 21/26] tests/tcg: add a system test to check memory instrumentation Alex Bennée
2024-09-10 14:07 ` [PATCH 22/26] util/timer: avoid deadlock when shutting down Alex Bennée
2024-09-10 14:07 ` [PATCH 23/26] contrib/plugins: Add a plugin to generate basic block vectors Alex Bennée
2024-09-10 14:07 ` [PATCH 24/26] plugins: add plugin API to read guest memory Alex Bennée
2024-09-10 14:07 ` [PATCH 25/26] plugins: add option to dump write argument to syscall plugin Alex Bennée
2024-09-10 14:07 ` [PATCH 26/26] plugins: add ability to register a GDB triggered callback Alex Bennée
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240910140733.4007719-16-alex.bennee@linaro.org \
--to=alex.bennee@linaro.org \
--cc=bleal@redhat.com \
--cc=devel@lists.libvirt.org \
--cc=eduardo@habkost.net \
--cc=erdnaxe@crans.org \
--cc=jiaxun.yang@flygoat.com \
--cc=ma.mandourr@gmail.com \
--cc=marcel.apfelbaum@gmail.com \
--cc=pbonzini@redhat.com \
--cc=peter.maydell@linaro.org \
--cc=philmd@linaro.org \
--cc=pierrick.bouvier@linaro.org \
--cc=qemu-arm@nongnu.org \
--cc=qemu-devel@nongnu.org \
--cc=richard.henderson@linaro.org \
--cc=thuth@redhat.com \
--cc=wainersm@redhat.com \
--cc=wangyanan55@huawei.com \
--cc=yaoxt.fnst@fujitsu.com \
--cc=zhao1.liu@intel.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).