[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 25/47] accel/tcg: Add restore_state_to_opc to TCGCPUOps
From: |
Richard Henderson |
Subject: |
[PULL 25/47] accel/tcg: Add restore_state_to_opc to TCGCPUOps |
Date: |
Wed, 26 Oct 2022 12:10:54 +1000 |
Add a tcg_ops hook to replace the restore_state_to_opc
function call. Because these generic hooks cannot depend
on target-specific types, temporarily, copy the current
target_ulong data[] into uint64_t d64[].
Reviewed-by: Claudio Fontana <cfontana@suse.de>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
---
include/exec/exec-all.h | 2 +-
include/hw/core/tcg-cpu-ops.h | 11 +++++++++++
accel/tcg/translate-all.c | 24 ++++++++++++++++++++++--
3 files changed, 34 insertions(+), 3 deletions(-)
diff --git a/include/exec/exec-all.h b/include/exec/exec-all.h
index 5ae484e34d..3b5e84240b 100644
--- a/include/exec/exec-all.h
+++ b/include/exec/exec-all.h
@@ -40,7 +40,7 @@ typedef ram_addr_t tb_page_addr_t;
#endif
void restore_state_to_opc(CPUArchState *env, TranslationBlock *tb,
- target_ulong *data);
+ target_ulong *data) __attribute__((weak));
/**
* cpu_restore_state:
diff --git a/include/hw/core/tcg-cpu-ops.h b/include/hw/core/tcg-cpu-ops.h
index 78c6c6635d..20e3c0ffbb 100644
--- a/include/hw/core/tcg-cpu-ops.h
+++ b/include/hw/core/tcg-cpu-ops.h
@@ -31,6 +31,17 @@ struct TCGCPUOps {
* function to restore all the state, and register it here.
*/
void (*synchronize_from_tb)(CPUState *cpu, const TranslationBlock *tb);
+ /**
+ * @restore_state_to_opc: Synchronize state from INDEX_op_start_insn
+ *
+ * This is called when we unwind state in the middle of a TB,
+ * usually before raising an exception. Set all part of the CPU
+ * state which are tracked insn-by-insn in the target-specific
+ * arguments to start_insn, passed as @data.
+ */
+ void (*restore_state_to_opc)(CPUState *cpu, const TranslationBlock *tb,
+ const uint64_t *data);
+
/** @cpu_exec_enter: Callback for cpu_exec preparation */
void (*cpu_exec_enter)(CPUState *cpu);
/** @cpu_exec_exit: Callback for cpu_exec cleanup */
diff --git a/accel/tcg/translate-all.c b/accel/tcg/translate-all.c
index 433fa247f4..4d8783efc7 100644
--- a/accel/tcg/translate-all.c
+++ b/accel/tcg/translate-all.c
@@ -256,7 +256,6 @@ int cpu_restore_state_from_tb(CPUState *cpu,
TranslationBlock *tb,
{
target_ulong data[TARGET_INSN_START_WORDS];
uintptr_t host_pc = (uintptr_t)tb->tc.ptr;
- CPUArchState *env = cpu->env_ptr;
const uint8_t *p = tb->tc.ptr + tb->tc.size;
int i, j, num_insns = tb->icount;
#ifdef CONFIG_PROFILER
@@ -295,7 +294,20 @@ int cpu_restore_state_from_tb(CPUState *cpu,
TranslationBlock *tb,
and shift if to the number of actually executed instructions */
cpu_neg(cpu)->icount_decr.u16.low += num_insns - i;
}
- restore_state_to_opc(env, tb, data);
+
+ {
+ const struct TCGCPUOps *ops = cpu->cc->tcg_ops;
+ __typeof(ops->restore_state_to_opc) restore =
ops->restore_state_to_opc;
+ if (restore) {
+ uint64_t d64[TARGET_INSN_START_WORDS];
+ for (i = 0; i < TARGET_INSN_START_WORDS; ++i) {
+ d64[i] = data[i];
+ }
+ restore(cpu, tb, d64);
+ } else {
+ restore_state_to_opc(cpu->env_ptr, tb, data);
+ }
+ }
#ifdef CONFIG_PROFILER
qatomic_set(&prof->restore_time,
@@ -307,6 +319,14 @@ int cpu_restore_state_from_tb(CPUState *cpu,
TranslationBlock *tb,
bool cpu_restore_state(CPUState *cpu, uintptr_t host_pc, bool will_exit)
{
+ /*
+ * The pc update associated with restore without exit will
+ * break the relative pc adjustments performed by TARGET_TB_PCREL.
+ */
+ if (TARGET_TB_PCREL) {
+ assert(will_exit);
+ }
+
/*
* The host_pc has to be in the rx region of the code buffer.
* If it is not we will not be able to resolve it here.
--
2.34.1
- [PULL 15/47] accel/tcg: Introduce tb_{set_}page_addr{0,1}, (continued)
- [PULL 15/47] accel/tcg: Introduce tb_{set_}page_addr{0,1}, Richard Henderson, 2022/10/25
- [PULL 16/47] accel/tcg: Rename tb_invalidate_phys_page, Richard Henderson, 2022/10/25
- [PULL 17/47] accel/tcg: Rename tb_invalidate_phys_page_range and drop end parameter, Richard Henderson, 2022/10/25
- [PULL 18/47] accel/tcg: Unify declarations of tb_invalidate_phys_range, Richard Henderson, 2022/10/25
- [PULL 19/47] accel/tcg: Use tb_invalidate_phys_page in page_set_flags, Richard Henderson, 2022/10/25
- [PULL 20/47] accel/tcg: Call tb_invalidate_phys_page for PAGE_RESET, Richard Henderson, 2022/10/25
- [PULL 21/47] accel/tcg: Use page_reset_target_data in page_set_flags, Richard Henderson, 2022/10/25
- [PULL 22/47] accel/tcg: Use tb_invalidate_phys_range in page_set_flags, Richard Henderson, 2022/10/25
- [PULL 23/47] accel/tcg: Move TARGET_PAGE_DATA_SIZE impl to user-exec.c, Richard Henderson, 2022/10/25
- [PULL 24/47] accel/tcg: Simplify page_get/alloc_target_data, Richard Henderson, 2022/10/25
- [PULL 25/47] accel/tcg: Add restore_state_to_opc to TCGCPUOps,
Richard Henderson <=
[PULL 26/47] target/alpha: Convert to tcg_ops restore_state_to_opc, Richard Henderson, 2022/10/25
[PULL 27/47] target/arm: Convert to tcg_ops restore_state_to_opc, Richard Henderson, 2022/10/25
[PULL 28/47] target/avr: Convert to tcg_ops restore_state_to_opc, Richard Henderson, 2022/10/25