Skip to content

Commit 2c380fd

Browse files
committed
rs: add TriCore support from capstone 5.0.6
1 parent 5bfa974 commit 2c380fd

File tree

9 files changed

+1076
-0
lines changed

9 files changed

+1076
-0
lines changed

capstone-rs/src/arch/mod.rs

+22
Original file line numberDiff line numberDiff line change
@@ -328,6 +328,21 @@ macro_rules! arch_info_base {
328328
( syntax: )
329329
( both_endian: true )
330330
]
331+
[
332+
( tricore, TriCore )
333+
( mode:
334+
TriCore110,
335+
TriCore120,
336+
TriCore130,
337+
TriCore131,
338+
TriCore160,
339+
TriCore161,
340+
TriCore162,
341+
)
342+
( extra_modes: )
343+
( syntax: )
344+
( both_endian: true )
345+
]
331346
[
332347
( x86, X86 )
333348
( mode:
@@ -530,6 +545,13 @@ macro_rules! detail_arch_base {
530545
/// Returns the Tms320c64x details, if any
531546
=> arch_name = tms320c64x,
532547
]
548+
[
549+
detail = TriCoreDetail,
550+
insn_detail = TriCoreInsnDetail<'a>,
551+
op = TriCoreOperand,
552+
/// Returns the TriCore details, if any
553+
=> arch_name = tricore,
554+
]
533555
[
534556
detail = X86Detail,
535557
insn_detail = X86InsnDetail<'a>,

capstone-rs/src/arch/tricore.rs

+91
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
//! Contains tricore-specific types
2+
3+
use core::convert::From;
4+
use core::{cmp, fmt, slice};
5+
6+
pub use capstone_sys::tricore_insn as TriCoreInsn;
7+
pub use capstone_sys::tricore_insn_group as TriCoreInsnGroup;
8+
pub use capstone_sys::tricore_reg as TriCoreReg;
9+
use capstone_sys::{cs_tricore, cs_tricore_op, tricore_op_mem, tricore_op_type};
10+
11+
pub use crate::arch::arch_builder::tricore::*;
12+
use crate::arch::DetailsArchInsn;
13+
use crate::instruction::{RegId, RegIdInt};
14+
15+
/// Contains tricore-specific details for an instruction
16+
pub struct TriCoreInsnDetail<'a>(pub(crate) &'a cs_tricore);
17+
18+
impl_PartialEq_repr_fields!(TriCoreInsnDetail<'a> [ 'a ];
19+
operands
20+
);
21+
22+
/// tricore operand
23+
#[derive(Clone, Debug, Eq, PartialEq)]
24+
pub enum TriCoreOperand {
25+
/// Register
26+
Reg(RegId),
27+
28+
/// Immediate
29+
Imm(i32),
30+
31+
/// Memory
32+
Mem(TriCoreOpMem),
33+
34+
/// Invalid
35+
Invalid,
36+
}
37+
38+
impl Default for TriCoreOperand {
39+
fn default() -> Self {
40+
TriCoreOperand::Invalid
41+
}
42+
}
43+
44+
/// tricore memory operand
45+
#[derive(Debug, Copy, Clone)]
46+
pub struct TriCoreOpMem(pub(crate) tricore_op_mem);
47+
48+
impl TriCoreOpMem {
49+
/// Base register
50+
pub fn base(&self) -> RegId {
51+
RegId(RegIdInt::from(self.0.base))
52+
}
53+
54+
/// Disp value
55+
pub fn disp(&self) -> i32 {
56+
self.0.disp
57+
}
58+
}
59+
60+
impl_PartialEq_repr_fields!(TriCoreOpMem;
61+
base, disp
62+
);
63+
64+
impl cmp::Eq for TriCoreOpMem {}
65+
66+
impl From<&cs_tricore_op> for TriCoreOperand {
67+
fn from(insn: &cs_tricore_op) -> TriCoreOperand {
68+
match insn.type_ {
69+
tricore_op_type::TRICORE_OP_REG => {
70+
TriCoreOperand::Reg(RegId(unsafe { insn.__bindgen_anon_1.reg } as RegIdInt))
71+
}
72+
tricore_op_type::TRICORE_OP_IMM => {
73+
TriCoreOperand::Imm(unsafe { insn.__bindgen_anon_1.imm })
74+
}
75+
tricore_op_type::TRICORE_OP_MEM => {
76+
TriCoreOperand::Mem(TriCoreOpMem(unsafe { insn.__bindgen_anon_1.mem }))
77+
}
78+
tricore_op_type::TRICORE_OP_INVALID => TriCoreOperand::Invalid,
79+
}
80+
}
81+
}
82+
83+
def_arch_details_struct!(
84+
InsnDetail = TriCoreInsnDetail;
85+
Operand = TriCoreOperand;
86+
OperandIterator = TriCoreOperandIterator;
87+
OperandIteratorLife = TriCoreOperandIterator<'a>;
88+
[ pub struct TriCoreOperandIterator<'a>(slice::Iter<'a, cs_tricore_op>); ]
89+
cs_arch_op = cs_tricore_op;
90+
cs_arch = cs_tricore;
91+
);

capstone-rs/src/constants.rs

+16
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,8 @@ define_cs_enum_wrapper!(
216216
=> M68K = CS_ARCH_M68K;
217217
/// Texas Instruments TMS320C64x
218218
=> TMS320C64X = CS_ARCH_TMS320C64X;
219+
/// TriCore
220+
=> TriCore = CS_ARCH_TRICORE;
219221
/// Motorola 68000
220222
=> M680X = CS_ARCH_M680X;
221223
/// EVM
@@ -293,6 +295,20 @@ define_cs_enum_wrapper!(
293295
=> Cbpf = { cs_mode::CS_MODE_BPF_CLASSIC };
294296
/// Extended BPF mode
295297
=> Ebpf = { cs_mode::CS_MODE_BPF_EXTENDED };
298+
/// TriCore 1.1
299+
=> TriCore110 = { cs_mode::CS_MODE_TRICORE_110 };
300+
/// TriCore 1.2
301+
=> TriCore120 = { cs_mode::CS_MODE_TRICORE_120 };
302+
/// TriCore 1.3
303+
=> TriCore130 = { cs_mode::CS_MODE_TRICORE_130 };
304+
/// TriCore 1.3.1
305+
=> TriCore131 = { cs_mode::CS_MODE_TRICORE_131 };
306+
/// TriCore 1.6
307+
=> TriCore160 = { cs_mode::CS_MODE_TRICORE_160 };
308+
/// TriCore 1.6.1
309+
=> TriCore161 = { cs_mode::CS_MODE_TRICORE_161 };
310+
/// TriCore 1.6.2
311+
=> TriCore162 = { cs_mode::CS_MODE_TRICORE_162 };
296312
/// Default mode for little-endian
297313
=> Default = { cs_mode::CS_MODE_LITTLE_ENDIAN };
298314
);

capstone-rs/src/instruction.rs

+1
Original file line numberDiff line numberDiff line change
@@ -495,6 +495,7 @@ impl InsnDetail<'_> {
495495
[RISCV, RiscVDetail, RiscVInsnDetail, riscv]
496496
[SPARC, SparcDetail, SparcInsnDetail, sparc]
497497
[TMS320C64X, Tms320c64xDetail, Tms320c64xInsnDetail, tms320c64x]
498+
[TriCore, TriCoreDetail, TriCoreInsnDetail, tricore]
498499
[X86, X86Detail, X86InsnDetail, x86]
499500
[XCORE, XcoreDetail, XcoreInsnDetail, xcore]
500501
[BPF, BpfDetail, BpfInsnDetail, bpf]

capstone-rs/src/test.rs

+50
Original file line numberDiff line numberDiff line change
@@ -3717,3 +3717,53 @@ fn test_regs_tms320c64x() {
37173717
CsResult::Err(Error::UnsupportedArch),
37183718
);
37193719
}
3720+
3721+
#[test]
3722+
fn test_arch_tricore() {
3723+
test_arch_mode_endian_insns(
3724+
&mut Capstone::new()
3725+
.tricore()
3726+
.mode(tricore::ArchMode::TriCore162)
3727+
.build()
3728+
.unwrap(),
3729+
Arch::TriCore,
3730+
Mode::TriCore162,
3731+
None,
3732+
&[],
3733+
&[("ld.a", b"\x09\xcf\xbc\xf5")],
3734+
);
3735+
}
3736+
3737+
#[test]
3738+
fn test_arch_tricore_detail() {
3739+
use crate::arch::tricore::TriCoreOpMem;
3740+
use crate::arch::tricore::TriCoreOperand;
3741+
use capstone_sys::tricore_op_mem;
3742+
use capstone_sys::tricore_reg::*;
3743+
3744+
test_arch_mode_endian_insns_detail(
3745+
&mut Capstone::new()
3746+
.tricore()
3747+
.mode(tricore::ArchMode::TriCore162)
3748+
.build()
3749+
.unwrap(),
3750+
Arch::TriCore,
3751+
Mode::TriCore162,
3752+
None,
3753+
&[],
3754+
&[
3755+
// ld.a a15, [+a12]#-4
3756+
DII::new(
3757+
"ld.a",
3758+
b"\x09\xcf\xbc\xf5",
3759+
&[
3760+
TriCoreOperand::Reg(RegId(TRICORE_REG_A15 as RegIdInt)),
3761+
TriCoreOperand::Mem(TriCoreOpMem(tricore_op_mem {
3762+
base: TRICORE_REG_A12 as u8,
3763+
disp: -4,
3764+
})),
3765+
],
3766+
),
3767+
],
3768+
);
3769+
}

capstone-sys/build.rs

+1
Original file line numberDiff line numberDiff line change
@@ -130,6 +130,7 @@ fn build_capstone_cc() {
130130
.define("CAPSTONE_HAS_SPARC", None)
131131
.define("CAPSTONE_HAS_SYSZ", None)
132132
.define("CAPSTONE_HAS_TMS320C64X", None)
133+
.define("CAPSTONE_HAS_TRICORE", None)
133134
.define("CAPSTONE_HAS_WASM", None)
134135
.define("CAPSTONE_HAS_X86", None)
135136
.define("CAPSTONE_HAS_XCORE", None)

capstone-sys/common.rs

+4
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,10 @@ pub static ARCH_INCLUDES: &[CapstoneArchInfo<'static>] = &[
6969
header_name: "tms320c64x.h",
7070
cs_name: "tms320c64x",
7171
},
72+
CapstoneArchInfo {
73+
header_name: "tricore.h",
74+
cs_name: "tricore",
75+
},
7276
CapstoneArchInfo {
7377
header_name: "x86.h",
7478
cs_name: "x86",

0 commit comments

Comments
 (0)