From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PATCH v2 06/33] accel/tcg: Record mmio bytes during translation
Date: Wed, 24 Apr 2024 16:31:04 -0700 [thread overview]
Message-ID: <20240424233131.988727-7-richard.henderson@linaro.org> (raw)
In-Reply-To: <20240424233131.988727-1-richard.henderson@linaro.org>
This will be able to replace plugin_insn_append, and will
be usable for disassembly.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/exec/translator.h | 12 ++++++++++++
accel/tcg/translator.c | 41 +++++++++++++++++++++++++++++++++++++++
2 files changed, 53 insertions(+)
diff --git a/include/exec/translator.h b/include/exec/translator.h
index 83fe66cba0..974cc4f9c4 100644
--- a/include/exec/translator.h
+++ b/include/exec/translator.h
@@ -90,6 +90,18 @@ typedef struct DisasContextBase {
bool plugin_enabled;
struct TCGOp *insn_start;
void *host_addr[2];
+
+ /*
+ * Record insn data that we cannot read directly from host memory.
+ * There are only two reasons we cannot use host memory:
+ * (1) We are executing from I/O,
+ * (2) We are executing a synthetic instruction (s390x EX).
+ * In both cases we need record exactly one instruction,
+ * and thus the maximum amount of data we record is limited.
+ */
+ int record_start;
+ int record_len;
+ uint8_t record[32];
} DisasContextBase;
/**
diff --git a/accel/tcg/translator.c b/accel/tcg/translator.c
index c3f4d0e252..a3c246ea37 100644
--- a/accel/tcg/translator.c
+++ b/accel/tcg/translator.c
@@ -131,6 +131,8 @@ void translator_loop(CPUState *cpu, TranslationBlock *tb, int *max_insns,
db->insn_start = NULL;
db->host_addr[0] = host_pc;
db->host_addr[1] = NULL;
+ db->record_start = 0;
+ db->record_len = 0;
ops->init_disas_context(db, cpu);
tcg_debug_assert(db->is_jmp == DISAS_NEXT); /* no early exit */
@@ -317,6 +319,39 @@ static bool translator_ld(CPUArchState *env, DisasContextBase *db,
return true;
}
+static void record_save(DisasContextBase *db, vaddr pc,
+ const void *from, int size)
+{
+ int offset;
+
+ /* Do not record probes before the start of TB. */
+ if (pc < db->pc_first) {
+ return;
+ }
+
+ /*
+ * In translator_access, we verified that pc is within 2 pages
+ * of pc_first, thus this will never overflow.
+ */
+ offset = pc - db->pc_first;
+
+ /*
+ * Either the first or second page may be I/O. If it is the second,
+ * then the first byte we need to record will be at a non-zero offset.
+ * In either case, we should not need to record but a single insn.
+ */
+ if (db->record_len == 0) {
+ db->record_start = offset;
+ db->record_len = size;
+ } else {
+ assert(offset == db->record_start + db->record_len);
+ assert(db->record_len + size <= sizeof(db->record));
+ db->record_len += size;
+ }
+
+ memcpy(db->record + (offset - db->record_start), from, size);
+}
+
static void plugin_insn_append(vaddr pc, const void *from, size_t size)
{
#ifdef CONFIG_PLUGIN
@@ -344,6 +379,7 @@ uint8_t translator_ldub(CPUArchState *env, DisasContextBase *db, vaddr pc)
if (!translator_ld(env, db, &raw, pc, sizeof(raw))) {
raw = cpu_ldub_code(env, pc);
+ record_save(db, pc, &raw, sizeof(raw));
}
plugin_insn_append(pc, &raw, sizeof(raw));
return raw;
@@ -358,6 +394,7 @@ uint16_t translator_lduw(CPUArchState *env, DisasContextBase *db, vaddr pc)
} else {
tgt = cpu_lduw_code(env, pc);
raw = tswap16(tgt);
+ record_save(db, pc, &raw, sizeof(raw));
}
plugin_insn_append(pc, &raw, sizeof(raw));
return tgt;
@@ -372,6 +409,7 @@ uint32_t translator_ldl(CPUArchState *env, DisasContextBase *db, vaddr pc)
} else {
tgt = cpu_ldl_code(env, pc);
raw = tswap32(tgt);
+ record_save(db, pc, &raw, sizeof(raw));
}
plugin_insn_append(pc, &raw, sizeof(raw));
return tgt;
@@ -386,6 +424,7 @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
} else {
tgt = cpu_ldl_code(env, pc);
raw = tswap64(tgt);
+ record_save(db, pc, &raw, sizeof(raw));
}
plugin_insn_append(pc, &raw, sizeof(raw));
return tgt;
@@ -393,5 +432,7 @@ uint64_t translator_ldq(CPUArchState *env, DisasContextBase *db, vaddr pc)
void translator_fake_ldb(DisasContextBase *db, vaddr pc, uint8_t insn8)
{
+ assert(pc >= db->pc_first);
+ record_save(db, pc, &insn8, sizeof(insn8));
plugin_insn_append(pc, &insn8, sizeof(insn8));
}
--
2.34.1
next prev parent reply other threads:[~2024-04-24 23:32 UTC|newest]
Thread overview: 58+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-04-24 23:30 [PATCH v2 00/33] accel/tcg: Improve disassembly for target and plugin Richard Henderson
2024-04-24 23:30 ` [PATCH v2 01/33] accel/tcg: Use vaddr in translator_ld* Richard Henderson
2024-04-24 23:31 ` [PATCH v2 02/33] accel/tcg: Hide in_same_page outside of a target-specific context Richard Henderson
2024-04-24 23:31 ` [PATCH v2 03/33] accel/tcg: Pass DisasContextBase to translator_fake_ldb Richard Henderson
2024-04-24 23:31 ` [PATCH v2 04/33] accel/tcg: Reorg translator_ld* Richard Henderson
2024-05-06 22:47 ` Philippe Mathieu-Daudé
2024-05-07 16:49 ` Richard Henderson
2024-05-08 8:18 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 05/33] accel/tcg: Cap the translation block when we encounter mmio Richard Henderson
2024-04-24 23:31 ` Richard Henderson [this message]
2024-04-29 10:34 ` [PATCH v2 06/33] accel/tcg: Record mmio bytes during translation Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 07/33] accel/tcg: Record when translator_fake_ldb is used Richard Henderson
2024-04-29 10:36 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 08/33] accel/tcg: Record DisasContextBase in tcg_ctx for plugins Richard Henderson
2024-05-03 15:11 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 09/33] plugins: Copy memory in qemu_plugin_insn_data Richard Henderson
2024-04-29 10:40 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 10/33] accel/tcg: Implement translator_st Richard Henderson
2024-05-08 15:20 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 11/33] plugins: Use translator_st for qemu_plugin_insn_data Richard Henderson
2024-04-29 10:44 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 12/33] plugins: Read mem_only directly from TB cflags Richard Henderson
2024-04-29 10:45 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 13/33] plugins: Use DisasContextBase for qemu_plugin_insn_haddr Richard Henderson
2024-05-13 14:18 ` Philippe Mathieu-Daudé
2024-05-13 18:16 ` Pierrick Bouvier
2024-04-24 23:31 ` [PATCH v2 14/33] plugins: Use DisasContextBase for qemu_plugin_tb_vaddr Richard Henderson
2024-04-24 23:31 ` [PATCH v2 15/33] plugins: Merge alloc_tcg_plugin_context into plugin_gen_tb_start Richard Henderson
2024-05-06 22:38 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 16/33] accel/tcg: Provide default implementation of disas_log Richard Henderson
2024-04-24 23:31 ` [PATCH v2 17/33] accel/tcg: Return bool from TranslatorOps.disas_log Richard Henderson
2024-04-24 23:31 ` [PATCH v2 18/33] disas: Split disas.c Richard Henderson
2024-05-08 15:26 ` Philippe Mathieu-Daudé
2024-05-10 9:42 ` Richard Henderson
2024-04-24 23:31 ` [PATCH v2 19/33] disas: Use translator_st to get disassembly data Richard Henderson
2024-05-08 15:33 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 20/33] accel/tcg: Introduce translator_fake_ld Richard Henderson
2024-04-24 23:31 ` [PATCH v2 21/33] target/s390x: Fix translator_fake_ld length Richard Henderson
2024-05-08 16:33 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 22/33] target/s390x: Disassemble EXECUTEd instructions Richard Henderson
2024-05-08 16:31 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 23/33] target/hexagon: Use translator_ldl in pkt_crosses_page Richard Henderson
2024-04-29 10:47 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 24/33] target/microblaze: Use translator_ldl Richard Henderson
2024-04-24 23:31 ` [PATCH v2 25/33] target/i386: Use translator_ldub for everything Richard Henderson
2024-04-24 23:31 ` [PATCH v2 26/33] target/avr: Use translator_lduw Richard Henderson
2024-04-24 23:31 ` [PATCH v2 27/33] target/cris: Use translator_ld* in cris_fetch Richard Henderson
2024-04-24 23:31 ` [PATCH v2 28/33] target/cris: Use cris_fetch in translate_v10.c.inc Richard Henderson
2024-04-24 23:31 ` [PATCH v2 29/33] target/riscv: Use translator_ld* for everything Richard Henderson
2024-04-29 10:55 ` Philippe Mathieu-Daudé
2024-05-08 16:31 ` Philippe Mathieu-Daudé
2024-05-14 6:25 ` Alistair Francis
2024-04-24 23:31 ` [PATCH v2 30/33] target/rx: Use translator_ld* Richard Henderson
2024-04-24 23:31 ` [PATCH v2 31/33] target/xtensa: Use translator_ldub in xtensa_insn_len Richard Henderson
2024-04-24 23:31 ` [PATCH v2 32/33] target/s390x: Use translator_lduw in get_next_pc Richard Henderson
2024-05-06 22:41 ` Philippe Mathieu-Daudé
2024-04-24 23:31 ` [PATCH v2 33/33] accel/tcg: Remove cpu_ldsb_code / cpu_ldsw_code Richard Henderson
2024-04-29 10:52 ` [PATCH v2 00/33] accel/tcg: Improve disassembly for target and plugin Philippe Mathieu-Daudé
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20240424233131.988727-7-richard.henderson@linaro.org \
--to=richard.henderson@linaro.org \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).