* [PATCH v2 0/1] plugins: add API to read guest CPU memory from hwaddr @ 2024-08-29 16:47 Rowan Hart 2024-08-29 16:47 ` [PATCH v2 1/1] " Rowan Hart 0 siblings, 1 reply; 2+ messages in thread From: Rowan Hart @ 2024-08-29 16:47 UTC (permalink / raw) To: qemu-devel Cc: Mahmoud Mandour, Alexandre Iooss, Pierrick Bouvier, Alex Bennée, Rowan Hart This patch adds a single API function which allows reading from a guest CPU physical address. I don't know of a good way to add a self-contained test for this feature to tests/tcg/plugins, but I did come up with a small test case to demonstrate the functionality using peiyuanix/riscv-os: First, grab and build the firmware code: curl -o firmware.S https://raw.githubusercontent.com/peiyuanix/riscv-os/main/03-Bare-Metal-Hello-RISC-V/firmware.s curl -o firmware.x https://raw.githubusercontent.com/peiyuanix/riscv-os/main/03-Bare-Metal-Hello-RISC-V/firmware.ld riscv64-linux-gnu-as firmware.S -o firmware.o riscv64-linux-gnu-ld -T firmware.x -o firmare firmware.o riscv64-linux-gnu-objcopy -O binary -S firmware firmware.bin Next, grab and build the plugin (just dumps from phys address on first instruction executed): curl -o dump-riscv-firmware.c https://gist.githubusercontent.com/novafacing/5abc08052fab671a0fb26547810b4c55/raw/33772d614d6e36eae30e3405af34f149d7cc608b/dump-riscv-firmware.c gcc -rdynamic -shared -fPIC -Iinclude/qemu $(pkg-config --cflags --libs glib-2.0) -o libdump-riscv-firmware.so dump-riscv-firmware.c Finally, run the plugin: qemu-system-riscv64 -display none -machine virt -serial stdio -bios firmware.bin -plugin $(pwd)libdump-riscv-firmware.so -d plugin This outputs as expected -- the hexdump of the running firmware: b7 01 00 10 a3 80 01 00 93 02 00 08 a3 81 51 00 | ..............Q. 93 02 50 00 23 80 51 00 93 02 00 00 a3 80 51 00 | ..P.#.Q.......Q. 93 02 30 00 a3 81 51 00 93 02 10 00 23 81 51 00 | ..0...Q.....#.Q. 23 82 01 00 83 82 51 00 83 82 01 00 a3 83 01 00 | #.....Q......... 93 02 80 04 23 80 51 00 93 02 50 06 23 80 51 00 | ....#.Q...P.#.Q. 93 02 c0 06 23 80 51 00 93 02 c0 06 23 80 51 00 | ....#.Q.....#.Q. 93 02 f0 06 23 80 51 00 93 02 c0 02 23 80 51 00 | ....#.Q.....#.Q. 93 02 00 02 23 80 51 00 93 02 20 05 23 80 51 00 | ....#.Q.....#.Q. 93 02 90 04 23 80 51 00 93 02 30 05 23 80 51 00 | ....#.Q...0.#.Q. 93 02 30 04 23 80 51 00 93 02 d0 02 23 80 51 00 | ..0.#.Q.....#.Q. 93 02 60 05 23 80 51 00 93 02 10 02 23 80 51 00 | ..`.#.Q.....#.Q. 93 02 a0 00 23 80 51 00 6f 00 00 00 00 00 00 00 | ....#.Q.o....... 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 | ................ Hello, RISC-V! For v2, removes a symbol left in qemu-plugins.symbols accidentally. Rowan Hart (1): plugins: add API to read guest CPU memory from hwaddr include/qemu/qemu-plugin.h | 22 ++++++++++++++++++++++ plugins/api.c | 17 +++++++++++++++++ plugins/qemu-plugins.symbols | 1 + 3 files changed, 40 insertions(+) -- 2.46.0 ^ permalink raw reply [flat|nested] 2+ messages in thread
* [PATCH v2 1/1] plugins: add API to read guest CPU memory from hwaddr 2024-08-29 16:47 [PATCH v2 0/1] plugins: add API to read guest CPU memory from hwaddr Rowan Hart @ 2024-08-29 16:47 ` Rowan Hart 0 siblings, 0 replies; 2+ messages in thread From: Rowan Hart @ 2024-08-29 16:47 UTC (permalink / raw) To: qemu-devel Cc: Mahmoud Mandour, Alexandre Iooss, Pierrick Bouvier, Alex Bennée, Rowan Hart Signed-off-by: Rowan Hart <rowanbhart@gmail.com> --- include/qemu/qemu-plugin.h | 22 ++++++++++++++++++++++ plugins/api.c | 17 +++++++++++++++++ plugins/qemu-plugins.symbols | 1 + 3 files changed, 40 insertions(+) diff --git a/include/qemu/qemu-plugin.h b/include/qemu/qemu-plugin.h index c71c705b69..25f39c0960 100644 --- a/include/qemu/qemu-plugin.h +++ b/include/qemu/qemu-plugin.h @@ -868,6 +868,28 @@ QEMU_PLUGIN_API int qemu_plugin_read_register(struct qemu_plugin_register *handle, GByteArray *buf); +/** + * qemu_plugin_read_cpu_memory_hwaddr() - read CPU memory from hwaddr + * + * @addr: A virtual address to read from + * @data: A byte array to store data into + * @len: The number of bytes to read, starting from @addr + * + * @len bytes of data is read starting at @addr and stored into @data. If @data + * is not large enough to hold @len bytes, it will be expanded to the necessary + * size, reallocating if necessary. @len must be greater than 0. + * + * This function does not ensure writes are flushed prior to reading, so + * callers should take care when calling this function in plugin callbacks to + * avoid attempting to read data which may not yet be written and should use + * the memory callback API instead. + * + * Returns true on success and false on failure. + */ +QEMU_PLUGIN_API +bool qemu_plugin_read_cpu_memory_hwaddr(uint64_t addr, + GByteArray *data, size_t len); + /** * qemu_plugin_scoreboard_new() - alloc a new scoreboard * diff --git a/plugins/api.c b/plugins/api.c index 2ff13d09de..c87bed6641 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -527,6 +527,22 @@ GArray *qemu_plugin_get_registers(void) return create_register_handles(regs); } +bool qemu_plugin_read_cpu_memory_hwaddr(uint64_t addr, + GByteArray *data, uint64_t len) +{ +#ifndef CONFIG_USER_ONLY + if (len == 0) { + return false; + } + + g_byte_array_set_size(data, len); + cpu_physical_memory_rw(addr, (void *)data->data, len, 0); + return true; +#else + return false; +#endif +} + int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray *buf) { g_assert(current_cpu); @@ -534,6 +550,7 @@ int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray *buf) return gdb_read_register(current_cpu, buf, GPOINTER_TO_INT(reg) - 1); } + struct qemu_plugin_scoreboard *qemu_plugin_scoreboard_new(size_t element_size) { return plugin_scoreboard_new(element_size); diff --git a/plugins/qemu-plugins.symbols b/plugins/qemu-plugins.symbols index ca773d8d9f..616cae1e7f 100644 --- a/plugins/qemu-plugins.symbols +++ b/plugins/qemu-plugins.symbols @@ -20,6 +20,7 @@ qemu_plugin_num_vcpus; qemu_plugin_outs; qemu_plugin_path_to_binary; + qemu_plugin_read_cpu_memory_hwaddr; qemu_plugin_read_register; qemu_plugin_register_atexit_cb; qemu_plugin_register_flush_cb; -- 2.46.0 ^ permalink raw reply related [flat|nested] 2+ messages in thread
end of thread, other threads:[~2024-08-29 16:48 UTC | newest] Thread overview: 2+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2024-08-29 16:47 [PATCH v2 0/1] plugins: add API to read guest CPU memory from hwaddr Rowan Hart 2024-08-29 16:47 ` [PATCH v2 1/1] " Rowan Hart
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).