Commit 2b38607286 for qemu.org
commit 2b386072864da25299991c4ca3d30efdd9466376
Author: Richard Henderson <richard.henderson@linaro.org>
Date: Sat Aug 8 12:47:26 2026 -0700
target/sh4: Enable disassembly via capstone
Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com>
Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
diff --git a/include/disas/capstone.h b/include/disas/capstone.h
index 5c78824da2..788f90771a 100644
--- a/include/disas/capstone.h
+++ b/include/disas/capstone.h
@@ -71,4 +71,11 @@
#define CS_MODE_RISCV_VENTANA 0
#endif
+#if CS_API_MAJOR < 5
+#define CS_ARCH_SH -1
+#define CS_MODE_SHFPU 0
+#define CS_MODE_SH4 0
+#define CS_MODE_SH4A 0
+#endif
+
#endif /* QEMU_CAPSTONE_H */
diff --git a/target/sh4/cpu.c b/target/sh4/cpu.c
index ad2ec28c1b..3bbdee301d 100644
--- a/target/sh4/cpu.c
+++ b/target/sh4/cpu.c
@@ -28,6 +28,7 @@
#include "fpu/softfloat-helpers.h"
#include "accel/tcg/cpu-ops.h"
#include "tcg/tcg.h"
+#include "disas/capstone.h"
static void superh_cpu_set_pc(CPUState *cs, vaddr value)
{
@@ -167,10 +168,23 @@ static void superh_cpu_reset_hold(Object *obj, ResetType type)
static void superh_cpu_disas_set_info(const CPUState *cpu,
disassemble_info *info)
{
+ const CPUSH4State *env = cpu_env((CPUState *)cpu);
+
info->endian = TARGET_BIG_ENDIAN ? BFD_ENDIAN_BIG
: BFD_ENDIAN_LITTLE;
info->mach = bfd_mach_sh4;
info->print_insn = print_insn_sh;
+
+ info->cap_arch = CS_ARCH_SH;
+ info->cap_insn_unit = 2;
+ info->cap_insn_split = 2;
+ /*
+ * Possible capstone bug: the isa levels are not additive:
+ * least significant bit wins, so SH4 overrides SH4A.
+ * Work around by setting one or the other but not both.
+ */
+ info->cap_mode = CS_MODE_SHFPU
+ | (env->features & SH_FEATURE_SH4A ? CS_MODE_SH4A : CS_MODE_SH4);
}
static ObjectClass *superh_cpu_class_by_name(const char *cpu_model)