@samitouri / QOSamiQemu / commits / 3a002bbcdd

target/tricore: Enable disassembly via capstone

Reviewed-by: Philippe Mathieu-Daudé <philmd@oss.qualcomm.com> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>

Richard Henderson committed Aug 8, 2026 at 13:19 UTC 3a002bbcdd65030bc93f0435f91325f4ef5cb171
2 files changed +42
include/disas/capstone.h
+11
@@ -78,4 +78,15 @@
78 #define CS_MODE_SH4A 0
79 #endif
80
81 +#if CS_API_MAJOR < 5
82 +#define CS_ARCH_TRICORE -1
83 +#define CS_MODE_TRICORE_110 0
84 +#define CS_MODE_TRICORE_120 0
85 +#define CS_MODE_TRICORE_130 0
86 +#define CS_MODE_TRICORE_131 0
87 +#define CS_MODE_TRICORE_160 0
88 +#define CS_MODE_TRICORE_161 0
89 +#define CS_MODE_TRICORE_162 0
90 +#endif
91 +
92 #endif /* QEMU_CAPSTONE_H */
target/tricore/cpu.c
+31
@@ -24,6 +24,7 @@
24 #include "qemu/error-report.h"
25 #include "tcg/debug-assert.h"
26 #include "accel/tcg/cpu-ops.h"
27 +#include "disas/capstone.h"
28
29 static inline void set_feature(CPUTriCoreState *env, int feature)
30 {
@@ -35,6 +36,35 @@ static const gchar *tricore_gdb_arch_name(CPUState *cs)
36 return "tricore";
37 }
38
39 +static void tricore_disas_set_info(const CPUState *cpu, disassemble_info *info)
40 +{
41 + CPUTriCoreState *env = cpu_env((CPUState *)cpu);
42 +
43 + info->endian = BFD_ENDIAN_LITTLE;
44 + info->cap_arch = CS_ARCH_TRICORE;
45 + info->cap_insn_unit = 4;
46 + info->cap_insn_split = 4;
47 +
48 + /*
49 + * Possible capstone bug: the isa levels are not additive.
50 + * Work around by settiing only one.
51 + * Note that TriCore 1.3.0 is the earliest we support.
52 + */
53 + if (tricore_has_feature(env, TRICORE_FEATURE_162)) {
54 + info->cap_mode = CS_MODE_TRICORE_162;
55 + } else if (tricore_has_feature(env, TRICORE_FEATURE_161)) {
56 + info->cap_mode = CS_MODE_TRICORE_161;
57 + } else if (tricore_has_feature(env, TRICORE_FEATURE_16)) {
58 + info->cap_mode = CS_MODE_TRICORE_160;
59 + } else if (tricore_has_feature(env, TRICORE_FEATURE_131)) {
60 + info->cap_mode = CS_MODE_TRICORE_131;
61 + } else if (tricore_has_feature(env, TRICORE_FEATURE_13)) {
62 + info->cap_mode = CS_MODE_TRICORE_130;
63 + } else {
64 + g_assert_not_reached();
65 + }
66 +}
67 +
68 static void tricore_cpu_set_pc(CPUState *cs, vaddr value)
69 {
70 cpu_env(cs)->PC = value & ~1;
@@ -214,6 +244,7 @@ static void tricore_cpu_class_init(ObjectClass *c, const void *data)
244 cc->gdb_write_register = tricore_cpu_gdb_write_register;
245 cc->gdb_num_core_regs = 44;
246 cc->gdb_arch_name = tricore_gdb_arch_name;
247 + cc->disas_set_info = tricore_disas_set_info;
248
249 cc->dump_state = tricore_cpu_dump_state;
250 cc->set_pc = tricore_cpu_set_pc;