All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets
@ 2026-09-28  5:20 Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 01/24] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic Yonggang Luo
                   ` (23 more replies)
  0 siblings, 24 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Many TCG targets copy the same two-line raise: set cs->exception_index and call
cpu_loop_exit_restore. They also copy DEF_HELPER_2(raise_exception, ...).
helper_raise_exception is a global C symbol, so a unified binary cannot keep
that name on more than one target.

This series adds a shared C exit and two shared TCG helpers, then converts one
target per commit. Joiners call gen_helper_raise_excp or
gen_helper_raise_excp_restore and drop the copied DEF. Leftover TCG helpers that
still do extra work take an arch prefix. C wrappers keep the short name as
static inline where that is enough. The shared helpers only touch CPUState.
Translate may store arch state (error_code, PC) first. Guest trap numbers stay
below 0x10000. TCG loop codes such as EXCP_INTERRUPT start at 0x10000.

- Move helper_exit_atomic into cpu-exec-common.c with its DEF_HELPER, so the new
  helpers can sit beside it.
- Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
  cpu->exception_index, then restore and exit the same way as
  cpu_loop_exit_restore.
- Add TCG raise_excp and raise_excp_restore next to cpu_loop_exit_excp.
  raise_excp exits with host_pc 0. raise_excp_restore exits with GETPC(). Each
  helper does one thing.
- Name RX and SH4 guest traps RX_EXCP_* and SH4_EXCP_* in their own commits,
  then convert the raises. Join privilege and illegal on RX through
  raise_excp_restore, and BRK and INT through raise_excp. Join illegal and
  FPU-disable on SH4. Keep SH4 sleep, trapa, and exclusive.
- Convert the remaining joiners one arch per commit: m68k, or1k, microblaze,
  sparc, loongarch, hppa, alpha, s390x, xtensa, avr, arm exception_internal,
  mips, and ppc. Store error_code or PC in translate where needed, then call the
  shared helper. loongarch and the mips 2-arg path use raise_excp_restore.
- Add gen_yield before the xtensa conversion. Fold gen_exception_nip into
  gen_exception_err_nip before the ppc conversion.
- Prefix leftover TCG helpers that still do extra work: riscv_raise_exception
  and hexagon_raise_exception. Tricore raise_exception_sync does not join.

v1: https://patchew.org/QEMU/20260918004225.827-1-luoyonggang@gmail.com/

Changes v1 -> v2:

- Move helper_exit_atomic into cpu-exec-common.c. Split the restore flag into
  raise_excp and raise_excp_restore, and define both there.
- Drop the helper-gen nested-extern change.
- Shorten the cpu_loop_exit_excp comment. Drop the generic EXCP_INTERRUPT note
  on the RX and SH4 trap enums, and put those enums in their own commits.
- Split xtensa gen_yield and the ppc gen_exception_nip fold out of the
  conversion commits.
- Omit the i386 conversion, the rx, mips, and hexagon helper_wait renames, and
  the arm raise_exception rename.

Yonggang Luo (24):
  accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic
  accel/tcg: add cpu_loop_exit_excp
  accel/tcg: add raise_excp and raise_excp_restore helpers
  target/rx: name guest trap numbers RX_EXCP_*
  target/rx: convert raises to raise_excp
  target/sh4: name guest trap numbers SH4_EXCP_*
  target/sh4: convert raises to raise_excp
  target/m68k: convert raises to raise_excp
  target/or1k: convert exception to raise_excp
  target/microblaze: convert raise_exception to raise_excp
  target/sparc: convert raise_exception to raise_excp
  target/loongarch: convert raise_exception to raise_excp
  target/hexagon: convert raise_exception to hexagon_raise_exception
  target/hppa: convert excp to raise_excp
  target/alpha: convert excp to raise_excp
  target/s390x: convert exception to raise_excp
  target/xtensa: add gen_yield for EXCP_YIELD
  target/xtensa: convert exception to raise_excp
  target/avr: convert debug/break/sleep to raise_excp
  target/arm: convert exception_internal to raise_excp
  target/riscv: convert raise_exception to riscv_raise_exception
  target/mips: convert raise_exception to raise_excp
  target/ppc: fold gen_exception_nip into gen_exception_err_nip
  target/ppc: convert raise_exception to raise_excp

 MAINTAINERS                                   |  1 +
 accel/tcg/cpu-exec-common.c                   | 28 +++++++
 accel/tcg/cpu-exec-common.h                   |  4 +
 accel/tcg/tcg-runtime.c                       |  8 --
 accel/tcg/tcg-runtime.h                       |  2 -
 include/accel/tcg/cpu-loop.h                  | 12 +++
 include/exec/helper-gen-common.h              |  4 +
 include/exec/helper-proto-common.h            |  4 +
 target/alpha/helper.c                         | 11 ---
 target/alpha/helper.h                         |  1 -
 target/alpha/translate.c                      |  8 +-
 target/arm/tcg/helper-defs.h                  |  1 -
 target/arm/tcg/m_helper.c                     |  3 +-
 target/arm/tcg/op_helper.c                    | 33 ++------
 target/arm/tcg/translate.c                    |  2 +-
 target/avr/helper.c                           | 24 ------
 target/avr/helper.h                           |  3 -
 target/avr/translate.c                        |  4 +-
 target/hexagon/cpu.c                          | 13 +--
 target/hexagon/cpu.h                          |  2 +-
 target/hexagon/helper.h                       |  3 +-
 target/hexagon/internal.h                     |  5 --
 target/hexagon/macros.h                       |  2 +-
 target/hexagon/op_helper.c                    | 29 +++----
 target/hexagon/translate.c                    | 11 +--
 target/hppa/helper.h                          |  2 -
 target/hppa/op_helper.c                       | 15 +---
 target/hppa/sys_helper.c                      |  4 +-
 target/hppa/translate.c                       |  2 +-
 target/loongarch/tcg/helper.h                 |  2 -
 target/loongarch/tcg/op_helper.c              |  6 --
 target/loongarch/tcg/tcg_cpu.c                |  4 +-
 target/loongarch/tcg/translate.c              |  2 +-
 target/m68k/helper.c                          | 12 +--
 target/m68k/helper.h                          |  1 -
 target/m68k/op_helper.c                       | 19 -----
 target/m68k/translate.c                       |  2 +-
 target/microblaze/helper.c                    |  3 +-
 target/microblaze/helper.h                    |  2 -
 target/microblaze/op_helper.c                 | 22 +----
 target/microblaze/translate.c                 |  2 +-
 target/mips/helper.h                          |  4 -
 target/mips/tcg/exception.c                   | 20 +----
 target/mips/tcg/fpu_helper.c                  |  6 +-
 target/mips/tcg/translate.c                   |  9 +-
 target/or1k/exception.c                       | 31 -------
 target/or1k/exception.h                       |  7 +-
 target/or1k/exception_helper.c                | 13 +--
 target/or1k/helper.h                          |  1 -
 target/or1k/meson.build                       |  1 -
 target/or1k/translate.c                       |  2 +-
 target/ppc/cpu.h                              |  3 -
 target/ppc/helper.h                           |  2 -
 target/ppc/internal.h                         |  9 ++
 target/ppc/misc_helper.c                      |  1 +
 target/ppc/tcg-excp_helper.c                  | 21 -----
 target/ppc/timebase_helper.c                  |  1 +
 target/ppc/translate.c                        | 20 ++---
 target/riscv/helper.h                         |  2 +-
 target/riscv/tcg/insn_trans/trans_rvi.c.inc   |  6 +-
 .../tcg/insn_trans/trans_rvzicfiss.c.inc      |  3 +-
 target/riscv/tcg/op_helper.c                  |  5 +-
 target/riscv/tcg/translate.c                  | 10 ++-
 target/rx/cpu.h                               | 10 +++
 target/rx/helper.c                            | 16 ++--
 target/rx/helper.h                            |  5 --
 target/rx/op_helper.c                         | 44 +---------
 target/rx/translate.c                         | 13 ++-
 target/s390x/helper.h                         |  1 -
 target/s390x/tcg/mem_helper.c                 |  2 +-
 target/s390x/tcg/misc_helper.c                | 10 ---
 target/s390x/tcg/translate.c                  |  2 +-
 target/sh4/cpu.h                              | 21 +++++
 target/sh4/helper.c                           | 82 ++++++++++---------
 target/sh4/helper.h                           |  4 -
 target/sh4/op_helper.c                        | 43 ++--------
 target/sh4/translate.c                        | 12 ++-
 target/sparc/helper.c                         | 21 +----
 target/sparc/helper.h                         |  2 -
 target/sparc/translate.c                      |  6 +-
 target/xtensa/cpu.h                           |  1 +
 target/xtensa/exc_helper.c                    | 13 ++-
 target/xtensa/helper.h                        |  1 -
 target/xtensa/translate.c                     |  8 +-
 target/xtensa/win_helper.c                    | 12 +--
 85 files changed, 287 insertions(+), 537 deletions(-)
 create mode 100644 accel/tcg/cpu-exec-common.h
 delete mode 100644 target/or1k/exception.c

-- 
2.52.0.windows.1



^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH v2 01/24] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp Yonggang Luo
                   ` (22 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

helper_exit_atomic only forwards to cpu_loop_exit_atomic. Define it
in cpu-exec-common.c with that function, and move its DEF_HELPER line
to cpu-exec-common.h. That file emits helper_info_exit_atomic.
tcg-runtime.c keeps the integer helpers.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 MAINTAINERS                        |  1 +
 accel/tcg/cpu-exec-common.c        | 10 ++++++++++
 accel/tcg/cpu-exec-common.h        |  2 ++
 accel/tcg/tcg-runtime.c            |  8 --------
 accel/tcg/tcg-runtime.h            |  2 --
 include/exec/helper-gen-common.h   |  4 ++++
 include/exec/helper-proto-common.h |  4 ++++
 7 files changed, 21 insertions(+), 10 deletions(-)
 create mode 100644 accel/tcg/cpu-exec-common.h

diff --git a/MAINTAINERS b/MAINTAINERS
index 1b66c65f689..7fa78a9bd74 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -174,6 +174,7 @@ F: system/watchpoint.c
 F: page-vary-system.c
 F: page-vary-common.c
 F: accel/tcg/
+F: accel/tcg/cpu-exec-common.h
 F: accel/stubs/tcg-stub.c
 F: util/cacheflush.c
 F: scripts/decodetree.py
diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
index 68077c8fd9d..d20cece1c5f 100644
--- a/accel/tcg/cpu-exec-common.c
+++ b/accel/tcg/cpu-exec-common.c
@@ -23,8 +23,13 @@
 #include "qemu/plugin.h"
 #include "qemu/main-loop.h"
 #include "accel/tcg/cpu-loop.h"
+#include "exec/helper-proto-common.h"
 #include "internal-common.h"
 
+#define HELPER_H "accel/tcg/cpu-exec-common.h"
+#include "exec/helper-info.c.inc"
+#undef  HELPER_H
+
 bool tcg_allowed;
 
 /*
@@ -120,3 +125,8 @@ void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc)
     cpu->exception_index = EXCP_ATOMIC;
     cpu_loop_exit_restore(cpu, pc);
 }
+
+void HELPER(exit_atomic)(CPUArchState *env)
+{
+    cpu_loop_exit_atomic(env_cpu(env), GETPC());
+}
diff --git a/accel/tcg/cpu-exec-common.h b/accel/tcg/cpu-exec-common.h
new file mode 100644
index 00000000000..19359a97bae
--- /dev/null
+++ b/accel/tcg/cpu-exec-common.h
@@ -0,0 +1,2 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later */
+DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env)
diff --git a/accel/tcg/tcg-runtime.c b/accel/tcg/tcg-runtime.c
index 7c0aab98a80..764c62c684d 100644
--- a/accel/tcg/tcg-runtime.c
+++ b/accel/tcg/tcg-runtime.c
@@ -23,10 +23,7 @@
  */
 #include "qemu/osdep.h"
 #include "qemu/host-utils.h"
-#include "exec/cpu-common.h"
 #include "exec/helper-proto-common.h"
-#include "accel/tcg/cpu-loop.h"
-#include "accel/tcg/getpc.h"
 
 #define HELPER_H  "accel/tcg/tcg-runtime.h"
 #include "exec/helper-info.c.inc"
@@ -129,8 +126,3 @@ uint64_t HELPER(ctpop_i64)(uint64_t arg)
 {
     return ctpop64(arg);
 }
-
-void HELPER(exit_atomic)(CPUArchState *env)
-{
-    cpu_loop_exit_atomic(env_cpu(env), GETPC());
-}
diff --git a/accel/tcg/tcg-runtime.h b/accel/tcg/tcg-runtime.h
index 0b832176b33..9b4c1c24916 100644
--- a/accel/tcg/tcg-runtime.h
+++ b/accel/tcg/tcg-runtime.h
@@ -22,8 +22,6 @@ DEF_HELPER_FLAGS_1(ctpop_i64, TCG_CALL_NO_RWG_SE, i64, i64)
 
 DEF_HELPER_FLAGS_1(lookup_tb_ptr, TCG_CALL_NO_WG_SE, cptr, env)
 
-DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env)
-
 #ifndef IN_HELPER_PROTO
 /*
  * Pass calls to memset directly to libc, without a thunk in qemu.
diff --git a/include/exec/helper-gen-common.h b/include/exec/helper-gen-common.h
index 834590dc4e5..ed5521ad881 100644
--- a/include/exec/helper-gen-common.h
+++ b/include/exec/helper-gen-common.h
@@ -7,6 +7,10 @@
 #ifndef HELPER_GEN_COMMON_H
 #define HELPER_GEN_COMMON_H
 
+#define HELPER_H "accel/tcg/cpu-exec-common.h"
+#include "exec/helper-gen.h.inc"
+#undef  HELPER_H
+
 #define HELPER_H "accel/tcg/tcg-runtime.h"
 #include "exec/helper-gen.h.inc"
 #undef  HELPER_H
diff --git a/include/exec/helper-proto-common.h b/include/exec/helper-proto-common.h
index 76e6c25becb..28afa7782d0 100644
--- a/include/exec/helper-proto-common.h
+++ b/include/exec/helper-proto-common.h
@@ -9,6 +9,10 @@
 
 #include "qemu/atomic128.h"  /* for HAVE_CMPXCHG128 */
 
+#define HELPER_H "accel/tcg/cpu-exec-common.h"
+#include "exec/helper-proto.h.inc"
+#undef  HELPER_H
+
 #define HELPER_H "accel/tcg/tcg-runtime.h"
 #include "exec/helper-proto.h.inc"
 #undef  HELPER_H
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 01/24] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-29  5:23   ` Philippe Mathieu-Daudé
  2026-09-28  5:20 ` [PATCH v2 03/24] accel/tcg: add raise_excp and raise_excp_restore helpers Yonggang Luo
                   ` (21 subsequent siblings)
  23 siblings, 1 reply; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
cpu->exception_index, then restore and exit the current TB the same
way as cpu_loop_exit_restore.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 accel/tcg/cpu-exec-common.c  |  6 ++++++
 include/accel/tcg/cpu-loop.h | 12 ++++++++++++
 2 files changed, 18 insertions(+)

diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
index d20cece1c5f..31fed8e497f 100644
--- a/accel/tcg/cpu-exec-common.c
+++ b/accel/tcg/cpu-exec-common.c
@@ -118,6 +118,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..856091020f2 100644
--- a/include/accel/tcg/cpu-loop.h
+++ b/include/accel/tcg/cpu-loop.h
@@ -65,6 +65,18 @@ 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
+ *
+ * Set cpu->exception_index and exit the current TB, restoring
+ * guest state from @host_pc the same way as cpu_loop_exit_restore.
+ */
+G_NORETURN void cpu_loop_exit_excp(CPUState *cpu, int exception_index,
+                                   uintptr_t host_pc);
+
 /**
  * cpu_loop_exit:
  * @cpu: the cpu context
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 03/24] accel/tcg: add raise_excp and raise_excp_restore helpers
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 01/24] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_* Yonggang Luo
                   ` (20 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Add two TCG helpers next to cpu_loop_exit_excp. raise_excp exits
with host_pc 0. raise_excp_restore exits with GETPC(). Declare both
with DEF_HELPER in cpu-exec-common.h.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 accel/tcg/cpu-exec-common.c | 12 ++++++++++++
 accel/tcg/cpu-exec-common.h |  2 ++
 2 files changed, 14 insertions(+)

diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
index 31fed8e497f..d6277b7d917 100644
--- a/accel/tcg/cpu-exec-common.c
+++ b/accel/tcg/cpu-exec-common.c
@@ -124,6 +124,18 @@ void cpu_loop_exit_excp(CPUState *cpu, int exception_index, uintptr_t pc)
     cpu_loop_exit_restore(cpu, pc);
 }
 
+/* Raise exception and exit the TB without restoring guest state. */
+void HELPER(raise_excp)(CPUArchState *env, uint32_t exception)
+{
+    cpu_loop_exit_excp(env_cpu(env), exception, 0);
+}
+
+/* Raise exception and exit the TB, restoring state from GETPC(). */
+void HELPER(raise_excp_restore)(CPUArchState *env, uint32_t exception)
+{
+    cpu_loop_exit_excp(env_cpu(env), exception, GETPC());
+}
+
 void cpu_loop_exit_atomic(CPUState *cpu, uintptr_t pc)
 {
     /* Prevent looping if already executing in a serial context. */
diff --git a/accel/tcg/cpu-exec-common.h b/accel/tcg/cpu-exec-common.h
index 19359a97bae..1e82f3b14d3 100644
--- a/accel/tcg/cpu-exec-common.h
+++ b/accel/tcg/cpu-exec-common.h
@@ -1,2 +1,4 @@
 /* SPDX-License-Identifier: GPL-2.0-or-later */
 DEF_HELPER_FLAGS_1(exit_atomic, TCG_CALL_NO_WG, noreturn, env)
+DEF_HELPER_FLAGS_2(raise_excp, TCG_CALL_NO_WG, noreturn, env, i32)
+DEF_HELPER_FLAGS_2(raise_excp_restore, TCG_CALL_NO_WG, noreturn, env, i32)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_*
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (2 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 03/24] accel/tcg: add raise_excp and raise_excp_restore helpers Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-29  5:26   ` Philippe Mathieu-Daudé
  2026-09-28  5:20 ` [PATCH v2 05/24] target/rx: convert raises to raise_excp Yonggang Luo
                   ` (19 subsequent siblings)
  23 siblings, 1 reply; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Add RX_EXCP_* in cpu.h for the guest trap numbers stored in
cs->exception_index.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/rx/cpu.h | 10 ++++++++++
 1 file changed, 10 insertions(+)

diff --git a/target/rx/cpu.h b/target/rx/cpu.h
index 64ba48a7329..521e494172e 100644
--- a/target/rx/cpu.h
+++ b/target/rx/cpu.h
@@ -71,6 +71,16 @@ enum {
     NUM_REGS = 16,
 };
 
+/* Guest trap numbers. */
+enum {
+    RX_EXCP_PRIVILEGE_VIOLATION = 20,
+    RX_EXCP_ACCESS = 21,
+    RX_EXCP_ILLEGAL_INSTRUCTION = 23,
+    RX_EXCP_FPU = 25,
+    RX_EXCP_NMI = 30,
+    RX_EXCP_INT = 0x100,
+};
+
 typedef struct CPUArchState {
     /* CPU registers */
     uint32_t regs[NUM_REGS];    /* general registers */
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 05/24] target/rx: convert raises to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (3 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_* Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 06/24] target/sh4: name guest trap numbers SH4_EXCP_* Yonggang Luo
                   ` (18 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate privilege and illegal through raise_excp_restore, and BRK
and INT through raise_excp. Drop unused raise_access_fault and the
one-line raise_exception wrapper. FPSW still exits with
RX_EXCP_ACCESS.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/rx/helper.c    | 16 ++++++++--------
 target/rx/helper.h    |  5 -----
 target/rx/op_helper.c | 44 ++-----------------------------------------
 target/rx/translate.c | 13 ++++++-------
 4 files changed, 16 insertions(+), 62 deletions(-)

diff --git a/target/rx/helper.c b/target/rx/helper.c
index 0f99279bbaa..2ebda733489 100644
--- a/target/rx/helper.c
+++ b/target/rx/helper.c
@@ -86,13 +86,13 @@ void rx_cpu_do_interrupt(CPUState *cs)
         env->isp -= 4;
         cpu_stl_le_data(env, env->isp, env->pc);
 
-        if (vec < 0x100) {
+        if (vec < RX_EXCP_INT) {
             env->pc = cpu_ldl_le_data(env, 0xffffff80 + vec * 4);
         } else {
             env->pc = cpu_ldl_le_data(env, env->intb + (vec & 0xff) * 4);
         }
 
-        if (vec == 30) {
+        if (vec == RX_EXCP_NMI) {
             /* Non-maskable interrupt */
             qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
         } else {
@@ -100,22 +100,22 @@ void rx_cpu_do_interrupt(CPUState *cs)
         }
 
         switch (vec) {
-        case 20:
+        case RX_EXCP_PRIVILEGE_VIOLATION:
             expname = "privilege violation";
             break;
-        case 21:
+        case RX_EXCP_ACCESS:
             expname = "access exception";
             break;
-        case 23:
+        case RX_EXCP_ILLEGAL_INSTRUCTION:
             expname = "illegal instruction";
             break;
-        case 25:
+        case RX_EXCP_FPU:
             expname = "fpu exception";
             break;
-        case 30:
+        case RX_EXCP_NMI:
             expname = "non-maskable interrupt";
             break;
-        case 0x100 ... 0x1ff:
+        case RX_EXCP_INT ... RX_EXCP_INT + 0xff:
             expname = "unconditional trap";
         }
         qemu_log_mask(CPU_LOG_INT, "exception 0x%02x [%s] raised\n",
diff --git a/target/rx/helper.h b/target/rx/helper.h
index 8cc38b0cb71..c6a85e968d9 100644
--- a/target/rx/helper.h
+++ b/target/rx/helper.h
@@ -1,9 +1,4 @@
-DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
-DEF_HELPER_1(raise_access_fault, noreturn, env)
-DEF_HELPER_1(raise_privilege_violation, noreturn, env)
 DEF_HELPER_1(wait, noreturn, env)
-DEF_HELPER_2(rxint, noreturn, env, i32)
-DEF_HELPER_1(rxbrk, noreturn, env)
 DEF_HELPER_3(fadd, f32, env, f32, f32)
 DEF_HELPER_3(fsub, f32, env, f32, f32)
 DEF_HELPER_3(fmul, f32, env, f32, f32)
diff --git a/target/rx/op_helper.c b/target/rx/op_helper.c
index 36df7d377e5..f73aeae6326 100644
--- a/target/rx/op_helper.c
+++ b/target/rx/op_helper.c
@@ -25,10 +25,6 @@
 #include "fpu/softfloat.h"
 #include "tcg/debug-assert.h"
 
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
-                     uintptr_t retaddr);
-
 static void _set_psw(CPURXState *env, uint32_t psw, uint32_t rte)
 {
     uint32_t prev_u;
@@ -115,7 +111,7 @@ static void update_fpsw(CPURXState *env, float32 ret, uintptr_t retaddr)
         enable = FIELD_EX32(env->fpsw, FPSW, ENABLE);
         enable |= 1 << 5; /* CE always enabled */
         if (cause & enable) {
-            raise_exception(env, 21, retaddr);
+            cpu_loop_exit_excp(env_cpu(env), RX_EXCP_ACCESS, retaddr);
         }
     }
 }
@@ -419,32 +415,6 @@ uint32_t helper_divu(CPURXState *env, uint32_t num, uint32_t den)
     return ret;
 }
 
-/* exception */
-static inline G_NORETURN
-void raise_exception(CPURXState *env, int index,
-                     uintptr_t retaddr)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = index;
-    cpu_loop_exit_restore(cs, retaddr);
-}
-
-G_NORETURN void helper_raise_privilege_violation(CPURXState *env)
-{
-    raise_exception(env, 20, GETPC());
-}
-
-G_NORETURN void helper_raise_access_fault(CPURXState *env)
-{
-    raise_exception(env, 21, GETPC());
-}
-
-G_NORETURN void helper_raise_illegal_instruction(CPURXState *env)
-{
-    raise_exception(env, 23, GETPC());
-}
-
 G_NORETURN void helper_wait(CPURXState *env)
 {
     CPUState *cs = env_cpu(env);
@@ -452,15 +422,5 @@ G_NORETURN void helper_wait(CPURXState *env)
     cs->halted = 1;
     env->in_sleep = 1;
     env->psw_i = 1;
-    raise_exception(env, EXCP_HLT, 0);
-}
-
-G_NORETURN void helper_rxint(CPURXState *env, uint32_t vec)
-{
-    raise_exception(env, 0x100 + vec, 0);
-}
-
-G_NORETURN void helper_rxbrk(CPURXState *env)
-{
-    raise_exception(env, 0x100, 0);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 }
diff --git a/target/rx/translate.c b/target/rx/translate.c
index 132d495710c..43efdb6af0e 100644
--- a/target/rx/translate.c
+++ b/target/rx/translate.c
@@ -245,7 +245,8 @@ static int is_privileged(DisasContext *ctx, int is_exception)
 {
     if (FIELD_EX32(ctx->tb_flags, PSW, PM)) {
         if (is_exception) {
-            gen_helper_raise_privilege_violation(tcg_env);
+            gen_helper_raise_excp_restore(
+                tcg_env, tcg_constant_i32(RX_EXCP_PRIVILEGE_VIOLATION));
         }
         return 0;
     } else {
@@ -2174,7 +2175,7 @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
 static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
 {
     tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
-    gen_helper_rxbrk(tcg_env);
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(RX_EXCP_INT));
     ctx->base.is_jmp = DISAS_NORETURN;
     return true;
 }
@@ -2182,12 +2183,9 @@ static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
 /* int #imm */
 static bool trans_INT(DisasContext *ctx, arg_INT *a)
 {
-    TCGv_i32 vec;
-
     tcg_debug_assert(a->imm < 0x100);
-    vec = tcg_constant_i32(a->imm);
     tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
-    gen_helper_rxint(tcg_env, vec);
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(RX_EXCP_INT + a->imm));
     ctx->base.is_jmp = DISAS_NORETURN;
     return true;
 }
@@ -2228,7 +2226,8 @@ static void rx_tr_translate_insn(DisasContextBase *dcbase, CPUState *cs)
     ctx->pc = ctx->base.pc_next;
     insn = decode_load(ctx);
     if (!decode(ctx, insn)) {
-        gen_helper_raise_illegal_instruction(tcg_env);
+        gen_helper_raise_excp_restore(
+            tcg_env, tcg_constant_i32(RX_EXCP_ILLEGAL_INSTRUCTION));
     }
 }
 
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 06/24] target/sh4: name guest trap numbers SH4_EXCP_*
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (4 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 05/24] target/rx: convert raises to raise_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 07/24] target/sh4: convert raises to raise_excp Yonggang Luo
                   ` (17 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Add SH4_EXCP_* in cpu.h for the guest trap numbers stored in
cs->exception_index.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/sh4/cpu.h | 21 +++++++++++++++++++++
 1 file changed, 21 insertions(+)

diff --git a/target/sh4/cpu.h b/target/sh4/cpu.h
index 6984bb462fb..a1e9049b7be 100644
--- a/target/sh4/cpu.h
+++ b/target/sh4/cpu.h
@@ -135,6 +135,27 @@ typedef struct memory_content {
     struct memory_content *next;
 } memory_content;
 
+/* Guest trap numbers. */
+enum {
+    SH4_EXCP_RESET = 0x000,
+    SH4_EXCP_MANUAL_RESET = 0x020,
+    SH4_EXCP_TLB_MISS = 0x040,
+    SH4_EXCP_DTLB_MISS_WRITE = 0x060,
+    SH4_EXCP_INITIAL_PAGE_WRITE = 0x080,
+    SH4_EXCP_TLB_VIOLATION = 0x0a0,
+    SH4_EXCP_DTLB_VIOLATION_WRITE = 0x0c0,
+    SH4_EXCP_ADDR_ERROR = 0x0e0,
+    SH4_EXCP_DATA_WRITE = 0x100,
+    SH4_EXCP_FPU = 0x120,
+    SH4_EXCP_TLB_MULTIPLE = 0x140,
+    SH4_EXCP_TRAPA = 0x160,
+    SH4_EXCP_ILLEGAL_INSTRUCTION = 0x180,
+    SH4_EXCP_SLOT_ILLEGAL_INSTRUCTION = 0x1a0,
+    SH4_EXCP_USER_BREAK = 0x1e0,
+    SH4_EXCP_FPU_DISABLE = 0x800,
+    SH4_EXCP_SLOT_FPU_DISABLE = 0x820,
+};
+
 typedef struct CPUArchState {
     uint32_t flags;             /* general execution flags */
     uint32_t gregs[24];         /* general registers */
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 07/24] target/sh4: convert raises to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (5 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 06/24] target/sh4: name guest trap numbers SH4_EXCP_* Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 08/24] target/m68k: " Yonggang Luo
                   ` (16 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate illegal and FPU-disable through raise_excp. Drop unused
raise_* TCG helpers and the one-line raise_exception wrapper. Keep
leftover sleep, trapa, and exclusive helpers. Exit unaligned and
tlb_fill through cpu_loop_exit_excp. Log reset, manual reset, TLB
multiple, and user break.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/sh4/helper.c    | 82 +++++++++++++++++++++---------------------
 target/sh4/helper.h    |  4 ---
 target/sh4/op_helper.c | 43 +++-------------------
 target/sh4/translate.c | 12 ++++---
 4 files changed, 55 insertions(+), 86 deletions(-)

diff --git a/target/sh4/helper.c b/target/sh4/helper.c
index b6b057f104b..e22f02a5647 100644
--- a/target/sh4/helper.c
+++ b/target/sh4/helper.c
@@ -70,7 +70,7 @@ void superh_cpu_do_interrupt(CPUState *cs)
     do_irq = do_irq && (cs->exception_index == -1);
 
     if (env->sr & (1u << SR_BL)) {
-        if (do_exp && cs->exception_index != 0x1e0) {
+        if (do_exp && cs->exception_index != SH4_EXCP_USER_BREAK) {
             /* In theory a masked exception generates a reset exception,
                which in turn jumps to the reset vector. However this only
                works when using a bootloader. When using a kernel and an
@@ -97,45 +97,57 @@ void superh_cpu_do_interrupt(CPUState *cs)
     if (qemu_loglevel_mask(CPU_LOG_INT)) {
         const char *expname;
         switch (cs->exception_index) {
-        case 0x0e0:
+        case SH4_EXCP_RESET:
+            expname = "reset";
+            break;
+        case SH4_EXCP_MANUAL_RESET:
+            expname = "manual_reset";
+            break;
+        case SH4_EXCP_ADDR_ERROR:
             expname = "addr_error";
             break;
-        case 0x040:
+        case SH4_EXCP_TLB_MISS:
             expname = "tlb_miss";
             break;
-        case 0x0a0:
+        case SH4_EXCP_TLB_MULTIPLE:
+            expname = "tlb_multiple";
+            break;
+        case SH4_EXCP_TLB_VIOLATION:
             expname = "tlb_violation";
             break;
-        case 0x180:
+        case SH4_EXCP_ILLEGAL_INSTRUCTION:
             expname = "illegal_instruction";
             break;
-        case 0x1a0:
+        case SH4_EXCP_SLOT_ILLEGAL_INSTRUCTION:
             expname = "slot_illegal_instruction";
             break;
-        case 0x800:
+        case SH4_EXCP_FPU_DISABLE:
             expname = "fpu_disable";
             break;
-        case 0x820:
+        case SH4_EXCP_SLOT_FPU_DISABLE:
             expname = "slot_fpu";
             break;
-        case 0x100:
+        case SH4_EXCP_DATA_WRITE:
             expname = "data_write";
             break;
-        case 0x060:
+        case SH4_EXCP_DTLB_MISS_WRITE:
             expname = "dtlb_miss_write";
             break;
-        case 0x0c0:
+        case SH4_EXCP_DTLB_VIOLATION_WRITE:
             expname = "dtlb_violation_write";
             break;
-        case 0x120:
+        case SH4_EXCP_FPU:
             expname = "fpu_exception";
             break;
-        case 0x080:
+        case SH4_EXCP_INITIAL_PAGE_WRITE:
             expname = "initial_page_write";
             break;
-        case 0x160:
+        case SH4_EXCP_TRAPA:
             expname = "trapa";
             break;
+        case SH4_EXCP_USER_BREAK:
+            expname = "user_break";
+            break;
         default:
             expname = do_irq ? "interrupt" : "???";
             break;
@@ -161,18 +173,18 @@ void superh_cpu_do_interrupt(CPUState *cs)
     if (do_exp) {
         env->expevt = cs->exception_index;
         switch (cs->exception_index) {
-        case 0x000:
-        case 0x020:
-        case 0x140:
+        case SH4_EXCP_RESET:
+        case SH4_EXCP_MANUAL_RESET:
+        case SH4_EXCP_TLB_MULTIPLE:
             env->sr &= ~(1u << SR_FD);
             env->sr |= 0xf << 4; /* IMASK */
             env->pc = 0xa0000000;
             break;
-        case 0x040:
-        case 0x060:
+        case SH4_EXCP_TLB_MISS:
+        case SH4_EXCP_DTLB_MISS_WRITE:
             env->pc = env->vbr + 0x400;
             break;
-        case 0x160:
+        case SH4_EXCP_TRAPA:
             env->spc += 2; /* special case for TRAPA */
             /* fall through */
         default:
@@ -632,7 +644,7 @@ void cpu_sh4_write_mmaped_utlb_addr(CPUSH4State *s, hwaddr addr,
                     CPUState *cs = env_cpu(s);
 
                     /* Multiple TLB Exception */
-                    cs->exception_index = 0x140;
+                    cs->exception_index = SH4_EXCP_TLB_MULTIPLE;
                     s->tea = addr;
                     break;
                 }
@@ -828,37 +840,27 @@ bool superh_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
     switch (ret) {
     case MMU_ITLB_MISS:
     case MMU_DTLB_MISS_READ:
-        cs->exception_index = 0x040;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_TLB_MISS, retaddr);
     case MMU_DTLB_MULTIPLE:
     case MMU_ITLB_MULTIPLE:
-        cs->exception_index = 0x140;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_TLB_MULTIPLE, retaddr);
     case MMU_ITLB_VIOLATION:
-        cs->exception_index = 0x0a0;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_TLB_VIOLATION, retaddr);
     case MMU_DTLB_MISS_WRITE:
-        cs->exception_index = 0x060;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_DTLB_MISS_WRITE, retaddr);
     case MMU_DTLB_INITIAL_WRITE:
-        cs->exception_index = 0x080;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_INITIAL_PAGE_WRITE, retaddr);
     case MMU_DTLB_VIOLATION_READ:
-        cs->exception_index = 0x0a0;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_TLB_VIOLATION, retaddr);
     case MMU_DTLB_VIOLATION_WRITE:
-        cs->exception_index = 0x0c0;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_DTLB_VIOLATION_WRITE, retaddr);
     case MMU_IADDR_ERROR:
     case MMU_DADDR_ERROR_READ:
-        cs->exception_index = 0x0e0;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_ADDR_ERROR, retaddr);
     case MMU_DADDR_ERROR_WRITE:
-        cs->exception_index = 0x100;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_DATA_WRITE, retaddr);
     default:
         cpu_abort(cs, "Unhandled MMU fault");
     }
-    cpu_loop_exit_restore(cs, retaddr);
 }
 #endif /* !CONFIG_USER_ONLY */
diff --git a/target/sh4/helper.h b/target/sh4/helper.h
index 29011d3dbbb..593b20c0af2 100644
--- a/target/sh4/helper.h
+++ b/target/sh4/helper.h
@@ -1,8 +1,4 @@
 DEF_HELPER_1(ldtlb, void, env)
-DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
-DEF_HELPER_1(raise_slot_illegal_instruction, noreturn, env)
-DEF_HELPER_1(raise_fpu_disable, noreturn, env)
-DEF_HELPER_1(raise_slot_fpu_disable, noreturn, env)
 DEF_HELPER_1(sleep, noreturn, env)
 DEF_HELPER_2(trapa, noreturn, env, i32)
 DEF_HELPER_1(exclusive, noreturn, env)
diff --git a/target/sh4/op_helper.c b/target/sh4/op_helper.c
index 777380f8e40..535bffb08f1 100644
--- a/target/sh4/op_helper.c
+++ b/target/sh4/op_helper.c
@@ -33,15 +33,12 @@ void superh_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
     switch (access_type) {
     case MMU_INST_FETCH:
     case MMU_DATA_LOAD:
-        cs->exception_index = 0x0e0;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_ADDR_ERROR, retaddr);
     case MMU_DATA_STORE:
-        cs->exception_index = 0x100;
-        break;
+        cpu_loop_exit_excp(cs, SH4_EXCP_DATA_WRITE, retaddr);
     default:
         g_assert_not_reached();
     }
-    cpu_loop_exit_restore(cs, retaddr);
 }
 
 #endif
@@ -55,49 +52,19 @@ void helper_ldtlb(CPUSH4State *env)
 #endif
 }
 
-static inline G_NORETURN
-void raise_exception(CPUSH4State *env, int index,
-                     uintptr_t retaddr)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = index;
-    cpu_loop_exit_restore(cs, retaddr);
-}
-
-void helper_raise_illegal_instruction(CPUSH4State *env)
-{
-    raise_exception(env, 0x180, 0);
-}
-
-void helper_raise_slot_illegal_instruction(CPUSH4State *env)
-{
-    raise_exception(env, 0x1a0, 0);
-}
-
-void helper_raise_fpu_disable(CPUSH4State *env)
-{
-    raise_exception(env, 0x800, 0);
-}
-
-void helper_raise_slot_fpu_disable(CPUSH4State *env)
-{
-    raise_exception(env, 0x820, 0);
-}
-
 void helper_sleep(CPUSH4State *env)
 {
     CPUState *cs = env_cpu(env);
 
     cs->halted = 1;
     env->in_sleep = 1;
-    raise_exception(env, EXCP_HLT, 0);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 }
 
 void helper_trapa(CPUSH4State *env, uint32_t tra)
 {
     env->tra = tra << 2;
-    raise_exception(env, 0x160, 0);
+    cpu_loop_exit_excp(env_cpu(env), SH4_EXCP_TRAPA, 0);
 }
 
 void helper_exclusive(CPUSH4State *env)
@@ -255,7 +222,7 @@ static void update_fpscr(CPUSH4State *env, uintptr_t retaddr)
         cause = (env->fpscr & FPSCR_CAUSE_MASK) >> FPSCR_CAUSE_SHIFT;
         enable = (env->fpscr & FPSCR_ENABLE_MASK) >> FPSCR_ENABLE_SHIFT;
         if (cause & enable) {
-            raise_exception(env, 0x120, retaddr);
+            cpu_loop_exit_excp(env_cpu(env), SH4_EXCP_FPU, retaddr);
         }
     }
 }
diff --git a/target/sh4/translate.c b/target/sh4/translate.c
index 5729a757f19..590b62ba3c1 100644
--- a/target/sh4/translate.c
+++ b/target/sh4/translate.c
@@ -1756,10 +1756,13 @@ static void _decode_opc(DisasContext * ctx)
     if (ctx->envflags & TB_FLAG_DELAY_SLOT_MASK) {
  do_illegal_slot:
         gen_save_cpu_state(ctx, true);
-        gen_helper_raise_slot_illegal_instruction(tcg_env);
+        gen_helper_raise_excp(tcg_env,
+                              tcg_constant_i32(
+                                  SH4_EXCP_SLOT_ILLEGAL_INSTRUCTION));
     } else {
         gen_save_cpu_state(ctx, true);
-        gen_helper_raise_illegal_instruction(tcg_env);
+        gen_helper_raise_excp(tcg_env,
+                              tcg_constant_i32(SH4_EXCP_ILLEGAL_INSTRUCTION));
     }
     ctx->base.is_jmp = DISAS_NORETURN;
     return;
@@ -1767,9 +1770,10 @@ static void _decode_opc(DisasContext * ctx)
  do_fpu_disabled:
     gen_save_cpu_state(ctx, true);
     if (ctx->envflags & TB_FLAG_DELAY_SLOT_MASK) {
-        gen_helper_raise_slot_fpu_disable(tcg_env);
+        gen_helper_raise_excp(tcg_env,
+                              tcg_constant_i32(SH4_EXCP_SLOT_FPU_DISABLE));
     } else {
-        gen_helper_raise_fpu_disable(tcg_env);
+        gen_helper_raise_excp(tcg_env, tcg_constant_i32(SH4_EXCP_FPU_DISABLE));
     }
     ctx->base.is_jmp = DISAS_NORETURN;
 }
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 08/24] target/m68k: convert raises to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (6 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 07/24] target/sh4: convert raises to raise_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 09/24] target/or1k: convert exception " Yonggang Luo
                   ` (15 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate through raise_excp. Drop TCG raise_exception and the
one-line raise_exception_ra wrappers. Keep leftover
raise_exception_format2.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/m68k/helper.c    | 12 ++----------
 target/m68k/helper.h    |  1 -
 target/m68k/op_helper.c | 19 -------------------
 target/m68k/translate.c |  2 +-
 4 files changed, 3 insertions(+), 31 deletions(-)

diff --git a/target/m68k/helper.c b/target/m68k/helper.c
index 5f91d206f59..3c62e15735d 100644
--- a/target/m68k/helper.c
+++ b/target/m68k/helper.c
@@ -162,14 +162,6 @@ void HELPER(cf_movec_to)(CPUM68KState *env, uint32_t reg, uint32_t val)
     }
 }
 
-static void raise_exception_ra(CPUM68KState *env, int tt, uintptr_t raddr)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = tt;
-    cpu_loop_exit_restore(cs, raddr);
-}
-
 void HELPER(m68k_movec_to)(CPUM68KState *env, uint32_t reg, uint32_t val)
 {
     switch (reg) {
@@ -291,7 +283,7 @@ void HELPER(m68k_movec_to)(CPUM68KState *env, uint32_t reg, uint32_t val)
     }
 
     /* Invalid control registers will generate an exception. */
-    raise_exception_ra(env, EXCP_ILLEGAL, 0);
+    cpu_loop_exit_excp(env_cpu(env), EXCP_ILLEGAL, 0);
 }
 
 uint32_t HELPER(m68k_movec_from)(CPUM68KState *env, uint32_t reg)
@@ -394,7 +386,7 @@ uint32_t HELPER(m68k_movec_from)(CPUM68KState *env, uint32_t reg)
     }
 
     /* Invalid control registers will generate an exception. */
-    raise_exception_ra(env, EXCP_ILLEGAL, 0);
+    cpu_loop_exit_excp(env_cpu(env), EXCP_ILLEGAL, 0);
 
     return 0;
 }
diff --git a/target/m68k/helper.h b/target/m68k/helper.h
index 0bda8f8152d..a6ca811ebe2 100644
--- a/target/m68k/helper.h
+++ b/target/m68k/helper.h
@@ -111,7 +111,6 @@ DEF_HELPER_3(set_mac_extu, void, env, i32, i32)
 DEF_HELPER_2(flush_flags, void, env, i32)
 DEF_HELPER_2(set_ccr, void, env, i32)
 DEF_HELPER_FLAGS_1(get_ccr, TCG_CALL_NO_WG_SE, i32, env)
-DEF_HELPER_2(raise_exception, noreturn, env, i32)
 
 DEF_HELPER_FLAGS_3(bfffo_reg, TCG_CALL_NO_RWG_SE, i32, i32, i32, i32)
 
diff --git a/target/m68k/op_helper.c b/target/m68k/op_helper.c
index 38f7a689814..5f539f8fd75 100644
--- a/target/m68k/op_helper.c
+++ b/target/m68k/op_helper.c
@@ -539,25 +539,6 @@ bool m68k_cpu_exec_interrupt(CPUState *cs, int interrupt_request)
 
 #endif /* !CONFIG_USER_ONLY */
 
-G_NORETURN static void
-raise_exception_ra(CPUM68KState *env, int tt, uintptr_t raddr)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = tt;
-    cpu_loop_exit_restore(cs, raddr);
-}
-
-G_NORETURN static void raise_exception(CPUM68KState *env, int tt)
-{
-    raise_exception_ra(env, tt, 0);
-}
-
-void HELPER(raise_exception)(CPUM68KState *env, uint32_t tt)
-{
-    raise_exception(env, tt);
-}
-
 G_NORETURN static void
 raise_exception_format2(CPUM68KState *env, int tt, int ilen, uintptr_t raddr)
 {
diff --git a/target/m68k/translate.c b/target/m68k/translate.c
index 138c89d3e53..b5ce0ee6ccd 100644
--- a/target/m68k/translate.c
+++ b/target/m68k/translate.c
@@ -252,7 +252,7 @@ static void gen_jmp(DisasContext *s, TCGv dest)
 
 static void gen_raise_exception(int nr)
 {
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(nr));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(nr));
 }
 
 static void gen_raise_exception_format2(DisasContext *s, int nr,
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 09/24] target/or1k: convert exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (7 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 08/24] target/m68k: " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 10/24] target/microblaze: convert raise_exception " Yonggang Luo
                   ` (14 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate through raise_excp. Drop the TCG exception helper and
exception.c. Keep C raise_exception as a static inline in
exception.h. Exit RANGE overflow through cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/or1k/exception.c        | 31 -------------------------------
 target/or1k/exception.h        |  7 ++++++-
 target/or1k/exception_helper.c | 13 +------------
 target/or1k/helper.h           |  1 -
 target/or1k/meson.build        |  1 -
 target/or1k/translate.c        |  2 +-
 6 files changed, 8 insertions(+), 47 deletions(-)
 delete mode 100644 target/or1k/exception.c

diff --git a/target/or1k/exception.c b/target/or1k/exception.c
deleted file mode 100644
index 0479a069592..00000000000
--- a/target/or1k/exception.c
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * OpenRISC exception.
- *
- * Copyright (c) 2011-2012 Jia Liu <proljc@gmail.com>
- *
- * This library is free software; you can redistribute it and/or
- * modify it under the terms of the GNU Lesser General Public
- * License as published by the Free Software Foundation; either
- * version 2.1 of the License, or (at your option) any later version.
- *
- * This library is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public
- * License along with this library; if not, see <http://www.gnu.org/licenses/>.
- */
-
-#include "qemu/osdep.h"
-#include "accel/tcg/cpu-loop.h"
-#include "cpu.h"
-#include "exception.h"
-
-G_NORETURN void raise_exception(OpenRISCCPU *cpu, uint32_t excp)
-{
-    CPUState *cs = CPU(cpu);
-
-    cs->exception_index = excp;
-    cpu_loop_exit(cs);
-}
diff --git a/target/or1k/exception.h b/target/or1k/exception.h
index f62fc314c1f..a49a6c90f0d 100644
--- a/target/or1k/exception.h
+++ b/target/or1k/exception.h
@@ -21,7 +21,12 @@
 #define TARGET_OPENRISC_EXCEPTION_H
 
 #include "cpu.h"
+#include "accel/tcg/cpu-loop.h"
 
-G_NORETURN void raise_exception(OpenRISCCPU *cpu, uint32_t excp);
+static inline G_NORETURN
+void raise_exception(OpenRISCCPU *cpu, uint32_t excp)
+{
+    cpu_loop_exit_excp(CPU(cpu), excp, 0);
+}
 
 #endif /* TARGET_OPENRISC_EXCEPTION_H */
diff --git a/target/or1k/exception_helper.c b/target/or1k/exception_helper.c
index 3bd82b29719..c9b80093b25 100644
--- a/target/or1k/exception_helper.c
+++ b/target/or1k/exception_helper.c
@@ -21,22 +21,11 @@
 #include "cpu.h"
 #include "accel/tcg/cpu-loop.h"
 #include "exec/helper-proto.h"
-#include "exception.h"
-
-void HELPER(exception)(CPUOpenRISCState *env, uint32_t excp)
-{
-    OpenRISCCPU *cpu = env_archcpu(env);
-
-    raise_exception(cpu, excp);
-}
 
 static G_NORETURN
 void do_range(CPUOpenRISCState *env, uintptr_t pc)
 {
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = EXCP_RANGE;
-    cpu_loop_exit_restore(cs, pc);
+    cpu_loop_exit_excp(env_cpu(env), EXCP_RANGE, pc);
 }
 
 void HELPER(ove_cy)(CPUOpenRISCState *env)
diff --git a/target/or1k/helper.h b/target/or1k/helper.h
index e0a8d402271..d6e6bd4ffbc 100644
--- a/target/or1k/helper.h
+++ b/target/or1k/helper.h
@@ -18,7 +18,6 @@
  */
 
 /* exception */
-DEF_HELPER_FLAGS_2(exception, TCG_CALL_NO_WG, void, env, i32)
 DEF_HELPER_FLAGS_1(ove_cy, TCG_CALL_NO_WG, void, env)
 DEF_HELPER_FLAGS_1(ove_ov, TCG_CALL_NO_WG, void, env)
 DEF_HELPER_FLAGS_1(ove_cyov, TCG_CALL_NO_WG, void, env)
diff --git a/target/or1k/meson.build b/target/or1k/meson.build
index 7cea45287a2..dba5044b655 100644
--- a/target/or1k/meson.build
+++ b/target/or1k/meson.build
@@ -5,7 +5,6 @@ or1k_ss.add(gen)
 or1k_ss.add(files(
   'cpu.c',
   'disas.c',
-  'exception.c',
   'exception_helper.c',
   'fpu_helper.c',
   'interrupt_helper.c',
diff --git a/target/or1k/translate.c b/target/or1k/translate.c
index e00ef45b9b7..243a8eede23 100644
--- a/target/or1k/translate.c
+++ b/target/or1k/translate.c
@@ -140,7 +140,7 @@ void openrisc_translate_init(void)
 
 static void gen_exception(DisasContext *dc, unsigned int excp)
 {
-    gen_helper_exception(tcg_env, tcg_constant_i32(excp));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
 }
 
 static void gen_illegal_exception(DisasContext *dc)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 10/24] target/microblaze: convert raise_exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (8 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 09/24] target/or1k: convert exception " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 11/24] target/sparc: " Yonggang Luo
                   ` (13 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate through raise_excp after syncing PC. Drop TCG
raise_exception. Exit HW_EXCP and MMU through cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/microblaze/helper.c    |  3 +--
 target/microblaze/helper.h    |  2 --
 target/microblaze/op_helper.c | 22 ++++------------------
 target/microblaze/translate.c |  2 +-
 4 files changed, 6 insertions(+), 23 deletions(-)

diff --git a/target/microblaze/helper.c b/target/microblaze/helper.c
index 05a90f5ecb2..d092e916db4 100644
--- a/target/microblaze/helper.c
+++ b/target/microblaze/helper.c
@@ -146,8 +146,7 @@ bool mb_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
     }
 
     /* TLB miss.  */
-    cs->exception_index = EXCP_MMU;
-    cpu_loop_exit_restore(cs, retaddr);
+    cpu_loop_exit_excp(cs, EXCP_MMU, retaddr);
 }
 
 void mb_cpu_do_interrupt(CPUState *cs)
diff --git a/target/microblaze/helper.h b/target/microblaze/helper.h
index 1429c1727ef..ad9c22ed5b7 100644
--- a/target/microblaze/helper.h
+++ b/target/microblaze/helper.h
@@ -1,5 +1,3 @@
-DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, i32)
-
 DEF_HELPER_FLAGS_3(divs, TCG_CALL_NO_WG, i32, env, i32, i32)
 DEF_HELPER_FLAGS_3(divu, TCG_CALL_NO_WG, i32, env, i32, i32)
 
diff --git a/target/microblaze/op_helper.c b/target/microblaze/op_helper.c
index 3da0c68da39..f3dc42d5bdd 100644
--- a/target/microblaze/op_helper.c
+++ b/target/microblaze/op_helper.c
@@ -62,25 +62,14 @@ uint32_t helper_get(uint32_t id, uint32_t ctrl)
     return 0xdead0000 | id;
 }
 
-void helper_raise_exception(CPUMBState *env, uint32_t index)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = index;
-    cpu_loop_exit(cs);
-}
-
 /* Raises ESR_EC_DIVZERO if exceptions are enabled.  */
 static void raise_divzero(CPUMBState *env, uint32_t esr, uintptr_t unwind_pc)
 {
     env->msr |= MSR_DZ;
 
     if ((env->msr & MSR_EE) && env_archcpu(env)->cfg.div_zero_exception) {
-        CPUState *cs = env_cpu(env);
-
         env->esr = esr;
-        cs->exception_index = EXCP_HW_EXCP;
-        cpu_loop_exit_restore(cs, unwind_pc);
+        cpu_loop_exit_excp(env_cpu(env), EXCP_HW_EXCP, unwind_pc);
     }
 }
 
@@ -123,8 +112,7 @@ static void raise_fpu_exception(CPUMBState *env, uintptr_t ra)
     CPUState *cs = env_cpu(env);
 
     env->esr = ESR_EC_FPU;
-    cs->exception_index = EXCP_HW_EXCP;
-    cpu_loop_exit_restore(cs, ra);
+    cpu_loop_exit_excp(cs, EXCP_HW_EXCP, ra);
 }
 
 static void update_fpu_flags(CPUMBState *env, int flags, uintptr_t ra)
@@ -390,8 +378,7 @@ void helper_stackprot(CPUMBState *env, uint32_t addr)
 
         env->ear = addr;
         env->esr = ESR_EC_STACKPROT;
-        cs->exception_index = EXCP_HW_EXCP;
-        cpu_loop_exit_restore(cs, GETPC());
+        cpu_loop_exit_excp(cs, EXCP_HW_EXCP, GETPC());
     }
 }
 
@@ -444,8 +431,7 @@ static void mb_transaction_failed_internal(CPUState *cs, hwaddr physaddr,
     if (take) {
         env->esr = esr;
         env->ear = addr;
-        cs->exception_index = EXCP_HW_EXCP;
-        cpu_loop_exit_restore(cs, retaddr);
+        cpu_loop_exit_excp(cs, EXCP_HW_EXCP, retaddr);
     }
 }
 
diff --git a/target/microblaze/translate.c b/target/microblaze/translate.c
index 8b219afb5dd..9424208a04b 100644
--- a/target/microblaze/translate.c
+++ b/target/microblaze/translate.c
@@ -100,7 +100,7 @@ static void t_sync_flags(DisasContext *dc)
 
 static void gen_raise_exception(DisasContext *dc, uint32_t index)
 {
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(index));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(index));
     dc->base.is_jmp = DISAS_NORETURN;
 }
 
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 11/24] target/sparc: convert raise_exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (9 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 10/24] target/microblaze: convert raise_exception " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 12/24] target/loongarch: " Yonggang Luo
                   ` (12 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate through raise_excp after save_state. Drop TCG
raise_exception. Keep C cpu_raise_exception_ra. Exit DEBUG and HLT
through cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/sparc/helper.c    | 21 +++------------------
 target/sparc/helper.h    |  2 --
 target/sparc/translate.c |  6 +++---
 3 files changed, 6 insertions(+), 23 deletions(-)

diff --git a/target/sparc/helper.c b/target/sparc/helper.c
index 8de261b0e30..411a8dfe359 100644
--- a/target/sparc/helper.c
+++ b/target/sparc/helper.c
@@ -27,26 +27,12 @@
 
 void cpu_raise_exception_ra(CPUSPARCState *env, int tt, uintptr_t ra)
 {
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = tt;
-    cpu_loop_exit_restore(cs, ra);
-}
-
-void helper_raise_exception(CPUSPARCState *env, int tt)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = tt;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(env_cpu(env), tt, ra);
 }
 
 void helper_debug(CPUSPARCState *env)
 {
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = EXCP_DEBUG;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(env_cpu(env), EXCP_DEBUG, 0);
 }
 
 #ifdef TARGET_SPARC64
@@ -208,10 +194,9 @@ void helper_power_down(CPUSPARCState *env)
     CPUState *cs = env_cpu(env);
 
     cs->halted = 1;
-    cs->exception_index = EXCP_HLT;
     env->pc = env->npc;
     env->npc = env->pc + 4;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 }
 
 target_ulong helper_rdasr17(CPUSPARCState *env)
diff --git a/target/sparc/helper.h b/target/sparc/helper.h
index 3a7f7dc1296..9fc38f5706a 100644
--- a/target/sparc/helper.h
+++ b/target/sparc/helper.h
@@ -53,8 +53,6 @@ DEF_HELPER_FLAGS_3(fcmpq, TCG_CALL_NO_WG, i32, env, i128, i128)
 DEF_HELPER_FLAGS_3(fcmpeq, TCG_CALL_NO_WG, i32, env, i128, i128)
 DEF_HELPER_FLAGS_3(flcmps, TCG_CALL_NO_RWG_SE, i32, env, f32, f32)
 DEF_HELPER_FLAGS_3(flcmpd, TCG_CALL_NO_RWG_SE, i32, env, f64, f64)
-DEF_HELPER_2(raise_exception, noreturn, env, int)
-
 DEF_HELPER_FLAGS_3(faddd, TCG_CALL_NO_WG, f64, env, f64, f64)
 DEF_HELPER_FLAGS_3(fsubd, TCG_CALL_NO_WG, f64, env, f64, f64)
 DEF_HELPER_FLAGS_3(fmuld, TCG_CALL_NO_WG, f64, env, f64, f64)
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
index 3156be6a94c..6dae5da7157 100644
--- a/target/sparc/translate.c
+++ b/target/sparc/translate.c
@@ -1048,7 +1048,7 @@ static void gen_exception(DisasContext *dc, int which)
 {
     finishing_insn(dc);
     save_state(dc);
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(which));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(which));
     dc->base.is_jmp = DISAS_NORETURN;
 }
 
@@ -2811,7 +2811,7 @@ static bool do_tcc(DisasContext *dc, int cond, int cc,
     /* Trap always.  */
     if (cond == 8) {
         save_state(dc);
-        gen_helper_raise_exception(tcg_env, trap);
+        gen_helper_raise_excp(tcg_env, trap);
         dc->base.is_jmp = DISAS_NORETURN;
         return true;
     }
@@ -5833,7 +5833,7 @@ static void sparc_tr_tb_stop(DisasContextBase *dcbase, CPUState *cs)
         if (e->npc % 4 == 0) {
             tcg_gen_movi_tl(cpu_npc, e->npc);
         }
-        gen_helper_raise_exception(tcg_env, e->excp);
+        gen_helper_raise_excp(tcg_env, e->excp);
 
         e_next = e->next;
         g_free(e);
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 12/24] target/loongarch: convert raise_exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (10 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 11/24] target/sparc: " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 13/24] target/hexagon: convert raise_exception to hexagon_raise_exception Yonggang Luo
                   ` (11 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Translate through raise_excp_restore after storing PC. Drop TCG
raise_exception. Keep C do_raise_exception and use
cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/loongarch/tcg/helper.h    | 2 --
 target/loongarch/tcg/op_helper.c | 6 ------
 target/loongarch/tcg/tcg_cpu.c   | 4 +---
 target/loongarch/tcg/translate.c | 2 +-
 4 files changed, 2 insertions(+), 12 deletions(-)

diff --git a/target/loongarch/tcg/helper.h b/target/loongarch/tcg/helper.h
index e76c73c7755..e3a7bc9e9da 100644
--- a/target/loongarch/tcg/helper.h
+++ b/target/loongarch/tcg/helper.h
@@ -3,8 +3,6 @@
  * Copyright (c) 2021 Loongson Technology Corporation Limited
  */
 
-DEF_HELPER_2(raise_exception, noreturn, env, i32)
-
 DEF_HELPER_FLAGS_3(asrtle_d, TCG_CALL_NO_WG, void, env, tl, tl)
 DEF_HELPER_FLAGS_3(asrtgt_d, TCG_CALL_NO_WG, void, env, tl, tl)
 
diff --git a/target/loongarch/tcg/op_helper.c b/target/loongarch/tcg/op_helper.c
index f98fe4d4a16..109417b7503 100644
--- a/target/loongarch/tcg/op_helper.c
+++ b/target/loongarch/tcg/op_helper.c
@@ -16,12 +16,6 @@
 #include <zlib.h> /* for crc32 */
 #include "cpu-csr.h"
 
-/* Exceptions helpers */
-void helper_raise_exception(CPULoongArchState *env, uint32_t exception)
-{
-    do_raise_exception(env, exception, GETPC());
-}
-
 /* loongarch assert op */
 void helper_asrtle_d(CPULoongArchState *env, target_ulong rj, target_ulong rk)
 {
diff --git a/target/loongarch/tcg/tcg_cpu.c b/target/loongarch/tcg/tcg_cpu.c
index 4b1d44a1644..56ef0d912cc 100644
--- a/target/loongarch/tcg/tcg_cpu.c
+++ b/target/loongarch/tcg/tcg_cpu.c
@@ -69,9 +69,7 @@ void G_NORETURN do_raise_exception(CPULoongArchState *env,
                   __func__,
                   exception,
                   loongarch_exception_name(exception));
-    cs->exception_index = exception;
-
-    cpu_loop_exit_restore(cs, pc);
+    cpu_loop_exit_excp(cs, exception, pc);
 }
 
 #ifndef CONFIG_USER_ONLY
diff --git a/target/loongarch/tcg/translate.c b/target/loongarch/tcg/translate.c
index 124dce62695..b7e8ce8a653 100644
--- a/target/loongarch/tcg/translate.c
+++ b/target/loongarch/tcg/translate.c
@@ -95,7 +95,7 @@ static void gen_nanbox_s(TCGv_i64 out, TCGv_i64 in)
 void generate_exception(DisasContext *ctx, int excp)
 {
     tcg_gen_movi_tl(cpu_pc, ctx->base.pc_next);
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(excp));
+    gen_helper_raise_excp_restore(tcg_env, tcg_constant_i32(excp));
     ctx->base.is_jmp = DISAS_NORETURN;
 }
 
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 13/24] target/hexagon: convert raise_exception to hexagon_raise_exception
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (11 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 12/24] target/loongarch: " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 14/24] target/hppa: convert excp to raise_excp Yonggang Luo
                   ` (10 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Fold C do_raise_exception into hexagon_raise_exception_err with
vaddr pc and a retaddr parameter, and exit via cpu_loop_exit_excp.
Prefix leftover TCG raise_exception to hexagon_raise_exception so
translate keeps the CPU_LOG_INT log and ASSERT_DIRECT_TO_GUEST_UNSET.

Reviewed-by: Brian Cain <brian.cain@oss.qualcomm.com>
Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/hexagon/cpu.c       | 13 +++++++------
 target/hexagon/cpu.h       |  2 +-
 target/hexagon/helper.h    |  3 ++-
 target/hexagon/internal.h  |  5 -----
 target/hexagon/macros.h    |  2 +-
 target/hexagon/op_helper.c | 29 +++++++++++------------------
 target/hexagon/translate.c | 11 ++++++-----
 7 files changed, 28 insertions(+), 37 deletions(-)

diff --git a/target/hexagon/cpu.c b/target/hexagon/cpu.c
index 1f7d8a8df70..3739f3f4561 100644
--- a/target/hexagon/cpu.c
+++ b/target/hexagon/cpu.c
@@ -342,7 +342,7 @@ static TCGTBCPUState hexagon_get_tb_cpu_state(CPUState *cs)
     }
     if (pc & PCALIGN_MASK) {
         env->cause_code = HEX_CAUSE_PC_NOT_ALIGNED;
-        hexagon_raise_exception_err(env, HEX_EVENT_PRECISE, pc);
+        hexagon_raise_exception_err(env, HEX_EVENT_PRECISE, pc, 0);
     }
 
 #ifndef CONFIG_USER_ONLY
@@ -734,14 +734,15 @@ static bool hexagon_tlb_fill(CPUState *cs, vaddr address, int size,
             return false;
         }
         raise_perm_exception(cs, address, slot, access_type, excp);
-        do_raise_exception(env, cs->exception_index, env->gpr[HEX_REG_PC],
-                           retaddr);
+        hexagon_raise_exception_err(env, cs->exception_index,
+                                    env->gpr[HEX_REG_PC], retaddr);
     }
     if (probe) {
         return false;
     }
     raise_tlbmiss_exception(cs, address, slot, access_type);
-    do_raise_exception(env, cs->exception_index, env->gpr[HEX_REG_PC], retaddr);
+    hexagon_raise_exception_err(env, cs->exception_index,
+                                env->gpr[HEX_REG_PC], retaddr);
 }
 
 #include "hw/core/sysemu-cpu-ops.h"
@@ -784,8 +785,8 @@ void hexagon_cpu_do_unaligned_access(CPUState *cs, vaddr addr,
     CPUHexagonState *env = cpu_env(cs);
 
     raise_misaligned_exception(cs, addr, 0, access_type);
-    do_raise_exception(env, cs->exception_index, env->gpr[HEX_REG_PC],
-                       retaddr);
+    hexagon_raise_exception_err(env, cs->exception_index,
+                                env->gpr[HEX_REG_PC], retaddr);
 }
 
 #endif
diff --git a/target/hexagon/cpu.h b/target/hexagon/cpu.h
index df4c0182247..1edcc3ef6c3 100644
--- a/target/hexagon/cpu.h
+++ b/target/hexagon/cpu.h
@@ -232,7 +232,7 @@ FIELD(TB_FLAGS, HVX_COPROC_ENABLED, 5, 1)
 
 G_NORETURN void hexagon_raise_exception_err(CPUHexagonState *env,
                                             uint32_t exception,
-                                            uintptr_t pc);
+                                            vaddr pc, uintptr_t retaddr);
 
 #ifndef CONFIG_USER_ONLY
 /*
diff --git a/target/hexagon/helper.h b/target/hexagon/helper.h
index 71c8da4c46d..6cd63f631b7 100644
--- a/target/hexagon/helper.h
+++ b/target/hexagon/helper.h
@@ -18,7 +18,8 @@
 #include "internal.h"
 #include "helper_protos_generated.h.inc"
 
-DEF_HELPER_FLAGS_3(raise_exception, TCG_CALL_NO_RETURN, noreturn, env, i32, i32)
+DEF_HELPER_FLAGS_3(hexagon_raise_exception, TCG_CALL_NO_RETURN, noreturn,
+                   env, i32, vaddr)
 DEF_HELPER_2(commit_store, void, env, int)
 DEF_HELPER_3(gather_store, void, env, i32, int)
 DEF_HELPER_1(commit_hvx_stores, void, env)
diff --git a/target/hexagon/internal.h b/target/hexagon/internal.h
index 05d1129916e..4b7a784fbc7 100644
--- a/target/hexagon/internal.h
+++ b/target/hexagon/internal.h
@@ -36,11 +36,6 @@ extern const char * const hexagon_sregnames[];
 extern const char * const hexagon_gregnames[];
 #endif
 
-void G_NORETURN do_raise_exception(CPUHexagonState *env,
-        uint32_t exception,
-        uint32_t PC,
-        uintptr_t retaddr);
-
 #define hexagon_cpu_mmu_enabled(env) ({ \
     HexagonCPU *cpu = env_archcpu(env); \
     cpu->globalregs ? \
diff --git a/target/hexagon/macros.h b/target/hexagon/macros.h
index a5b9c24c6bb..4a87f6d72f1 100644
--- a/target/hexagon/macros.h
+++ b/target/hexagon/macros.h
@@ -637,7 +637,7 @@ static inline TCGv gen_read_ireg(TCGv result, TCGv val, int shift)
 #ifdef CONFIG_USER_ONLY
 #define fTRAP(TRAPTYPE, IMM) \
     do { \
-        hexagon_raise_exception_err(env, HEX_EVENT_TRAP0, PC); \
+        hexagon_raise_exception_err(env, HEX_EVENT_TRAP0, PC, 0); \
     } while (0)
 #endif
 
diff --git a/target/hexagon/op_helper.c b/target/hexagon/op_helper.c
index 4f00ca773f3..dfdb597f3fc 100644
--- a/target/hexagon/op_helper.c
+++ b/target/hexagon/op_helper.c
@@ -72,31 +72,24 @@ uint64_t HELPER(utimer)(void)
 #define SF_MANTBITS    23
 
 /* Exceptions processing helpers */
-G_NORETURN
-void do_raise_exception(CPUHexagonState *env, uint32_t exception,
-                        uint32_t PC, uintptr_t retaddr)
+G_NORETURN void hexagon_raise_exception_err(CPUHexagonState *env,
+                                            uint32_t exception,
+                                            vaddr pc, uintptr_t retaddr)
 {
     CPUState *cs = env_cpu(env);
-    qemu_log_mask(CPU_LOG_INT, "%s: 0x%08" PRIx32 ", @ %08" PRIx32 "\n",
-                  __func__, exception, PC);
+    qemu_log_mask(CPU_LOG_INT, "%s: 0x%08" PRIx32 ", @ %08" VADDR_PRIx "\n",
+                  __func__, exception, pc);
     ASSERT_DIRECT_TO_GUEST_UNSET(env, exception);
 
-    env->gpr[HEX_REG_PC] = PC;
-    cs->exception_index = exception;
-    cpu_loop_exit_restore(cs, retaddr);
-}
-
-G_NORETURN void hexagon_raise_exception_err(CPUHexagonState *env,
-                                            uint32_t exception,
-                                            uintptr_t pc)
-{
-    do_raise_exception(env, exception, pc, 0);
+    env->gpr[HEX_REG_PC] = pc;
+    cpu_loop_exit_excp(cs, exception, retaddr);
 }
 
-G_NORETURN void HELPER(raise_exception)(CPUHexagonState *env, uint32_t excp,
-                                        uint32_t PC)
+G_NORETURN void HELPER(hexagon_raise_exception)(CPUHexagonState *env,
+                                                uint32_t exception,
+                                                vaddr pc)
 {
-    hexagon_raise_exception_err(env, excp, PC);
+    hexagon_raise_exception_err(env, exception, pc, 0);
 }
 
 void log_store32(CPUHexagonState *env, target_ulong addr,
diff --git a/target/hexagon/translate.c b/target/hexagon/translate.c
index 827859e052c..3bef721d7d8 100644
--- a/target/hexagon/translate.c
+++ b/target/hexagon/translate.c
@@ -138,11 +138,12 @@ intptr_t ctx_tmp_vreg_off(DisasContext *ctx, int regnum,
     return offset;
 }
 
-static void gen_precise_exception(int cause, uint32_t PC)
+static void gen_precise_exception(int cause, vaddr pc)
 {
     tcg_gen_movi_i32(hex_cause_code, cause);
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(HEX_EVENT_PRECISE),
-                               tcg_constant_i32(PC));
+    gen_helper_hexagon_raise_exception(tcg_env,
+                                       tcg_constant_i32(HEX_EVENT_PRECISE),
+                                       tcg_constant_vaddr(pc));
 }
 
 #ifndef CONFIG_USER_ONLY
@@ -1139,11 +1140,11 @@ static void update_exec_counters(DisasContext *ctx)
  */
 static void check_imprecise_exception(DisasContext *ctx)
 {
-    TCGv PC = tcg_constant_tl(ctx->pkt.pc);
     TCGLabel *label = gen_new_label();
 
     tcg_gen_brcondi_tl(TCG_COND_EQ, hex_imprecise_exception, 0, label);
-    gen_helper_raise_exception(tcg_env, hex_imprecise_exception, PC);
+    gen_helper_hexagon_raise_exception(tcg_env, hex_imprecise_exception,
+                                       tcg_constant_vaddr(ctx->pkt.pc));
     gen_set_label(label);
 }
 #endif
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 14/24] target/hppa: convert excp to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (12 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 13/24] target/hexagon: convert raise_exception to hexagon_raise_exception Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-29  5:21   ` Philippe Mathieu-Daudé
  2026-09-28  5:20 ` [PATCH v2 15/24] target/alpha: " Yonggang Luo
                   ` (9 subsequent siblings)
  23 siblings, 1 reply; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Drop TCG excp and call raise_excp. Keep C hppa_dynamic_excp and use
cpu_loop_exit_excp. Route leftover C callers through
hppa_dynamic_excp instead of helper_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/hppa/helper.h     |  2 --
 target/hppa/op_helper.c  | 15 ++-------------
 target/hppa/sys_helper.c |  4 ++--
 target/hppa/translate.c  |  2 +-
 4 files changed, 5 insertions(+), 18 deletions(-)

diff --git a/target/hppa/helper.h b/target/hppa/helper.h
index 8369855d78e..5ed39e01e31 100644
--- a/target/hppa/helper.h
+++ b/target/hppa/helper.h
@@ -1,5 +1,3 @@
-DEF_HELPER_2(excp, noreturn, env, int)
-
 DEF_HELPER_FLAGS_3(stby_b, TCG_CALL_NO_WG, void, env, tl, tl)
 DEF_HELPER_FLAGS_3(stby_b_parallel, TCG_CALL_NO_WG, void, env, tl, tl)
 DEF_HELPER_FLAGS_3(stby_e, TCG_CALL_NO_WG, void, env, tl, tl)
diff --git a/target/hppa/op_helper.c b/target/hppa/op_helper.c
index 76a8d8a0d34..c4651f0d85a 100644
--- a/target/hppa/op_helper.c
+++ b/target/hppa/op_helper.c
@@ -30,20 +30,9 @@
 #include "user/page-protection.h"
 #endif
 
-G_NORETURN void HELPER(excp)(CPUHPPAState *env, int excp)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = excp;
-    cpu_loop_exit(cs);
-}
-
 G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra)
 {
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = excp;
-    cpu_loop_exit_restore(cs, ra);
+    cpu_loop_exit_excp(env_cpu(env), excp, ra);
 }
 
 static void atomic_store_mask32(CPUHPPAState *env, target_ulong addr,
@@ -341,7 +330,7 @@ target_ulong HELPER(probe)(CPUHPPAState *env, target_ulong addr,
         if (excp == EXCP_DTLB_MISS) {
             excp = EXCP_NA_DTLB_MISS;
         }
-        helper_excp(env, excp);
+        hppa_dynamic_excp(env, excp, 0);
     }
     return (want & prot) != 0;
 #endif
diff --git a/target/hppa/sys_helper.c b/target/hppa/sys_helper.c
index 88109f0181a..dd3be1bfc90 100644
--- a/target/hppa/sys_helper.c
+++ b/target/hppa/sys_helper.c
@@ -51,13 +51,13 @@ void HELPER(write_interval_timer)(CPUHPPAState *env, target_ulong val)
 void HELPER(halt)(CPUHPPAState *env)
 {
     qemu_system_shutdown_request(SHUTDOWN_CAUSE_GUEST_SHUTDOWN);
-    helper_excp(env, EXCP_HLT);
+    hppa_dynamic_excp(env, EXCP_HLT, 0);
 }
 
 void HELPER(reset)(CPUHPPAState *env)
 {
     qemu_system_reset_request(SHUTDOWN_CAUSE_GUEST_RESET);
-    helper_excp(env, EXCP_HLT);
+    hppa_dynamic_excp(env, EXCP_HLT, 0);
 }
 
 target_ulong HELPER(swap_system_mask)(CPUHPPAState *env, target_ulong nsm)
diff --git a/target/hppa/translate.c b/target/hppa/translate.c
index 41300c0dd73..35766e6ee06 100644
--- a/target/hppa/translate.c
+++ b/target/hppa/translate.c
@@ -726,7 +726,7 @@ static void install_link(DisasContext *ctx, unsigned link, bool with_sr0)
 
 static void gen_excp_1(int exception)
 {
-    gen_helper_excp(tcg_env, tcg_constant_i32(exception));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(exception));
 }
 
 static void gen_excp(DisasContext *ctx, int exception)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 15/24] target/alpha: convert excp to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (13 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 14/24] target/hppa: convert excp to raise_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 16/24] target/s390x: convert exception " Yonggang Luo
                   ` (8 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Store error_code in translate, then call raise_excp. Drop TCG excp.
Keep C dynamic_excp and arith_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/alpha/helper.c    | 11 -----------
 target/alpha/helper.h    |  1 -
 target/alpha/translate.c |  8 +++-----
 3 files changed, 3 insertions(+), 17 deletions(-)

diff --git a/target/alpha/helper.c b/target/alpha/helper.c
index c3614ecafda..d1497547181 100644
--- a/target/alpha/helper.c
+++ b/target/alpha/helper.c
@@ -533,17 +533,6 @@ void alpha_cpu_dump_state(CPUState *cs, FILE *f, int flags)
     qemu_fprintf(f, "\n");
 }
 
-/* This should only be called from translate, via gen_excp.
-   We expect that ENV->PC has already been updated.  */
-G_NORETURN void helper_excp(CPUAlphaState *env, int excp, int error)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = excp;
-    env->error_code = error;
-    cpu_loop_exit(cs);
-}
-
 /* This may be called from any of the helpers to set up EXCEPTION_INDEX.  */
 G_NORETURN void dynamic_excp(CPUAlphaState *env, uintptr_t retaddr,
                              int excp, int error)
diff --git a/target/alpha/helper.h b/target/alpha/helper.h
index 954a5c8294c..cdb36384a7b 100644
--- a/target/alpha/helper.h
+++ b/target/alpha/helper.h
@@ -1,4 +1,3 @@
-DEF_HELPER_3(excp, noreturn, env, int, int)
 DEF_HELPER_FLAGS_1(load_pcc, TCG_CALL_NO_RWG_SE, i64, env)
 
 DEF_HELPER_FLAGS_3(check_overflow, TCG_CALL_NO_WG, void, env, i64, i64)
diff --git a/target/alpha/translate.c b/target/alpha/translate.c
index c66e3f9c146..91941e5be8f 100644
--- a/target/alpha/translate.c
+++ b/target/alpha/translate.c
@@ -264,11 +264,9 @@ static void gen_pc_disp(DisasContext *ctx, TCGv_i64 dest, int32_t disp)
 
 static void gen_excp_1(int exception, int error_code)
 {
-    TCGv_i32 tmp1, tmp2;
-
-    tmp1 = tcg_constant_i32(exception);
-    tmp2 = tcg_constant_i32(error_code);
-    gen_helper_excp(tcg_env, tmp1, tmp2);
+    tcg_gen_st_i32(tcg_constant_i32(error_code), tcg_env,
+                   offsetof(CPUAlphaState, error_code));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(exception));
 }
 
 static DisasJumpType gen_excp(DisasContext *ctx, int exception, int error_code)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 16/24] target/s390x: convert exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (14 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 15/24] target/alpha: " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28 17:42   ` Ilya Leoshkevich
  2026-09-28  5:20 ` [PATCH v2 17/24] target/xtensa: add gen_yield for EXCP_YIELD Yonggang Luo
                   ` (7 subsequent siblings)
  23 siblings, 1 reply; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Drop TCG exception and call raise_excp. Keep data_exception. Route
leftover C SVC execute through cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/s390x/helper.h          |  1 -
 target/s390x/tcg/mem_helper.c  |  2 +-
 target/s390x/tcg/misc_helper.c | 10 ----------
 target/s390x/tcg/translate.c   |  2 +-
 4 files changed, 2 insertions(+), 13 deletions(-)

diff --git a/target/s390x/helper.h b/target/s390x/helper.h
index 6a7426fdac7..ec27ef104f2 100644
--- a/target/s390x/helper.h
+++ b/target/s390x/helper.h
@@ -1,4 +1,3 @@
-DEF_HELPER_2(exception, noreturn, env, i32)
 DEF_HELPER_2(data_exception, noreturn, env, i32)
 DEF_HELPER_FLAGS_4(nc, TCG_CALL_NO_WG, i32, env, i32, i64, i64)
 DEF_HELPER_FLAGS_4(oc, TCG_CALL_NO_WG, i32, env, i32, i64, i64)
diff --git a/target/s390x/tcg/mem_helper.c b/target/s390x/tcg/mem_helper.c
index 414e6838c87..3f754dac00f 100644
--- a/target/s390x/tcg/mem_helper.c
+++ b/target/s390x/tcg/mem_helper.c
@@ -2488,7 +2488,7 @@ void HELPER(ex)(CPUS390XState *env, uint32_t ilen, uint64_t r1, uint64_t addr)
     } else if (opc == 0x0a) {
         env->int_svc_code = extract64(insn, 48, 8);
         env->int_svc_ilen = ilen;
-        helper_exception(env, EXCP_SVC);
+        cpu_loop_exit_excp(env_cpu(env), EXCP_SVC, 0);
         g_assert_not_reached();
     }
 
diff --git a/target/s390x/tcg/misc_helper.c b/target/s390x/tcg/misc_helper.c
index f1c8563af00..f5e31419268 100644
--- a/target/s390x/tcg/misc_helper.c
+++ b/target/s390x/tcg/misc_helper.c
@@ -56,16 +56,6 @@
 #define HELPER_LOG(x...)
 #endif
 
-/* Raise an exception statically from a TB.  */
-void HELPER(exception)(CPUS390XState *env, uint32_t excp)
-{
-    CPUState *cs = env_cpu(env);
-
-    HELPER_LOG("%s: exception %d\n", __func__, excp);
-    cs->exception_index = excp;
-    cpu_loop_exit(cs);
-}
-
 /* Store CPU Timer (also used for EXTRACT CPU TIME) */
 uint64_t HELPER(stpt)(CPUS390XState *env)
 {
diff --git a/target/s390x/tcg/translate.c b/target/s390x/tcg/translate.c
index 474d604ed17..d2bf1422b1f 100644
--- a/target/s390x/tcg/translate.c
+++ b/target/s390x/tcg/translate.c
@@ -400,7 +400,7 @@ static int get_mem_index(DisasContext *s)
 
 static void gen_exception(int excp)
 {
-    gen_helper_exception(tcg_env, tcg_constant_i32(excp));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
 }
 
 static void gen_program_exception(DisasContext *s, int code)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 17/24] target/xtensa: add gen_yield for EXCP_YIELD
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (15 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 16/24] target/s390x: convert exception " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 18/24] target/xtensa: convert exception to raise_excp Yonggang Luo
                   ` (6 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

gen_exception has one caller, and that caller always passes
EXCP_YIELD. Rename the path to gen_yield and clear yield_needed
there.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/xtensa/translate.c | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
index 175fd4b5cfc..db48f0c562a 100644
--- a/target/xtensa/translate.c
+++ b/target/xtensa/translate.c
@@ -303,9 +303,11 @@ static void gen_left_shift_sar(DisasContext *dc, TCGv_i32 sa)
     dc->sar_m32_5bit = true;
 }
 
-static void gen_exception(DisasContext *dc, int excp)
+static void gen_yield(DisasContext *dc)
 {
-    gen_helper_exception(tcg_env, tcg_constant_i32(excp));
+    tcg_gen_st_i32(tcg_constant_i32(0), tcg_env,
+                   offsetof(CPUXtensaState, yield_needed));
+    gen_helper_exception(tcg_env, tcg_constant_i32(EXCP_YIELD));
 }
 
 static void gen_exception_cause(DisasContext *dc, uint32_t cause)
@@ -1167,7 +1169,7 @@ static void xtensa_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
        but this is the first TranslateOps hook that allows exiting.  */
     if ((tb_cflags(dc->base.tb) & CF_USE_ICOUNT)
         && (dc->base.tb->flags & XTENSA_TBFLAG_YIELD)) {
-        gen_exception(dc, EXCP_YIELD);
+        gen_yield(dc);
         dc->base.pc_next = dc->pc + 1;
         dc->base.is_jmp = DISAS_NORETURN;
         return;
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 18/24] target/xtensa: convert exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (16 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 17/24] target/xtensa: add gen_yield for EXCP_YIELD Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 19/24] target/avr: convert debug/break/sleep " Yonggang Luo
                   ` (5 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Call raise_excp from gen_yield. Drop TCG exception. Keep
exception_cause helpers. C callers use xtensa_exception for the old
helper_exception body.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/xtensa/cpu.h        |  1 +
 target/xtensa/exc_helper.c | 13 +++++--------
 target/xtensa/helper.h     |  1 -
 target/xtensa/translate.c  |  2 +-
 target/xtensa/win_helper.c | 12 ++++++------
 5 files changed, 13 insertions(+), 16 deletions(-)

diff --git a/target/xtensa/cpu.h b/target/xtensa/cpu.h
index 49d6ad9083d..0b2cb5a250d 100644
--- a/target/xtensa/cpu.h
+++ b/target/xtensa/cpu.h
@@ -601,6 +601,7 @@ int xtensa_cpu_gdb_write_register(CPUState *cpu, uint8_t *buf, int reg);
 G_NORETURN void xtensa_cpu_do_unaligned_access(CPUState *cpu, vaddr addr,
                                                MMUAccessType access_type, int mmu_idx,
                                                uintptr_t retaddr);
+G_NORETURN void xtensa_exception(CPUXtensaState *env, uint32_t excp);
 
 #define CPU_RESOLVING_TYPE TYPE_XTENSA_CPU
 
diff --git a/target/xtensa/exc_helper.c b/target/xtensa/exc_helper.c
index 7cb67d179a8..3049432f4c4 100644
--- a/target/xtensa/exc_helper.c
+++ b/target/xtensa/exc_helper.c
@@ -35,15 +35,12 @@
 #include "qemu/atomic.h"
 #include "qemu/plugin.h"
 
-void HELPER(exception)(CPUXtensaState *env, uint32_t excp)
+void xtensa_exception(CPUXtensaState *env, uint32_t excp)
 {
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = excp;
     if (excp == EXCP_YIELD) {
         env->yield_needed = 0;
     }
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(env_cpu(env), excp, 0);
 }
 
 void HELPER(exception_cause)(CPUXtensaState *env, uint32_t pc, uint32_t cause)
@@ -66,7 +63,7 @@ void HELPER(exception_cause)(CPUXtensaState *env, uint32_t pc, uint32_t cause)
     env->sregs[EXCCAUSE] = cause;
     env->sregs[PS] |= PS_EXCM;
 
-    HELPER(exception)(env, vector);
+    xtensa_exception(env, vector);
 }
 
 void HELPER(exception_cause_vaddr)(CPUXtensaState *env,
@@ -93,7 +90,7 @@ void HELPER(debug_exception)(CPUXtensaState *env, uint32_t pc, uint32_t cause)
     env->sregs[EPS2 + level - 2] = env->sregs[PS];
     env->sregs[PS] = (env->sregs[PS] & ~PS_INTLEVEL) | PS_EXCM |
         (level << PS_INTLEVEL_SHIFT);
-    HELPER(exception)(env, EXC_DEBUG);
+    xtensa_exception(env, EXC_DEBUG);
 }
 
 #ifndef CONFIG_USER_ONLY
@@ -116,7 +113,7 @@ void HELPER(waiti)(CPUXtensaState *env, uint32_t pc, uint32_t intlevel)
     }
 
     cpu->halted = 1;
-    HELPER(exception)(env, EXCP_HLT);
+    xtensa_exception(env, EXCP_HLT);
 }
 
 void HELPER(check_interrupts)(CPUXtensaState *env)
diff --git a/target/xtensa/helper.h b/target/xtensa/helper.h
index ae938ceedb8..4640d0da59a 100644
--- a/target/xtensa/helper.h
+++ b/target/xtensa/helper.h
@@ -1,4 +1,3 @@
-DEF_HELPER_2(exception, noreturn, env, i32)
 DEF_HELPER_3(exception_cause, noreturn, env, i32, i32)
 DEF_HELPER_4(exception_cause_vaddr, noreturn, env, i32, i32, i32)
 DEF_HELPER_3(debug_exception, noreturn, env, i32, i32)
diff --git a/target/xtensa/translate.c b/target/xtensa/translate.c
index db48f0c562a..05c73bef99d 100644
--- a/target/xtensa/translate.c
+++ b/target/xtensa/translate.c
@@ -307,7 +307,7 @@ static void gen_yield(DisasContext *dc)
 {
     tcg_gen_st_i32(tcg_constant_i32(0), tcg_env,
                    offsetof(CPUXtensaState, yield_needed));
-    gen_helper_exception(tcg_env, tcg_constant_i32(EXCP_YIELD));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(EXCP_YIELD));
 }
 
 static void gen_exception_cause(DisasContext *dc, uint32_t cause)
diff --git a/target/xtensa/win_helper.c b/target/xtensa/win_helper.c
index 4b25f8f4de7..3e4d7c0f768 100644
--- a/target/xtensa/win_helper.c
+++ b/target/xtensa/win_helper.c
@@ -125,13 +125,13 @@ void HELPER(window_check)(CPUXtensaState *env, uint32_t pc, uint32_t w)
 
     switch (ctz32(windowstart >> n)) {
     case 0:
-        HELPER(exception)(env, EXC_WINDOW_OVERFLOW4);
+        xtensa_exception(env, EXC_WINDOW_OVERFLOW4);
         break;
     case 1:
-        HELPER(exception)(env, EXC_WINDOW_OVERFLOW8);
+        xtensa_exception(env, EXC_WINDOW_OVERFLOW8);
         break;
     default:
-        HELPER(exception)(env, EXC_WINDOW_OVERFLOW12);
+        xtensa_exception(env, EXC_WINDOW_OVERFLOW12);
         break;
     }
 }
@@ -174,11 +174,11 @@ void HELPER(test_underflow_retw)(CPUXtensaState *env, uint32_t pc)
         env->sregs[EPC1] = env->pc = pc;
 
         if (n == 1) {
-            HELPER(exception)(env, EXC_WINDOW_UNDERFLOW4);
+            xtensa_exception(env, EXC_WINDOW_UNDERFLOW4);
         } else if (n == 2) {
-            HELPER(exception)(env, EXC_WINDOW_UNDERFLOW8);
+            xtensa_exception(env, EXC_WINDOW_UNDERFLOW8);
         } else if (n == 3) {
-            HELPER(exception)(env, EXC_WINDOW_UNDERFLOW12);
+            xtensa_exception(env, EXC_WINDOW_UNDERFLOW12);
         }
     }
 }
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 19/24] target/avr: convert debug/break/sleep to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (17 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 18/24] target/xtensa: convert exception to raise_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 20/24] target/arm: convert exception_internal " Yonggang Luo
                   ` (4 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Replace debug, break, and sleep TCG helpers with raise_excp. Keep
unsupported.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/avr/helper.c    | 24 ------------------------
 target/avr/helper.h    |  3 ---
 target/avr/translate.c |  4 ++--
 3 files changed, 2 insertions(+), 29 deletions(-)

diff --git a/target/avr/helper.c b/target/avr/helper.c
index f452c9d9040..ca58a0191fd 100644
--- a/target/avr/helper.c
+++ b/target/avr/helper.c
@@ -152,14 +152,6 @@ bool avr_cpu_tlb_fill(CPUState *cs, vaddr address, int size,
  *  helpers
  */
 
-void helper_sleep(CPUAVRState *env)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = EXCP_HLT;
-    cpu_loop_exit(cs);
-}
-
 void helper_unsupported(CPUAVRState *env)
 {
     CPUState *cs = env_cpu(env);
@@ -176,22 +168,6 @@ void helper_unsupported(CPUAVRState *env)
     cpu_loop_exit(cs);
 }
 
-void helper_debug(CPUAVRState *env)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = EXCP_DEBUG;
-    cpu_loop_exit(cs);
-}
-
-void helper_break(CPUAVRState *env)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = EXCP_DEBUG;
-    cpu_loop_exit(cs);
-}
-
 void helper_wdr(CPUAVRState *env)
 {
     qemu_log_mask(LOG_UNIMP, "WDG reset (not implemented)\n");
diff --git a/target/avr/helper.h b/target/avr/helper.h
index e8d13e925f4..09ce0624915 100644
--- a/target/avr/helper.h
+++ b/target/avr/helper.h
@@ -19,8 +19,5 @@
  */
 
 DEF_HELPER_1(wdr, void, env)
-DEF_HELPER_1(debug, noreturn, env)
-DEF_HELPER_1(break, noreturn, env)
-DEF_HELPER_1(sleep, noreturn, env)
 DEF_HELPER_1(unsupported, noreturn, env)
 DEF_HELPER_3(fullwr, void, env, i32, i32)
diff --git a/target/avr/translate.c b/target/avr/translate.c
index 3c576060970..477610cd349 100644
--- a/target/avr/translate.c
+++ b/target/avr/translate.c
@@ -2554,7 +2554,7 @@ static bool trans_BREAK(DisasContext *ctx, arg_BREAK *a)
 
 #ifdef BREAKPOINT_ON_BREAK
     tcg_gen_movi_tl(cpu_pc, ctx->npc - 1);
-    gen_helper_debug(tcg_env);
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(EXCP_DEBUG));
     ctx->base.is_jmp = DISAS_EXIT;
 #else
     /* NOP */
@@ -2580,7 +2580,7 @@ static bool trans_NOP(DisasContext *ctx, arg_NOP *a)
  */
 static bool trans_SLEEP(DisasContext *ctx, arg_SLEEP *a)
 {
-    gen_helper_sleep(tcg_env);
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(EXCP_HLT));
     ctx->base.is_jmp = DISAS_NORETURN;
     return true;
 }
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 20/24] target/arm: convert exception_internal to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (18 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 19/24] target/avr: convert debug/break/sleep " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 21/24] target/riscv: convert raise_exception to riscv_raise_exception Yonggang Luo
                   ` (3 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Switch gen_exception_internal to raise_excp, and drop TCG
exception_internal. Keep syndrome helpers. Fold leftover C exits
into cpu_loop_exit_excp. Keep arm_raise_exception_ra via restore
then arm_raise_exception.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/arm/tcg/helper-defs.h |  1 -
 target/arm/tcg/m_helper.c    |  3 ++-
 target/arm/tcg/op_helper.c   | 33 ++++++---------------------------
 target/arm/tcg/translate.c   |  2 +-
 4 files changed, 9 insertions(+), 30 deletions(-)

diff --git a/target/arm/tcg/helper-defs.h b/target/arm/tcg/helper-defs.h
index 269ac515065..14ef3120373 100644
--- a/target/arm/tcg/helper-defs.h
+++ b/target/arm/tcg/helper-defs.h
@@ -45,7 +45,6 @@ DEF_HELPER_FLAGS_2(usad8, TCG_CALL_NO_RWG_SE, i32, i32, i32)
 
 DEF_HELPER_FLAGS_3(sel_flags, TCG_CALL_NO_RWG_SE,
                    i32, i32, i32, i32)
-DEF_HELPER_2(exception_internal, noreturn, env, i32)
 DEF_HELPER_3(exception_with_syndrome, noreturn, env, i32, i32)
 DEF_HELPER_4(exception_with_syndrome_el, noreturn, env, i32, i32, i32)
 DEF_HELPER_2(exception_bkpt_insn, noreturn, env, i32)
diff --git a/target/arm/tcg/m_helper.c b/target/arm/tcg/m_helper.c
index 33c9e7c55bc..161c5460217 100644
--- a/target/arm/tcg/m_helper.c
+++ b/target/arm/tcg/m_helper.c
@@ -18,6 +18,7 @@
 #include "exec/page-protection.h"
 #ifdef CONFIG_TCG
 #include "accel/tcg/cpu-ldst-common.h"
+#include "accel/tcg/cpu-loop.h"
 #include "semihosting/common-semi.h"
 #endif
 #if !defined(CONFIG_USER_ONLY)
@@ -575,7 +576,7 @@ void HELPER(v7m_bxns)(CPUARMState *env, uint32_t dest)
          */
         env->regs[15] = dest & ~1;
         env->thumb = dest & 1;
-        HELPER(exception_internal)(env, EXCP_EXCEPTION_EXIT);
+        cpu_loop_exit_excp(env_cpu(env), EXCP_EXCEPTION_EXIT, 0);
         /* notreached */
     }
 
diff --git a/target/arm/tcg/op_helper.c b/target/arm/tcg/op_helper.c
index 643b1482523..2ad45b23725 100644
--- a/target/arm/tcg/op_helper.c
+++ b/target/arm/tcg/op_helper.c
@@ -64,10 +64,9 @@ void raise_exception(CPUARMState *env, uint32_t excp,
     }
 
     assert(!excp_is_internal(excp));
-    cs->exception_index = excp;
     env->exception.syndrome = syndrome;
     env->exception.target_el = target_el;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, excp, 0);
 }
 
 void raise_exception_ra(CPUARMState *env, uint32_t excp, uint64_t syndrome,
@@ -399,9 +398,8 @@ void HELPER(wfi)(CPUARMState *env, uint32_t insn_len)
     }
 
     qatomic_set(&env->halt_reason, HALT_WFI);
-    cs->exception_index = EXCP_HLT;
     cs->halted = 1;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 #endif
 }
 
@@ -461,9 +459,8 @@ void HELPER(wfit)(CPUARMState *env, uint32_t rd)
         timer_mod(cpu->wfxt_timer, nexttick);
     }
     qatomic_set(&env->halt_reason, HALT_WFI);
-    cs->exception_index = EXCP_HLT;
     cs->halted = 1;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 #endif
 }
 
@@ -630,9 +627,8 @@ void HELPER(wfe)(CPUARMState *env, uint32_t insn_len)
     }
 
     qatomic_set(&env->halt_reason, HALT_WFE);
-    cs->exception_index = EXCP_HLT;
     cs->halted = 1;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 #endif
 }
 
@@ -724,9 +720,8 @@ void HELPER(wfet)(CPUARMState *env, uint32_t rd)
     }
 
     qatomic_set(&env->halt_reason, HALT_WFE);
-    cs->exception_index = EXCP_HLT;
     cs->halted = 1;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_HLT, 0);
 #endif
 }
 
@@ -738,23 +733,7 @@ void HELPER(yield)(CPUARMState *env)
      * that the guest is currently busy-looping. Yield control back to the
      * top level loop so that a more deserving VCPU has a chance to run.
      */
-    cs->exception_index = EXCP_YIELD;
-    cpu_loop_exit(cs);
-}
-
-/* Raise an internal-to-QEMU exception. This is limited to only
- * those EXCP values which are special cases for QEMU to interrupt
- * execution and not to be used for exceptions which are passed to
- * the guest (those must all have syndrome information and thus should
- * use exception_with_syndrome*).
- */
-void HELPER(exception_internal)(CPUARMState *env, uint32_t excp)
-{
-    CPUState *cs = env_cpu(env);
-
-    assert(excp_is_internal(excp));
-    cs->exception_index = excp;
-    cpu_loop_exit(cs);
+    cpu_loop_exit_excp(cs, EXCP_YIELD, 0);
 }
 
 /* Raise an exception with the specified syndrome register value */
diff --git a/target/arm/tcg/translate.c b/target/arm/tcg/translate.c
index 8c56348a665..6452888ed41 100644
--- a/target/arm/tcg/translate.c
+++ b/target/arm/tcg/translate.c
@@ -379,7 +379,7 @@ static void gen_rebuild_hflags(DisasContext *s, bool new_el)
 void gen_exception_internal(int excp)
 {
     assert(excp_is_internal(excp));
-    gen_helper_exception_internal(tcg_env, tcg_constant_i32(excp));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
 }
 
 static void gen_singlestep_exception(DisasContext *s)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 21/24] target/riscv: convert raise_exception to riscv_raise_exception
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (19 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 20/24] target/arm: convert exception_internal " Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 22/24] target/mips: convert raise_exception to raise_excp Yonggang Luo
                   ` (2 subsequent siblings)
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Prefix leftover TCG raise_exception to riscv_raise_exception so
translate still decrements instret then exits with restore 0. Keep
C riscv_raise_exception via cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/riscv/helper.h                             |  2 +-
 target/riscv/tcg/insn_trans/trans_rvi.c.inc       |  6 ++----
 target/riscv/tcg/insn_trans/trans_rvzicfiss.c.inc |  3 +--
 target/riscv/tcg/op_helper.c                      |  5 ++---
 target/riscv/tcg/translate.c                      | 10 +++++++---
 5 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/target/riscv/helper.h b/target/riscv/helper.h
index aab92bf132a..9458a5152be 100644
--- a/target/riscv/helper.h
+++ b/target/riscv/helper.h
@@ -1,5 +1,5 @@
 /* Exceptions */
-DEF_HELPER_2(raise_exception, noreturn, env, i32)
+DEF_HELPER_2(riscv_raise_exception, noreturn, env, i32)
 
 /* Floating Point - rounding mode */
 DEF_HELPER_FLAGS_2(set_rounding_mode, TCG_CALL_NO_WG, void, env, i32)
diff --git a/target/riscv/tcg/insn_trans/trans_rvi.c.inc b/target/riscv/tcg/insn_trans/trans_rvi.c.inc
index 40b4c9aa4ab..b9b554f4e5d 100644
--- a/target/riscv/tcg/insn_trans/trans_rvi.c.inc
+++ b/target/riscv/tcg/insn_trans/trans_rvi.c.inc
@@ -55,8 +55,7 @@ static bool trans_lpad(DisasContext *ctx, arg_lpad *a)
          */
         tcg_gen_st8_i32(tcg_constant_i32(RISCV_EXCP_SW_CHECK_FCFI_TVAL),
                         tcg_env, offsetof(CPURISCVState, sw_check_code));
-        gen_helper_raise_exception(tcg_env,
-                      tcg_constant_i32(RISCV_EXCP_SW_CHECK));
+        gen_raise_exception(RISCV_EXCP_SW_CHECK);
         return true;
     }
 
@@ -68,8 +67,7 @@ static bool trans_lpad(DisasContext *ctx, arg_lpad *a)
         tcg_gen_brcondi_tl(TCG_COND_EQ, tmp, a->label, skip);
         tcg_gen_st8_i32(tcg_constant_i32(RISCV_EXCP_SW_CHECK_FCFI_TVAL),
                         tcg_env, offsetof(CPURISCVState, sw_check_code));
-        gen_helper_raise_exception(tcg_env,
-                      tcg_constant_i32(RISCV_EXCP_SW_CHECK));
+        gen_raise_exception(RISCV_EXCP_SW_CHECK);
         gen_set_label(skip);
     }
 
diff --git a/target/riscv/tcg/insn_trans/trans_rvzicfiss.c.inc b/target/riscv/tcg/insn_trans/trans_rvzicfiss.c.inc
index d47a9f9c7d2..087328a12ef 100644
--- a/target/riscv/tcg/insn_trans/trans_rvzicfiss.c.inc
+++ b/target/riscv/tcg/insn_trans/trans_rvzicfiss.c.inc
@@ -43,8 +43,7 @@ static bool trans_sspopchk(DisasContext *ctx, arg_sspopchk *a)
     tcg_gen_brcond_tl(TCG_COND_EQ, data, rs1, skip);
     tcg_gen_st8_i32(tcg_constant_i32(RISCV_EXCP_SW_CHECK_BCFI_TVAL),
                     tcg_env, offsetof(CPURISCVState, sw_check_code));
-    gen_helper_raise_exception(tcg_env,
-                  tcg_constant_i32(RISCV_EXCP_SW_CHECK));
+    gen_raise_exception(RISCV_EXCP_SW_CHECK);
     gen_set_label(skip);
     tcg_gen_addi_tl(addr, addr, tmp);
     tcg_gen_ext_tl_i64(wide_addr, addr);
diff --git a/target/riscv/tcg/op_helper.c b/target/riscv/tcg/op_helper.c
index b67c7718db4..a00370a7973 100644
--- a/target/riscv/tcg/op_helper.c
+++ b/target/riscv/tcg/op_helper.c
@@ -47,11 +47,10 @@ G_NORETURN void riscv_raise_exception(CPURISCVState *env,
                           riscv_cpu_get_trap_name(exception, false),
                           env->pc);
 
-    cs->exception_index = exception;
-    cpu_loop_exit_restore(cs, pc);
+    cpu_loop_exit_excp(cs, exception, pc);
 }
 
-void helper_raise_exception(CPURISCVState *env, uint32_t exception)
+void HELPER(riscv_raise_exception)(CPURISCVState *env, uint32_t exception)
 {
 #ifndef CONFIG_USER_ONLY
     riscv_pmu_decr_instret(env);
diff --git a/target/riscv/tcg/translate.c b/target/riscv/tcg/translate.c
index cce3b6dc721..08640c4ebd1 100644
--- a/target/riscv/tcg/translate.c
+++ b/target/riscv/tcg/translate.c
@@ -257,10 +257,15 @@ static void gen_update_pc(DisasContext *ctx, target_long diff)
     ctx->pc_save = ctx->base.pc_next + diff;
 }
 
+static void gen_raise_exception(uint32_t excp)
+{
+    gen_helper_riscv_raise_exception(tcg_env, tcg_constant_i32(excp));
+}
+
 static void generate_exception(DisasContext *ctx, RISCVException excp)
 {
     gen_update_pc(ctx, 0);
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(excp));
+    gen_raise_exception(excp);
     ctx->base.is_jmp = DISAS_NORETURN;
 }
 
@@ -1424,8 +1429,7 @@ static void riscv_tr_translate_insn(DisasContextBase *dcbase, CPUState *cpu)
         tcg_ctx->emit_before_op = QTAILQ_NEXT(ctx->base.insn_start, link);
         tcg_gen_st8_i32(tcg_constant_i32(RISCV_EXCP_SW_CHECK_FCFI_TVAL),
                         tcg_env, offsetof(CPURISCVState, sw_check_code));
-        gen_helper_raise_exception(tcg_env,
-                      tcg_constant_i32(RISCV_EXCP_SW_CHECK));
+        gen_raise_exception(RISCV_EXCP_SW_CHECK);
         tcg_ctx->emit_before_op = NULL;
         ctx->base.is_jmp = DISAS_NORETURN;
     }
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 22/24] target/mips: convert raise_exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (20 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 21/24] target/riscv: convert raise_exception to riscv_raise_exception Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 23/24] target/ppc: fold gen_exception_nip into gen_exception_err_nip Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 24/24] target/ppc: convert raise_exception to raise_excp Yonggang Luo
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Store error_code, then call raise_excp for the err path and
raise_excp_restore for the 2-arg path. Drop TCG raise_exception,
raise_exception_err, and the unused debug DEF. Keep C
do_raise_exception_err via cpu_loop_exit_excp.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/mips/helper.h         |  4 ----
 target/mips/tcg/exception.c  | 20 +-------------------
 target/mips/tcg/fpu_helper.c |  6 +++---
 target/mips/tcg/translate.c  |  9 ++++++---
 4 files changed, 10 insertions(+), 29 deletions(-)

diff --git a/target/mips/helper.h b/target/mips/helper.h
index 779b87101db..83a6dd0b3c4 100644
--- a/target/mips/helper.h
+++ b/target/mips/helper.h
@@ -1,7 +1,3 @@
-DEF_HELPER_3(raise_exception_err, noreturn, env, i32, int)
-DEF_HELPER_2(raise_exception, noreturn, env, i32)
-DEF_HELPER_1(raise_exception_debug, noreturn, env)
-
 #ifdef TARGET_MIPS64
 DEF_HELPER_4(sdl, void, env, tl, tl, int)
 DEF_HELPER_4(sdr, void, env, tl, tl, int)
diff --git a/target/mips/tcg/exception.c b/target/mips/tcg/exception.c
index 630b8b809fa..851b74e4fde 100644
--- a/target/mips/tcg/exception.c
+++ b/target/mips/tcg/exception.c
@@ -44,22 +44,6 @@ target_ulong exception_resume_pc(CPUMIPSState *env)
     return bad_pc;
 }
 
-void helper_raise_exception_err(CPUMIPSState *env, uint32_t exception,
-                                int error_code)
-{
-    do_raise_exception_err(env, exception, error_code, 0);
-}
-
-void helper_raise_exception(CPUMIPSState *env, uint32_t exception)
-{
-    do_raise_exception(env, exception, GETPC());
-}
-
-void helper_raise_exception_debug(CPUMIPSState *env)
-{
-    do_raise_exception(env, EXCP_DEBUG, 0);
-}
-
 static void raise_exception(CPUMIPSState *env, uint32_t exception)
 {
     do_raise_exception(env, exception, 0);
@@ -145,8 +129,6 @@ void do_raise_exception_err(CPUMIPSState *env, uint32_t exception,
     qemu_log_mask(CPU_LOG_INT, "%s: %d (%s) %d\n",
                   __func__, exception, mips_exception_name(exception),
                   error_code);
-    cs->exception_index = exception;
     env->error_code = error_code;
-
-    cpu_loop_exit_restore(cs, pc);
+    cpu_loop_exit_excp(cs, exception, pc);
 }
diff --git a/target/mips/tcg/fpu_helper.c b/target/mips/tcg/fpu_helper.c
index 36af9808025..ce68cda1e43 100644
--- a/target/mips/tcg/fpu_helper.c
+++ b/target/mips/tcg/fpu_helper.c
@@ -61,7 +61,7 @@ target_ulong helper_cfc1(CPUMIPSState *env, uint32_t reg)
             if (env->CP0_Config5 & (1 << CP0C5_UFE)) {
                 arg1 = (env->CP0_Config5 >> CP0C5_FRE) & 1;
             } else {
-                helper_raise_exception(env, EXCP_RI);
+                do_raise_exception(env, EXCP_RI, GETPC());
             }
         }
         break;
@@ -120,7 +120,7 @@ void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt)
             env->CP0_Config5 &= ~(1 << CP0C5_FRE);
             compute_hflags(env);
         } else {
-            helper_raise_exception(env, EXCP_RI);
+            do_raise_exception(env, EXCP_RI, GETPC());
         }
         break;
     case 6:
@@ -132,7 +132,7 @@ void helper_ctc1(CPUMIPSState *env, target_ulong arg1, uint32_t fs, uint32_t rt)
             env->CP0_Config5 |= (1 << CP0C5_FRE);
             compute_hflags(env);
         } else {
-            helper_raise_exception(env, EXCP_RI);
+            do_raise_exception(env, EXCP_RI, GETPC());
         }
         break;
     case 25:
diff --git a/target/mips/tcg/translate.c b/target/mips/tcg/translate.c
index e3467d15251..b1b09816504 100644
--- a/target/mips/tcg/translate.c
+++ b/target/mips/tcg/translate.c
@@ -1316,14 +1316,17 @@ static inline void restore_cpu_state(CPUMIPSState *env, DisasContext *ctx)
 void generate_exception_err(DisasContext *ctx, int excp, int err)
 {
     save_cpu_state(ctx, 1);
-    gen_helper_raise_exception_err(tcg_env, tcg_constant_i32(excp),
-                                   tcg_constant_i32(err));
+    tcg_gen_st_i32(tcg_constant_i32(err), tcg_env,
+                   offsetof(CPUMIPSState, error_code));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
     ctx->base.is_jmp = DISAS_NORETURN;
 }
 
 void generate_exception(DisasContext *ctx, int excp)
 {
-    gen_helper_raise_exception(tcg_env, tcg_constant_i32(excp));
+    tcg_gen_st_i32(tcg_constant_i32(0), tcg_env,
+                   offsetof(CPUMIPSState, error_code));
+    gen_helper_raise_excp_restore(tcg_env, tcg_constant_i32(excp));
 }
 
 void generate_exception_end(DisasContext *ctx, int excp)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 23/24] target/ppc: fold gen_exception_nip into gen_exception_err_nip
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (21 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 22/24] target/mips: convert raise_exception to raise_excp Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  2026-09-28  5:20 ` [PATCH v2 24/24] target/ppc: convert raise_exception to raise_excp Yonggang Luo
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

gen_exception_nip is gen_exception_err_nip with error_code 0. Call
that function instead of raising on its own.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/ppc/translate.c | 7 +------
 1 file changed, 1 insertion(+), 6 deletions(-)

diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index 467b8f3d4ec..f1a7039a325 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -330,12 +330,7 @@ static inline void gen_exception_err(DisasContext *ctx, uint32_t excp,
 static void gen_exception_nip(DisasContext *ctx, uint32_t excp,
                               target_ulong nip)
 {
-    TCGv_i32 t0;
-
-    gen_update_nip(ctx, nip);
-    t0 = tcg_constant_i32(excp);
-    gen_helper_raise_exception(tcg_env, t0);
-    ctx->base.is_jmp = DISAS_NORETURN;
+    gen_exception_err_nip(ctx, excp, 0, nip);
 }
 
 static inline void gen_exception(DisasContext *ctx, uint32_t excp)
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH v2 24/24] target/ppc: convert raise_exception to raise_excp
  2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
                   ` (22 preceding siblings ...)
  2026-09-28  5:20 ` [PATCH v2 23/24] target/ppc: fold gen_exception_nip into gen_exception_err_nip Yonggang Luo
@ 2026-09-28  5:20 ` Yonggang Luo
  23 siblings, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-28  5:20 UTC (permalink / raw)
  To: qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Philippe Mathieu-Daudé, Eric Farman,
	qemu-riscv, Richard Henderson, David Hildenbrand, Glenn Miles,
	Cornelia Huck, Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm,
	Michael Rolnik, Pierrick Bouvier, Paolo Bonzini, qemu-s390x

Store error_code, then call raise_excp. Drop TCG raise_exception
and raise_exception_err. Move C raise_exception_err_ra to static
inline in internal.h, and remove the cpu.h prototype. Callers
include internal.h.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
---
 target/ppc/cpu.h             |  3 ---
 target/ppc/helper.h          |  2 --
 target/ppc/internal.h        |  9 +++++++++
 target/ppc/misc_helper.c     |  1 +
 target/ppc/tcg-excp_helper.c | 21 ---------------------
 target/ppc/timebase_helper.c |  1 +
 target/ppc/translate.c       | 13 ++++++-------
 7 files changed, 17 insertions(+), 33 deletions(-)

diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h
index 3fb51bbeb82..217b4f334e5 100644
--- a/target/ppc/cpu.h
+++ b/target/ppc/cpu.h
@@ -2819,9 +2819,6 @@ void cpu_write_xer(CPUPPCState *env, target_ulong xer);
  */
 #define is_book3s_arch2x(ctx) (!!((ctx)->insns_flags & PPC_SEGMENT_64B))
 
-G_NORETURN void raise_exception_err_ra(CPUPPCState *env, uint32_t exception,
-                                       uint32_t error_code, uintptr_t raddr);
-
 /* PERFM EBB helper*/
 #if defined(TARGET_PPC64) && !defined(CONFIG_USER_ONLY)
 void raise_ebb_perfm_exception(CPUPPCState *env);
diff --git a/target/ppc/helper.h b/target/ppc/helper.h
index 80d6616bab4..8a804d326ac 100644
--- a/target/ppc/helper.h
+++ b/target/ppc/helper.h
@@ -1,5 +1,3 @@
-DEF_HELPER_FLAGS_3(raise_exception_err, TCG_CALL_NO_WG, noreturn, env, i32, i32)
-DEF_HELPER_FLAGS_2(raise_exception, TCG_CALL_NO_WG, noreturn, env, i32)
 DEF_HELPER_FLAGS_4(TW, TCG_CALL_NO_WG, void, env, tl, tl, i32)
 #if defined(TARGET_PPC64)
 DEF_HELPER_FLAGS_4(TD, TCG_CALL_NO_WG, void, env, tl, tl, i32)
diff --git a/target/ppc/internal.h b/target/ppc/internal.h
index a20a0f9f7e0..14c08c23ffc 100644
--- a/target/ppc/internal.h
+++ b/target/ppc/internal.h
@@ -320,8 +320,17 @@ static inline int ger_pack_masks(int pmsk, int ymsk, int xmsk)
 
 #ifdef CONFIG_TCG
 #include "accel/tcg/tb-cpu-state.h"
+#include "accel/tcg/cpu-loop.h"
 
 TCGTBCPUState ppc_get_tb_cpu_state(CPUState *cs);
+
+static inline G_NORETURN
+void raise_exception_err_ra(CPUPPCState *env, uint32_t excp,
+                            uint32_t err, uintptr_t ra)
+{
+    env->error_code = err;
+    cpu_loop_exit_excp(env_cpu(env), excp, ra);
+}
 #endif
 
 #endif /* PPC_INTERNAL_H */
diff --git a/target/ppc/misc_helper.c b/target/ppc/misc_helper.c
index 0e625cbb704..527af513f92 100644
--- a/target/ppc/misc_helper.c
+++ b/target/ppc/misc_helper.c
@@ -20,6 +20,7 @@
 #include "qemu/osdep.h"
 #include "qemu/log.h"
 #include "cpu.h"
+#include "internal.h"
 #include "exec/cputlb.h"
 #include "exec/helper-proto.h"
 #include "qemu/error-report.h"
diff --git a/target/ppc/tcg-excp_helper.c b/target/ppc/tcg-excp_helper.c
index 93aedb0c8e2..6289ca7dfd5 100644
--- a/target/ppc/tcg-excp_helper.c
+++ b/target/ppc/tcg-excp_helper.c
@@ -34,27 +34,6 @@
 /*****************************************************************************/
 /* Exceptions processing helpers */
 
-void raise_exception_err_ra(CPUPPCState *env, uint32_t exception,
-                            uint32_t error_code, uintptr_t raddr)
-{
-    CPUState *cs = env_cpu(env);
-
-    cs->exception_index = exception;
-    env->error_code = error_code;
-    cpu_loop_exit_restore(cs, raddr);
-}
-
-void helper_raise_exception_err(CPUPPCState *env, uint32_t exception,
-                                uint32_t error_code)
-{
-    raise_exception_err_ra(env, exception, error_code, 0);
-}
-
-void helper_raise_exception(CPUPPCState *env, uint32_t exception)
-{
-    raise_exception_err_ra(env, exception, 0, 0);
-}
-
 #ifndef CONFIG_USER_ONLY
 
 static G_NORETURN void raise_exception_err(CPUPPCState *env, uint32_t exception,
diff --git a/target/ppc/timebase_helper.c b/target/ppc/timebase_helper.c
index 7209b418fb6..d0986ff261a 100644
--- a/target/ppc/timebase_helper.c
+++ b/target/ppc/timebase_helper.c
@@ -18,6 +18,7 @@
  */
 #include "qemu/osdep.h"
 #include "cpu.h"
+#include "internal.h"
 #include "hw/ppc/ppc.h"
 #include "exec/helper-proto.h"
 #include "qemu/log.h"
diff --git a/target/ppc/translate.c b/target/ppc/translate.c
index f1a7039a325..767b8ed7697 100644
--- a/target/ppc/translate.c
+++ b/target/ppc/translate.c
@@ -308,12 +308,10 @@ static inline void gen_update_nip(DisasContext *ctx, target_ulong nip)
 static void gen_exception_err_nip(DisasContext *ctx, uint32_t excp,
                                   uint32_t error, target_ulong nip)
 {
-    TCGv_i32 t0, t1;
-
     gen_update_nip(ctx, nip);
-    t0 = tcg_constant_i32(excp);
-    t1 = tcg_constant_i32(error);
-    gen_helper_raise_exception_err(tcg_env, t0, t1);
+    tcg_gen_st_i32(tcg_constant_i32(error), tcg_env,
+                   offsetof(CPUPPCState, error_code));
+    gen_helper_raise_excp(tcg_env, tcg_constant_i32(excp));
     ctx->base.is_jmp = DISAS_NORETURN;
 }
 
@@ -372,8 +370,9 @@ static void gen_debug_exception(DisasContext *ctx, bool rfi_type)
         gen_load_spr(t0, SPR_BOOKE_DBSR);
         tcg_gen_ori_tl(t0, t0, dbsr);
         gen_store_spr(SPR_BOOKE_DBSR, t0);
-        gen_helper_raise_exception(tcg_env,
-                                   tcg_constant_i32(POWERPC_EXCP_DEBUG));
+        tcg_gen_st_i32(tcg_constant_i32(0), tcg_env,
+                       offsetof(CPUPPCState, error_code));
+        gen_helper_raise_excp(tcg_env, tcg_constant_i32(POWERPC_EXCP_DEBUG));
         ctx->base.is_jmp = DISAS_NORETURN;
     } else {
         if (!rfi_type) { /* BookS does not single step rfi type instructions */
-- 
2.52.0.windows.1



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 16/24] target/s390x: convert exception to raise_excp
  2026-09-28  5:20 ` [PATCH v2 16/24] target/s390x: convert exception " Yonggang Luo
@ 2026-09-28 17:42   ` Ilya Leoshkevich
  0 siblings, 0 replies; 34+ messages in thread
From: Ilya Leoshkevich @ 2026-09-28 17:42 UTC (permalink / raw)
  To: Yonggang Luo, qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Alistair Francis, Stafford Horne, Chinmay Rath, Nicholas Piggin,
	Yoshinori Sato, Peter Maydell, Artyom Tarasenko, Laurent Vivier,
	Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias, Aurelien Jarno,
	Philippe Mathieu-Daudé, Eric Farman, qemu-riscv,
	Richard Henderson, David Hildenbrand, Glenn Miles, Cornelia Huck,
	Mark Cave-Ayland, Song Gao, qemu-ppc, qemu-arm, Michael Rolnik,
	Pierrick Bouvier, Paolo Bonzini, qemu-s390x



On 9/28/26 07:20, Yonggang Luo wrote:
> Drop TCG exception and call raise_excp. Keep data_exception. Route
> leftover C SVC execute through cpu_loop_exit_excp.
> 
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> ---
>   target/s390x/helper.h          |  1 -
>   target/s390x/tcg/mem_helper.c  |  2 +-
>   target/s390x/tcg/misc_helper.c | 10 ----------
>   target/s390x/tcg/translate.c   |  2 +-
>   4 files changed, 2 insertions(+), 13 deletions(-)

Seems to be a straightforward patch without functional changes
(not counting HELPER_LOG removal, but `-d int` should still work).

Thanks!

Reviewed-by: Ilya Leoshkevich <iii@linux.ibm.com>



^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 14/24] target/hppa: convert excp to raise_excp
  2026-09-28  5:20 ` [PATCH v2 14/24] target/hppa: convert excp to raise_excp Yonggang Luo
@ 2026-09-29  5:21   ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 34+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-09-29  5:21 UTC (permalink / raw)
  To: Yonggang Luo, qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On 28/9/26 07:20, Yonggang Luo wrote:
> Drop TCG excp and call raise_excp. Keep C hppa_dynamic_excp and use
> cpu_loop_exit_excp. Route leftover C callers through
> hppa_dynamic_excp instead of helper_excp.
> 
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> ---
>   target/hppa/helper.h     |  2 --
>   target/hppa/op_helper.c  | 15 ++-------------
>   target/hppa/sys_helper.c |  4 ++--
>   target/hppa/translate.c  |  2 +-
>   4 files changed, 5 insertions(+), 18 deletions(-)
> 
> diff --git a/target/hppa/helper.h b/target/hppa/helper.h
> index 8369855d78e..5ed39e01e31 100644
> --- a/target/hppa/helper.h
> +++ b/target/hppa/helper.h
> @@ -1,5 +1,3 @@
> -DEF_HELPER_2(excp, noreturn, env, int)
> -
>   DEF_HELPER_FLAGS_3(stby_b, TCG_CALL_NO_WG, void, env, tl, tl)
>   DEF_HELPER_FLAGS_3(stby_b_parallel, TCG_CALL_NO_WG, void, env, tl, tl)
>   DEF_HELPER_FLAGS_3(stby_e, TCG_CALL_NO_WG, void, env, tl, tl)
> diff --git a/target/hppa/op_helper.c b/target/hppa/op_helper.c
> index 76a8d8a0d34..c4651f0d85a 100644
> --- a/target/hppa/op_helper.c
> +++ b/target/hppa/op_helper.c
> @@ -30,20 +30,9 @@
>   #include "user/page-protection.h"
>   #endif
>   
> -G_NORETURN void HELPER(excp)(CPUHPPAState *env, int excp)
> -{
> -    CPUState *cs = env_cpu(env);
> -
> -    cs->exception_index = excp;
> -    cpu_loop_exit(cs);
> -}
> -
>   G_NORETURN void hppa_dynamic_excp(CPUHPPAState *env, int excp, uintptr_t ra)
>   {
> -    CPUState *cs = env_cpu(env);
> -
> -    cs->exception_index = excp;
> -    cpu_loop_exit_restore(cs, ra);
> +    cpu_loop_exit_excp(env_cpu(env), excp, ra);

cpu_loop_exit_excp() replacement is one logical change, ...

>   }
>   
>   static void atomic_store_mask32(CPUHPPAState *env, target_ulong addr,
> @@ -341,7 +330,7 @@ target_ulong HELPER(probe)(CPUHPPAState *env, target_ulong addr,
>           if (excp == EXCP_DTLB_MISS) {
>               excp = EXCP_NA_DTLB_MISS;
>           }
> -        helper_excp(env, excp);
> +        hppa_dynamic_excp(env, excp, 0);

... removing helper_excp() and calling hppa_dynamic_excp()
another one. Please split in 2 distinct patches.

>       }
>       return (want & prot) != 0;
>   #endif



^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp
  2026-09-28  5:20 ` [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp Yonggang Luo
@ 2026-09-29  5:23   ` Philippe Mathieu-Daudé
  2026-09-29  5:27     ` Yonggang Luo
  2026-09-30  7:53     ` Yonggang Luo
  0 siblings, 2 replies; 34+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-09-29  5:23 UTC (permalink / raw)
  To: Yonggang Luo, qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On 28/9/26 07:20, Yonggang Luo wrote:
> Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
> cpu->exception_index, then restore and exit the current TB the same
> way as cpu_loop_exit_restore.
> 
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> ---
>   accel/tcg/cpu-exec-common.c  |  6 ++++++
>   include/accel/tcg/cpu-loop.h | 12 ++++++++++++
>   2 files changed, 18 insertions(+)
> 
> diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
> index d20cece1c5f..31fed8e497f 100644
> --- a/accel/tcg/cpu-exec-common.c
> +++ b/accel/tcg/cpu-exec-common.c
> @@ -118,6 +118,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..856091020f2 100644
> --- a/include/accel/tcg/cpu-loop.h
> +++ b/include/accel/tcg/cpu-loop.h
> @@ -65,6 +65,18 @@ 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

I'm not comfortable this is hidding the 'restore' part,
not even mentioning no restore is done if host_pc==0.

> + *
> + * Set cpu->exception_index and exit the current TB, restoring
> + * guest state from @host_pc the same way as cpu_loop_exit_restore.
> + */
> +G_NORETURN void cpu_loop_exit_excp(CPUState *cpu, int exception_index,
> +                                   uintptr_t host_pc);
> +
>   /**
>    * cpu_loop_exit:
>    * @cpu: the cpu context



^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_*
  2026-09-28  5:20 ` [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_* Yonggang Luo
@ 2026-09-29  5:26   ` Philippe Mathieu-Daudé
  2026-09-29  5:29     ` Yonggang Luo
  0 siblings, 1 reply; 34+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-09-29  5:26 UTC (permalink / raw)
  To: Yonggang Luo, qemu-devel
  Cc: Helge Deller, Harsh Prateek Bora, Weiwei Li, Brian Cain,
	Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On 28/9/26 07:20, Yonggang Luo wrote:
> Add RX_EXCP_* in cpu.h for the guest trap numbers stored in
> cs->exception_index.
> 
> Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> ---
>   target/rx/cpu.h | 10 ++++++++++
>   1 file changed, 10 insertions(+)
> 
> diff --git a/target/rx/cpu.h b/target/rx/cpu.h
> index 64ba48a7329..521e494172e 100644
> --- a/target/rx/cpu.h
> +++ b/target/rx/cpu.h
> @@ -71,6 +71,16 @@ enum {
>       NUM_REGS = 16,
>   };
>   
> +/* Guest trap numbers. */
> +enum {
> +    RX_EXCP_PRIVILEGE_VIOLATION = 20,
> +    RX_EXCP_ACCESS = 21,
> +    RX_EXCP_ILLEGAL_INSTRUCTION = 23,
> +    RX_EXCP_FPU = 25,
> +    RX_EXCP_NMI = 30,
> +    RX_EXCP_INT = 0x100,
> +};

Thanks for splitting in a previous patch, but we want to
add the definitions and replace the magic values at the
same time (i.e. the changes in rx_cpu_do_interrupt() in
the next patch go here), but also s/21/RX_EXCP_ACCESS/ in
update_fpsw, etc...).


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp
  2026-09-29  5:23   ` Philippe Mathieu-Daudé
@ 2026-09-29  5:27     ` Yonggang Luo
  2026-09-30  7:53     ` Yonggang Luo
  1 sibling, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-29  5:27 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Helge Deller, Harsh Prateek Bora, Weiwei Li,
	Brian Cain, Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On Tue, Sep 29, 2026 at 1:23 PM Philippe Mathieu-Daudé
<philmd@oss.qualcomm.com> wrote:
>
> On 28/9/26 07:20, Yonggang Luo wrote:
> > Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
> > cpu->exception_index, then restore and exit the current TB the same
> > way as cpu_loop_exit_restore.
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> > ---
> >   accel/tcg/cpu-exec-common.c  |  6 ++++++
> >   include/accel/tcg/cpu-loop.h | 12 ++++++++++++
> >   2 files changed, 18 insertions(+)
> >
> > diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
> > index d20cece1c5f..31fed8e497f 100644
> > --- a/accel/tcg/cpu-exec-common.c
> > +++ b/accel/tcg/cpu-exec-common.c
> > @@ -118,6 +118,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..856091020f2 100644
> > --- a/include/accel/tcg/cpu-loop.h
> > +++ b/include/accel/tcg/cpu-loop.h
> > @@ -65,6 +65,18 @@ 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
>
> I'm not comfortable this is hidding the 'restore' part,
> not even mentioning no restore is done if host_pc==0.


So it's the pitfall of cpu_loop_exit_restore. what would be
better, I have no idea how to improve it.

>
> > + *
> > + * Set cpu->exception_index and exit the current TB, restoring
> > + * guest state from @host_pc the same way as cpu_loop_exit_restore.
> > + */
> > +G_NORETURN void cpu_loop_exit_excp(CPUState *cpu, int exception_index,
> > +                                   uintptr_t host_pc);
> > +
> >   /**
> >    * cpu_loop_exit:
> >    * @cpu: the cpu context
>


-- 
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo


^ permalink raw reply	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_*
  2026-09-29  5:26   ` Philippe Mathieu-Daudé
@ 2026-09-29  5:29     ` Yonggang Luo
  2026-09-29  6:57       ` [PATCH 1/2] target/rx: Unify BRK and INT trap handling Philippe Mathieu-Daudé
  0 siblings, 1 reply; 34+ messages in thread
From: Yonggang Luo @ 2026-09-29  5:29 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Helge Deller, Harsh Prateek Bora, Weiwei Li,
	Brian Cain, Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On Tue, Sep 29, 2026 at 1:26 PM Philippe Mathieu-Daudé
<philmd@oss.qualcomm.com> wrote:
>
> On 28/9/26 07:20, Yonggang Luo wrote:
> > Add RX_EXCP_* in cpu.h for the guest trap numbers stored in
> > cs->exception_index.
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> > ---
> >   target/rx/cpu.h | 10 ++++++++++
> >   1 file changed, 10 insertions(+)
> >
> > diff --git a/target/rx/cpu.h b/target/rx/cpu.h
> > index 64ba48a7329..521e494172e 100644
> > --- a/target/rx/cpu.h
> > +++ b/target/rx/cpu.h
> > @@ -71,6 +71,16 @@ enum {
> >       NUM_REGS = 16,
> >   };
> >
> > +/* Guest trap numbers. */
> > +enum {
> > +    RX_EXCP_PRIVILEGE_VIOLATION = 20,
> > +    RX_EXCP_ACCESS = 21,
> > +    RX_EXCP_ILLEGAL_INSTRUCTION = 23,
> > +    RX_EXCP_FPU = 25,
> > +    RX_EXCP_NMI = 30,
> > +    RX_EXCP_INT = 0x100,
> > +};
>
> Thanks for splitting in a previous patch, but we want to
> add the definitions and replace the magic values at the
> same time (i.e. the changes in rx_cpu_do_interrupt() in
> the next patch go here), but also s/21/RX_EXCP_ACCESS/ in
> update_fpsw, etc...).

Do you mean add a single enum value in a single commit? so it can
be tracked clearly.
So when RX_EXCP_ACCESS is introduced. all usage of 21 will be replaced with
RX_EXCP_ACCESS?



-- 
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo


^ permalink raw reply	[flat|nested] 34+ messages in thread

* [PATCH 1/2] target/rx: Unify BRK and INT trap handling
  2026-09-29  5:29     ` Yonggang Luo
@ 2026-09-29  6:57       ` Philippe Mathieu-Daudé
  2026-09-29  6:57         ` [PATCH 2/2] target/rx: Define exception vector constants Philippe Mathieu-Daudé
  0 siblings, 1 reply; 34+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-09-29  6:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Yoshinori Sato, Philippe Mathieu-Daudé

BRK is equivalent to INT #0, so route both instructions
through the same translation path and trap helper.

Remove the duplicate helper declarations and implementation
used by the two instructions.

Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/rx/helper.h    |  3 +--
 target/rx/op_helper.c |  7 +------
 target/rx/translate.c | 21 ++++++++++-----------
 3 files changed, 12 insertions(+), 19 deletions(-)

diff --git a/target/rx/helper.h b/target/rx/helper.h
index 8cc38b0cb71..f3897ce7619 100644
--- a/target/rx/helper.h
+++ b/target/rx/helper.h
@@ -2,8 +2,7 @@ DEF_HELPER_1(raise_illegal_instruction, noreturn, env)
 DEF_HELPER_1(raise_access_fault, noreturn, env)
 DEF_HELPER_1(raise_privilege_violation, noreturn, env)
 DEF_HELPER_1(wait, noreturn, env)
-DEF_HELPER_2(rxint, noreturn, env, i32)
-DEF_HELPER_1(rxbrk, noreturn, env)
+DEF_HELPER_2(trap, noreturn, env, i32)
 DEF_HELPER_3(fadd, f32, env, f32, f32)
 DEF_HELPER_3(fsub, f32, env, f32, f32)
 DEF_HELPER_3(fmul, f32, env, f32, f32)
diff --git a/target/rx/op_helper.c b/target/rx/op_helper.c
index 36df7d377e5..6782912247e 100644
--- a/target/rx/op_helper.c
+++ b/target/rx/op_helper.c
@@ -455,12 +455,7 @@ G_NORETURN void helper_wait(CPURXState *env)
     raise_exception(env, EXCP_HLT, 0);
 }
 
-G_NORETURN void helper_rxint(CPURXState *env, uint32_t vec)
+G_NORETURN void helper_trap(CPURXState *env, uint32_t vec)
 {
     raise_exception(env, 0x100 + vec, 0);
 }
-
-G_NORETURN void helper_rxbrk(CPURXState *env)
-{
-    raise_exception(env, 0x100, 0);
-}
diff --git a/target/rx/translate.c b/target/rx/translate.c
index 132d495710c..d0910fbf8e7 100644
--- a/target/rx/translate.c
+++ b/target/rx/translate.c
@@ -2170,26 +2170,25 @@ static bool trans_RTE(DisasContext *ctx, arg_RTE *a)
     return true;
 }
 
+static bool do_trap(DisasContext *ctx, uint8_t vec)
+{
+    tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
+    gen_helper_trap(tcg_env, tcg_constant_i32(vec));
+    ctx->base.is_jmp = DISAS_NORETURN;
+    return true;
+}
+
 /* brk */
 static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
 {
-    tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
-    gen_helper_rxbrk(tcg_env);
-    ctx->base.is_jmp = DISAS_NORETURN;
-    return true;
+    return do_trap(ctx, 0);
 }
 
 /* int #imm */
 static bool trans_INT(DisasContext *ctx, arg_INT *a)
 {
-    TCGv_i32 vec;
-
     tcg_debug_assert(a->imm < 0x100);
-    vec = tcg_constant_i32(a->imm);
-    tcg_gen_movi_i32(cpu_pc, ctx->base.pc_next);
-    gen_helper_rxint(tcg_env, vec);
-    ctx->base.is_jmp = DISAS_NORETURN;
-    return true;
+    return do_trap(ctx, a->imm);
 }
 
 /* wait */
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* [PATCH 2/2] target/rx: Define exception vector constants
  2026-09-29  6:57       ` [PATCH 1/2] target/rx: Unify BRK and INT trap handling Philippe Mathieu-Daudé
@ 2026-09-29  6:57         ` Philippe Mathieu-Daudé
  0 siblings, 0 replies; 34+ messages in thread
From: Philippe Mathieu-Daudé @ 2026-09-29  6:57 UTC (permalink / raw)
  To: qemu-devel; +Cc: Yoshinori Sato, Yonggang Luo, Philippe Mathieu-Daudé

From: Yonggang Luo <luoyonggang@gmail.com>

Name RX exception vectors and trap ranges, and use the
definitions throughout exception handling and exception
raising.

Assert that exception indexes remain within the defined
range before accessing their vector tables.

Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
Co-developed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Signed-off-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
---
 target/rx/cpu.h       | 13 +++++++++++++
 target/rx/helper.c    | 21 +++++++++++----------
 target/rx/op_helper.c | 10 +++++-----
 target/rx/translate.c |  2 +-
 4 files changed, 30 insertions(+), 16 deletions(-)

diff --git a/target/rx/cpu.h b/target/rx/cpu.h
index 64ba48a7329..0d9f4898a26 100644
--- a/target/rx/cpu.h
+++ b/target/rx/cpu.h
@@ -71,6 +71,19 @@ enum {
     NUM_REGS = 16,
 };
 
+#define RX_EXCP_TRAP_COUNT          0x100
+
+enum {
+    RX_EXCP_PRIVILEGE_VIOLATION     = 20,
+    RX_EXCP_ACCESS                  = 21,
+    RX_EXCP_ILLEGAL_INSTRUCTION     = 23,
+    RX_EXCP_FPU                     = 25,
+    RX_EXCP_NMI                     = 30,
+    RX_EXCP_TRAP_BASE               = 0x100, /* Up to RX_EXCP_TRAP_COUNT */
+};
+
+#define RX_EXCP_COUNT   (RX_EXCP_TRAP_BASE + RX_EXCP_TRAP_COUNT)
+
 typedef struct CPUArchState {
     /* CPU registers */
     uint32_t regs[NUM_REGS];    /* general registers */
diff --git a/target/rx/helper.c b/target/rx/helper.c
index 0f99279bbaa..bc76dd28ab3 100644
--- a/target/rx/helper.c
+++ b/target/rx/helper.c
@@ -86,13 +86,14 @@ void rx_cpu_do_interrupt(CPUState *cs)
         env->isp -= 4;
         cpu_stl_le_data(env, env->isp, env->pc);
 
-        if (vec < 0x100) {
-            env->pc = cpu_ldl_le_data(env, 0xffffff80 + vec * 4);
-        } else {
+        assert(vec < RX_EXCP_COUNT);
+        if (vec >= RX_EXCP_TRAP_BASE) {
             env->pc = cpu_ldl_le_data(env, env->intb + (vec & 0xff) * 4);
+        } else {
+            env->pc = cpu_ldl_le_data(env, 0xffffff80 + vec * 4);
         }
 
-        if (vec == 30) {
+        if (vec == RX_EXCP_NMI) {
             /* Non-maskable interrupt */
             qemu_plugin_vcpu_interrupt_cb(cs, last_pc);
         } else {
@@ -100,22 +101,22 @@ void rx_cpu_do_interrupt(CPUState *cs)
         }
 
         switch (vec) {
-        case 20:
+        case RX_EXCP_PRIVILEGE_VIOLATION:
             expname = "privilege violation";
             break;
-        case 21:
+        case RX_EXCP_ACCESS:
             expname = "access exception";
             break;
-        case 23:
+        case RX_EXCP_ILLEGAL_INSTRUCTION:
             expname = "illegal instruction";
             break;
-        case 25:
+        case RX_EXCP_FPU:
             expname = "fpu exception";
             break;
-        case 30:
+        case RX_EXCP_NMI:
             expname = "non-maskable interrupt";
             break;
-        case 0x100 ... 0x1ff:
+        case RX_EXCP_TRAP_BASE ... RX_EXCP_TRAP_BASE + RX_EXCP_TRAP_COUNT - 1:
             expname = "unconditional trap";
         }
         qemu_log_mask(CPU_LOG_INT, "exception 0x%02x [%s] raised\n",
diff --git a/target/rx/op_helper.c b/target/rx/op_helper.c
index 6782912247e..d4e9ac2f192 100644
--- a/target/rx/op_helper.c
+++ b/target/rx/op_helper.c
@@ -115,7 +115,7 @@ static void update_fpsw(CPURXState *env, float32 ret, uintptr_t retaddr)
         enable = FIELD_EX32(env->fpsw, FPSW, ENABLE);
         enable |= 1 << 5; /* CE always enabled */
         if (cause & enable) {
-            raise_exception(env, 21, retaddr);
+            raise_exception(env, RX_EXCP_ACCESS, retaddr);
         }
     }
 }
@@ -432,17 +432,17 @@ void raise_exception(CPURXState *env, int index,
 
 G_NORETURN void helper_raise_privilege_violation(CPURXState *env)
 {
-    raise_exception(env, 20, GETPC());
+    raise_exception(env, RX_EXCP_PRIVILEGE_VIOLATION, GETPC());
 }
 
 G_NORETURN void helper_raise_access_fault(CPURXState *env)
 {
-    raise_exception(env, 21, GETPC());
+    raise_exception(env, RX_EXCP_ACCESS, GETPC());
 }
 
 G_NORETURN void helper_raise_illegal_instruction(CPURXState *env)
 {
-    raise_exception(env, 23, GETPC());
+    raise_exception(env, RX_EXCP_ILLEGAL_INSTRUCTION, GETPC());
 }
 
 G_NORETURN void helper_wait(CPURXState *env)
@@ -457,5 +457,5 @@ G_NORETURN void helper_wait(CPURXState *env)
 
 G_NORETURN void helper_trap(CPURXState *env, uint32_t vec)
 {
-    raise_exception(env, 0x100 + vec, 0);
+    raise_exception(env, RX_EXCP_TRAP_BASE + vec, 0);
 }
diff --git a/target/rx/translate.c b/target/rx/translate.c
index d0910fbf8e7..1bacc7adf92 100644
--- a/target/rx/translate.c
+++ b/target/rx/translate.c
@@ -2187,7 +2187,7 @@ static bool trans_BRK(DisasContext *ctx, arg_BRK *a)
 /* int #imm */
 static bool trans_INT(DisasContext *ctx, arg_INT *a)
 {
-    tcg_debug_assert(a->imm < 0x100);
+    tcg_debug_assert(a->imm < RX_EXCP_TRAP_COUNT);
     return do_trap(ctx, a->imm);
 }
 
-- 
2.53.0



^ permalink raw reply related	[flat|nested] 34+ messages in thread

* Re: [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp
  2026-09-29  5:23   ` Philippe Mathieu-Daudé
  2026-09-29  5:27     ` Yonggang Luo
@ 2026-09-30  7:53     ` Yonggang Luo
  1 sibling, 0 replies; 34+ messages in thread
From: Yonggang Luo @ 2026-09-30  7:53 UTC (permalink / raw)
  To: Philippe Mathieu-Daudé
  Cc: qemu-devel, Helge Deller, Harsh Prateek Bora, Weiwei Li,
	Brian Cain, Daniel Henrique Barboza, Max Filippov, Chao Liu,
	Aleksandar Rikalo, Philippe Mathieu-Daude, Matthew Rosato,
	Ilya Leoshkevich, Alistair Francis, Stafford Horne, Chinmay Rath,
	Nicholas Piggin, Yoshinori Sato, Peter Maydell, Artyom Tarasenko,
	Laurent Vivier, Jiaxun Yang, Palmer Dabbelt, Edgar E. Iglesias,
	Aurelien Jarno, Eric Farman, qemu-riscv, Richard Henderson,
	David Hildenbrand, Glenn Miles, Cornelia Huck, Mark Cave-Ayland,
	Song Gao, qemu-ppc, qemu-arm, Michael Rolnik, Pierrick Bouvier,
	Paolo Bonzini, qemu-s390x

On Tue, Sep 29, 2026 at 1:23 PM Philippe Mathieu-Daudé
<philmd@oss.qualcomm.com> wrote:
>
> On 28/9/26 07:20, Yonggang Luo wrote:
> > Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
> > cpu->exception_index, then restore and exit the current TB the same
> > way as cpu_loop_exit_restore.
> >
> > Signed-off-by: Yonggang Luo <luoyonggang@gmail.com>
> > ---
> >   accel/tcg/cpu-exec-common.c  |  6 ++++++
> >   include/accel/tcg/cpu-loop.h | 12 ++++++++++++
> >   2 files changed, 18 insertions(+)
> >
> > diff --git a/accel/tcg/cpu-exec-common.c b/accel/tcg/cpu-exec-common.c
> > index d20cece1c5f..31fed8e497f 100644
> > --- a/accel/tcg/cpu-exec-common.c
> > +++ b/accel/tcg/cpu-exec-common.c
> > @@ -118,6 +118,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..856091020f2 100644
> > --- a/include/accel/tcg/cpu-loop.h
> > +++ b/include/accel/tcg/cpu-loop.h
> > @@ -65,6 +65,18 @@ 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
>
> I'm not comfortable this is hidding the 'restore' part,
> not even mentioning no restore is done if host_pc==0.

After thinking, maybe it should be cpu_raise_excp and cpu_raise_excp_restore
That match the accel/tcg: add raise_excp and raise_excp_restore helpers?


>
> > + *
> > + * Set cpu->exception_index and exit the current TB, restoring
> > + * guest state from @host_pc the same way as cpu_loop_exit_restore.
> > + */
> > +G_NORETURN void cpu_loop_exit_excp(CPUState *cpu, int exception_index,
> > +                                   uintptr_t host_pc);
> > +
> >   /**
> >    * cpu_loop_exit:
> >    * @cpu: the cpu context
>


-- 
         此致
礼
罗勇刚
Yours
    sincerely,
Yonggang Luo


^ permalink raw reply	[flat|nested] 34+ messages in thread

end of thread, other threads:[~2026-09-30  7:54 UTC | newest]

Thread overview: 34+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2026-09-28  5:20 [PATCH v2 00/24] accel/tcg: share raise_excp across TCG targets Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 01/24] accel/tcg: move helper_exit_atomic next to cpu_loop_exit_atomic Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 02/24] accel/tcg: add cpu_loop_exit_excp Yonggang Luo
2026-09-29  5:23   ` Philippe Mathieu-Daudé
2026-09-29  5:27     ` Yonggang Luo
2026-09-30  7:53     ` Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 03/24] accel/tcg: add raise_excp and raise_excp_restore helpers Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 04/24] target/rx: name guest trap numbers RX_EXCP_* Yonggang Luo
2026-09-29  5:26   ` Philippe Mathieu-Daudé
2026-09-29  5:29     ` Yonggang Luo
2026-09-29  6:57       ` [PATCH 1/2] target/rx: Unify BRK and INT trap handling Philippe Mathieu-Daudé
2026-09-29  6:57         ` [PATCH 2/2] target/rx: Define exception vector constants Philippe Mathieu-Daudé
2026-09-28  5:20 ` [PATCH v2 05/24] target/rx: convert raises to raise_excp Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 06/24] target/sh4: name guest trap numbers SH4_EXCP_* Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 07/24] target/sh4: convert raises to raise_excp Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 08/24] target/m68k: " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 09/24] target/or1k: convert exception " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 10/24] target/microblaze: convert raise_exception " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 11/24] target/sparc: " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 12/24] target/loongarch: " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 13/24] target/hexagon: convert raise_exception to hexagon_raise_exception Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 14/24] target/hppa: convert excp to raise_excp Yonggang Luo
2026-09-29  5:21   ` Philippe Mathieu-Daudé
2026-09-28  5:20 ` [PATCH v2 15/24] target/alpha: " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 16/24] target/s390x: convert exception " Yonggang Luo
2026-09-28 17:42   ` Ilya Leoshkevich
2026-09-28  5:20 ` [PATCH v2 17/24] target/xtensa: add gen_yield for EXCP_YIELD Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 18/24] target/xtensa: convert exception to raise_excp Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 19/24] target/avr: convert debug/break/sleep " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 20/24] target/arm: convert exception_internal " Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 21/24] target/riscv: convert raise_exception to riscv_raise_exception Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 22/24] target/mips: convert raise_exception to raise_excp Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 23/24] target/ppc: fold gen_exception_nip into gen_exception_err_nip Yonggang Luo
2026-09-28  5:20 ` [PATCH v2 24/24] target/ppc: convert raise_exception to raise_excp Yonggang Luo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.