1 use crate::common::Register;
2 
3 macro_rules! registers {
4     ($struct_name:ident, { $($name:ident = ($val:expr, $disp:expr)),+ $(,)? }) => {
5         #[allow(missing_docs)]
6         impl $struct_name {
7             $(
8                 pub const $name: Register = Register($val);
9             )+
10         }
11 
12         impl $struct_name {
13             /// The name of a register, or `None` if the register number is unknown.
14             pub fn register_name(register: Register) -> Option<&'static str> {
15                 match register {
16                     $(
17                         Self::$name => Some($disp),
18                     )+
19                     _ => return None,
20                 }
21             }
22 
23 	    /// Converts a register name into a register number.
24 	    pub fn name_to_register(value: &str) -> Option<Register> {
25 		match value {
26                     $(
27                         $disp => Some(Self::$name),
28                     )+
29                     _ => return None,
30 		}
31 	    }
32         }
33     };
34 }
35 
36 /// ARM architecture specific definitions.
37 ///
38 /// See [DWARF for the ARM Architecture](http://infocenter.arm.com/help/topic/com.arm.doc.ihi0040b/IHI0040B_aadwarf.pdf).
39 #[derive(Debug, Clone, Copy)]
40 pub struct Arm;
41 
42 // TODO: add more registers.
43 registers!(Arm, {
44     R0 = (0, "R0"),
45     R1 = (1, "R1"),
46     R2 = (2, "R2"),
47     R3 = (3, "R3"),
48     R4 = (4, "R4"),
49     R5 = (5, "R5"),
50     R6 = (6, "R6"),
51     R7 = (7, "R7"),
52     R8 = (8, "R8"),
53     R9 = (9, "R9"),
54     R10 = (10, "R10"),
55     R11 = (11, "R11"),
56     R12 = (12, "R12"),
57     R13 = (13, "R13"),
58     R14 = (14, "R14"),
59     R15 = (15, "R15"),
60 });
61 
62 /// Intel i386 architecture specific definitions.
63 ///
64 /// See Intel386 psABi version 1.1 at the [X86 psABI wiki](https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI).
65 #[derive(Debug, Clone, Copy)]
66 pub struct X86;
67 
68 registers!(X86, {
69     EAX = (0, "eax"),
70     ECX = (1, "ecx"),
71     EDX = (2, "edx"),
72     EBX = (3, "ebx"),
73     ESP = (4, "esp"),
74     EBP = (5, "ebp"),
75     ESI = (6, "esi"),
76     EDI = (7, "edi"),
77 
78     // Return Address register. This is stored in `0(%esp, "")` and is not a physical register.
79     RA = (8, "RA"),
80 
81     ST0 = (11, "st0"),
82     ST1 = (12, "st1"),
83     ST2 = (13, "st2"),
84     ST3 = (14, "st3"),
85     ST4 = (15, "st4"),
86     ST5 = (16, "st5"),
87     ST6 = (17, "st6"),
88     ST7 = (18, "st7"),
89 
90     XMM0 = (21, "xmm0"),
91     XMM1 = (22, "xmm1"),
92     XMM2 = (23, "xmm2"),
93     XMM3 = (24, "xmm3"),
94     XMM4 = (25, "xmm4"),
95     XMM5 = (26, "xmm5"),
96     XMM6 = (27, "xmm6"),
97     XMM7 = (28, "xmm7"),
98 
99     MM0 = (29, "mm0"),
100     MM1 = (30, "mm1"),
101     MM2 = (31, "mm2"),
102     MM3 = (32, "mm3"),
103     MM4 = (33, "mm4"),
104     MM5 = (34, "mm5"),
105     MM6 = (35, "mm6"),
106     MM7 = (36, "mm7"),
107 
108     MXCSR = (39, "mxcsr"),
109 
110     ES = (40, "es"),
111     CS = (41, "cs"),
112     SS = (42, "ss"),
113     DS = (43, "ds"),
114     FS = (44, "fs"),
115     GS = (45, "gs"),
116 
117     TR = (48, "tr"),
118     LDTR = (49, "ldtr"),
119 
120     FS_BASE = (93, "fs.base"),
121     GS_BASE = (94, "gs.base"),
122 });
123 
124 /// AMD64 architecture specific definitions.
125 ///
126 /// See x86-64 psABI version 1.0 at the [X86 psABI wiki](https://github.com/hjl-tools/x86-psABI/wiki/X86-psABI).
127 #[derive(Debug, Clone, Copy)]
128 pub struct X86_64;
129 
130 registers!(X86_64, {
131     RAX = (0, "rax"),
132     RDX = (1, "rdx"),
133     RCX = (2, "rcx"),
134     RBX = (3, "rbx"),
135     RSI = (4, "rsi"),
136     RDI = (5, "rdi"),
137     RBP = (6, "rbp"),
138     RSP = (7, "rsp"),
139 
140     R8 = (8, "r8"),
141     R9 = (9, "r9"),
142     R10 = (10, "r10"),
143     R11 = (11, "r11"),
144     R12 = (12, "r12"),
145     R13 = (13, "r13"),
146     R14 = (14, "r14"),
147     R15 = (15, "r15"),
148 
149     // Return Address register. This is stored in `0(%rsp, "")` and is not a physical register.
150     RA = (16, "RA"),
151 
152     XMM0 = (17, "xmm0"),
153     XMM1 = (18, "xmm1"),
154     XMM2 = (19, "xmm2"),
155     XMM3 = (20, "xmm3"),
156     XMM4 = (21, "xmm4"),
157     XMM5 = (22, "xmm5"),
158     XMM6 = (23, "xmm6"),
159     XMM7 = (24, "xmm7"),
160 
161     XMM8 = (25, "xmm8"),
162     XMM9 = (26, "xmm9"),
163     XMM10 = (27, "xmm10"),
164     XMM11 = (28, "xmm11"),
165     XMM12 = (29, "xmm12"),
166     XMM13 = (30, "xmm13"),
167     XMM14 = (31, "xmm14"),
168     XMM15 = (32, "xmm15"),
169 
170     ST0 = (33, "st0"),
171     ST1 = (34, "st1"),
172     ST2 = (35, "st2"),
173     ST3 = (36, "st3"),
174     ST4 = (37, "st4"),
175     ST5 = (38, "st5"),
176     ST6 = (39, "st6"),
177     ST7 = (40, "st7"),
178 
179     MM0 = (41, "mm0"),
180     MM1 = (42, "mm1"),
181     MM2 = (43, "mm2"),
182     MM3 = (44, "mm3"),
183     MM4 = (45, "mm4"),
184     MM5 = (46, "mm5"),
185     MM6 = (47, "mm6"),
186     MM7 = (48, "mm7"),
187 
188     RFLAGS = (49, "rFLAGS"),
189     ES = (50, "es"),
190     CS = (51, "cs"),
191     SS = (52, "ss"),
192     DS = (53, "ds"),
193     FS = (54, "fs"),
194     GS = (55, "gs"),
195 
196     FS_BASE = (58, "fs.base"),
197     GS_BASE = (59, "gs.base"),
198 
199     TR = (62, "tr"),
200     LDTR = (63, "ldtr"),
201     MXCSR = (64, "mxcsr"),
202     FCW = (65, "fcw"),
203     FSW = (66, "fsw"),
204 
205     XMM16 = (67, "xmm16"),
206     XMM17 = (68, "xmm17"),
207     XMM18 = (69, "xmm18"),
208     XMM19 = (70, "xmm19"),
209     XMM20 = (71, "xmm20"),
210     XMM21 = (72, "xmm21"),
211     XMM22 = (73, "xmm22"),
212     XMM23 = (74, "xmm23"),
213     XMM24 = (75, "xmm24"),
214     XMM25 = (76, "xmm25"),
215     XMM26 = (77, "xmm26"),
216     XMM27 = (78, "xmm27"),
217     XMM28 = (79, "xmm28"),
218     XMM29 = (80, "xmm29"),
219     XMM30 = (81, "xmm30"),
220     XMM31 = (82, "xmm31"),
221 
222     K0 = (118, "k0"),
223     K1 = (119, "k1"),
224     K2 = (120, "k2"),
225     K3 = (121, "k3"),
226     K4 = (122, "k4"),
227     K5 = (123, "k5"),
228     K6 = (124, "k6"),
229     K7 = (125, "k7"),
230 });
231