about summary refs log tree commit diff stats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--miasm2/arch/aarch64/sem.py84
1 files changed, 75 insertions, 9 deletions
diff --git a/miasm2/arch/aarch64/sem.py b/miasm2/arch/aarch64/sem.py
index 800cc677..44925e1f 100644
--- a/miasm2/arch/aarch64/sem.py
+++ b/miasm2/arch/aarch64/sem.py
@@ -240,6 +240,13 @@ def ands(ir, instr, arg1, arg2, arg3):
     e.append(m2_expr.ExprAff(arg1, res))
     return e, []
 
+def tst(ir, instr, arg1, arg2):
+    e = []
+    arg2 = extend_arg(arg1, arg2)
+    res = arg1 & arg2
+    e += update_flag_logic(res)
+    return e, []
+
 
 @sbuild.parse
 def lsl(arg1, arg2, arg3):
@@ -383,10 +390,11 @@ def get_mem_access(mem):
     return addr, updt
 
 
-def strb(ir, instr, arg1, arg2):
+
+def ldr(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(m2_expr.ExprAff(m2_expr.ExprMem(addr, 8), arg1[:8]))
+    e.append(m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, arg1.size)))
     if updt:
         e.append(updt)
     return e, []
@@ -402,7 +410,17 @@ def ldrb(ir, instr, arg1, arg2):
     return e, []
 
 
-def str(ir, instr, arg1, arg2):
+def ldrh(ir, instr, arg1, arg2):
+    e = []
+    addr, updt = get_mem_access(arg2)
+    e.append(
+        m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, 16).zeroExtend(arg1.size)))
+    if updt:
+        e.append(updt)
+    return e, []
+
+
+def l_str(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
     e.append(m2_expr.ExprAff(m2_expr.ExprMem(addr, arg1.size), arg1))
@@ -411,10 +429,19 @@ def str(ir, instr, arg1, arg2):
     return e, []
 
 
-def ldr(ir, instr, arg1, arg2):
+def strb(ir, instr, arg1, arg2):
     e = []
     addr, updt = get_mem_access(arg2)
-    e.append(m2_expr.ExprAff(arg1, m2_expr.ExprMem(addr, arg1.size)))
+    e.append(m2_expr.ExprAff(m2_expr.ExprMem(addr, 8), arg1[:8]))
+    if updt:
+        e.append(updt)
+    return e, []
+
+
+def strh(ir, instr, arg1, arg2):
+    e = []
+    addr, updt = get_mem_access(arg2)
+    e.append(m2_expr.ExprAff(m2_expr.ExprMem(addr, 16), arg1[:16]))
     if updt:
         e.append(updt)
     return e, []
@@ -475,6 +502,19 @@ def ubfm(ir, instr, arg1, arg2, arg3, arg4):
     e.append(m2_expr.ExprAff(arg1, res))
     return e, []
 
+def bfm(ir, instr, arg1, arg2, arg3, arg4):
+    e = []
+    rim, sim = int(arg3.arg), int(arg4.arg) + 1
+    if sim > rim:
+        res = arg2[rim:sim]
+        e.append(m2_expr.ExprAff(arg1[:sim-rim], res))
+    else:
+        shift_i = arg2.size - rim
+        shift = m2_expr.ExprInt_from(arg2, shift_i)
+        res = arg2[:sim]
+        e.append(m2_expr.ExprAff(arg1[shift_i:shift_i+sim], res))
+    return e, []
+
 
 @sbuild.parse
 def madd(arg1, arg2, arg3, arg4):
@@ -482,6 +522,11 @@ def madd(arg1, arg2, arg3, arg4):
 
 
 @sbuild.parse
+def msub(arg1, arg2, arg3, arg4):
+    arg1 = arg4 - (arg2 * arg3)
+
+
+@sbuild.parse
 def udiv(arg1, arg2, arg3):
     arg1 = m2_expr.ExprOp('udiv', arg2, arg3)
 
@@ -623,11 +668,20 @@ def br(arg1):
 def nop():
     """Do nothing"""
 
+
+
+@sbuild.parse
+def extr(arg1, arg2, arg3, arg4):
+    compose = m2_expr.ExprCompose([(arg2, 0, arg2.size),
+                                   (arg3, arg2.size, arg2.size+arg3.size)])
+    arg1 = compose[int(arg4.arg):int(arg4.arg)+arg1.size]
+
 mnemo_func = sbuild.functions
 mnemo_func.update({
     'and': and_l,
     'adds': adds,
     'ands': ands,
+    'tst': tst,
     'subs': subs,
     'cmp': cmp,
     'cmn': cmn,
@@ -653,19 +707,31 @@ mnemo_func.update({
     'stp': stp,
     'ldp': ldp,
 
-    'str': str,
     'ldr': ldr,
+    'ldrb': ldrb,
+    'ldrh': ldrh,
 
-    'ldur': ldr,  # XXXX CHECK
+    'ldur': ldr,
+    'ldurb': ldrb,
+    'ldurh': ldrh,
+
+    'str': l_str,
+    'strb': strb,
+    'strh': strh,
+
+    'stur': l_str,
+    'sturb': strb,
+    'sturh': strh,
 
     'ldrsw': ldrsw,
 
-    'strb': strb,
-    'ldrb': ldrb,
 
+    'bfm': bfm,
     'sbfm': sbfm,
     'ubfm': ubfm,
 
+    'extr': extr,
+
 })