plugins: add plugin API to read guest memory
Signed-off-by: Rowan Hart <rowanbhart@gmail.com> Reviewed-by: Pierrick Bouvier <pierrick.bouvier@linaro.org> Message-Id: <20240827215329.248434-2-rowanbhart@gmail.com> [AJB: tweaked cpu_memory_rw_debug call] Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Message-Id: <20240916085400.1046925-17-alex.bennee@linaro.org>
This commit is contained in:
parent
0d279bec0f
commit
595cd9ce2e
@ -57,11 +57,19 @@ typedef uint64_t qemu_plugin_id_t;
|
||||
* - Remove qemu_plugin_register_vcpu_{tb, insn, mem}_exec_inline.
|
||||
* Those functions are replaced by *_per_vcpu variants, which guarantee
|
||||
* thread-safety for operations.
|
||||
*
|
||||
* version 3:
|
||||
* - modified arguments and return value of qemu_plugin_insn_data to copy
|
||||
* the data into a user-provided buffer instead of returning a pointer
|
||||
* to the data.
|
||||
*
|
||||
* version 4:
|
||||
* - added qemu_plugin_read_memory_vaddr
|
||||
*/
|
||||
|
||||
extern QEMU_PLUGIN_EXPORT int qemu_plugin_version;
|
||||
|
||||
#define QEMU_PLUGIN_VERSION 3
|
||||
#define QEMU_PLUGIN_VERSION 4
|
||||
|
||||
/**
|
||||
* struct qemu_info_t - system information for plugins
|
||||
@ -884,6 +892,28 @@ typedef struct {
|
||||
QEMU_PLUGIN_API
|
||||
GArray *qemu_plugin_get_registers(void);
|
||||
|
||||
/**
|
||||
* qemu_plugin_read_memory_vaddr() - read from memory using a virtual address
|
||||
*
|
||||
* @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_memory_vaddr(uint64_t addr,
|
||||
GByteArray *data, size_t len);
|
||||
|
||||
/**
|
||||
* qemu_plugin_read_register() - read register for current vCPU
|
||||
*
|
||||
|
@ -560,6 +560,26 @@ GArray *qemu_plugin_get_registers(void)
|
||||
return create_register_handles(regs);
|
||||
}
|
||||
|
||||
bool qemu_plugin_read_memory_vaddr(vaddr addr, GByteArray *data, size_t len)
|
||||
{
|
||||
g_assert(current_cpu);
|
||||
|
||||
if (len == 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
g_byte_array_set_size(data, len);
|
||||
|
||||
int result = cpu_memory_rw_debug(current_cpu, addr, data->data,
|
||||
data->len, false);
|
||||
|
||||
if (result < 0) {
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray *buf)
|
||||
{
|
||||
g_assert(current_cpu);
|
||||
|
@ -21,6 +21,7 @@
|
||||
qemu_plugin_num_vcpus;
|
||||
qemu_plugin_outs;
|
||||
qemu_plugin_path_to_binary;
|
||||
qemu_plugin_read_memory_vaddr;
|
||||
qemu_plugin_read_register;
|
||||
qemu_plugin_register_atexit_cb;
|
||||
qemu_plugin_register_flush_cb;
|
||||
|
Loading…
Reference in New Issue
Block a user