about summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rw-r--r--miasm2/arch/arm/arch.py36
-rw-r--r--test/arch/arm/arch.py11
2 files changed, 47 insertions, 0 deletions
diff --git a/miasm2/arch/arm/arch.py b/miasm2/arch/arm/arch.py
index 0d10d6f8..c74d10a8 100644
--- a/miasm2/arch/arm/arch.py
+++ b/miasm2/arch/arm/arch.py
@@ -456,6 +456,8 @@ class instruction_armt(instruction_arm):
             return
         if self.name == 'BLX':
             ad = e.arg + (self.offset & 0xfffffffc)
+        elif self.name == 'BL':
+            ad = e.arg + self.offset + self.l
         else:
             ad = e.arg + self.offset
         l = symbol_pool.getby_offset_create(ad)
@@ -2382,6 +2384,35 @@ class armt_imm5_1(arm_imm):
         self.value = (v >> 1) & 0x1f
         return True
 
+aif_str = ["X", "F", "I", "IF", "A", "AF", "AI", "AIF"]
+aif_expr = [ExprId(x, 32) if x != None else None for x in aif_str]
+
+aif_reg = reg_info(aif_str, aif_expr)
+
+class armt_aif(reg_noarg, m_arg):
+    reg_info = aif_reg
+    parser = reg_info.parser
+
+    def decode(self, v):
+        if v == 0:
+            return False
+        return super(armt_aif, self).decode(v)
+
+    def encode(self):
+        ret = super(armt_aif, self).encode()
+        if not ret:
+            return ret
+        return self.value != 0
+
+    def fromstring(self, s, parser_result=None):
+        start, stop = super(armt_aif, self).fromstring(s, parser_result)
+        if self.expr.name == "X":
+            return None, None
+        return start, stop
+
+aif = bs(l=3, cls=(armt_aif,))
+
+
 imm5_off = bs(l=5, cls=(armt_imm5_1,), fname="imm5_off")
 
 tsign = bs(l=1, fname="sign")
@@ -2405,3 +2436,8 @@ armtop("cbz", [bs('101100'), imm1, bs('1'), imm5_off, rnl], [rnl, imm5_off])
 armtop("cbnz", [bs('101110'), imm1, bs('1'), imm5_off, rnl], [rnl, imm5_off])
 
 armtop("bkpt", [bs('1011'), bs('1110'), imm8])
+
+armtop("nop", [bs8(0xBF),bs8(0x0)])
+armtop("wfi", [bs8(0xBF),bs8(0x30)])
+armtop("cpsid", [bs8(0xB6),bs('0111'), bs('0'), aif], [aif])
+armtop("cpsie", [bs8(0xB6),bs('0110'), bs('0'), aif], [aif])
diff --git a/test/arch/arm/arch.py b/test/arch/arm/arch.py
index cb0e56fe..3ba2dbd4 100644
--- a/test/arch/arm/arch.py
+++ b/test/arch/arm/arch.py
@@ -478,6 +478,17 @@ reg_tests_armt = [
     ("xxxxxxxx    SVC        0x13",
      "13df"),
 
+    ("xxxxxxxx    NOP        ",
+     "00bf"),
+
+    ("xxxxxxxx    CPSID      AIF",
+     "77B6"),
+    ("xxxxxxxx    CPSIE      I",
+     "62B6"),
+
+    ("xxxxxxxx    WFI        ",
+     "30bf"),
+
 ]
 print "#" * 40, 'armthumb', '#' * 40