On 2026-09-18 2:42, Yonggang Luo wrote:
Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
cpu->exception_index then restore and exit the TB. host_pc == 0
skips restore, matching existing wrappers.
Signed-off-by: Yonggang Luo <[email protected]>
---
accel/tcg/cpu-exec-common.c | 6 ++++++
include/accel/tcg/cpu-loop.h | 13 +++++++++++++
2 files changed, 19 insertions(+)
diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
index 44e84344f3b..a33ec922745 100644
--- a/accel/tcg/cpu-exec-common.c
+++ b/accel/tcg/cpu-exec-common.c
@@ -82,6 +82,12 @@ void cpu_loop_exit_restore(CPUState *cpu, uintptr_t pc)
cpu_loop_exit(cpu);
}
+void cpu_loop_exit_excp(CPUState *cpu, int exception_index, uintptr_t pc)
+{
+ cpu->exception_index = exception_index;
+ cpu_loop_exit_restore(cpu, pc);
+}
+
void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc)
{
/* Prevent looping if already executing in a serial context. */
diff --git a/include/accel/tcg/cpu-loop.h b/include/accel/tcg/cpu-loop.h
index f4d38bc2bca..04c14396d93 100644
--- a/include/accel/tcg/cpu-loop.h
+++ b/include/accel/tcg/cpu-loop.h
@@ -65,6 +65,19 @@ G_NORETURN void cpu_loop_exit_noexc(CPUState *cpu);
G_NORETURN void cpu_loop_exit_restore(CPUState *cpu, uintptr_t host_pc);
G_NORETURN void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t host_pc);
+/**
+ * cpu_loop_exit_excp:
+ * @cpu: the cpu context
+ * @exception_index: EXCP_* or target trap number
+ * @host_pc: the host pc within the translation, or 0
+ *
+ * Set cpu->exception_index and exit the TB. If @host_pc is in
+ * translated code, restore guest state first (same as
+ * cpu_loop_exit_restore). @host_pc == 0 skips restore.
This comment sounds like implementation detail, why mention that
in the API contract? Otherwise LGTM.
+ */
+G_NORETURN void cpu_loop_exit_excp(CPUState *cpu, int exception_index,
+ uintptr_t host_pc);
+
/**
* cpu_loop_exit:
* @cpu: the cpu context