Skip to content

Commit ade427c

Browse files
committed
rust: add AVR architecture support.
Signed-off-by: Glenn Baker <[email protected]>
1 parent 48be7b5 commit ade427c

File tree

4 files changed

+224
-1
lines changed

4 files changed

+224
-1
lines changed

bindings/rust/build.rs

+3
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,9 @@ fn build_with_cmake() {
116116
if std::env::var("CARGO_FEATURE_ARCH_TRICORE").is_ok() {
117117
archs.push_str("tricore;");
118118
}
119+
if std::env::var("CARGO_FEATURE_ARCH_AVR").is_ok() {
120+
archs.push_str("avr;");
121+
}
119122

120123
if !archs.is_empty() {
121124
archs.pop();

bindings/rust/src/avr.rs

+211
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,211 @@
1+
#![allow(non_camel_case_types)]
2+
// For Unicorn Engine. AUTO-GENERATED FILE, DO NOT EDIT
3+
4+
#[repr(C)]
5+
#[derive(PartialEq, Debug, Clone, Copy)]
6+
pub enum RegisterAVR {
7+
INVALID = 0,
8+
9+
// General purpose registers (GPR)
10+
R0 = 1,
11+
R1 = 2,
12+
R2 = 3,
13+
R3 = 4,
14+
R4 = 5,
15+
R5 = 6,
16+
R6 = 7,
17+
R7 = 8,
18+
R8 = 9,
19+
R9 = 10,
20+
R10 = 11,
21+
R11 = 12,
22+
R12 = 13,
23+
R13 = 14,
24+
R14 = 15,
25+
R15 = 16,
26+
R16 = 17,
27+
R17 = 18,
28+
R18 = 19,
29+
R19 = 20,
30+
R20 = 21,
31+
R21 = 22,
32+
R22 = 23,
33+
R23 = 24,
34+
R24 = 25,
35+
R25 = 26,
36+
R26 = 27,
37+
R27 = 28,
38+
R28 = 29,
39+
R29 = 30,
40+
R30 = 31,
41+
R31 = 32,
42+
43+
PC = 33,
44+
SP = 34,
45+
46+
RAMPD = 57,
47+
RAMPX = 58,
48+
RAMPY = 59,
49+
RAMPZ = 60,
50+
EIND = 61,
51+
SPL = 62,
52+
SPH = 63,
53+
SREG = 64,
54+
55+
// 16-bit coalesced registers
56+
R0W = 65,
57+
R1W = 66,
58+
R2W = 67,
59+
R3W = 68,
60+
R4W = 69,
61+
R5W = 70,
62+
R6W = 71,
63+
R7W = 72,
64+
R8W = 73,
65+
R9W = 74,
66+
R10W = 75,
67+
R11W = 76,
68+
R12W = 77,
69+
R13W = 78,
70+
R14W = 79,
71+
R15W = 80,
72+
R16W = 81,
73+
R17W = 82,
74+
R18W = 83,
75+
R19W = 84,
76+
R20W = 85,
77+
R21W = 86,
78+
R22W = 87,
79+
R23W = 88,
80+
R24W = 89,
81+
R25W = 90,
82+
R26W = 91,
83+
R27W = 92,
84+
R28W = 93,
85+
R29W = 94,
86+
R30W = 95,
87+
88+
// 32-bit coalesced registers
89+
R0D = 97,
90+
R1D = 98,
91+
R2D = 99,
92+
R3D = 100,
93+
R4D = 101,
94+
R5D = 102,
95+
R6D = 103,
96+
R7D = 104,
97+
R8D = 105,
98+
R9D = 106,
99+
R10D = 107,
100+
R11D = 108,
101+
R12D = 109,
102+
R13D = 110,
103+
R14D = 111,
104+
R15D = 112,
105+
R16D = 113,
106+
R17D = 114,
107+
R18D = 115,
108+
R19D = 116,
109+
R20D = 117,
110+
R21D = 118,
111+
R22D = 119,
112+
R23D = 120,
113+
R24D = 121,
114+
R25D = 122,
115+
R26D = 123,
116+
R27D = 124,
117+
R28D = 125,
118+
}
119+
120+
impl RegisterAVR {
121+
// alias registers
122+
// (assoc) Xhi = 28
123+
// (assoc) Xlo = 27
124+
// (assoc) Yhi = 30
125+
// (assoc) Ylo = 29
126+
// (assoc) Zhi = 32
127+
// (assoc) Zlo = 31
128+
pub const XHI: RegisterAVR = RegisterAVR::R27;
129+
pub const XLO: RegisterAVR = RegisterAVR::R26;
130+
pub const YHI: RegisterAVR = RegisterAVR::R29;
131+
pub const YLO: RegisterAVR = RegisterAVR::R28;
132+
pub const ZHI: RegisterAVR = RegisterAVR::R31;
133+
pub const ZLO: RegisterAVR = RegisterAVR::R30;
134+
135+
// (assoc) X = 91
136+
// (assoc) Y = 93
137+
// (assoc) Z = 95
138+
pub const X: RegisterAVR = RegisterAVR::R26W;
139+
pub const Y: RegisterAVR = RegisterAVR::R28W;
140+
pub const Z: RegisterAVR = RegisterAVR::R30W;
141+
}
142+
143+
impl From<RegisterAVR> for i32 {
144+
fn from(r: RegisterAVR) -> Self {
145+
r as i32
146+
}
147+
}
148+
149+
#[repr(C)]
150+
#[derive(PartialEq, Debug, Clone, Copy)]
151+
pub enum AvrArch {
152+
UC_AVR_ARCH_AVR1 = 10,
153+
UC_AVR_ARCH_AVR2 = 20,
154+
UC_AVR_ARCH_AVR25 = 25,
155+
UC_AVR_ARCH_AVR3 = 30,
156+
UC_AVR_ARCH_AVR4 = 40,
157+
UC_AVR_ARCH_AVR5 = 50,
158+
UC_AVR_ARCH_AVR51 = 51,
159+
UC_AVR_ARCH_AVR6 = 60,
160+
}
161+
162+
impl From<AvrArch> for i32 {
163+
fn from(value: AvrArch) -> Self {
164+
value as i32
165+
}
166+
}
167+
168+
impl From<&AvrArch> for i32 {
169+
fn from(value: &AvrArch) -> Self {
170+
*value as i32
171+
}
172+
}
173+
174+
#[repr(C)]
175+
#[derive(PartialEq, Debug, Clone, Copy)]
176+
pub enum AvrCpuModel {
177+
UC_CPU_AVR_ATMEGA16 = 50016,
178+
UC_CPU_AVR_ATMEGA32 = 50032,
179+
UC_CPU_AVR_ATMEGA64 = 50064,
180+
UC_CPU_AVR_ATMEGA128 = 51128,
181+
UC_CPU_AVR_ATMEGA128RFR2 = 51129,
182+
UC_CPU_AVR_ATMEGA1280 = 51130,
183+
UC_CPU_AVR_ATMEGA256 = 60256,
184+
UC_CPU_AVR_ATMEGA256RFR2 = 60257,
185+
UC_CPU_AVR_ATMEGA2560 = 60258,
186+
}
187+
188+
impl From<AvrCpuModel> for i32 {
189+
fn from(value: AvrCpuModel) -> Self {
190+
value as i32
191+
}
192+
}
193+
194+
impl From<&AvrCpuModel> for i32 {
195+
fn from(value: &AvrCpuModel) -> Self {
196+
*value as i32
197+
}
198+
}
199+
200+
#[repr(i32)]
201+
#[derive(Debug, PartialEq, Eq, Copy, Clone)]
202+
pub enum AvrMem {
203+
// Flash program memory (code)
204+
FLASH = 0x08000000,
205+
}
206+
207+
impl From<AvrMem> for i32 {
208+
fn from(r: AvrMem) -> Self {
209+
r as i32
210+
}
211+
}

bindings/rust/src/lib.rs

+8
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,12 @@ mod arm64;
6161
#[cfg(feature = "arch_arm")]
6262
pub use crate::arm64::*;
6363

64+
// include avr support if conditionally compiled in
65+
#[cfg(feature = "arch_avr")]
66+
mod avr;
67+
#[cfg(feature = "arch_avr")]
68+
pub use crate::avr::*;
69+
6470
// include m68k support if conditionally compiled in
6571
#[cfg(feature = "arch_m68k")]
6672
mod m68k;
@@ -1005,6 +1011,8 @@ impl<'a, D> Unicorn<'a, D> {
10051011
Arch::S390X => Ok(RegisterS390X::PC as i32),
10061012
#[cfg(feature = "arch_tricore")]
10071013
Arch::TRICORE => Ok(RegisterTRICORE::PC as i32),
1014+
#[cfg(feature = "arch_avr")]
1015+
Arch::AVR => Ok(RegisterAVR::PC as i32),
10081016
// returns `uc_error::ARCH` for `Arch::MAX`, and any
10091017
// other architecture that are not compiled in
10101018
_ => Err(uc_error::ARCH),

bindings/rust/src/unicorn_const.rs

+2-1
Original file line numberDiff line numberDiff line change
@@ -175,7 +175,8 @@ pub enum Arch {
175175
RISCV = 8,
176176
S390X = 9,
177177
TRICORE = 10,
178-
MAX = 11,
178+
AVR = 11,
179+
MAX = 12,
179180
}
180181

181182
impl TryFrom<usize> for Arch {

0 commit comments

Comments
 (0)