[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v3 17/19] tcg: save vaddr temp for plugin usage
From: |
Alex Bennée |
Subject: |
[PATCH v3 17/19] tcg: save vaddr temp for plugin usage |
Date: |
Tue, 25 Feb 2020 12:47:08 +0000 |
From: Richard Henderson <address@hidden>
While do_gen_mem_cb does copy (via extu_tl_i64) vaddr into a new temp
this won't help if the vaddr temp gets clobbered by the actual
load/store op. To avoid this clobbering we explicitly copy vaddr
before the op to ensure it is live my the time we do the
instrumentation.
Suggested-by: Richard Henderson <address@hidden>
Signed-off-by: Alex Bennée <address@hidden>
Reviewed-by: Richard Henderson <address@hidden>
Reviewed-by: Emilio G. Cota <address@hidden>
Cc: address@hidden
---
tcg/tcg-op.c | 23 ++++++++++++++++++++---
1 file changed, 20 insertions(+), 3 deletions(-)
diff --git a/tcg/tcg-op.c b/tcg/tcg-op.c
index 7d782002e3f..e2e25ebf7db 100644
--- a/tcg/tcg-op.c
+++ b/tcg/tcg-op.c
@@ -2794,13 +2794,26 @@ static void tcg_gen_req_mo(TCGBar type)
}
}
+static inline TCGv plugin_prep_mem_callbacks(TCGv vaddr)
+{
+#ifdef CONFIG_PLUGIN
+ if (tcg_ctx->plugin_insn != NULL) {
+ /* Save a copy of the vaddr for use after a load. */
+ TCGv temp = tcg_temp_new();
+ tcg_gen_mov_tl(temp, vaddr);
+ return temp;
+ }
+#endif
+ return vaddr;
+}
+
static inline void plugin_gen_mem_callbacks(TCGv vaddr, uint16_t info)
{
#ifdef CONFIG_PLUGIN
- if (tcg_ctx->plugin_insn == NULL) {
- return;
+ if (tcg_ctx->plugin_insn != NULL) {
+ plugin_gen_empty_mem_callback(vaddr, info);
+ tcg_temp_free(vaddr);
}
- plugin_gen_empty_mem_callback(vaddr, info);
#endif
}
@@ -2822,6 +2835,7 @@ void tcg_gen_qemu_ld_i32(TCGv_i32 val, TCGv addr, TCGArg
idx, MemOp memop)
}
}
+ addr = plugin_prep_mem_callbacks(addr);
gen_ldst_i32(INDEX_op_qemu_ld_i32, val, addr, memop, idx);
plugin_gen_mem_callbacks(addr, info);
@@ -2868,6 +2882,7 @@ void tcg_gen_qemu_st_i32(TCGv_i32 val, TCGv addr, TCGArg
idx, MemOp memop)
memop &= ~MO_BSWAP;
}
+ addr = plugin_prep_mem_callbacks(addr);
gen_ldst_i32(INDEX_op_qemu_st_i32, val, addr, memop, idx);
plugin_gen_mem_callbacks(addr, info);
@@ -2905,6 +2920,7 @@ void tcg_gen_qemu_ld_i64(TCGv_i64 val, TCGv addr, TCGArg
idx, MemOp memop)
}
}
+ addr = plugin_prep_mem_callbacks(addr);
gen_ldst_i64(INDEX_op_qemu_ld_i64, val, addr, memop, idx);
plugin_gen_mem_callbacks(addr, info);
@@ -2967,6 +2983,7 @@ void tcg_gen_qemu_st_i64(TCGv_i64 val, TCGv addr, TCGArg
idx, MemOp memop)
memop &= ~MO_BSWAP;
}
+ addr = plugin_prep_mem_callbacks(addr);
gen_ldst_i64(INDEX_op_qemu_st_i64, val, addr, memop, idx);
plugin_gen_mem_callbacks(addr, info);
--
2.20.1
- [PATCH v3 10/19] docs/devel: document query handle lifetimes, (continued)
- [PATCH v3 10/19] docs/devel: document query handle lifetimes, Alex Bennée, 2020/02/25
- [PATCH v3 13/19] qemu/bitops.h: Add extract8 and extract16, Alex Bennée, 2020/02/25
- [PATCH v3 11/19] plugins/core: add missing break in cb_to_tcg_flags, Alex Bennée, 2020/02/25
- [PATCH v3 12/19] tests/plugin: prevent uninitialized warning, Alex Bennée, 2020/02/25
- [PATCH v3 19/19] tests/tcg: take into account expected clashes pauth-4, Alex Bennée, 2020/02/25
- [PATCH v3 16/19] tests/tcg: give debug builds a little bit longer, Alex Bennée, 2020/02/25
- [PATCH v3 15/19] tests/plugins: make howvec clean-up after itself., Alex Bennée, 2020/02/25
- [PATCH v3 17/19] tcg: save vaddr temp for plugin usage,
Alex Bennée <=
- [PATCH v3 18/19] tests/tcg: fix typo in configure.sh test for v8.3, Alex Bennée, 2020/02/25
- [PATCH v3 14/19] target/riscv: progressively load the instruction during decode, Alex Bennée, 2020/02/25
- Re: [PATCH v3 00/19] testing & plugin updates, no-reply, 2020/02/26