Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
arch.py
Go to the documentation of this file.
1 #!/usr/bin/env python
2 #-*- coding:utf-8 -*-
3 
4 import logging
5 from pyparsing import *
7 from miasm2.core.cpu import *
8 from collections import defaultdict
9 from miasm2.core.bin_stream import bin_stream
10 import miasm2.arch.arm.regs as regs_module
11 from miasm2.arch.arm.regs import *
12 from miasm2.core.asmbloc import asm_label
13 
14 # A1 encoding
15 
16 log = logging.getLogger("armdis")
17 console_handler = logging.StreamHandler()
18 console_handler.setFormatter(logging.Formatter("%(levelname)-5s: %(message)s"))
19 log.addHandler(console_handler)
20 log.setLevel(logging.DEBUG)
21 
22 # arm regs ##############
23 reg_dum = ExprId('DumReg')
24 
25 gen_reg('PC', globals())
26 
27 # GP
28 regs_str = ['R%d' % r for r in xrange(0x10)]
29 regs_str[13] = 'SP'
30 regs_str[14] = 'LR'
31 regs_str[15] = 'PC'
32 regs_expr = [ExprId(x, 32) for x in regs_str]
33 
34 gpregs = reg_info(regs_str, regs_expr)
35 
36 gpregs_pc = reg_info(regs_str[-1:], regs_expr[-1:])
37 gpregs_sp = reg_info(regs_str[13:14], regs_expr[13:14])
38 
39 gpregs_nosppc = reg_info(regs_str[:13] + [str(reg_dum), regs_str[14]],
40  regs_expr[:13] + [reg_dum, regs_expr[14]])
41 
42 
43 # psr
44 sr_flags = "cxsf"
45 cpsr_regs_str = []
46 spsr_regs_str = []
47 for i in xrange(0x10):
48  o = ""
49  for j in xrange(4):
50  if i & (1 << j):
51  o += sr_flags[j]
52  cpsr_regs_str.append("CPSR_%s" % o)
53  spsr_regs_str.append("SPSR_%s" % o)
54 
55 # psr_regs_str = ['CPSR', 'SPSR']
56 # psr_regs_expr = [ExprId(x, 32) for x in psr_regs_str]
57 
58 # psr_regs = reg_info(psr_regs_str, psr_regs_expr)
59 
60 cpsr_regs_expr = [ExprId(x, 32) for x in cpsr_regs_str]
61 spsr_regs_expr = [ExprId(x, 32) for x in spsr_regs_str]
62 
63 cpsr_regs = reg_info(cpsr_regs_str, cpsr_regs_expr)
64 spsr_regs = reg_info(spsr_regs_str, spsr_regs_expr)
65 
66 # CP
67 cpregs_str = ['c%d' % r for r in xrange(0x10)]
68 cpregs_expr = [ExprId(x) for x in cpregs_str]
69 
70 cp_regs = reg_info(cpregs_str, cpregs_expr)
71 
72 # P
73 pregs_str = ['p%d' % r for r in xrange(0x10)]
74 pregs_expr = [ExprId(x) for x in pregs_str]
75 
76 p_regs = reg_info(pregs_str, pregs_expr)
77 
78 conditional_branch = ["BEQ", "BNE", "BCS", "BCC", "BMI", "BPL", "BVS",
79  "BVC", "BHI", "BLS", "BGE", "BLT", "BGT", "BLE"]
80 
81 unconditional_branch = ["B", "BX", "BL", "BLX"]
82 
83 # parser helper ###########
84 
85 def tok_reg_duo(s, l, t):
86  t = t[0]
87  i1 = gpregs.expr.index(t[0])
88  i2 = gpregs.expr.index(t[1])
89  o = []
90  for i in xrange(i1, i2 + 1):
91  o.append(gpregs.expr[i])
92  return o
93 
94 LPARENTHESIS = Literal("(")
95 RPARENTHESIS = Literal(")")
96 
97 LACC = Suppress(Literal("{"))
98 RACC = Suppress(Literal("}"))
99 MINUS = Suppress(Literal("-"))
100 CIRCUNFLEX = Literal("^")
101 
102 
103 def check_bounds(left_bound, right_bound, value):
104  if left_bound <= value and value <= right_bound:
105  return ExprInt32(value)
106  else:
107  raise ValueError('shift operator immediate value out of bound')
108 
109 int_1_31 = str_int.copy().setParseAction(lambda v: check_bounds(1, 31, v[0]))
110 int_1_32 = str_int.copy().setParseAction(lambda v: check_bounds(1, 32, v[0]))
111 
112 
113 def reglistparse(s, l, t):
114  t = t[0]
115  if t[-1] == "^":
116  return ExprOp('sbit', ExprOp('reglist', *t[:-1]))
117  return ExprOp('reglist', *t)
118 
119 
120 allshifts = ['<<', '>>', 'a>>', '>>>', 'rrx']
121 allshifts_armt = ['<<', '>>', 'a>>', '>>>', 'rrx']
122 
123 shift2expr_dct = {'LSL': '<<', 'LSR': '>>', 'ASR': 'a>>',
124  'ROR': ">>>", 'RRX': "rrx"}
125 
126 expr2shift_dct = dict([(x[1], x[0]) for x in shift2expr_dct.items()])
127 
128 
129 def op_shift2expr(s, l, t):
130  return shift2expr_dct[t[0]]
131 
132 reg_duo = Group(gpregs.parser + MINUS +
133  gpregs.parser).setParseAction(tok_reg_duo)
134 reg_or_duo = reg_duo | gpregs.parser
135 gpreg_list = Group(LACC + delimitedList(
136  reg_or_duo, delim=',') + RACC + Optional(CIRCUNFLEX))
137 gpreg_list.setParseAction(reglistparse)
138 
139 LBRACK = Suppress("[")
140 RBRACK = Suppress("]")
141 COMMA = Suppress(",")
142 all_binaryop_1_31_shifts_t = literal_list(
143  ['LSL', 'ROR']).setParseAction(op_shift2expr)
144 all_binaryop_1_32_shifts_t = literal_list(
145  ['LSR', 'ASR']).setParseAction(op_shift2expr)
146 all_unaryop_shifts_t = literal_list(['RRX']).setParseAction(op_shift2expr)
147 
148 allshifts_t_armt = literal_list(
149  ['LSL', 'LSR', 'ASR', 'ROR', 'RRX']).setParseAction(op_shift2expr)
150 
151 gpreg_p = gpregs.parser
152 
153 psr_p = cpsr_regs.parser | spsr_regs.parser
154 
155 
156 def shift2expr(t):
157  if len(t) == 1:
158  return t[0]
159  elif len(t) == 2:
160  return ExprOp(t[1], t[0])
161  elif len(t) == 3:
162  return ExprOp(t[1], t[0], t[2])
163 
164 variable, operand, base_expr = gen_base_expr()
165 
166 int_or_expr = base_expr
167 
168 
169 def ast_id2expr(t):
170  if not t in mn_arm.regs.all_regs_ids_byname:
171  r = ExprId(asm_label(t))
172  else:
173  r = mn_arm.regs.all_regs_ids_byname[t]
174  return r
175 
176 
178  return ExprInt32(a)
179 
180 
181 my_var_parser = parse_ast(ast_id2expr, ast_int2expr)
182 base_expr.setParseAction(my_var_parser)
183 
184 
185 shift_off = (gpregs.parser + Optional(
186  (all_unaryop_shifts_t) |
187  (all_binaryop_1_31_shifts_t + (gpregs.parser | int_1_31)) |
188  (all_binaryop_1_32_shifts_t + (gpregs.parser | int_1_32))
189 )).setParseAction(shift2expr)
190 shift_off |= base_expr
191 
192 
193 def deref2expr_nooff(s, l, t):
194  t = t[0]
195  # XXX default
196  return ExprOp("preinc", t[0], ExprInt32(0))
197 
198 
199 def deref2expr_pre(s, l, t):
200  t = t[0]
201  if len(t) == 1:
202  return ExprOp("preinc", t[0], ExprInt32(0))
203  elif len(t) == 2:
204  return ExprOp("preinc", t[0], t[1])
205  else:
206  raise NotImplementedError('len(t) > 2')
207 
208 
209 def deref2expr_pre_mem(s, l, t):
210  t = t[0]
211  if len(t) == 1:
212  return ExprMem(ExprOp("preinc", t[0], ExprInt32(0)))
213  elif len(t) == 2:
214  return ExprMem(ExprOp("preinc", t[0], t[1]))
215  else:
216  raise NotImplementedError('len(t) > 2')
217 
218 
219 def deref2expr_post(s, l, t):
220  t = t[0]
221  return ExprOp("postinc", t[0], t[1])
222 
223 
224 def deref_wb(s, l, t):
225  t = t[0]
226  if t[-1] == '!':
227  return ExprMem(ExprOp('wback', *t[:-1]))
228  return ExprMem(t[0])
229 
230 # shift_off.setParseAction(deref_off)
231 deref_nooff = Group(
232  LBRACK + gpregs.parser + RBRACK).setParseAction(deref2expr_nooff)
233 deref_pre = Group(LBRACK + gpregs.parser + Optional(
234  COMMA + shift_off) + RBRACK).setParseAction(deref2expr_pre)
235 deref_post = Group(LBRACK + gpregs.parser + RBRACK +
236  COMMA + shift_off).setParseAction(deref2expr_post)
237 deref = Group((deref_post | deref_pre | deref_nooff)
238  + Optional('!')).setParseAction(deref_wb)
239 
240 
241 def parsegpreg_wb(s, l, t):
242  t = t[0]
243  if t[-1] == '!':
244  return ExprOp('wback', *t[:-1])
245  return t[0]
246 
247 gpregs_wb = Group(gpregs.parser + Optional('!')).setParseAction(parsegpreg_wb)
248 
249 
250 #
251 
252 
253 cond_list = ['EQ', 'NE', 'CS', 'CC', 'MI', 'PL', 'VS', 'VC',
254  'HI', 'LS', 'GE', 'LT', 'GT', 'LE', ''] # , 'NV']
255 cond_dct = dict([(x[1], x[0]) for x in enumerate(cond_list)])
256 # default_prio = 0x1337
257 
258 bm_cond = bs_mod_name(l=4, fname='cond', mn_mod=cond_list) # cond_dct)
259 
260 
261 def permut_args(order, args):
262  l = []
263  for i, x in enumerate(order):
264  l.append((x.__class__, i))
265  l = dict(l)
266  out = [None for x in xrange(len(args))]
267  for a in args:
268  out[l[a.__class__]] = a
269  return out
270 
271 
273 
274  def __init__(self):
275  self.except_on_instr = False
276  self.lnk = None
277  self.cond = None
278 
279 
281  delayslot = 0
282 
283  def __init__(self, *args, **kargs):
284  super(instruction_arm, self).__init__(*args, **kargs)
285 
286  @staticmethod
287  def arg2str(e, pos = None):
288  wb = False
289  if isinstance(e, ExprId) or isinstance(e, ExprInt):
290  return str(e)
291  if isinstance(e, ExprOp) and e.op in expr2shift_dct:
292  if len(e.args) == 1:
293  return '%s %s' % (e.args[0], expr2shift_dct[e.op])
294  elif len(e.args) == 2:
295  return '%s %s %s' % (e.args[0], expr2shift_dct[e.op], e.args[1])
296  else:
297  raise NotImplementedError('zarb arg2str')
298 
299 
300  sb = False
301  if isinstance(e, ExprOp) and e.op == "sbit":
302  sb = True
303  e = e.args[0]
304  if isinstance(e, ExprOp) and e.op == "reglist":
305  o = [gpregs.expr.index(x) for x in e.args]
306  out = reglist2str(o)
307  if sb:
308  out += "^"
309  return out
310 
311 
312  if isinstance(e, ExprOp) and e.op == 'wback':
313  wb = True
314  e = e.args[0]
315  if isinstance(e, ExprId):
316  out = str(e)
317  if wb:
318  out += "!"
319  return out
320 
321  if not isinstance(e, ExprMem):
322  return str(e)
323 
324  e = e.arg
325  if isinstance(e, ExprOp) and e.op == 'wback':
326  wb = True
327  e = e.args[0]
328 
329 
330  if isinstance(e, ExprId):
331  r, s = e, None
332  elif len(e.args) == 1 and isinstance(e.args[0], ExprId):
333  r, s = e.args[0], None
334  elif isinstance(e.args[0], ExprId):
335  r, s = e.args[0], e.args[1]
336  else:
337  r, s = e.args[0].args
338  if isinstance(s, ExprOp) and s.op in expr2shift_dct:
339  s = ' '.join([str(x)
340  for x in s.args[0], expr2shift_dct[s.op], s.args[1]])
341 
342  if isinstance(e, ExprOp) and e.op == 'postinc':
343  o = '[%s]' % r
344  if s and not (isinstance(s, ExprInt) and s.arg == 0):
345  o += ', %s' % s
346  else:
347  if s and not (isinstance(s, ExprInt) and s.arg == 0):
348  o = '[%s, %s]' % (r, s)
349  else:
350  o = '[%s]' % (r)
351 
352 
353  if wb:
354  o += "!"
355  return o
356 
357 
358  def dstflow(self):
359  return self.name in conditional_branch + unconditional_branch
360 
361  def dstflow2label(self, symbol_pool):
362  e = self.args[0]
363  if not isinstance(e, ExprInt):
364  return
365  if self.name == 'BLX':
366  ad = e.arg + self.offset
367  else:
368  ad = e.arg + self.offset
369  l = symbol_pool.getby_offset_create(ad)
370  s = ExprId(l, e.size)
371  self.args[0] = s
372 
373  def breakflow(self):
374  if self.name in conditional_branch + unconditional_branch:
375  return True
376  if self.name.startswith("LDM") and PC in self.args[1].args:
377  return True
378  if self.args and PC in self.args[0].get_r():
379  return True
380  return False
381 
382  def is_subcall(self):
383  if self.name == 'BLX':
384  return True
385  return self.additional_info.lnk
386 
387  def getdstflow(self, symbol_pool):
388  return [self.args[0]]
389 
390  def splitflow(self):
391  if self.additional_info.lnk:
392  return True
393  if self.name == 'BLX':
394  return True
395  if self.name == 'BX':
396  return False
397  return self.breakflow() and self.additional_info.cond != 14
398 
399  def get_symbol_size(self, symbol, symbol_pool):
400  return 32
401 
402  def fixDstOffset(self):
403  e = self.args[0]
404  if self.offset is None:
405  raise ValueError('symbol not resolved %s' % l)
406  if not isinstance(e, ExprInt):
407  log.debug('dyn dst %r', e)
408  return
409  off = e.arg - self.offset
410  if int(off % 4):
411  raise ValueError('strange offset! %r' % off)
412  self.args[0] = ExprInt32(off)
413 
414  def get_args_expr(self):
415  args = [a for a in self.args]
416  return args
417 
418  def get_asm_offset(self, expr):
419  # LDR XXX, [PC, offset] => PC is self.offset+8
420  return ExprInt_from(expr, self.offset+8)
421 
423 
424  def __init__(self, *args, **kargs):
425  super(instruction_armt, self).__init__(*args, **kargs)
426 
427  def dstflow(self):
428  if self.name in ["CBZ", "CBNZ"]:
429  return True
430  return self.name in conditional_branch + unconditional_branch
431 
432  def dstflow2label(self, symbol_pool):
433  if self.name in ["CBZ", "CBNZ"]:
434  e = self.args[1]
435  else:
436  e = self.args[0]
437  if not isinstance(e, ExprInt):
438  return
439  if self.name == 'BLX':
440  ad = e.arg + (self.offset & 0xfffffffc)
441  else:
442  ad = e.arg + self.offset
443  l = symbol_pool.getby_offset_create(ad)
444  s = ExprId(l, e.size)
445  if self.name in ["CBZ", "CBNZ"]:
446  self.args[1] = s
447  else:
448  self.args[0] = s
449 
450  def breakflow(self):
451  if self.name in conditional_branch + unconditional_branch +["CBZ", "CBNZ"]:
452  return True
453  if self.name.startswith("LDM") and PC in self.args[1].args:
454  return True
455  if self.args and PC in self.args[0].get_r():
456  return True
457  return False
458 
459  def getdstflow(self, symbol_pool):
460  if self.name in ['CBZ', 'CBNZ']:
461  return [self.args[1]]
462  return [self.args[0]]
463 
464  def splitflow(self):
465  if self.name in conditional_branch + ['BL', 'BLX', 'CBZ', 'CBNZ']:
466  return True
467  return False
468 
469  def is_subcall(self):
470  return self.name in ['BL', 'BLX']
471 
472  def fixDstOffset(self):
473  e = self.args[0]
474  if self.offset is None:
475  raise ValueError('symbol not resolved %s' % l)
476  if not isinstance(e, ExprInt):
477  log.debug('dyn dst %r', e)
478  return
479  # The first +2 is to compensate instruction len, but strangely, 32 bits
480  # thumb2 instructions len is 2... For the second +2, didn't find it in
481  # the doc.
482  off = e.arg - self.offset
483  if int(off % 2):
484  raise ValueError('strange offset! %r' % off)
485  self.args[0] = ExprInt32(off)
486 
487  def get_asm_offset(self, expr):
488  # ADR XXX, PC, imm => PC is 4 aligned + imm
489  new_offset = ((self.offset+self.l)/4)*4
490  return ExprInt_from(expr, new_offset)
491 
492 
493 class mn_arm(cls_mn):
494  delayslot = 0
495  name = "arm"
496  regs = regs_module
497  bintree = {}
498  num = 0
499  all_mn = []
500  all_mn_mode = defaultdict(list)
501  all_mn_name = defaultdict(list)
502  all_mn_inst = defaultdict(list)
503  pc = {'l':PC, 'b':PC}
504  sp = {'l':SP, 'b':SP}
505  instruction = instruction_arm
506  max_instruction_len = 4
507  alignment = 4
508 
509  @classmethod
510  def getpc(cls, attrib = None):
511  return PC
512 
513  @classmethod
514  def getsp(cls, attrib = None):
515  return SP
516 
517  def additional_info(self):
518  info = additional_info()
519  info.lnk = False
520  if hasattr(self, "lnk"):
521  info.lnk = self.lnk.value != 0
522  info.cond = self.cond.value
523  return info
524 
525  @classmethod
526  def getbits(cls, bs, attrib, start, n):
527  if not n:
528  return 0
529  o = 0
530  if n > bs.getlen() * 8:
531  raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8))
532  while n:
533  offset = start / 8
534  n_offset = cls.endian_offset(attrib, offset)
535  c = cls.getbytes(bs, n_offset, 1)
536  if not c:
537  raise IOError
538  c = ord(c)
539  r = 8 - start % 8
540  c &= (1 << r) - 1
541  l = min(r, n)
542  c >>= (r - l)
543  o <<= l
544  o |= c
545  n -= l
546  start += l
547  return o
548 
549  @classmethod
550  def endian_offset(cls, attrib, offset):
551  if attrib == "l":
552  return (offset & ~3) + 3 - offset % 4
553  elif attrib == "b":
554  return offset
555  else:
556  raise NotImplementedError('bad attrib')
557 
558  @classmethod
559  def check_mnemo(cls, fields):
560  l = sum([x.l for x in fields])
561  assert l == 32, "len %r" % l
562 
563  @classmethod
564  def getmn(cls, name):
565  return name.upper()
566 
567  @classmethod
568  def mod_fields(cls, fields):
569  l = sum([x.l for x in fields])
570  if l == 32:
571  return fields
572  return [bm_cond] + fields
573 
574  @classmethod
575  def gen_modes(cls, subcls, name, bases, dct, fields):
576  dct['mode'] = None
577  return [(subcls, name, bases, dct, fields)]
578 
579  def value(self, mode):
580  v = super(mn_arm, self).value(mode)
581  if mode == 'l':
582  return [x[::-1] for x in v]
583  elif mode == 'b':
584  return [x for x in v]
585  else:
586  raise NotImplementedError('bad attrib')
587 
588 
589  def get_symbol_size(self, symbol, symbol_pool, mode):
590  return 32
591 
592 
594  name = "armt"
595  regs = regs_module
596  delayslot = 0
597  bintree = {}
598  num = 0
599  all_mn = []
600  all_mn_mode = defaultdict(list)
601  all_mn_name = defaultdict(list)
602  all_mn_inst = defaultdict(list)
603  pc = PC
604  sp = SP
605  instruction = instruction_armt
606  max_instruction_len = 4
607  alignment = 4
608 
609  @classmethod
610  def getpc(cls, attrib = None):
611  return PC
612 
613  @classmethod
614  def getsp(cls, attrib = None):
615  return SP
616 
617  def additional_info(self):
618  info = additional_info()
619  info.lnk = False
620  if hasattr(self, "lnk"):
621  info.lnk = self.lnk.value != 0
622  info.cond = 14 # COND_ALWAYS
623  return info
624 
625 
626  @classmethod
627  def getbits(cls, bs, attrib, start, n):
628  if not n:
629  return 0
630  o = 0
631  if n > bs.getlen() * 8:
632  raise ValueError('not enought bits %r %r' % (n, len(bs.bin) * 8))
633  while n:
634  offset = start / 8
635  n_offset = cls.endian_offset(attrib, offset)
636  c = cls.getbytes(bs, n_offset, 1)
637  if not c:
638  raise IOError
639  c = ord(c)
640  r = 8 - start % 8
641  c &= (1 << r) - 1
642  l = min(r, n)
643  c >>= (r - l)
644  o <<= l
645  o |= c
646  n -= l
647  start += l
648  return o
649 
650  @classmethod
651  def endian_offset(cls, attrib, offset):
652  if attrib == "l":
653  return (offset & ~1) + 1 - offset % 2
654  elif attrib == "b":
655  return offset
656  else:
657  raise NotImplementedError('bad attrib')
658 
659  @classmethod
660  def check_mnemo(cls, fields):
661  l = sum([x.l for x in fields])
662  assert l in [16, 32], "len %r" % l
663 
664  @classmethod
665  def getmn(cls, name):
666  return name.upper()
667 
668  @classmethod
669  def mod_fields(cls, fields):
670  return list(fields)
671 
672  @classmethod
673  def gen_modes(cls, subcls, name, bases, dct, fields):
674  dct['mode'] = None
675  return [(subcls, name, bases, dct, fields)]
676 
677  def value(self, mode):
678  v = super(mn_armt, self).value(mode)
679  if mode == 'l':
680  out = []
681  for x in v:
682  if len(x) == 2:
683  out.append(x[::-1])
684  elif len(x) == 4:
685  out.append(x[:2][::-1] + x[2:4][::-1])
686  return out
687  elif mode == 'b':
688  return [x for x in v]
689  else:
690  raise NotImplementedError('bad attrib')
691 
692  def get_args_expr(self):
693  args = [a.expr for a in self.args]
694  return args
695 
696  def get_symbol_size(self, symbol, symbol_pool, mode):
697  return 32
698 
699 
701  pass
702 
703 
704 class arm_gpreg_noarg(reg_noarg):
705  reg_info = gpregs
706  parser = reg_info.parser
707 
708 
710  reg_info = gpregs
711  parser = reg_info.parser
712 
713 
715  reg_info = gpregs
716  parser = gpregs_wb
717 
718  def decode(self, v):
719  v = v & self.lmask
720  e = self.reg_info.expr[v]
721  if self.parent.wback.value:
722  e = ExprOp('wback', e)
723  self.expr = e
724  return True
725 
726  def encode(self):
727  e = self.expr
728  self.parent.wback.value = 0
729  if isinstance(e, ExprOp) and e.op == 'wback':
730  self.parent.wback.value = 1
731  e = e.args[0]
732  if isinstance(e, ExprId):
733  self.value = self.reg_info.expr.index(e)
734  else:
735  self.parent.wback.value = 1
736  self.value = self.reg_info.expr.index(e.args[0])
737  return True
738 
739 
740 class arm_psr(m_arg):
741  parser = psr_p
742 
743  def decode(self, v):
744  v = v & self.lmask
745  if self.parent.psr.value == 0:
746  e = cpsr_regs.expr[v]
747  else:
748  e = spsr_regs.expr[v]
749  self.expr = e
750  return True
751 
752  def encode(self):
753  e = self.expr
754  if e in spsr_regs.expr:
755  self.parent.psr.value = 1
756  v = spsr_regs.expr.index(e)
757  elif e in cpsr_regs.expr:
758  self.parent.psr.value = 0
759  v = cpsr_regs.expr.index(e)
760  else:
761  return False
762  self.value = v
763  return True
764 
765 
767  reg_info = cp_regs
768  parser = reg_info.parser
769 
770 
772  reg_info = p_regs
773  parser = reg_info.parser
774 
775 
777  parser = base_expr
778 
779 
781  parser = base_expr
782 
783  def int2expr(self, v):
784  if v & ~self.intmask != 0:
785  return None
786  return ExprInt(v, self.intsize)
787 
788  def decodeval(self, v):
789  v <<= 2
790  # Add pipeline offset
791  v += 8
792  return v
793 
794  def encodeval(self, v):
795  if v%4 != 0:
796  return False
797  # Remove pipeline offset
798  v -= 8
799  return v >> 2
800 
801  def decode(self, v):
802  v = v & self.lmask
803  if (1 << (self.l - 1)) & v:
804  v |= ~0 ^ self.lmask
805  v = self.decodeval(v)
806  self.expr = ExprInt32(v)
807  return True
808 
809  def encode(self):
810  if not isinstance(self.expr, ExprInt):
811  return False
812  v = int(self.expr.arg)
813  if (1 << (self.l - 1)) & v:
814  v = -((0xffffffff ^ v) + 1)
815  v = self.encodeval(v)
816  self.value = (v & 0xffffffff) & self.lmask
817  return True
818 
819 
821  parser = deref
822 
823  def decode(self, v):
824  v = v & self.lmask
825  if self.parent.updown.value:
826  e = ExprInt32(v << 2)
827  else:
828  e = ExprInt32(-v << 2)
829  if self.parent.ppi.value:
830  e = ExprOp('preinc', self.parent.rn.expr, e)
831  else:
832  e = ExprOp('postinc', self.parent.rn.expr, e)
833  if self.parent.wback.value == 1:
834  e = ExprOp('wback', e)
835  self.expr = ExprMem(e)
836  return True
837 
838  def encode(self):
839  self.parent.updown.value = 1
840  e = self.expr
841  if not isinstance(e, ExprMem):
842  return False
843  e = e.arg
844  if isinstance(e, ExprOp) and e.op == 'wback':
845  self.parent.wback.value = 1
846  e = e.args[0]
847  else:
848  self.parent.wback.value = 0
849  if e.op == "postinc":
850  self.parent.ppi.value = 0
851  elif e.op == "preinc":
852  self.parent.ppi.value = 1
853  else:
854  # XXX default
855  self.parent.ppi.value = 1
856  self.parent.rn.expr = e.args[0]
857  if len(e.args) == 1:
858  self.value = 0
859  return True
860  e = e.args[1]
861  if not isinstance(e, ExprInt):
862  log.debug('should be int %r', e)
863  return False
864  v = int(e.arg)
865  if v < 0 or v & (1 << 31):
866  self.parent.updown.value = 0
867  v = -v & 0xFFFFFFFF
868  if v & 0x3:
869  log.debug('arg should be 4 aligned')
870  return False
871  v >>= 2
872  self.value = v
873  return True
874 
875 
877  parser = base_expr
878 
879  def decode(self, v):
880  v = v & self.lmask
881  imm = (self.parent.imm4.value << 12) | v
882  self.expr = ExprInt32(imm)
883  return True
884 
885  def encode(self):
886  if not isinstance(self.expr, ExprInt):
887  return False
888  v = int(self.expr.arg)
889  if v > 0xffff:
890  return False
891  self.parent.imm4.value = v >> 12
892  self.value = v & 0xfff
893  return True
894 
895 
896 class arm_op2(m_arg):
897  parser = shift_off
898 
899  def str_to_imm_rot_form(self, s, neg=False):
900  if neg:
901  s = -s & 0xffffffff
902  for i in xrange(0, 32, 2):
903  v = myrol32(s, i)
904  if 0 <= v < 0x100:
905  return ((i / 2) << 8) | v
906  return None
907 
908  def decode(self, v):
909  val = v & self.lmask
910  if self.parent.immop.value:
911  rot = val >> 8
912  imm = val & 0xff
913  imm = myror32(imm, rot * 2)
914  self.expr = ExprInt32(imm)
915  return True
916  rm = val & 0xf
917  shift = val >> 4
918  shift_kind = shift & 1
919  shift_type = (shift >> 1) & 3
920  shift >>= 3
921  # print self.parent.immop.value, hex(shift), hex(shift_kind),
922  # hex(shift_type)
923  if shift_kind:
924  # shift kind is reg
925  if shift & 1:
926  # log.debug('error in shift1')
927  return False
928  rs = shift >> 1
929  if rs == 0xf:
930  # log.debug('error in shift2')
931  return False
932  shift_op = regs_expr[rs]
933  else:
934  # shift kind is imm
935  amount = shift
936  shift_op = ExprInt32(amount)
937  a = regs_expr[rm]
938  if shift_op == ExprInt32(0):
939  if shift_type == 3:
940  self.expr = ExprOp(allshifts[4], a)
941  else:
942  self.expr = a
943  else:
944  self.expr = ExprOp(allshifts[shift_type], a, shift_op)
945  return True
946 
947  def encode(self):
948  e = self.expr
949  # pure imm
950  if isinstance(e, ExprInt):
951  val = self.str_to_imm_rot_form(int(e.arg))
952  if val is None:
953  return False
954  self.parent.immop.value = 1
955  self.value = val
956  return True
957 
958  self.parent.immop.value = 0
959  # pure reg
960  if isinstance(e, ExprId):
961  rm = gpregs.expr.index(e)
962  shift_kind = 0
963  shift_type = 0
964  amount = 0
965  self.value = (
966  ((((amount << 2) | shift_type) << 1) | shift_kind) << 4) | rm
967  return True
968  # rot reg
969  if not isinstance(e, ExprOp):
970  log.debug('bad reg rot1 %r', e)
971  return False
972  rm = gpregs.expr.index(e.args[0])
973  shift_type = allshifts.index(e.op)
974  if e.op == 'rrx':
975  shift_kind = 0
976  amount = 0
977  shift_type = 3
978  elif isinstance(e.args[1], ExprInt):
979  shift_kind = 0
980  amount = int(e.args[1].arg)
981  # LSR/ASR of 32 => 0
982  if amount == 32 and e.op in ['>>', 'a>>']:
983  amount = 0
984  else:
985  shift_kind = 1
986  amount = gpregs.expr.index(e.args[1]) << 1
987  self.value = (
988  ((((amount << 2) | shift_type) << 1) | shift_kind) << 4) | rm
989  return True
990 
991 # op2imm + rn
992 
993 
995  parser = deref
996 
997  def str_to_imm_rot_form(self, s, neg=False):
998  if neg:
999  s = -s & 0xffffffff
1000  if 0 <= s < (1 << 12):
1001  return s
1002  return None
1003 
1004  def decode(self, v):
1005  val = v & self.lmask
1006  if self.parent.immop.value == 0:
1007  imm = val
1008  if self.parent.updown.value == 0:
1009  imm = -imm
1010  if self.parent.ppi.value:
1011  e = ExprOp('preinc', self.parent.rn.expr, ExprInt32(imm))
1012  else:
1013  e = ExprOp('postinc', self.parent.rn.expr, ExprInt32(imm))
1014  if self.parent.wback.value == 1:
1015  e = ExprOp('wback', e)
1016  self.expr = ExprMem(e)
1017  return True
1018  rm = val & 0xf
1019  shift = val >> 4
1020  shift_kind = shift & 1
1021  shift_type = (shift >> 1) & 3
1022  shift >>= 3
1023  # print self.parent.immop.value, hex(shift), hex(shift_kind),
1024  # hex(shift_type)
1025  if shift_kind:
1026  # log.debug('error in disasm xx')
1027  return False
1028  else:
1029  # shift kind is imm
1030  amount = shift
1031  shift_op = ExprInt32(amount)
1032  a = regs_expr[rm]
1033  if shift_op == ExprInt32(0):
1034  pass
1035  else:
1036  a = ExprOp(allshifts[shift_type], a, shift_op)
1037  if self.parent.ppi.value:
1038  e = ExprOp('preinc', self.parent.rn.expr, a)
1039  else:
1040  e = ExprOp('postinc', self.parent.rn.expr, a)
1041  if self.parent.wback.value == 1:
1042  e = ExprOp('wback', e)
1043  self.expr = ExprMem(e)
1044  return True
1045 
1046  def encode(self):
1047  self.parent.immop.value = 1
1048  self.parent.updown.value = 1
1049 
1050  e = self.expr
1051  assert(isinstance(e, ExprMem))
1052  e = e.arg
1053  if e.op == 'wback':
1054  self.parent.wback.value = 1
1055  e = e.args[0]
1056  else:
1057  self.parent.wback.value = 0
1058  if e.op == "postinc":
1059  self.parent.ppi.value = 0
1060  elif e.op == "preinc":
1061  self.parent.ppi.value = 1
1062  else:
1063  # XXX default
1064  self.parent.ppi.value = 1
1065 
1066  # if len(v) <1:
1067  # raise ValueError('cannot parse', s)
1068  self.parent.rn.fromstring(e.args[0])
1069  if len(e.args) == 1:
1070  self.parent.immop.value = 0
1071  self.value = 0
1072  return True
1073  # pure imm
1074  if isinstance(e.args[1], ExprInt):
1075  self.parent.immop.value = 0
1076  val = self.str_to_imm_rot_form(int(e.args[1].arg))
1077  if val is None:
1078  val = self.str_to_imm_rot_form(int(e.args[1].arg), True)
1079  if val is None:
1080  log.debug('cannot encode inm')
1081  return False
1082  self.parent.updown.value = 0
1083  self.value = val
1084  return True
1085  # pure reg
1086  if isinstance(e.args[1], ExprId):
1087  rm = gpregs.expr.index(e.args[1])
1088  shift_kind = 0
1089  shift_type = 0
1090  amount = 0
1091  self.value = (
1092  ((((amount << 2) | shift_type) << 1) | shift_kind) << 4) | rm
1093  return True
1094  # rot reg
1095  if not isinstance(e.args[1], ExprOp):
1096  log.debug('bad reg rot2 %r', e)
1097  return False
1098  e = e.args[1]
1099  rm = gpregs.expr.index(e.args[0])
1100  shift_type = allshifts.index(e.op)
1101  if isinstance(e.args[1], ExprInt):
1102  shift_kind = 0
1103  amount = int(e.args[1].arg)
1104  else:
1105  shift_kind = 1
1106  amount = gpregs.expr.index(e.args[1]) << 1
1107  self.value = (
1108  ((((amount << 2) | shift_type) << 1) | shift_kind) << 4) | rm
1109  return True
1110 
1111 
1112 def reglist2str(rlist):
1113  out = []
1114  i = 0
1115  while i < len(rlist):
1116  j = i + 1
1117  while j < len(rlist) and rlist[j] < 13 and rlist[j] == rlist[j - 1] + 1:
1118  j += 1
1119  j -= 1
1120  if j < i + 2:
1121  out.append(regs_str[rlist[i]])
1122  i += 1
1123  else:
1124  out.append(regs_str[rlist[i]] + '-' + regs_str[rlist[j]])
1125  i = j + 1
1126  return "{" + ", ".join(out) + '}'
1127 
1128 
1130  parser = gpreg_list
1131 
1132  def encode(self):
1133  self.parent.sbit.value = 0
1134  e = self.expr
1135  if isinstance(e, ExprOp) and e.op == "sbit":
1136  e = e.args[0]
1137  self.parent.sbit.value = 1
1138  rlist = [gpregs.expr.index(x) for x in e.args]
1139  v = 0
1140  for r in rlist:
1141  v |= 1 << r
1142  self.value = v
1143  return True
1144 
1145  def decode(self, v):
1146  v = v & self.lmask
1147  out = []
1148  for i in xrange(0x10):
1149  if 1 << i & v:
1150  out.append(gpregs.expr[i])
1151  if not out:
1152  return False
1153  e = ExprOp('reglist', *out)
1154  if self.parent.sbit.value == 1:
1155  e = ExprOp('sbit', e)
1156  self.expr = e
1157  return True
1158 
1159 
1161  mn_mod = ['D', 'I']
1162 
1163  def modname(self, name, f_i):
1164  return name + self.args['mn_mod'][f_i]
1165 
1166 
1168  prio = 5
1169  mn_mod = ['A', 'B']
1170 
1171 
1173  mn_mod = ['A', 'D']
1174 
1175  def modname(self, name, f_i):
1176  if name.startswith("STM"):
1177  f_i = [1, 0][f_i]
1178  return name + self.args['mn_mod'][f_i]
1179 
1180 
1182  mn_mod = ['F', 'E']
1183 
1184  def modname(self, name, f_i):
1185  if name.startswith("STM"):
1186  f_i = [1, 0][f_i]
1187  return name + self.args['mn_mod'][f_i]
1188 
1189 
1191 
1192  def decode(self, v):
1193  v = v & self.lmask
1194  if v == 13:
1195  return False
1196  e = self.reg_info.expr[v]
1197  if self.parent.wback.value:
1198  e = ExprOp('wback', e)
1199  self.expr = e
1200  return True
1201 
1202 
1204 
1205  def decode(self, v):
1206  v = v & self.lmask
1207  v = (v << 2) + (self.parent.lowb.value << 1)
1208  v = sign_ext(v, 26, 32)
1209  # Add pipeline offset
1210  v += 8
1211  self.expr = ExprInt32(v)
1212  return True
1213 
1214  def encode(self):
1215  if not isinstance(self.expr, ExprInt):
1216  return False
1217  # Remove pipeline offset
1218  v = int(self.expr.arg - 8)
1219  if v & 0x80000000:
1220  v &= (1 << 26) - 1
1221  self.parent.lowb.value = (v >> 1) & 1
1222  self.value = v >> 2
1223  return True
1224 
1225 
1227 
1228  def modname(self, name, i):
1229  return name[:1] + self.args['mn_mod'][i] + name[1:]
1230 
1231 
1232 accum = bs(l=1)
1233 scc = bs_mod_name(l=1, fname='scc', mn_mod=['', 'S'])
1234 dumscc = bs("1")
1235 rd = bs(l=4, cls=(arm_gpreg,))
1236 rdl = bs(l=4, cls=(arm_gpreg,))
1237 
1238 rn = bs(l=4, cls=(arm_gpreg,), fname="rn")
1239 rs = bs(l=4, cls=(arm_gpreg,))
1240 rm = bs(l=4, cls=(arm_gpreg,))
1241 op2 = bs(l=12, cls=(arm_op2,))
1242 lnk = bs_lnk(l=1, fname='lnk', mn_mod=['', 'L'])
1243 offs = bs(l=24, cls=(arm_offs,), fname="offs")
1244 
1245 rn_noarg = bs(l=4, cls=(arm_gpreg_noarg,), fname="rn")
1246 rm_noarg = bs(l=4, cls=(arm_gpreg_noarg,), fname="rm", order = -1)
1247 
1248 immop = bs(l=1, fname='immop')
1249 dumr = bs(l=4, default_val="0000", fname="dumr")
1250 # psr = bs(l=1, cls=(arm_psr,), fname="psr")
1251 
1252 psr = bs(l=1, fname="psr")
1253 psr_field = bs(l=4, cls=(arm_psr,))
1254 
1255 ppi = bs(l=1, fname='ppi')
1256 updown = bs(l=1, fname='updown')
1257 trb = bs_mod_name(l=1, fname='trb', mn_mod=['', 'B'])
1258 wback = bs_mod_name(l=1, fname="wback", mn_mod=['', 'T'])
1259 wback_no_t = bs(l=1, fname="wback")
1260 
1261 op2imm = bs(l=12, cls=(arm_op2imm,))
1262 
1263 updown_b_nosp = updown_b_nosp_mn(l=1, mn_mod=['D', 'I'], fname='updown')
1264 ppi_b_nosp = ppi_b_nosp_mn(l=1, mn_mod=['A', 'B'], fname='ppi')
1265 updown_b_sp = updown_b_sp_mn(l=1, mn_mod=['A', 'D'], fname='updown')
1266 ppi_b_sp = ppi_b_sp_mn(l=1, mn_mod=['F', 'E'], fname='ppi')
1267 
1268 sbit = bs(l=1, fname="sbit")
1269 rn_sp = bs("1101", cls=(arm_reg_wb,), fname='rnsp')
1270 rn_wb = bs(l=4, cls=(arm_reg_wb_nosp,), fname='rn')
1271 rlist = bs(l=16, cls=(arm_rlist,), fname='rlist')
1272 
1273 swi_i = bs(l=24, cls=(arm_imm,), fname="swi_i")
1274 
1275 opc = bs(l=4, cls=(arm_imm, m_arg), fname='opc')
1276 crn = bs(l=4, cls=(arm_cpreg,), fname='crn')
1277 crd = bs(l=4, cls=(arm_cpreg,), fname='crd')
1278 crm = bs(l=4, cls=(arm_cpreg,), fname='crm')
1279 cpnum = bs(l=4, cls=(arm_preg,), fname='cpnum')
1280 cp = bs(l=3, cls=(arm_imm, m_arg), fname='cp')
1281 
1282 imm8_12 = bs(l=8, cls=(arm_imm8_12, m_arg), fname='imm')
1283 tl = bs_mod_name(l=1, fname="tl", mn_mod=['', 'L'])
1284 
1285 cpopc = bs(l=3, cls=(arm_imm, m_arg), fname='cpopc')
1286 imm20 = bs(l=20, cls=(arm_imm, m_arg))
1287 imm4 = bs(l=4, cls=(arm_imm, m_arg))
1288 imm12 = bs(l=12, cls=(arm_imm, m_arg))
1289 imm16 = bs(l=16, cls=(arm_imm, m_arg))
1290 
1291 imm4_noarg = bs(l=4, fname="imm4")
1292 
1293 imm_4_12 = bs(l=12, cls=(arm_imm_4_12,))
1294 
1295 lowb = bs(l=1, fname='lowb')
1296 offs_blx = bs(l=24, cls=(arm_offs_blx,), fname="offs")
1297 
1298 fix_cond = bs("1111", fname="cond")
1299 
1301  prio = 5
1302  mn_mod = ['B', 'T']
1303 
1305  prio = 6
1306  mn_mod = ['B', 'T']
1307 
1308 mul_x = mul_part_x(l=1, fname='x', mn_mod=['B', 'T'])
1309 mul_y = mul_part_y(l=1, fname='y', mn_mod=['B', 'T'])
1310 
1312  parser = deref
1313 
1314  def decode(self, v):
1315  if self.parent.immop.value == 1:
1316  imm = ExprInt32((self.parent.immedH.value << 4) | v)
1317  else:
1318  imm = gpregs.expr[v]
1319  if self.parent.updown.value == 0:
1320  imm = -imm
1321  if self.parent.ppi.value:
1322  e = ExprOp('preinc', self.parent.rn.expr, imm)
1323  else:
1324  e = ExprOp('postinc', self.parent.rn.expr, imm)
1325  if self.parent.wback.value == 1:
1326  e = ExprOp('wback', e)
1327  self.expr = ExprMem(e)
1328 
1329  return True
1330 
1331  def encode(self):
1332  self.parent.immop.value = 1
1333  self.parent.updown.value = 1
1334  e = self.expr
1335  if not isinstance(e, ExprMem):
1336  return False
1337  e = e.arg
1338  if isinstance(e, ExprOp) and e.op == 'wback':
1339  self.parent.wback.value = 1
1340  e = e.args[0]
1341  else:
1342  self.parent.wback.value = 0
1343  if e.op == "postinc":
1344  self.parent.ppi.value = 0
1345  elif e.op == "preinc":
1346  self.parent.ppi.value = 1
1347  else:
1348  # XXX default
1349  self.parent.ppi.value = 1
1350  self.parent.rn.expr = e.args[0]
1351  if len(e.args) == 1:
1352  self.value = 0
1353  self.parent.immedH.value = 0
1354  return True
1355  e = e.args[1]
1356  if isinstance(e, ExprInt):
1357  v = int(e.arg)
1358  if v < 0 or v & (1 << 31):
1359  self.parent.updown.value = 0
1360  v = (-v) & 0xFFFFFFFF
1361  if v > 0xff:
1362  log.debug('cannot encode imm XXX')
1363  return False
1364  self.value = v & 0xF
1365  self.parent.immedH.value = v >> 4
1366  return True
1367 
1368  self.parent.immop.value = 0
1369  if isinstance(e, ExprOp) and len(e.args) == 1 and e.op == "-":
1370  self.parent.updown.value = 0
1371  e = e.args[0]
1372  if e in gpregs.expr:
1373  self.value = gpregs.expr.index(e)
1374  self.parent.immedH.value = 0x0
1375  return True
1376  else:
1377  raise ValueError('e should be int: %r' % e)
1378 
1379 immedH = bs(l=4, fname='immedH')
1380 immedL = bs(l=4, cls=(arm_immed, m_arg), fname='immedL')
1381 hb = bs(l=1)
1382 
1383 
1385  parser = shift_off
1386  def decode(self, v):
1387  r = self.parent.rm.expr
1388  if v == 00:
1389  e = r
1390  else:
1391  raise NotImplementedError('rotation')
1392  self.expr = e
1393  return True
1394  def encode(self):
1395  e = self.expr
1396  if isinstance(e, ExprId):
1397  self.value = 0
1398  else:
1399  raise NotImplementedError('rotation')
1400  return True
1401 
1402 rot_rm = bs(l=2, cls=(armt2_rot_rm,), fname="rot_rm")
1403 
1404 
1405 def armop(name, fields, args=None, alias=False):
1406  dct = {"fields": fields}
1407  dct["alias"] = alias
1408  if args is not None:
1409  dct['args'] = args
1410  type(name, (mn_arm,), dct)
1411 
1412 
1413 def armtop(name, fields, args=None, alias=False):
1414  dct = {"fields": fields}
1415  dct["alias"] = alias
1416  if args is not None:
1417  dct['args'] = args
1418  type(name, (mn_armt,), dct)
1419 
1420 
1421 op_list = ['AND', 'EOR', 'SUB', 'RSB', 'ADD', 'ADC', 'SBC', 'RSC',
1422  'TST', 'TEQ', 'CMP', 'CMN', 'ORR', 'MOV', 'BIC', 'MVN']
1423 data_mov_name = {'MOV': 13, 'MVN': 15}
1424 data_test_name = {'TST': 8, 'TEQ': 9, 'CMP': 10, 'CMN': 11}
1425 
1426 data_name = {}
1427 for i, n in enumerate(op_list):
1428  if n in data_mov_name.keys() + data_test_name.keys():
1429  continue
1430  data_name[n] = i
1431 bs_data_name = bs_name(l=4, name=data_name)
1432 
1433 bs_data_mov_name = bs_name(l=4, name=data_mov_name)
1434 
1435 bs_data_test_name = bs_name(l=4, name=data_test_name)
1436 
1437 
1438 transfer_name = {'STR': 0, 'LDR': 1}
1439 bs_transfer_name = bs_name(l=1, name=transfer_name)
1440 
1441 transferh_name = {'STRH': 0, 'LDRH': 1}
1442 bs_transferh_name = bs_name(l=1, name=transferh_name)
1443 
1444 
1445 transfer_ldr_name = {'LDRD': 0, 'LDRSB': 1}
1446 bs_transfer_ldr_name = bs_name(l=1, name=transfer_ldr_name)
1447 
1448 btransfer_name = {'STM': 0, 'LDM': 1}
1449 bs_btransfer_name = bs_name(l=1, name=btransfer_name)
1450 
1451 ctransfer_name = {'STC': 0, 'LDC': 1}
1452 bs_ctransfer_name = bs_name(l=1, name=ctransfer_name)
1453 
1454 mr_name = {'MCR': 0, 'MRC': 1}
1455 bs_mr_name = bs_name(l=1, name=mr_name)
1456 
1457 armop("mul", [bs('000000'), bs('0'), scc, rd,
1458  bs('0000'), rs, bs('1001'), rm], [rd, rm, rs])
1459 armop("umull", [bs('000010'),
1460  bs('0'), scc, rd, rdl, rs, bs('1001'), rm], [rdl, rd, rm, rs])
1461 armop("umlal", [bs('000010'),
1462  bs('1'), scc, rd, rdl, rs, bs('1001'), rm], [rdl, rd, rm, rs])
1463 armop("smull", [bs('000011'), bs('0'), scc, rd,
1464  rdl, rs, bs('1001'), rm], [rdl, rd, rm, rs])
1465 armop("smlal", [bs('000011'), bs('1'), scc, rd,
1466  rdl, rs, bs('1001'), rm], [rdl, rd, rm, rs])
1467 armop("mla", [bs('000000'), bs('1'), scc, rd,
1468  rn, rs, bs('1001'), rm], [rd, rm, rs, rn])
1469 armop("mrs", [bs('00010'), psr, bs('00'),
1470  psr_field, rd, bs('000000000000')], [rd, psr])
1471 armop("msr", [bs('00010'), psr, bs('10'), psr_field,
1472  bs('1111'), bs('0000'), bs('0000'), rm], [psr_field, rm])
1473 armop("data", [bs('00'), immop, bs_data_name, scc, rn, rd, op2], [rd, rn, op2])
1474 armop("data_mov",
1475  [bs('00'), immop, bs_data_mov_name, scc, bs('0000'), rd, op2], [rd, op2])
1476 armop("data_test", [bs('00'), immop, bs_data_test_name, dumscc, rn, dumr, op2])
1477 armop("b", [bs('101'), lnk, offs])
1478 
1479 armop("smul", [bs('00010110'), rd, bs('0000'), rs, bs('1'), mul_y, mul_x, bs('0'), rm], [rd, rm, rs])
1480 
1481 # TODO TEST
1482 #armop("und", [bs('011'), imm20, bs('1'), imm4])
1483 armop("transfer", [bs('01'), immop, ppi, updown, trb, wback_no_t,
1484  bs_transfer_name, rn_noarg, rd, op2imm], [rd, op2imm])
1485 armop("transferh", [bs('000'), ppi, updown, immop, wback_no_t,
1486  bs_transferh_name, rn_noarg, rd, immedH, bs('1011'), immedL], [rd, immedL])
1487 armop("ldrd", [bs('000'), ppi, updown, immop, wback_no_t, bs_transfer_ldr_name,
1488  rn_noarg, rd, immedH, bs('1101'), immedL], [rd, immedL])
1489 armop("ldrsh", [bs('000'), ppi, updown, immop, wback_no_t, bs('1'), rn_noarg,
1490  rd, immedH, bs('1'), bs('1'), bs('1'), bs('1'), immedL], [rd, immedL])
1491 armop("strd", [bs('000'), ppi, updown, immop, wback_no_t, bs('0'), rn_noarg,
1492  rd, immedH, bs('1'), bs('1'), bs('1'), bs('1'), immedL], [rd, immedL])
1493 armop("btransfersp", [bs('100'), ppi_b_sp, updown_b_sp, sbit, wback_no_t,
1494  bs_btransfer_name, rn_sp, rlist])
1495 armop("btransfer", [bs('100'), ppi_b_nosp, updown_b_nosp, sbit, wback_no_t,
1496  bs_btransfer_name, rn_wb, rlist])
1497 # TODO: TEST
1498 armop("swp", [bs('00010'), trb, bs('00'), rn, rd, bs('0000'), bs('1001'), rm])
1499 armop("svc", [bs('1111'), swi_i])
1500 armop("cdp", [bs('1110'), opc, crn, crd, cpnum, cp, bs('0'), crm],
1501  [cpnum, opc, crd, crn, crm, cp])
1502 armop("cdata", [bs('110'), ppi, updown, tl, wback_no_t, bs_ctransfer_name,
1503  rn_noarg, crd, cpnum, imm8_12], [cpnum, crd, imm8_12])
1504 armop("mr", [bs('1110'), cpopc, bs_mr_name, crn, rd, cpnum, cp, bs('1'), crm],
1505  [cpnum, cpopc, rd, crn, crm, cp])
1506 armop("bkpt", [bs('00010010'), imm12, bs('0111'), imm4])
1507 armop("bx", [bs('000100101111111111110001'), rn])
1508 armop("mov", [bs('00110000'), imm4_noarg, rd, imm_4_12], [rd, imm_4_12])
1509 armop("movt", [bs('00110100'), imm4_noarg, rd, imm_4_12], [rd, imm_4_12])
1510 armop("blx", [bs('00010010'), bs('1111'),
1511  bs('1111'), bs('1111'), bs('0011'), rm], [rm])
1512 armop("blx", [fix_cond, bs('101'), lowb, offs_blx], [offs_blx])
1513 armop("clz", [bs('00010110'), bs('1111'),
1514  rd, bs('1111'), bs('0001'), rm], [rd, rm])
1515 armop("qadd",
1516  [bs('00010000'), rn, rd, bs('0000'), bs('0101'), rm], [rd, rm, rn])
1517 
1518 armop("uxtb", [bs('01101110'), bs('1111'), rd, rot_rm, bs('00'), bs('0111'), rm_noarg])
1519 armop("uxth", [bs('01101111'), bs('1111'), rd, rot_rm, bs('00'), bs('0111'), rm_noarg])
1520 armop("sxtb", [bs('01101010'), bs('1111'), rd, rot_rm, bs('00'), bs('0111'), rm_noarg])
1521 armop("sxth", [bs('01101011'), bs('1111'), rd, rot_rm, bs('00'), bs('0111'), rm_noarg])
1522 
1523 armop("rev", [bs('01101011'), bs('1111'), rd, bs('1111'), bs('0011'), rm])
1524 
1526  def decode(self, v):
1527  self.expr = ExprInt32(v+1)
1528  return True
1529 
1530  def encode(self):
1531  if not isinstance(self.expr, ExprInt):
1532  return False
1533  v = int(self.expr.arg) + -1
1534  self.value = v
1535  return True
1536 
1537 
1538 widthm1 = bs(l=5, cls=(arm_widthm1, m_arg))
1539 lsb = bs(l=5, cls=(arm_imm, m_arg))
1540 
1541 armop("ubfx", [bs('0111111'), widthm1, rd, lsb, bs('101'), rn], [rd, rn, lsb, widthm1])
1542 
1543 armop("bfc", [bs('0111110'), widthm1, rd, lsb, bs('001'), bs('1111')], [rd, lsb, widthm1])
1544 #
1545 # thumnb #######################
1546 #
1547 # ARM7-TDMI-manual-pt3
1548 gpregs_l = reg_info(regs_str[:8], regs_expr[:8])
1549 gpregs_h = reg_info(regs_str[8:], regs_expr[8:])
1550 
1551 gpregs_sppc = reg_info(regs_str[-1:] + regs_str[13:14],
1552  regs_expr[-1:] + regs_expr[13:14])
1553 
1554 deref_low = Group(LBRACK + gpregs_l.parser + Optional(
1555  COMMA + shift_off) + RBRACK).setParseAction(deref2expr_pre_mem)
1556 deref_pc = Group(LBRACK + gpregs_pc.parser + Optional(
1557  COMMA + shift_off) + RBRACK).setParseAction(deref2expr_pre_mem)
1558 deref_sp = Group(LBRACK + gpregs_sp.parser + COMMA +
1559  shift_off + RBRACK).setParseAction(deref2expr_pre_mem)
1560 
1561 gpregs_l_wb = Group(
1562  gpregs_l.parser + Optional('!')).setParseAction(parsegpreg_wb)
1563 
1564 
1566  parser = deref_pc
1567 
1568  def decodeval(self, v):
1569  return v
1570 
1571  def encodeval(self, v):
1572  return v
1573 
1574  def decode(self, v):
1575  v = v & self.lmask
1576  v = self.decodeval(v)
1577  if v:
1578  self.expr = self.off_reg + ExprInt32(v)
1579  else:
1580  self.expr = self.off_reg
1581 
1582  e = self.expr
1583  if isinstance(e, ExprOp) and e.op == 'wback':
1584  self.parent.wback.value = 1
1585  e = e.args[0]
1586  return True
1587 
1588  def encode(self):
1589  e = self.expr
1590  if not (isinstance(e, ExprOp) and e.op == "preinc"):
1591  log.debug('cannot encode %r', e)
1592  return False
1593  if e.args[0] != self.off_reg:
1594  log.debug('cannot encode reg %r', e.args[0])
1595  return False
1596  v = int(e.args[1].arg)
1597  v = self.encodeval(v)
1598  self.value = v
1599  return True
1600 
1601 
1603  off_reg = regs_expr[15]
1604 
1605  def decode(self, v):
1606  v = v & self.lmask
1607  v <<= 2
1608  if v:
1609  self.expr = ExprMem(self.off_reg + ExprInt32(v))
1610  else:
1611  self.expr = ExprMem(self.off_reg)
1612 
1613  e = self.expr.arg
1614  if isinstance(e, ExprOp) and e.op == 'wback':
1615  self.parent.wback.value = 1
1616  e = e.args[0]
1617  return True
1618 
1619  def encode(self):
1620  e = self.expr
1621  if not isinstance(e, ExprMem):
1622  return False
1623  e = e.arg
1624  if not (isinstance(e, ExprOp) and e.op == "preinc"):
1625  log.debug('cannot encode %r', e)
1626  return False
1627  if e.args[0] != self.off_reg:
1628  log.debug('cannot encode reg %r', e.args[0])
1629  return False
1630  v = int(e.args[1].arg)
1631  v >>= 2
1632  self.value = v
1633  return True
1634 
1635 
1636 
1637 
1639  parser = deref_sp
1640  off_reg = regs_expr[13]
1641 
1642 
1644 
1645  def decodeval(self, v):
1646  v = v << 1
1647  # Add pipeline offset
1648  v += 2 + 2
1649  return v
1650 
1651  def encodeval(self, v):
1652  # Remove pipeline offset
1653  v -= 2 + 2
1654  if v % 2 == 0:
1655  return v >> 1
1656  return False
1657 
1658 
1660 
1661  def decodeval(self, v):
1662  return v << 2
1663 
1664  def encodeval(self, v):
1665  return v >> 2
1666 
1667 
1669 
1670  def decodeval(self, v):
1671  return v << 2
1672 
1673  def encodeval(self, v):
1674  return v >> 2
1675 
1676 
1678  parser = deref_low
1679 
1680  def decode(self, v):
1681  v = v & self.lmask
1682  rbase = regs_expr[v]
1683  e = ExprOp('preinc', rbase, self.parent.off.expr)
1684  self.expr = ExprMem(e)
1685  return True
1686 
1687  def encode(self):
1688  e = self.expr
1689  if not isinstance(e, ExprMem):
1690  return False
1691  e = e.arg
1692  if not (isinstance(e, ExprOp) and e.op == 'preinc'):
1693  log.debug('cannot encode %r', e)
1694  return False
1695  off = e.args[1]
1696  if isinstance(off, ExprId):
1697  self.parent.off.expr = off
1698  elif isinstance(off, ExprInt):
1699  self.parent.off.expr = off
1700  else:
1701  log.debug('cannot encode off %r', off)
1702  return False
1703  self.value = gpregs.expr.index(e.args[0])
1704  if self.value >= 1 << self.l:
1705  log.debug('cannot encode reg %r', off)
1706  return False
1707  return True
1708 
1709 
1711 
1712  def decode(self, v):
1713  v = v & self.lmask
1714  if self.parent.trb.value == 0:
1715  v <<= 2
1716  self.expr = ExprInt32(v)
1717  return True
1718 
1719  def encode(self):
1720  if not isinstance(self.expr, ExprInt):
1721  return False
1722  v = int(self.expr.arg)
1723  if self.parent.trb.value == 0:
1724  if v & 3:
1725  log.debug('off must be aligned %r', v)
1726  return False
1727  v >>= 2
1728  self.value = v
1729  return True
1730 
1731 
1733 
1734  def decode(self, v):
1735  v = v & self.lmask
1736  v <<= 1
1737  self.expr = ExprInt32(v)
1738  return True
1739 
1740  def encode(self):
1741  if not isinstance(self.expr, ExprInt):
1742  return False
1743  v = int(self.expr.arg)
1744  if v & 1:
1745  log.debug('off must be aligned %r', v)
1746  return False
1747  v >>= 1
1748  self.value = v
1749  return True
1750 
1751 
1753  parser = gpreg_list
1754 
1755  def encode(self):
1756  e = self.expr
1757  rlist = [gpregs_l.expr.index(x) for x in e.args]
1758  v = 0
1759  for r in rlist:
1760  v |= 1 << r
1761  self.value = v
1762  return True
1763 
1764  def decode(self, v):
1765  v = v & self.lmask
1766  out = []
1767  for i in xrange(0x10):
1768  if 1 << i & v:
1769  out.append(gpregs.expr[i])
1770  if not out:
1771  return False
1772  e = ExprOp('reglist', *out)
1773  self.expr = e
1774  return True
1775 
1776 
1778 
1779  def encode(self):
1780  e = self.expr
1781  reg_l = list(e.args)
1782  self.parent.pclr.value = 0
1783  if self.parent.pp.value == 0:
1784  # print 'push'
1785  if regs_expr[14] in reg_l:
1786  reg_l.remove(regs_expr[14])
1787  self.parent.pclr.value = 1
1788  else:
1789  # print 'pop',
1790  if regs_expr[15] in reg_l:
1791  reg_l.remove(regs_expr[15])
1792  self.parent.pclr.value = 1
1793  rlist = [gpregs.expr.index(x) for x in reg_l]
1794  v = 0
1795  for r in rlist:
1796  v |= 1 << r
1797  self.value = v
1798  return True
1799 
1800  def decode(self, v):
1801  v = v & self.lmask
1802  out = []
1803  for i in xrange(0x10):
1804  if 1 << i & v:
1805  out.append(gpregs.expr[i])
1806 
1807  if self.parent.pclr.value == 1:
1808  if self.parent.pp.value == 0:
1809  out += [regs_expr[14]]
1810  else:
1811  out += [regs_expr[15]]
1812  if not out:
1813  return False
1814  e = ExprOp('reglist', *out)
1815  self.expr = e
1816  return True
1817 
1818 
1820  reg_info = gpregs_l
1821  parser = gpregs_l_wb
1822 
1823  def decode(self, v):
1824  v = v & self.lmask
1825  e = self.reg_info.expr[v]
1826  if not e in self.parent.trlist.expr.args:
1827  e = ExprOp('wback', e)
1828  self.expr = e
1829  return True
1830 
1831  def encode(self):
1832  e = self.expr
1833  if isinstance(e, ExprOp):
1834  if e.op != 'wback':
1835  return False
1836  e = e.args[0]
1837  self.value = self.reg_info.expr.index(e)
1838  return True
1839 
1840 
1842  reg_info = gpregs_l
1843  parser = reg_info.parser
1844 
1845 
1847  reg_info = gpregs_h
1848  parser = reg_info.parser
1849 
1850 
1852  reg_info = gpregs_l
1853  parser = reg_info.parser
1854 
1855 
1857  reg_info = gpregs_sppc
1858  parser = reg_info.parser
1859 
1860 
1862  reg_info = gpregs_sp
1863  parser = reg_info.parser
1864 
1865 
1866 off5 = bs(l=5, cls=(arm_imm,), fname="off")
1867 off3 = bs(l=3, cls=(arm_imm,), fname="off")
1868 off8 = bs(l=8, cls=(arm_imm,), fname="off")
1869 off7 = bs(l=7, cls=(arm_off7,), fname="off")
1870 
1871 rdl = bs(l=3, cls=(arm_gpreg_l,), fname="rd")
1872 rnl = bs(l=3, cls=(arm_gpreg_l,), fname="rn")
1873 rsl = bs(l=3, cls=(arm_gpreg_l,), fname="rs")
1874 rml = bs(l=3, cls=(arm_gpreg_l,), fname="rm")
1875 rol = bs(l=3, cls=(arm_gpreg_l,), fname="ro")
1876 rbl = bs(l=3, cls=(arm_gpreg_l,), fname="rb")
1877 rbl_deref = bs(l=3, cls=(arm_deref,), fname="rb")
1878 dumrh = bs(l=3, default_val="000")
1879 
1880 rdh = bs(l=3, cls=(arm_gpreg_h,), fname="rd")
1881 rsh = bs(l=3, cls=(arm_gpreg_h,), fname="rs")
1882 
1883 offpc8 = bs(l=8, cls=(arm_offpc,), fname="offs")
1884 offsp8 = bs(l=8, cls=(arm_offsp,), fname="offs")
1885 rol_noarg = bs(l=3, cls=(arm_gpreg_l_noarg,), fname="off")
1886 
1887 off5bw = bs(l=5, cls=(arm_offbw,), fname="off")
1888 off5h = bs(l=5, cls=(arm_offh,), fname="off")
1889 sppc = bs(l=1, cls=(arm_sppc,))
1890 
1891 
1892 pclr = bs(l=1, fname='pclr')
1893 
1894 
1895 sp = bs(l=0, cls=(arm_sp,))
1896 
1897 
1898 off8s = bs(l=8, cls=(arm_offs,), fname="offs")
1899 trlistpclr = bs(l=8, cls=(armt_rlist_pclr,))
1900 trlist = bs(l=8, cls=(armt_rlist,), fname="trlist", order = -1)
1901 
1902 rbl_wb = bs(l=3, cls=(armt_reg_wb,), fname='rb')
1903 
1904 offs8 = bs(l=8, cls=(arm_offspc,), fname="offs")
1905 offs11 = bs(l=11, cls=(arm_offspc,), fname="offs")
1906 
1907 hl = bs(l=1, prio=default_prio + 1, fname='hl')
1908 off8sppc = bs(l=8, cls=(arm_off8sppc,), fname="off")
1909 
1910 imm8_d1 = bs(l=8, default_val="00000001")
1911 imm8 = bs(l=8, cls=(arm_imm,), default_val = "00000001")
1912 
1913 
1914 mshift_name = {'LSLS': 0, 'LSRS': 1, 'ASRS': 2}
1915 bs_mshift_name = bs_name(l=2, name=mshift_name)
1916 
1917 
1918 addsub_name = {'ADDS': 0, 'SUBS': 1}
1919 bs_addsub_name = bs_name(l=1, name=addsub_name)
1920 
1921 mov_cmp_add_sub_name = {'MOVS': 0, 'CMP': 1, 'ADDS': 2, 'SUBS': 3}
1922 bs_mov_cmp_add_sub_name = bs_name(l=2, name=mov_cmp_add_sub_name)
1923 
1924 alu_name = {'ANDS': 0, 'EORS': 1, 'LSLS': 2, 'LSRS': 3,
1925  'ASRS': 4, 'ADCS': 5, 'SBCS': 6, 'RORS': 7,
1926  'TST': 8, 'NEGS': 9, 'CMP': 10, 'CMN': 11,
1927  'ORRS': 12, 'MULS': 13, 'BICS': 14, 'MVNS': 15}
1928 bs_alu_name = bs_name(l=4, name=alu_name)
1929 
1930 hiregop_name = {'ADDS': 0, 'CMP': 1, 'MOV': 2}
1931 bs_hiregop_name = bs_name(l=2, name=hiregop_name)
1932 
1933 ldr_str_name = {'STR': 0, 'LDR': 1}
1934 bs_ldr_str_name = bs_name(l=1, name=ldr_str_name)
1935 
1936 ldrh_strh_name = {'STRH': 0, 'LDRH': 1}
1937 bs_ldrh_strh_name = bs_name(l=1, name=ldrh_strh_name)
1938 
1939 ldstsp_name = {'STR': 0, 'LDR': 1}
1940 bs_ldstsp_name = bs_name(l=1, name=ldstsp_name)
1941 
1942 addsubsp_name = {'ADD': 0, 'SUB': 1}
1943 bs_addsubsp_name = bs_name(l=1, name=addsubsp_name)
1944 
1945 pushpop_name = {'PUSH': 0, 'POP': 1}
1946 bs_pushpop_name = bs_name(l=1, name=pushpop_name, fname='pp')
1947 
1948 tbtransfer_name = {'STMIA': 0, 'LDMIA': 1}
1949 bs_tbtransfer_name = bs_name(l=1, name=tbtransfer_name)
1950 
1951 br_name = {'BEQ': 0, 'BNE': 1, 'BCS': 2, 'BCC': 3, 'BMI': 4,
1952  'BPL': 5, 'BVS': 6, 'BVC': 7, 'BHI': 8, 'BLS': 9,
1953  'BGE': 10, 'BLT': 11, 'BGT': 12, 'BLE': 13}
1954 bs_br_name = bs_name(l=4, name=br_name)
1955 
1956 
1957 armtop("mshift", [bs('000'), bs_mshift_name, off5, rsl, rdl], [rdl, rsl, off5])
1958 armtop("addsubr",
1959  [bs('000110'), bs_addsub_name, rnl, rsl, rdl], [rdl, rsl, rnl])
1960 armtop("addsubi",
1961  [bs('000111'), bs_addsub_name, off3, rsl, rdl], [rdl, rsl, off3])
1962 armtop("mcas", [bs('001'), bs_mov_cmp_add_sub_name, rnl, off8])
1963 armtop("alu", [bs('010000'), bs_alu_name, rsl, rdl], [rdl, rsl])
1964  # should not be used ??
1965 armtop("hiregop00",
1966  [bs('010001'), bs_hiregop_name, bs('00'), rsl, rdl], [rdl, rsl])
1967 armtop("hiregop01",
1968  [bs('010001'), bs_hiregop_name, bs('01'), rsh, rdl], [rdl, rsh])
1969 armtop("hiregop10",
1970  [bs('010001'), bs_hiregop_name, bs('10'), rsl, rdh], [rdh, rsl])
1971 armtop("hiregop11",
1972  [bs('010001'), bs_hiregop_name, bs('11'), rsh, rdh], [rdh, rsh])
1973 armtop("bx", [bs('010001'), bs('11'), bs('00'), rsl, dumrh])
1974 armtop("bx", [bs('010001'), bs('11'), bs('01'), rsh, dumrh])
1975 armtop("ldr", [bs('01001'), rdl, offpc8])
1976 armtop("ldrstr", [bs('0101'), bs_ldr_str_name,
1977  trb, bs('0'), rol_noarg, rbl_deref, rdl], [rdl, rbl_deref])
1978 armtop("strh", [bs('0101'), bs('00'), bs('1'),
1979  rol_noarg, rbl_deref, rdl], [rdl, rbl_deref])
1980 armtop("ldrh", [bs('0101'), bs('10'), bs('1'),
1981  rol_noarg, rbl_deref, rdl], [rdl, rbl_deref])
1982 armtop("ldsb", [bs('0101'), bs('01'), bs('1'),
1983  rol_noarg, rbl_deref, rdl], [rdl, rbl_deref])
1984 armtop("ldsh", [bs('0101'), bs('11'), bs('1'),
1985  rol_noarg, rbl_deref, rdl], [rdl, rbl_deref])
1986 armtop("ldst", [bs('011'), trb,
1987  bs_ldr_str_name, off5bw, rbl_deref, rdl], [rdl, rbl_deref])
1988 armtop("ldhsth",
1989  [bs('1000'), bs_ldrh_strh_name, off5h, rbl_deref, rdl], [rdl, rbl_deref])
1990 armtop("ldstsp", [bs('1001'), bs_ldstsp_name, rdl, offsp8], [rdl, offsp8])
1991 armtop("add", [bs('1010'), sppc, rdl, off8sppc], [rdl, sppc, off8sppc])
1992 armtop("addsp", [bs('10110000'), bs_addsubsp_name, sp, off7], [sp, off7])
1993 armtop("pushpop",
1994  [bs('1011'), bs_pushpop_name, bs('10'), pclr, trlistpclr], [trlistpclr])
1995 armtop("btransfersp", [bs('1100'), bs_tbtransfer_name, rbl_wb, trlist])
1996 armtop("br", [bs('1101'), bs_br_name, offs8])
1997 armtop("blx", [bs("01000111"), bs('10'), rnl, bs('000')])
1998 armtop("svc", [bs('11011111'), imm8])
1999 armtop("b", [bs('11100'), offs11])
2000 armtop("und", [bs('1101'), bs('1110'), imm8_d1])
2001 
2002 
2003 armtop("uxtb", [bs('10110010'), bs('11'), rml, rdl], [rdl, rml])
2004 armtop("uxth", [bs('10110010'), bs('10'), rml, rdl], [rdl, rml])
2005 armtop("sxtb", [bs('10110010'), bs('01'), rml, rdl], [rdl, rml])
2006 armtop("sxth", [bs('10110010'), bs('00'), rml, rdl], [rdl, rml])
2007 
2008 # thumb2 ######################
2009 #
2010 
2011 # ARM Architecture Reference Manual Thumb-2 Supplement
2012 
2013 armt_gpreg_shift_off = Group(
2014  gpregs_nosppc.parser + allshifts_t_armt + base_expr
2015 ).setParseAction(shift2expr)
2016 armt_gpreg_shift_off |= gpregs_nosppc.parser
2017 
2018 
2020  reg_info = gpregs_nosppc
2021 
2022 
2024  parser = armt_gpreg_shift_off
2025 
2026  def decode(self, v):
2027  v = v & self.lmask
2028  if v >= len(gpregs_nosppc.expr):
2029  return False
2030  r = gpregs_nosppc.expr[v]
2031 
2032  i = int(self.parent.imm5_3.value) << 2
2033  i |= int(self.parent.imm5_2.value)
2034 
2035  if self.parent.stype.value < 3 or i != 0:
2036  shift = allshifts_armt[self.parent.stype.value]
2037  else:
2038  shift = allshifts_armt[4]
2039  self.expr = ExprOp(shift, r, ExprInt32(i))
2040  return True
2041 
2042  def encode(self):
2043  e = self.expr
2044  if isinstance(e, ExprId):
2045  self.value = gpregs_nosppc.index(e)
2046  self.parent.stype.value = 0
2047  self.parent.imm5_3.value = 0
2048  self.parent.imm5_2.value = 0
2049  return True
2050  shift = e.op
2051  r = gpregs_nosppc.expr.index(e.args[0])
2052  self.value = r
2053  i = int(e.args[1].arg)
2054  if shift == 'rrx':
2055  if i != 1:
2056  log.debug('rrx shift must be 1')
2057  return False
2058  self.parent.imm5_3.value = 0
2059  self.parent.imm5_2.value = 0
2060  self.parent.stype.value = 3
2061  return True
2062  self.parent.stype.value = allshifts_armt.index(shift)
2063  self.parent.imm5_2.value = i & 3
2064  self.parent.imm5_3.value = i >> 2
2065  return True
2066 
2067 rn_nosppc = bs(l=4, cls=(arm_gpreg_nosppc,), fname="rn")
2068 rd_nosppc = bs(l=4, cls=(arm_gpreg_nosppc,), fname="rd")
2069 rm_sh = bs(l=4, cls=(armt_gpreg_rm_shift_off,), fname="rm")
2070 
2071 
2073 
2074  def decode(self, v):
2075  v = v & self.lmask
2076  v |= int(self.parent.imm12_3.value) << 8
2077  v |= int(self.parent.imm12_1.value) << 11
2078 
2079  # simple encoding
2080  if 0 <= v < 0x100:
2081  self.expr = ExprInt32(v)
2082  return True
2083  # 00XY00XY form
2084  if v >> 8 == 1:
2085  v &= 0xFF
2086  self.expr = ExprInt32((v << 16) | v)
2087  return True
2088  # XY00XY00 form
2089  if v >> 8 == 2:
2090  v &= 0xFF
2091  self.expr = ExprInt32((v << 24) | (v << 8))
2092  return True
2093  # XYXYXYXY
2094  if v >> 8 == 3:
2095  v &= 0xFF
2096  self.expr = ExprInt32((v << 24) | (v << 16) | (v << 8) | v)
2097  return True
2098  r = v >> 7
2099  v = v & 0xFF
2100  self.expr = ExprInt32(myror32(v, r))
2101  return True
2102 
2103  def encode(self):
2104  v = int(self.expr.arg)
2105  value = None
2106  # simple encoding
2107  if 0 <= v < 0x100:
2108  value = v
2109  elif v & 0xFF00FF00 == 0 and v & 0xFF == (v >> 16) & 0xff:
2110  # 00XY00XY form
2111  value = (1 << 8) | (v & 0xFF)
2112  elif v & 0x00FF00FF == 0 and (v >> 8) & 0xff == (v >> 24) & 0xff:
2113  # XY00XY00 form
2114  value = (2 << 8) | ((v >> 8) & 0xff)
2115  elif (v & 0xFF ==
2116  (v >> 8) & 0xFF ==
2117  (v >> 16) & 0xFF ==
2118  (v >> 24) & 0xFF):
2119  # XYXYXYXY form
2120  value = (3 << 8) | ((v >> 16) & 0xff)
2121  else:
2122  # rol encoding
2123  for i in xrange(32):
2124  o = myrol32(v, i)
2125  if 0 <= o < 0x100 and o & 0x80:
2126  value = (i << 7) | o
2127  break
2128  if value is None:
2129  log.debug('cannot encode imm12')
2130  return False
2131  self.value = value & self.lmask
2132  self.parent.imm12_3.value = (value >> 8) & self.parent.imm12_3.lmask
2133  self.parent.imm12_1.value = (value >> 11) & self.parent.imm12_1.lmask
2134  return True
2135 
2136 
2138 
2139  def decode(self, v):
2140  v = v & self.lmask
2141  s = self.parent.sign.value
2142  j1 = self.parent.j1.value
2143  j2 = self.parent.j2.value
2144  imm10h = self.parent.imm10h.value
2145  imm10l = v
2146 
2147  i1, i2 = j1 ^ s ^ 1, j2 ^ s ^ 1
2148 
2149  v = (s << 24) | (i1 << 23) | (
2150  i2 << 22) | (imm10h << 12) | (imm10l << 2)
2151  v = sign_ext(v, 25, 32)
2152  self.expr = ExprInt32(v)
2153  return True
2154 
2155  def encode(self):
2156  if not isinstance(self.expr, ExprInt):
2157  return False
2158  v = self.expr.arg.arg
2159  s = 0
2160  if v & 0x80000000:
2161  s = 1
2162  v = (-v) & 0xffffffff
2163  if v > (1 << 26):
2164  return False
2165  i1, i2, imm10h, imm10l = (v >> 23) & 1, (
2166  v >> 22) & 1, (v >> 12) & 0x3ff, (v >> 2) & 0x3ff
2167  j1, j2 = i1 ^ s ^ 1, i2 ^ s ^ 1
2168  self.parent.sign.value = s
2169  self.parent.j1.value = j1
2170  self.parent.j2.value = j2
2171  self.parent.imm10h.value = imm10h
2172  self.value = imm10l
2173  return True
2174 
2175 
2177 
2178  def decode(self, v):
2179  v = v & self.lmask
2180  s = self.parent.sign.value
2181  j1 = self.parent.j1.value
2182  j2 = self.parent.j2.value
2183  imm10h = self.parent.imm10h.value
2184  imm11l = v
2185 
2186  i1, i2 = j1 ^ s ^ 1, j2 ^ s ^ 1
2187 
2188  v = (s << 24) | (i1 << 23) | (
2189  i2 << 22) | (imm10h << 12) | (imm11l << 1)
2190  v = sign_ext(v, 25, 32)
2191  self.expr = ExprInt32(v)
2192  return True
2193 
2194  def encode(self):
2195  if not isinstance(self.expr, ExprInt):
2196  return False
2197  v = self.expr.arg.arg
2198  s = 0
2199  if v & 0x80000000:
2200  s = 1
2201  v = (-v) & 0xffffffff
2202  if v > (1 << 26):
2203  return False
2204  i1, i2, imm10h, imm11l = (v >> 23) & 1, (
2205  v >> 22) & 1, (v >> 12) & 0x3ff, (v >> 1) & 0x7ff
2206  j1, j2 = i1 ^ s ^ 1, i2 ^ s ^ 1
2207  self.parent.sign.value = s
2208  self.parent.j1.value = j1
2209  self.parent.j2.value = j2
2210  self.parent.imm10h.value = imm10h
2211  self.value = imm11l
2212  return True
2213 
2214 
2215 imm12_1 = bs(l=1, fname="imm12_1", order=1)
2216 imm12_3 = bs(l=3, fname="imm12_3", order=1)
2217 imm12_8 = bs(l=8, cls=(armt2_imm12,), fname="imm", order=2)
2218 
2219 
2220 imm5_3 = bs(l=3, fname="imm5_3")
2221 imm5_2 = bs(l=2, fname="imm5_2")
2222 imm_stype = bs(l=2, fname="stype")
2223 
2224 imm1 = bs(l=1, fname="imm1")
2225 
2226 
2228 
2229  def decode(self, v):
2230  v = sign_ext(((self.parent.imm1.value << 5) | v) << 1, 7, 32)
2231  self.expr = ExprInt32(v)
2232  return True
2233 
2234  def encode(self):
2235  if not isinstance(self.expr, ExprInt):
2236  return False
2237  v = self.expr.arg.arg
2238  if v & 0x80000000:
2239  v &= (1 << 7) - 1
2240  self.parent.imm1.value = (v >> 6) & 1
2241  self.value = (v >> 1) & 0x1f
2242  return True
2243 
2244 imm5_off = bs(l=5, cls=(armt_imm5_1,), fname="imm5_off")
2245 
2246 tsign = bs(l=1, fname="sign")
2247 tj1 = bs(l=1, fname="j1")
2248 tj2 = bs(l=1, fname="j2")
2249 
2250 timm10H = bs(l=10, fname="imm10h")
2251 timm10L = bs(l=10, cls=(armt2_imm10l,), fname="imm10l")
2252 timm11L = bs(l=11, cls=(armt2_imm11l,), fname="imm11l")
2253 
2254 
2255 armtop("adc", [bs('11110'), imm12_1, bs('0'), bs('1010'), scc, rn_nosppc,
2256  bs('0'), imm12_3, rd_nosppc, imm12_8])
2257 armtop("adc", [bs('11101'), bs('01'), bs('1010'), scc, rn_nosppc,
2258  bs('0'), imm5_3, rd_nosppc, imm5_2, imm_stype, rm_sh])
2259 armtop("bl", [bs('11110'), tsign, timm10H,
2260  bs('11'), tj1, bs('1'), tj2, timm11L])
2261 armtop("blx", [bs('11110'), tsign, timm10H,
2262  bs('11'), tj1, bs('0'), tj2, timm10L, bs('0')])
2263 armtop("cbz", [bs('101100'), imm1, bs('1'), imm5_off, rnl], [rnl, imm5_off])
2264 armtop("cbnz", [bs('101110'), imm1, bs('1'), imm5_off, rnl], [rnl, imm5_off])
2265 
2266 armtop("bkpt", [bs('1011'), bs('1110'), imm8])
def deref2expr_pre_mem
Definition: arch.py:209
def myror32
Definition: cpu.py:345
def gen_reg
Definition: cpu.py:105
def gen_base_expr
Definition: cpu.py:309
def deref2expr_nooff
Definition: arch.py:193
def literal_list
Definition: cpu.py:80
def myrol32
Definition: cpu.py:349
def sign_ext
Definition: cpu.py:1602