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.
|
* - Remove qemu_plugin_register_vcpu_{tb, insn, mem}_exec_inline.
|
||||||
* Those functions are replaced by *_per_vcpu variants, which guarantee
|
* Those functions are replaced by *_per_vcpu variants, which guarantee
|
||||||
* thread-safety for operations.
|
* 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;
|
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
|
* struct qemu_info_t - system information for plugins
|
||||||
@ -884,6 +892,28 @@ typedef struct {
|
|||||||
QEMU_PLUGIN_API
|
QEMU_PLUGIN_API
|
||||||
GArray *qemu_plugin_get_registers(void);
|
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
|
* qemu_plugin_read_register() - read register for current vCPU
|
||||||
*
|
*
|
||||||
|
@ -560,6 +560,26 @@ GArray *qemu_plugin_get_registers(void)
|
|||||||
return create_register_handles(regs);
|
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)
|
int qemu_plugin_read_register(struct qemu_plugin_register *reg, GByteArray *buf)
|
||||||
{
|
{
|
||||||
g_assert(current_cpu);
|
g_assert(current_cpu);
|
||||||
|
@ -21,6 +21,7 @@
|
|||||||
qemu_plugin_num_vcpus;
|
qemu_plugin_num_vcpus;
|
||||||
qemu_plugin_outs;
|
qemu_plugin_outs;
|
||||||
qemu_plugin_path_to_binary;
|
qemu_plugin_path_to_binary;
|
||||||
|
qemu_plugin_read_memory_vaddr;
|
||||||
qemu_plugin_read_register;
|
qemu_plugin_read_register;
|
||||||
qemu_plugin_register_atexit_cb;
|
qemu_plugin_register_atexit_cb;
|
||||||
qemu_plugin_register_flush_cb;
|
qemu_plugin_register_flush_cb;
|
||||||
|
Loading…
Reference in New Issue
Block a user