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 a shared TCG helper, then
converts one target per commit. Joiners call gen_helper_raise_excp
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 helper only touches
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.
- Add cpu_loop_exit_excp next to cpu_loop_exit_restore. Set
cpu->exception_index then restore and exit. host_pc == 0 skips
restore.
- Move helper_info_* extern into each gen_helper_* body so a
comment on DEF_HELPER attaches to gen_helper_*, not helper_info_*.
- Add TCG raise_excp (env, exception, restore). restore 1 exits
with GETPC(); restore 0 skips unwind.
- Convert RX and SH4: name guest traps RX_EXCP_* / SH4_EXCP_*.
Join privilege, illegal, BRK, and INT on RX, and illegal /
FPU-disable on SH4. Prefix leftover rx_wait. 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.
- Prefix leftover TCG helpers that still do extra work:
i386_raise_exception, riscv_raise_exception, and
hexagon_raise_exception. Prefix leftover wait as mips_wait and
hexagon_wait. Tricore raise_exception_sync does not join.
Yonggang Luo (21):
accel/tcg: add cpu_loop_exit_excp
helper-gen: move helper_info extern into gen_helper
accel/tcg: add helper raise_excp
target/rx: convert raises to raise_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: 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: convert raise_exception to raise_excp
target/i386: convert raise_exception to i386_raise_exception
accel/tcg/cpu-exec-common.c | 6 ++
accel/tcg/tcg-runtime.c | 6 ++
accel/tcg/tcg-runtime.h | 11 +++
include/accel/tcg/cpu-loop.h | 13 +++
include/exec/helper-gen.h.inc | 24 ++++--
target/alpha/helper.c | 11 ---
target/alpha/helper.h | 1 -
target/alpha/translate.c | 9 +-
target/arm/internals.h | 27 ++++--
target/arm/tcg-stubs.c | 4 +-
target/arm/tcg/helper-defs.h | 1 -
target/arm/tcg/m_helper.c | 3 +-
target/arm/tcg/op_helper.c | 43 +++-------
target/arm/tcg/translate.c | 2 +-
target/avr/helper.c | 24 ------
target/avr/helper.h | 3 -
target/avr/translate.c | 6 +-
target/hexagon/cpu.c | 13 +--
target/hexagon/cpu.h | 2 +-
target/hexagon/gen_tcg_sys.h | 2 +-
target/hexagon/helper.h | 5 +-
target/hexagon/internal.h | 5 --
target/hexagon/macros.h | 2 +-
target/hexagon/op_helper.c | 37 ++++-----
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 | 3 +-
target/i386/helper.h | 2 +-
target/i386/tcg/excp_helper.c | 18 ++--
target/i386/tcg/helper-tcg.h | 42 ++++++++--
target/i386/tcg/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 | 3 +-
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 | 3 +-
target/mips/helper.h | 6 +-
target/mips/tcg/exception.c | 22 +----
target/mips/tcg/fpu_helper.c | 6 +-
target/mips/tcg/translate.c | 13 ++-
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 | 23 +++---
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 | 13 +++
target/rx/helper.c | 16 ++--
target/rx/helper.h | 7 +-
target/rx/op_helper.c | 46 +----------
target/rx/translate.c | 19 +++--
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 | 24 ++++++
target/sh4/helper.c | 82 ++++++++++---------
target/sh4/helper.h | 4 -
target/sh4/op_helper.c | 43 ++--------
target/sh4/translate.c | 17 +++-
target/sparc/helper.c | 21 +----
target/sparc/helper.h | 2 -
target/sparc/translate.c | 7 +-
target/xtensa/cpu.h | 1 +
target/xtensa/exc_helper.c | 13 ++-
target/xtensa/helper.h | 1 -
target/xtensa/translate.c | 7 +-
target/xtensa/win_helper.c | 12 +--
89 files changed, 399 insertions(+), 577 deletions(-)
delete mode 100644 target/or1k/exception.c
--
2.52.0.windows.1