aboutsummaryrefslogtreecommitdiff
path: root/include/exec/plugin-gen.h
diff options
context:
space:
mode:
authorAlex Bennée <alex.bennee@linaro.org>2021-10-26 11:22:26 +0100
committerAlex Bennée <alex.bennee@linaro.org>2021-11-04 10:32:01 +0000
commit357af9be5ca47ae8ac2bc439de4bb9a39e186fd4 (patch)
tree763bcbb19526f9542e9a28568713594ceb1e95ba /include/exec/plugin-gen.h
parente83f79b3faee1316a243b05bb768840d21cec6f4 (diff)
downloadqemu-357af9be5ca47ae8ac2bc439de4bb9a39e186fd4.zip
qemu-357af9be5ca47ae8ac2bc439de4bb9a39e186fd4.tar.gz
qemu-357af9be5ca47ae8ac2bc439de4bb9a39e186fd4.tar.bz2
plugins: try and make plugin_insn_append more ergonomic
Currently we make the assumption that the guest frontend loads all op code bytes sequentially. This mostly holds up for regular fixed encodings but some architectures like s390x like to re-read the instruction which causes weirdness to occur. Rather than changing the frontends make the plugin API a little more ergonomic and able to handle the re-read case. Stuff will still get strange if we read ahead of the opcode but so far no front ends have done that and this patch asserts the case so we can catch it early if they do. Signed-off-by: Alex Bennée <alex.bennee@linaro.org> Suggested-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Message-Id: <20211026102234.3961636-21-alex.bennee@linaro.org>
Diffstat (limited to 'include/exec/plugin-gen.h')
-rw-r--r--include/exec/plugin-gen.h12
1 files changed, 10 insertions, 2 deletions
diff --git a/include/exec/plugin-gen.h b/include/exec/plugin-gen.h
index b1b72b5..f92f169 100644
--- a/include/exec/plugin-gen.h
+++ b/include/exec/plugin-gen.h
@@ -27,13 +27,21 @@ void plugin_gen_insn_end(void);
void plugin_gen_disable_mem_helpers(void);
void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info);
-static inline void plugin_insn_append(const void *from, size_t size)
+static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
{
struct qemu_plugin_insn *insn = tcg_ctx->plugin_insn;
+ abi_ptr off;
if (insn == NULL) {
return;
}
+ off = pc - insn->vaddr;
+ if (off < insn->data->len) {
+ g_byte_array_set_size(insn->data, off);
+ } else if (off > insn->data->len) {
+ /* we have an unexpected gap */
+ g_assert_not_reached();
+ }
insn->data = g_byte_array_append(insn->data, from, size);
}
@@ -62,7 +70,7 @@ static inline void plugin_gen_disable_mem_helpers(void)
static inline void plugin_gen_empty_mem_callback(TCGv addr, uint32_t info)
{ }
-static inline void plugin_insn_append(const void *from, size_t size)
+static inline void plugin_insn_append(abi_ptr pc, const void *from, size_t size)
{ }
#endif /* CONFIG_PLUGIN */