From: Richard Henderson <richard.henderson@linaro.org>
To: qemu-devel@nongnu.org
Subject: [PATCH 24/29] accel/tcg: Introduce cpu_unwind_state_data
Date: Mon, 24 Oct 2022 23:24:54 +1000 [thread overview]
Message-ID: <20221024132459.3229709-26-richard.henderson@linaro.org> (raw)
In-Reply-To: <20221024132459.3229709-1-richard.henderson@linaro.org>
Add a way to examine the unwind data without actually
restoring the data back into env.
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/exec/exec-all.h | 13 ++++++++
accel/tcg/translate-all.c | 68 ++++++++++++++++++++++++++-------------
2 files changed, 58 insertions(+), 23 deletions(-)
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 300832bd0b..d49cf113dd 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -39,6 +39,19 @@ typedef ram_addr_t tb_page_addr_t;
#define TB_PAGE_ADDR_FMT RAM_ADDR_FMT
#endif
+/**
+ * cpu_unwind_state_data:
+ * @cpu: the vCPU state is to be restore to
+ * @host_pc: the host PC the fault occurred at
+ * @data: output data
+ *
+ * Attempt to load the the unwind state for a host pc occurring in
+ * translated code. If the searched_pc is not in translated code,
+ * the function returns false; otherwise @data is loaded.
+ * This is the same unwind info as given to restore_state_to_opc.
+ */
+bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data);
+
/**
* cpu_restore_state:
* @cpu: the vCPU state is to be restore to
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index e4386b3198..c772e3769c 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -320,29 +320,20 @@ static int encode_search(TranslationBlock *tb, uint8_t *block)
return p - block;
}
-/* The cpu state corresponding to 'searched_pc' is restored.
- * When reset_icount is true, current TB will be interrupted and
- * icount should be recalculated.
- */
-static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
- uintptr_t searched_pc, bool reset_icount)
+static int cpu_unwind_data_from_tb(TranslationBlock *tb, uintptr_t host_pc,
+ uint64_t *data)
{
- uint64_t data[TARGET_INSN_START_WORDS];
- uintptr_t host_pc = (uintptr_t)tb->tc.ptr;
+ uintptr_t iter_pc = (uintptr_t)tb->tc.ptr;
const uint8_t *p = tb->tc.ptr + tb->tc.size;
int i, j, num_insns = tb->icount;
-#ifdef CONFIG_PROFILER
- TCGProfile *prof = &tcg_ctx->prof;
- int64_t ti = profile_getclock();
-#endif
- searched_pc -= GETPC_ADJ;
+ host_pc -= GETPC_ADJ;
- if (searched_pc < host_pc) {
+ if (host_pc < iter_pc) {
return -1;
}
- memset(data, 0, sizeof(data));
+ memset(data, 0, sizeof(uint64_t) * TARGET_INSN_START_WORDS);
if (!TARGET_TB_PCREL) {
data[0] = tb_pc(tb);
}
@@ -353,19 +344,40 @@ static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
for (j = 0; j < TARGET_INSN_START_WORDS; ++j) {
data[j] += decode_sleb128(&p);
}
- host_pc += decode_sleb128(&p);
- if (host_pc > searched_pc) {
- goto found;
+ iter_pc += decode_sleb128(&p);
+ if (iter_pc > host_pc) {
+ return num_insns - i;
}
}
return -1;
+}
+
+/*
+ * The cpu state corresponding to 'host_pc' is restored.
+ * When reset_icount is true, current TB will be interrupted and
+ * icount should be recalculated.
+ */
+static void cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
+ uintptr_t host_pc, bool reset_icount)
+{
+ uint64_t data[TARGET_INSN_START_WORDS];
+#ifdef CONFIG_PROFILER
+ TCGProfile *prof = &tcg_ctx->prof;
+ int64_t ti = profile_getclock();
+#endif
+ int insns_left = cpu_unwind_data_from_tb(tb, host_pc, data);
+
+ if (insns_left < 0) {
+ return;
+ }
- found:
if (reset_icount && (tb_cflags(tb) & CF_USE_ICOUNT)) {
assert(icount_enabled());
- /* Reset the cycle counter to the start of the block
- and shift if to the number of actually executed instructions */
- cpu_neg(cpu)->icount_decr.u16.low += num_insns - i;
+ /*
+ * Reset the cycle counter to the start of the block and
+ * shift if to the number of actually executed instructions.
+ */
+ cpu_neg(cpu)->icount_decr.u16.low += insns_left;
}
cpu->cc->tcg_ops->restore_state_to_opc(cpu, tb, data);
@@ -375,7 +387,6 @@ static int cpu_restore_state_from_tb(CPUState *cpu, TranslationBlock *tb,
prof->restore_time + profile_getclock() - ti);
qatomic_set(&prof->restore_count, prof->restore_count + 1);
#endif
- return 0;
}
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
@@ -408,6 +419,17 @@ bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
return false;
}
+bool cpu_unwind_state_data(CPUState *cpu, uintptr_t host_pc, uint64_t *data)
+{
+ if (in_code_gen_buffer((const void *)(host_pc - tcg_splitwx_diff))) {
+ TranslationBlock *tb = tcg_tb_lookup(host_pc);
+ if (tb) {
+ return cpu_unwind_data_from_tb(tb, host_pc, data) >= 0;
+ }
+ }
+ return false;
+}
+
void page_init(void)
{
page_size_init();
--
2.34.1
next prev parent reply other threads:[~2022-10-24 13:59 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-10-24 13:24 [PATCH 00/29] tcg: Fix x86 TARGET_TB_PCREL (#1269) Richard Henderson
2022-10-24 13:24 ` [PATCH 01/29] accel/tcg: Add restore_state_to_opc to TCGCPUOps Richard Henderson
2022-10-24 15:05 ` Claudio Fontana
2022-10-24 15:15 ` Richard Henderson
2022-10-25 8:41 ` Claudio Fontana
2022-10-24 13:24 ` [PATCH] tests/tcg/nios2: Tweak 10m50-ghrd.ld Richard Henderson
2022-10-25 9:12 ` Claudio Fontana
2022-10-24 13:24 ` [PATCH 02/29] target/alpha: Convert to tcg_ops restore_state_to_opc Richard Henderson
2022-10-24 15:08 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 03/29] target/arm: " Richard Henderson
2022-10-24 14:27 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 04/29] target/avr: " Richard Henderson
2022-10-24 14:01 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 05/29] target/cris: " Richard Henderson
2022-10-24 14:58 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 06/29] target/hexagon: " Richard Henderson
2022-10-24 14:27 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 07/29] target/hppa: " Richard Henderson
2022-10-24 14:02 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 08/29] target/i386: " Richard Henderson
2022-10-24 14:59 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 09/29] target/loongarch: " Richard Henderson
2022-10-24 14:59 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 10/29] target/m68k: " Richard Henderson
2022-10-24 17:55 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 11/29] target/microblaze: " Richard Henderson
2022-10-24 17:56 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 12/29] target/mips: " Richard Henderson
2022-10-24 14:02 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 13/29] target/nios2: " Richard Henderson
2022-10-24 14:03 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 14/29] target/openrisc: " Richard Henderson
2022-10-24 15:00 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 15/29] target/ppc: " Richard Henderson
2022-10-24 17:56 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 16/29] target/riscv: " Richard Henderson
2022-10-24 14:03 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 17/29] target/rx: " Richard Henderson
2022-10-24 14:03 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 18/29] target/s390x: " Richard Henderson
2022-10-24 14:05 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 19/29] target/sh4: " Richard Henderson
2022-10-24 14:04 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 20/29] target/sparc: " Richard Henderson
2022-10-24 14:07 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 21/29] target/tricore: " Richard Henderson
2022-10-24 14:04 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 22/29] target/xtensa: " Richard Henderson
2022-10-24 17:56 ` Philippe Mathieu-Daudé
2022-10-24 13:24 ` [PATCH 23/29] accel/tcg: Remove restore_state_to_opc function Richard Henderson
2022-10-25 8:56 ` Claudio Fontana
2022-10-24 13:24 ` Richard Henderson [this message]
2022-10-25 9:23 ` [PATCH 24/29] accel/tcg: Introduce cpu_unwind_state_data Claudio Fontana
2022-10-25 9:32 ` Claudio Fontana
2022-10-25 23:08 ` Richard Henderson
2022-10-24 13:24 ` [PATCH 25/29] target/i386: Use cpu_unwind_state_data for tpr access Richard Henderson
2022-10-24 13:24 ` [PATCH 26/29] target/openrisc: Always exit after mtspr npc Richard Henderson
2022-10-25 15:39 ` Philippe Mathieu-Daudé
2022-10-25 15:49 ` Richard Henderson
2022-10-24 13:24 ` [PATCH 27/29] target/openrisc: Use cpu_unwind_state_data for mfspr Richard Henderson
2022-10-24 13:24 ` [PATCH 28/29] accel/tcg: Remove will_exit argument from cpu_restore_state Richard Henderson
2022-10-25 13:00 ` Claudio Fontana
2022-10-24 13:24 ` [PATCH 29/29] accel/tcg: Remove reset_icount argument from cpu_restore_state_from_tb Richard Henderson
2022-10-25 13:09 ` Claudio Fontana
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=20221024132459.3229709-26-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).