Miasm2
 All Classes Namespaces Files Functions Variables Typedefs Properties Macros
Classes | Functions | Variables
miasm2.core.cpu Namespace Reference

Classes

class  bitobj
 
class  bs
 
class  bs8
 
class  bs_cond
 
class  bs_divert
 
class  bs_mod_name
 
class  bs_name
 
class  bs_swapargs
 
class  bsi
 
class  bsopt
 
class  cls_mn
 
class  dum_arg
 
class  imm08_noarg
 
class  imm16_noarg
 
class  imm32_noarg
 
class  imm64_noarg
 
class  imm_noarg
 
class  instruction
 
class  int32_noarg
 
class  m_arg
 
class  m_reg
 
class  metamn
 
class  mn_prefix
 
class  parse_ast
 
class  reg_info
 
class  reg_noarg
 

Functions

def literal_list
 
def gen_reg
 
def gen_regs
 
def int2expr
 
def parse_op
 
def parse_id
 
def ast_parse_op
 
def ast_id2expr
 
def ast_int2expr
 
def ast_raw2expr
 
def ast_get_ids
 
def _extract_ast_core
 
def extract_ast_core
 
def neg_int
 
def gen_base_expr
 
def isbin
 
def int2bin
 
def myror32
 
def myrol32
 
def swap16
 
def swap32
 
def perm_inv
 
def gen_bsint
 
def branch2nodes
 
def factor_one_bit
 
def factor_fields
 
def factor_fields_all
 
def factor_tree
 
def graph_tree
 
def add_candidate_to_tree
 
def add_candidate
 
def getfieldby_name
 
def getfieldindexby_name
 
def swap_uint
 
def swap_sint
 
def sign_ext
 

Variables

tuple log = logging.getLogger("cpuhelper")
 
tuple console_handler = logging.StreamHandler()
 
tuple LPARENTHESIS = pyparsing.Literal("(")
 
tuple RPARENTHESIS = pyparsing.Literal(")")
 
tuple integer = pyparsing.Word(pyparsing.nums)
 
tuple hex_word = pyparsing.Literal('0x')
 
tuple hex_int = pyparsing.Combine(hex_word)
 
tuple str_int_pos = (hex_int | integer)
 
tuple str_int_neg
 
 str_int = str_int_pos|str_int_neg
 
tuple logicop = pyparsing.oneOf('& | ^ >> << <<< >>>')
 
tuple signop = pyparsing.oneOf('+ -')
 
tuple multop = pyparsing.oneOf('* / %')
 
tuple plusop = pyparsing.oneOf('+ -')
 
tuple my_var_parser = parse_ast(ast_id2expr, ast_int2expr)
 
int default_prio = 0x1337
 
int total_scans = 0
 

Function Documentation

def miasm2.core.cpu._extract_ast_core (   a)
private

Definition at line 238 of file cpu.py.

239 def _extract_ast_core(a):
240  assert(isinstance(a, tuple))
241  if a[0] in [m2_expr.ExprInt, m2_expr.ExprId]:
242  return a
243  elif a[0] is m2_expr.ExprOp:
244  out = []
245  for x in a[1]:
246  if isinstance(x, tuple):
247  x = _extract_ast_core(x)
248  out.append(x)
249  return tuple([a[0]] + [out])
250  else:
251  raise TypeError('unknown type')
252 
def _extract_ast_core
Definition: cpu.py:238

+ Here is the caller graph for this function:

def miasm2.core.cpu.add_candidate (   bases,
  c 
)

Definition at line 835 of file cpu.py.

836 def add_candidate(bases, c):
837  add_candidate_to_tree(bases[0].bintree, c)
838 
def add_candidate_to_tree
Definition: cpu.py:820
def add_candidate
Definition: cpu.py:835

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.core.cpu.add_candidate_to_tree (   tree,
  c 
)

Definition at line 820 of file cpu.py.

821 def add_candidate_to_tree(tree, c):
822  branch = tree
823  for f in c.fields:
824  if f.l == 0:
825  continue
826  node = f.l, f.fmask, f.fbits, f.fname, f.flen
827 
828  if not node in branch:
829  branch[node] = {}
830  branch = branch[node]
831  if not 'mn' in branch:
832  branch['mn'] = set()
833  branch['mn'].add(c)
834 
def add_candidate_to_tree
Definition: cpu.py:820

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.core.cpu.ast_get_ids (   a)

Definition at line 223 of file cpu.py.

224 def ast_get_ids(a):
225  assert(isinstance(a, tuple))
226  if a[0] is m2_expr.ExprId:
227  return set([a[1]])
228  elif a[0] is m2_expr.ExprInt:
229  return set()
230  elif a[0] is m2_expr.ExprOp:
231  out = set()
232  for x in a[1]:
233  if isinstance(x, tuple):
234  out.update(ast_get_ids(x))
235  return out
236  raise TypeError('unknown type')
237 
def ast_get_ids
Definition: cpu.py:223

+ Here is the caller graph for this function:

def miasm2.core.cpu.ast_id2expr (   a)

Definition at line 197 of file cpu.py.

198 def ast_id2expr(a):
199  return m2_expr.ExprId(a, 32)
200 
def ast_id2expr
Definition: cpu.py:197
def miasm2.core.cpu.ast_int2expr (   a)

Definition at line 201 of file cpu.py.

202 def ast_int2expr(a):
203  return m2_expr.ExprInt32(a)
204 
def ast_int2expr
Definition: cpu.py:201
def miasm2.core.cpu.ast_parse_op (   t)

Definition at line 170 of file cpu.py.

171 def ast_parse_op(t):
172  if len(t) == 1:
173  return t[0]
174  if len(t) == 2:
175  if t[0] in ['-', '+', '!']:
176  return m2_expr.ExprOp(t[0], t[1])
177  if len(t) == 3:
178  args = [t[0], t[2]]
179  if t[1] == '-':
180  # a - b => a + (-b)
181  t[1] = '+'
182  t[2] = - t[2]
183  return m2_expr.ExprOp(t[1], t[0], t[2])
184  t = t[::-1]
185  while len(t) >= 3:
186  o1, op, o2 = t.pop(), t.pop(), t.pop()
187  if op == '-':
188  # a - b => a + (-b)
189  op = '+'
190  o2 = - o2
191  e = m2_expr.ExprOp(op, o1, o2)
192  t.append(e)
193  if len(t) != 1:
194  raise NotImplementedError('strange op')
195  return t[0]
196 
def ast_parse_op
Definition: cpu.py:170

+ Here is the caller graph for this function:

def miasm2.core.cpu.ast_raw2expr (   a,
  my_id2expr,
  my_int2expr 
)

Definition at line 205 of file cpu.py.

206 def ast_raw2expr(a, my_id2expr, my_int2expr):
207  assert(isinstance(a, tuple))
208  if a[0] is m2_expr.ExprId:
209  e = my_id2expr(a[1])
210  elif a[0] is m2_expr.ExprInt:
211  e = my_int2expr(a[1])
212  elif a[0] is m2_expr.ExprOp:
213  out = []
214  for x in a[1]:
215  if isinstance(x, tuple):
216  x = ast_raw2expr(x, my_id2expr, my_int2expr)
217  out.append(x)
218  e = ast_parse_op(out)
219  else:
220  raise TypeError('unknown type')
221  return e
222 
def ast_parse_op
Definition: cpu.py:170
def ast_raw2expr
Definition: cpu.py:205

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.core.cpu.branch2nodes (   branch,
  nodes = None 
)

Definition at line 701 of file cpu.py.

702 def branch2nodes(branch, nodes=None):
703  if nodes is None:
704  node = []
705  for k, v in branch.items():
706  if not isinstance(v, dict):
707  continue
708  for k2 in v.keys():
709  nodes.append((k, k2))
710  branch2nodes(v, nodes)
711 
def branch2nodes
Definition: cpu.py:701

+ Here is the caller graph for this function:

def miasm2.core.cpu.extract_ast_core (   v,
  my_id2expr,
  my_int2expr 
)

Definition at line 253 of file cpu.py.

254 def extract_ast_core(v, my_id2expr, my_int2expr):
255  ast_tokens = _extract_ast_core(v)
256  ids = ast_get_ids(ast_tokens)
257  ids_expr = [my_id2expr(x) for x in ids]
258  sizes = set([i.size for i in ids_expr])
259 
260  if len(sizes) == 0:
261  pass
262  elif len(sizes) == 1:
263  size = sizes.pop()
264  my_int2expr = lambda x: m2_expr.ExprInt(x, size)
265  else:
266  raise ValueError('multiple sizes in ids')
267  e = ast_raw2expr(ast_tokens, my_id2expr, my_int2expr)
268  return e
269 
def ast_get_ids
Definition: cpu.py:223
def _extract_ast_core
Definition: cpu.py:238
def extract_ast_core
Definition: cpu.py:253
def ast_raw2expr
Definition: cpu.py:205

+ Here is the call graph for this function:

def miasm2.core.cpu.factor_fields (   tree)

Definition at line 749 of file cpu.py.

750 def factor_fields(tree):
751  if not isinstance(tree, dict):
752  return tree
753  if len(tree) != 1:
754  return tree
755  # merge
756  k1, v1 = tree.items()[0]
757  if k1 == "mn":
758  return tree
759  l1, fmask1, fbits1, fname1, flen1 = k1
760  if fname1 is not None:
761  return tree
762  if flen1 is not None:
763  return tree
764 
765  if not isinstance(v1, dict):
766  return tree
767  if len(v1) != 1:
768  return tree
769  k2, v2 = v1.items()[0]
770  if k2 == "mn":
771  return tree
772  l2, fmask2, fbits2, fname2, flen2 = k2
773  if fname2 is not None:
774  return tree
775  if flen2 is not None:
776  return tree
777  l = l1 + l2
778  fmask = (fmask1 << l2) | fmask2
779  fbits = (fbits1 << l2) | fbits2
780  fname = fname2
781  flen = flen2
782  k = l, fmask, fbits, fname, flen
783  new_keys = {k: v2}
784  return new_keys
785 
def factor_fields
Definition: cpu.py:749

+ Here is the caller graph for this function:

def miasm2.core.cpu.factor_fields_all (   tree)

Definition at line 786 of file cpu.py.

787 def factor_fields_all(tree):
788  if not isinstance(tree, dict):
789  return tree
790  new_keys = {}
791  for k, v in tree.items():
792  v = factor_fields(v)
793  new_keys[k] = factor_fields_all(v)
794  return new_keys
795 
def factor_fields_all
Definition: cpu.py:786
def factor_fields
Definition: cpu.py:749

+ Here is the call graph for this function:

def miasm2.core.cpu.factor_one_bit (   tree)

Definition at line 712 of file cpu.py.

713 def factor_one_bit(tree):
714  if isinstance(tree, set):
715  return tree
716  new_keys = defaultdict(lambda: defaultdict(dict))
717  if len(tree) == 1:
718  return tree
719  for k, v in tree.items():
720  if k == "mn":
721  new_keys[k] = v
722  continue
723  l, fmask, fbits, fname, flen = k
724  if flen is not None or l <= 1:
725  new_keys[k] = v
726  continue
727  cfmask = fmask >> (l - 1)
728  nfmask = fmask & ((1 << (l - 1)) - 1)
729  cfbits = fbits >> (l - 1)
730  nfbits = fbits & ((1 << (l - 1)) - 1)
731  ck = 1, cfmask, cfbits, None, flen
732  nk = l - 1, nfmask, nfbits, fname, flen
733  if nk in new_keys[ck]:
734  raise NotImplementedError('not fully functional')
735  new_keys[ck][nk] = v
736  for k, v in new_keys.items():
737  new_keys[k] = factor_one_bit(v)
738  # try factor sons
739  if len(new_keys) != 1:
740  return new_keys
741  subtree = new_keys.values()[0]
742  if len(subtree) != 1:
743  return new_keys
744  if subtree.keys()[0] == 'mn':
745  return new_keys
746 
747  return new_keys
748 
def factor_one_bit
Definition: cpu.py:712
def miasm2.core.cpu.factor_tree (   tree)

Definition at line 796 of file cpu.py.

797 def factor_tree(tree):
798  new_keys = {}
799  i = 1
800  min_len = min([x[0] for x in tree.keys()])
801  while i < min_len:
802 
803  i += 1
804 
def factor_tree
Definition: cpu.py:796
def miasm2.core.cpu.gen_base_expr ( )

Definition at line 309 of file cpu.py.

310 def gen_base_expr():
311  variable = pyparsing.Word(pyparsing.alphas + "_$.",
312  pyparsing.alphanums + "_")
313  variable.setParseAction(parse_id)
314  operand = str_int | variable
315  base_expr = pyparsing.operatorPrecedence(operand,
316  [("!", 1, pyparsing.opAssoc.RIGHT, parse_op),
317  (logicop, 2, pyparsing.opAssoc.RIGHT,
318  parse_op),
319  (signop, 1, pyparsing.opAssoc.RIGHT,
320  parse_op),
321  (multop, 2, pyparsing.opAssoc.LEFT,
322  parse_op),
323  (plusop, 2, pyparsing.opAssoc.LEFT,
324  parse_op),
325  ])
326  return variable, operand, base_expr
327 
328 
329 variable, operand, base_expr = gen_base_expr()
def gen_base_expr
Definition: cpu.py:309

+ Here is the caller graph for this function:

def miasm2.core.cpu.gen_bsint (   value,
  l,
  args 
)

Definition at line 691 of file cpu.py.

692 def gen_bsint(value, l, args):
693  s = int2bin(value, l)
694  args = dict(args)
695  args.update({'strbits': s})
696  f = bs(**args)
697  return f
def gen_bsint
Definition: cpu.py:691
def int2bin
Definition: cpu.py:340

+ Here is the call graph for this function:

+ Here is the caller graph for this function:

def miasm2.core.cpu.gen_reg (   rname,
  env,
  sz = 32 
)
Gen reg expr and parser
Equivalent to:
    PC = ExprId('PC')
    reg_pc_str = ['PC']
    reg_pc_expr = [ExprId(x, sz) for x in reg_pc_str]
    regpc = reg_info(reg_pc_str, reg_pc_expr)

    class bs_rname(m_reg):
        reg = regi_rname

    bsrname = bs(l=0, cls=(bs_rname,))

Definition at line 105 of file cpu.py.

106 def gen_reg(rname, env, sz=32):
107  """
108  Gen reg expr and parser
109  Equivalent to:
110  PC = ExprId('PC')
111  reg_pc_str = ['PC']
112  reg_pc_expr = [ExprId(x, sz) for x in reg_pc_str]
113  regpc = reg_info(reg_pc_str, reg_pc_expr)
114 
115  class bs_rname(m_reg):
116  reg = regi_rname
117 
118  bsrname = bs(l=0, cls=(bs_rname,))
119 
120  """
121  rnamel = rname.lower()
122  r = m2_expr.ExprId(rname, sz)
123  reg_str = [rname]
124  reg_expr = [r]
125  regi = reg_info(reg_str, reg_expr)
126  # define as global val
127  cname = "bs_" + rnamel
128  c = type(cname, (m_reg,), {'reg': regi})
129  env[rname] = r
130  env["regi_" + rnamel] = regi
131  env[cname] = c
132  env["bs" + rnamel] = bs(l=0, cls=(c,))
133  return r, regi
134 
def gen_reg
Definition: cpu.py:105
def miasm2.core.cpu.gen_regs (   rnames,
  env,
  sz = 32 
)

Definition at line 135 of file cpu.py.

136 def gen_regs(rnames, env, sz=32):
137  regs_str = []
138  regs_expr = []
139  regs_init = []
140  for rname in rnames:
141  r = m2_expr.ExprId(rname, sz)
142  r_init = m2_expr.ExprId(rname+'_init', sz)
143  regs_str.append(rname)
144  regs_expr.append(r)
145  regs_init.append(r_init)
146  env[rname] = r
147 
148  reginfo = reg_info(regs_str, regs_expr)
149  return regs_expr, regs_init, reginfo
150 
def gen_regs
Definition: cpu.py:135
def miasm2.core.cpu.getfieldby_name (   fields,
  fname 
)

Definition at line 839 of file cpu.py.

840 def getfieldby_name(fields, fname):
841  f = filter(lambda x: hasattr(x, 'fname') and x.fname == fname, fields)
842  if len(f) != 1:
843  raise ValueError('more than one field with name: %s' % fname)
844  return f[0]
845 
def getfieldby_name
Definition: cpu.py:839
def miasm2.core.cpu.getfieldindexby_name (   fields,
  fname 
)

Definition at line 846 of file cpu.py.

847 def getfieldindexby_name(fields, fname):
848  for i, f in enumerate(fields):
849  if hasattr(f, 'fname') and f.fname == fname:
850  return f, i
851  return None
852 
def getfieldindexby_name
Definition: cpu.py:846

+ Here is the caller graph for this function:

def miasm2.core.cpu.graph_tree (   tree)

Definition at line 805 of file cpu.py.

806 def graph_tree(tree):
807  nodes = []
808  branch2nodes(tree, nodes)
809 
810  out = """
811  digraph G {
812  """
813  for a, b in nodes:
814  if b == 'mn':
815  continue
816  out += "%s -> %s;\n" % (id(a), id(b))
817  out += "}"
818  open('graph.txt', 'w').write(out)
819 
def branch2nodes
Definition: cpu.py:701
def graph_tree
Definition: cpu.py:805

+ Here is the call graph for this function:

def miasm2.core.cpu.int2bin (   i,
  l 
)

Definition at line 340 of file cpu.py.

341 def int2bin(i, l):
342  s = '0' * l + bin(i)[2:]
343  return s[-l:]
344 
def int2bin
Definition: cpu.py:340

+ Here is the caller graph for this function:

def miasm2.core.cpu.int2expr (   t)

Definition at line 155 of file cpu.py.

156 def int2expr(t):
157  v = t[0]
158  return (m2_expr.ExprInt, v)
159 
def int2expr
Definition: cpu.py:155
def miasm2.core.cpu.isbin (   s)

Definition at line 336 of file cpu.py.

337 def isbin(s):
338  return re.match('[0-1]+$', s)
339 
def isbin
Definition: cpu.py:336

+ Here is the caller graph for this function:

def miasm2.core.cpu.literal_list (   l)

Definition at line 80 of file cpu.py.

80 
81 def literal_list(l):
82  l = l[:]
83  l.sort()
84  l = l[::-1]
85  o = pyparsing.Literal(l[0])
86  for x in l[1:]:
87  o |= pyparsing.Literal(x)
88  return o
89 
def literal_list
Definition: cpu.py:80
def miasm2.core.cpu.myrol32 (   v,
  r 
)

Definition at line 349 of file cpu.py.

350 def myrol32(v, r):
351  return ((v & 0xFFFFFFFFL) >> (32 - r)) | ((v << r) & 0xFFFFFFFFL)
352 
def myrol32
Definition: cpu.py:349

+ Here is the caller graph for this function:

def miasm2.core.cpu.myror32 (   v,
  r 
)

Definition at line 345 of file cpu.py.

346 def myror32(v, r):
347  return ((v & 0xFFFFFFFFL) >> r) | ((v << (32 - r)) & 0xFFFFFFFFL)
348 
def myror32
Definition: cpu.py:345

+ Here is the caller graph for this function:

def miasm2.core.cpu.neg_int (   t)

Definition at line 284 of file cpu.py.

285 def neg_int(t):
286  x = -t[0]
287  return x
288 
def neg_int
Definition: cpu.py:284
def miasm2.core.cpu.parse_id (   t)

Definition at line 165 of file cpu.py.

166 def parse_id(t):
167  v = t[0]
168  return (m2_expr.ExprId, v)
169 
def parse_id
Definition: cpu.py:165
def miasm2.core.cpu.parse_op (   t)

Definition at line 160 of file cpu.py.

161 def parse_op(t):
162  v = t[0]
163  return (m2_expr.ExprOp, v)
164 
def parse_op
Definition: cpu.py:160
def miasm2.core.cpu.perm_inv (   p)

Definition at line 684 of file cpu.py.

685 def perm_inv(p):
686  o = [None for x in xrange(len(p))]
687  for i, x in enumerate(p):
688  o[x] = i
689  return o
690 
def perm_inv
Definition: cpu.py:684

+ Here is the caller graph for this function:

def miasm2.core.cpu.sign_ext (   v,
  s_in,
  s_out 
)

Definition at line 1602 of file cpu.py.

1603 def sign_ext(v, s_in, s_out):
1604  assert(s_in <= s_out)
1605  v &= (1 << s_in) - 1
1606  sign_in = v & (1 << (s_in - 1))
1607  if not sign_in:
1608  return v
1609  m = (1 << (s_out)) - 1
1610  m ^= (1 << s_in) - 1
1611  v |= m
1612  return v
def sign_ext
Definition: cpu.py:1602

+ Here is the caller graph for this function:

def miasm2.core.cpu.swap16 (   v)

Definition at line 676 of file cpu.py.

677 def swap16(v):
678  return struct.unpack('<H', struct.pack('>H', v))[0]
679 
def swap16
Definition: cpu.py:676
def miasm2.core.cpu.swap32 (   v)

Definition at line 680 of file cpu.py.

681 def swap32(v):
682  return struct.unpack('<I', struct.pack('>I', v))[0]
683 
def swap32
Definition: cpu.py:680
def miasm2.core.cpu.swap_sint (   size,
  i 
)

Definition at line 1590 of file cpu.py.

1591 def swap_sint(size, i):
1592  if size == 8:
1593  return i
1594  elif size == 16:
1595  return struct.unpack('<h', struct.pack('>H', i & 0xffff))[0]
1596  elif size == 32:
1597  return struct.unpack('<i', struct.pack('>I', i & 0xffffffff))[0]
1598  elif size == 64:
1599  return struct.unpack('<q', struct.pack('>Q', i & 0xffffffffffffffff))[0]
1600  raise ValueError('unknown int len %r' % size)
1601 
def swap_sint
Definition: cpu.py:1590

+ Here is the caller graph for this function:

def miasm2.core.cpu.swap_uint (   size,
  i 
)

Definition at line 1578 of file cpu.py.

1579 def swap_uint(size, i):
1580  if size == 8:
1581  return i & 0xff
1582  elif size == 16:
1583  return struct.unpack('<H', struct.pack('>H', i & 0xffff))[0]
1584  elif size == 32:
1585  return struct.unpack('<I', struct.pack('>I', i & 0xffffffff))[0]
1586  elif size == 64:
1587  return struct.unpack('<Q', struct.pack('>Q', i & 0xffffffffffffffff))[0]
1588  raise ValueError('unknown int len %r' % size)
1589 
def swap_uint
Definition: cpu.py:1578

+ Here is the caller graph for this function:

Variable Documentation

tuple miasm2.core.cpu.console_handler = logging.StreamHandler()

Definition at line 18 of file cpu.py.

int miasm2.core.cpu.default_prio = 0x1337

Definition at line 333 of file cpu.py.

tuple miasm2.core.cpu.hex_int = pyparsing.Combine(hex_word)

Definition at line 292 of file cpu.py.

tuple miasm2.core.cpu.hex_word = pyparsing.Literal('0x')

Definition at line 291 of file cpu.py.

tuple miasm2.core.cpu.integer = pyparsing.Word(pyparsing.nums)

Definition at line 289 of file cpu.py.

tuple miasm2.core.cpu.log = logging.getLogger("cpuhelper")

Definition at line 17 of file cpu.py.

tuple miasm2.core.cpu.logicop = pyparsing.oneOf('& | ^ >> << <<< >>>')

Definition at line 303 of file cpu.py.

tuple miasm2.core.cpu.LPARENTHESIS = pyparsing.Literal("(")

Definition at line 151 of file cpu.py.

tuple miasm2.core.cpu.multop = pyparsing.oneOf('* / %')

Definition at line 305 of file cpu.py.

tuple miasm2.core.cpu.my_var_parser = parse_ast(ast_id2expr, ast_int2expr)

Definition at line 330 of file cpu.py.

tuple miasm2.core.cpu.plusop = pyparsing.oneOf('+ -')

Definition at line 306 of file cpu.py.

tuple miasm2.core.cpu.RPARENTHESIS = pyparsing.Literal(")")

Definition at line 152 of file cpu.py.

tuple miasm2.core.cpu.signop = pyparsing.oneOf('+ -')

Definition at line 304 of file cpu.py.

miasm2.core.cpu.str_int = str_int_pos|str_int_neg

Definition at line 300 of file cpu.py.

tuple miasm2.core.cpu.str_int_neg
Initial value:
1 = (pyparsing.Suppress('-') + \
2  (hex_int | integer))

Definition at line 297 of file cpu.py.

tuple miasm2.core.cpu.str_int_pos = (hex_int | integer)

Definition at line 296 of file cpu.py.

int miasm2.core.cpu.total_scans = 0

Definition at line 698 of file cpu.py.