1
2 import envi.bits as e_bits
3 from envi.bits import binary
4 import envi.bintree as e_btree
5
6 import envi.archs.arm.disasm as arm_dis
7 import envi.archs.arm.armdisasm as arm_armdis
8 import envi.archs.arm.regs as arm_reg
9
10 thumb_32 = [
11 binary('11101'),
12 binary('11110'),
13 binary('11111'),
14 ]
15
16 O_REG = 0
17 O_IMM = 1
18
20 return (value >> shval) & mask
21
24 self.operdef = operdef
25
27 ret = []
28 for otype, shval, mask in self.operdef:
29 oval = shmaskval(value, shval, mask)
30
31 ret.append( (value >> shval) )
32
33 imm5_rm_rd = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7), (O_IMM, 6, 0x1f))
34 rm_rn_rd = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7), (O_REG, 6, 0x7))
35 imm3_rn_rd = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7), (O_IMM, 6, 0x7))
36 imm8_rd = simpleops((O_REG, 8, 0x7), (O_IMM, 0, 0xff))
37 rm_rd = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7))
38 rn_rdm = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7))
39 rm_rdn = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7))
40 rm_rd_imm0 = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7), (O_IMM, 0, 0))
41 rm4_shift3 = simpleops((O_REG, 3, 0xf))
42 rm_rn_rt = simpleops((O_REG, 0, 0x7), (O_REG, 3, 0x7), (O_REG, 6, 0x7))
43 imm8 = simpleops((O_IMM, 8, 0xff))
44 imm11 = simpleops((O_IMM, 11, 0x7ff))
45
46 sh4_imm1 = simpleops((O_IMM, 3, 0x1))
47
54
62
70
78
80 rd = shmask(value, 8, 0x7)
81 imm = shmask(value, 0, 0xff)
82 oper0 = arm_dis.ArmRegOper(rd)
83
84 oper1 = arm_dis.ArmImmOper(va+imm)
85 return oper0,oper1
86
93
95 rd = shmask(value, 8, 0x7)
96 reg_list = value & 0xff
97 oper0 = arm_dis.ArmRegOper(rd)
98 oper1 = arm_dis.ArmRegListOper(reg_list)
99 flags = 1<<11
100 return oper0,oper1
101
108
110 rm = shmask(value, 8, 0x7)
111 reglist = value & 0xff
112 oper0 = arm_dis.ArmRegOper(rm)
113 oper1 = arm_dis.ArmReglistOper(reglist)
114 return oper0,oper1
115
116
117
118
119
120
121 thumb_table = [
122 ('00000', ('lsl', imm5_rm_rd, 0)),
123 ('00001', ('lsr', imm5_rm_rd, 0)),
124 ('00010', ('asr', imm5_rm_rd, 0)),
125 ('0001100', ('add', rm_rn_rd, 0)),
126 ('0001101', ('sub', rm_rn_rd, 0)),
127 ('0001110', ('add', imm3_rn_rd, 0)),
128 ('0001111', ('sub', imm3_rn_rd, 0)),
129 ('00100', ('mov', imm8_rd, 0)),
130 ('00101', ('cmp', imm8_rd, 0)),
131 ('00110', ('add', imm8_rd, 0)),
132 ('00111', ('sub', imm8_rd, 0)),
133
134 ('0100000000', ('and', rm_rdn, 0)),
135 ('0100000001', ('eor', rm_rdn, 0)),
136 ('0100000010', ('lsl', rm_rdn, 0)),
137 ('0100000011', ('lsr', rm_rdn, 0)),
138 ('0100000100', ('asr', rm_rdn, 0)),
139 ('0100000101', ('adc', rm_rdn, 0)),
140 ('0100000110', ('sbc', rm_rdn, 0)),
141 ('0100000111', ('ror', rm_rdn, 0)),
142 ('0100001000', ('tst', rm_rd, 0)),
143 ('0100001001', ('rsb', rm_rd_imm0, 0)),
144 ('0100001010', ('cmp', rm_rd, 0)),
145 ('0100001011', ('cmn', rm_rd, 0)),
146 ('0100001100', ('orr', rm_rdn, 0)),
147 ('0100001101', ('mul', rn_rdm, 0)),
148 ('0100001110', ('bic', rm_rdn, 0)),
149 ('0100001111', ('mvn', rm_rd, 0)),
150
151 ('0100010000', ('add', d1_rm4_rd3, 0)),
152 ('0100010001', ('add', d1_rm4_rd3, 0)),
153 ('010001001', ('add', d1_rm4_rd3, 0)),
154 ('0100010101', ('cmp', d1_rm4_rd3, 0)),
155 ('010001011', ('cmp', d1_rm4_rd3, 0)),
156 ('0100011000', ('mov', d1_rm4_rd3, 0)),
157 ('0100011001', ('mov', d1_rm4_rd3, 0)),
158 ('0100011010', ('mov', d1_rm4_rd3, 0)),
159 ('010001110', ('bx', rm4_shift3, 0)),
160 ('010001111', ('blx', rm4_shift3, 0)),
161
162 ('01001', ('ldr', rt_pc_imm8, 0)),
163
164 ('0101000', ('str', rm_rn_rt, 0)),
165 ('0101001', ('strh', rm_rn_rt, 0)),
166 ('0101010', ('strb', rm_rn_rt, 0)),
167 ('0101011', ('ldrsb', rm_rn_rt, 0)),
168 ('0101100', ('ldr', rm_rn_rt, 0)),
169 ('0101101', ('ldrh', rm_rn_rt, 0)),
170 ('0101110', ('ldrb', rm_rn_rt, 0)),
171 ('0101111', ('ldrsh', rm_rn_rt, 0)),
172 ('01100', ('str', imm5_rn_rt, 0)),
173 ('01101', ('ldr', imm5_rn_rt, 0)),
174 ('01110', ('strb', imm5_rn_rt, 0)),
175 ('01111', ('ldrb', imm5_rn_rt, 0)),
176 ('10000', ('strh', imm5_rn_rt, 0)),
177 ('10001', ('ldrh', imm5_rn_rt, 0)),
178 ('10010', ('str', imm5_rn_rt, 0)),
179 ('10011', ('ldr', imm5_rn_rt, 0)),
180
181 ('10100', ('add', rd_pc_imm8, 0)),
182
183 ('10101', ('add', rd_sp_imm8, 0)),
184
185 ('10110110010', ('setend', sh4_imm1, 0)),
186 ('10110110011', ('cps', simpleops(),0)),
187 ('1011101000', ('rev', rn_rdm, 0)),
188 ('1011101001', ('rev16', rn_rdm, 0)),
189 ('1011101011', ('revsh', rn_rdm, 0)),
190 ('101100000', ('add', sp_sp_imm7, 0)),
191 ('101100001', ('sub', sp_sp_imm7, 0)),
192 ('10111110', ('bkpt', imm8, 0)),
193
194 ('11000', ('stmia', rm_reglist, 0x800)),
195 ('11001', ('ldmia', rm_reglist, 0x800)),
196
197 ('11010000', ('b', imm8, 0)),
198 ('11010001', ('bn', imm8, 0)),
199 ('11010010', ('bz', imm8, 0)),
200 ('11010011', ('bnz', imm8, 0)),
201 ('11010100', ('bc', imm8, 0)),
202 ('11010101', ('bnc', imm8, 0)),
203 ('11010100', ('bzc', imm8, 0)),
204 ('11010111', ('bnzc', imm8, 0)),
205 ('11011000', ('bv', imm8, 0)),
206 ('11011001', ('bnv', imm8, 0)),
207 ('11011010', ('bzv', imm8, 0)),
208 ('11011011', ('bnzv', imm8, 0)),
209 ('11011100', ('bcv', imm8, 0)),
210 ('11011101', ('bncv', imm8, 0)),
211 ('11011110', ('bzcv', imm8, 0)),
212 ('11011111', ('bnzcv', imm8, 0)),
213
214 ('11011111', ('swi', imm8, 0)),
215 ('11100', ('b', imm11, 0)),
216 ('11101', ('blx', imm11, 0)),
217 ('11110', ('bl', imm11, 0)),
218 ('11111', ('blx', imm11, 0)),
219 ]
220
221 ttree = e_btree.BinaryTree()
222 for binstr, opinfo in thumb_table:
223 ttree.addBinstr(binstr, opinfo)
224
225 thumb32mask = binary('11111')
226 thumb32min = binary('11100')
227
229 '''
230 Take a 16 bit integer (opcode) value and determine
231 if it is really the first 16 bits of a 32 bit
232 instruction.
233 '''
234 bval = val >> 11
235 return (bval & thumb32mask) > thumb32min
236
237
240
241
242
243
244
245
246
247
248
249
250
251