aboutsummaryrefslogtreecommitdiffstats
path: root/translate-all.c
diff options
context:
space:
mode:
authorVladimir Chtchetkine <vchtchetkine@google.com>2010-02-16 10:38:35 -0800
committerVladimir Chtchetkine <vchtchetkine@google.com>2010-02-18 15:22:07 -0800
commit5389aa19033153c09556d1362a8b8a56abccb8f5 (patch)
tree5d731effe5bd5d2f162f06aadec7212045eaef3d /translate-all.c
parent76dbca0489ab98a46f2954bc7b77c3df6f9d8264 (diff)
downloadexternal_qemu-5389aa19033153c09556d1362a8b8a56abccb8f5.zip
external_qemu-5389aa19033153c09556d1362a8b8a56abccb8f5.tar.gz
external_qemu-5389aa19033153c09556d1362a8b8a56abccb8f5.tar.bz2
Merge memory checking from sandbox
Change-id: Ibce845d0
Diffstat (limited to 'translate-all.c')
-rw-r--r--translate-all.c31
1 files changed, 30 insertions, 1 deletions
diff --git a/translate-all.c b/translate-all.c
index 4bdf2c9..8964758 100644
--- a/translate-all.c
+++ b/translate-all.c
@@ -49,6 +49,22 @@ target_ulong gen_opc_jump_pc[2];
uint32_t gen_opc_hflags[OPC_BUF_SIZE];
#endif
+#ifdef CONFIG_MEMCHECK
+/*
+ * Memchecker code in this module copies TB PC <-> Guest PC map to the TB
+ * descriptor after guest code has been translated in cpu_gen_init routine.
+ */
+#include "memcheck/memcheck_api.h"
+
+/* Array of (tb_pc, guest_pc) pairs, big enough for all translations. This
+ * array is used to obtain guest PC address from a translated PC address.
+ * tcg_gen_code_common will fill it up when memchecker is enabled. */
+static target_ulong gen_opc_tpc2gpc[OPC_BUF_SIZE * 2];
+target_ulong* gen_opc_tpc2gpc_ptr = &gen_opc_tpc2gpc[0];
+/* Number of (tb_pc, guest_pc) pairs stored in gen_opc_tpc2gpc array. */
+unsigned int gen_opc_tpc2gpc_pairs;
+#endif // CONFIG_MEMCHECK
+
/* XXX: suppress that */
unsigned long code_gen_max_block_size(void)
{
@@ -67,7 +83,7 @@ unsigned long code_gen_max_block_size(void)
void cpu_gen_init(void)
{
- tcg_context_init(&tcg_ctx);
+ tcg_context_init(&tcg_ctx);
tcg_set_frame(&tcg_ctx, TCG_AREG0, offsetof(CPUState, temp_buf),
CPU_TEMP_BUF_NLONGS * sizeof(long));
}
@@ -126,6 +142,19 @@ int cpu_gen_code(CPUState *env, TranslationBlock *tb, int *gen_code_size_ptr)
s->code_out_len += gen_code_size;
#endif
+#ifdef CONFIG_MEMCHECK
+ /* Save translated PC -> guest PC map into TB. */
+ if (memcheck_enabled && gen_opc_tpc2gpc_pairs && is_cpu_user(env)) {
+ tb->tpc2gpc =
+ qemu_malloc(gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong));
+ if (tb->tpc2gpc != NULL) {
+ memcpy(tb->tpc2gpc, gen_opc_tpc2gpc_ptr,
+ gen_opc_tpc2gpc_pairs * 2 * sizeof(target_ulong));
+ tb->tpc2gpc_pairs = gen_opc_tpc2gpc_pairs;
+ }
+ }
+#endif // CONFIG_MEMCHECK
+
#ifdef DEBUG_DISAS
if (qemu_loglevel_mask(CPU_LOG_TB_OUT_ASM)) {
qemu_log("OUT: [size=%d]\n", *gen_code_size_ptr);