Some registers should be marked as read-only from a plugin API perspective, as writing to them via qemu_plugin_write_register has no effect. This includes the program counter, and we expose this fact to the plugins with this patch.
Reviewed-by: Alex Bennée <[email protected]> Signed-off-by: Florian Hofhammer <[email protected]> --- include/plugins/qemu-plugin.h | 3 +++ plugins/api.c | 16 ++++++++++++++++ 2 files changed, 19 insertions(+) diff --git a/include/plugins/qemu-plugin.h b/include/plugins/qemu-plugin.h index f083c30fd3..791d223df4 100644 --- a/include/plugins/qemu-plugin.h +++ b/include/plugins/qemu-plugin.h @@ -979,11 +979,14 @@ struct qemu_plugin_register; * writing value with qemu_plugin_write_register * @name: register name * @feature: optional feature descriptor, can be NULL + * @is_readonly: true if the register cannot be written via + * qemu_plugin_write_register */ typedef struct { struct qemu_plugin_register *handle; const char *name; const char *feature; + bool is_readonly; } qemu_plugin_reg_descriptor; /** diff --git a/plugins/api.c b/plugins/api.c index 23c291f644..85b34949cb 100644 --- a/plugins/api.c +++ b/plugins/api.c @@ -410,6 +410,12 @@ bool qemu_plugin_bool_parse(const char *name, const char *value, bool *ret) * ancillary data the plugin might find useful. */ +static const char pc_str[] = "pc"; /* generic name for program counter */ +static const char eip_str[] = "eip"; /* x86-specific name for PC */ +static const char rip_str[] = "rip"; /* x86_64-specific name for PC */ +static const char pswa_str[] = "pswa"; /* s390x-specific name for PC */ +static const char iaoq_str[] = "iaoq"; /* HP/PA-specific name for PC */ +static const char rpc_str[] = "rpc"; /* microblaze-specific name for PC */ static GArray *create_register_handles(GArray *gdbstub_regs) { GArray *find_data = g_array_new(true, true, @@ -427,6 +433,16 @@ static GArray *create_register_handles(GArray *gdbstub_regs) /* Create a record for the plugin */ desc.handle = GINT_TO_POINTER(grd->gdb_reg + 1); desc.name = g_intern_string(grd->name); + desc.is_readonly = false; + if (g_strcmp0(desc.name, pc_str) == 0 + || g_strcmp0(desc.name, eip_str) == 0 + || g_strcmp0(desc.name, rip_str) == 0 + || g_strcmp0(desc.name, pswa_str) == 0 + || g_strcmp0(desc.name, iaoq_str) == 0 + || g_strcmp0(desc.name, rpc_str) == 0 + ) { + desc.is_readonly = true; + } desc.feature = g_intern_string(grd->feature_name); g_array_append_val(find_data, desc); } -- 2.53.0
