about summary refs log tree commit diff stats
diff options
context:
space:
mode:
authorFabrice Desclaux <fabrice.desclaux@cea.fr>2018-04-05 16:26:05 +0200
committerFabrice Desclaux <fabrice.desclaux@cea.fr>2018-04-18 09:54:48 +0200
commitae0cc091837b9ef025eed65296d28d603098a433 (patch)
tree99da9f50553ec2c82b8d92ffb99c47398c29c504
parentdd51f5871fd21b0a6da7f318661f3cb9fd62ad50 (diff)
downloadmiasm-ae0cc091837b9ef025eed65296d28d603098a433.tar.gz
miasm-ae0cc091837b9ef025eed65296d28d603098a433.zip
Arm: add dsb
-rw-r--r--miasm2/arch/arm/arch.py47
-rw-r--r--test/arch/arm/arch.py3
2 files changed, 49 insertions, 1 deletions
diff --git a/miasm2/arch/arm/arch.py b/miasm2/arch/arm/arch.py
index 0e058e91..f4ea36a6 100644
--- a/miasm2/arch/arm/arch.py
+++ b/miasm2/arch/arm/arch.py
@@ -84,6 +84,24 @@ conditional_branch = ["BEQ", "BNE", "BCS", "BCC", "BMI", "BPL", "BVS",
 
 unconditional_branch = ["B", "BX", "BL", "BLX"]
 
+barrier_expr = {
+    0b1111: ExprId("SY", 32),
+    0b1110: ExprId("ST", 32),
+    0b1101: ExprId("LD", 32),
+    0b1011: ExprId("ISH", 32),
+    0b1010: ExprId("ISHST", 32),
+    0b1001: ExprId("ISHLD", 32),
+    0b0111: ExprId("NSH", 32),
+    0b0110: ExprId("NSHST", 32),
+    0b0011: ExprId("OSH", 32),
+    0b0010: ExprId("OSHST", 32),
+    0b0001: ExprId("OSHLD", 32),
+}
+
+barrier_info = reg_info_dct(barrier_expr)
+
+
+
 # parser helper ###########
 
 def tok_reg_duo(s, l, t):
@@ -3097,6 +3115,34 @@ rm_deref_reg = bs(l=4, cls=(armt_deref_reg,))
 bs_deref_reg_reg = bs(l=4, cls=(armt_deref_reg_reg,))
 bs_deref_reg_reg_lsl_1 = bs(l=4, cls=(armt_deref_reg_reg_lsl_1,))
 
+
+class armt_barrier_option(reg_noarg, m_arg):
+    reg_info = barrier_info
+    parser = reg_info.parser
+
+    def decode(self, v):
+        v = v & self.lmask
+        if v not in self.reg_info.dct_expr:
+            return False
+        self.expr = self.reg_info.dct_expr[v]
+        return True
+
+    def encode(self):
+        if not self.expr in self.reg_info.dct_expr_inv:
+            log.debug("cannot encode reg %r", self.expr)
+            return False
+        self.value = self.reg_info.dct_expr_inv[self.expr]
+        if self.value > self.lmask:
+            log.debug("cannot encode field value %x %x",
+                      self.value, self.lmask)
+            return False
+        return True
+
+    def check_fbits(self, v):
+        return v & self.fmask == self.fbits
+
+barrier_option = bs(l=4, cls=(armt_barrier_option,))
+
 armtop("adc", [bs('11110'),  imm12_1, bs('0'), bs('1010'), scc, rn_nosppc, bs('0'), imm12_3, rd_nosppc, imm12_8])
 armtop("adc", [bs('11101'),  bs('01'), bs('1010'), scc, rn_nosppc, bs('0'), imm5_3, rd_nosppc, imm5_2, imm_stype, rm_sh])
 armtop("bl", [bs('11110'), tsign, timm10H, bs('11'), tj1, bs('1'), tj2, timm11L])
@@ -3203,4 +3249,3 @@ armtop("clz",  [bs('111110101011'), rm, bs('1111'), rd, bs('1000'), rm_cp], [rd,
 armtop("tbb",  [bs('111010001101'), rn_noarg, bs('11110000000'), bs('0'), bs_deref_reg_reg], [bs_deref_reg_reg])
 armtop("tbh",  [bs('111010001101'), rn_noarg, bs('11110000000'), bs('1'), bs_deref_reg_reg_lsl_1], [bs_deref_reg_reg_lsl_1])
 armtop("dsb",  [bs('111100111011'), bs('1111'), bs('1000'), bs('1111'), bs('0100'), barrier_option])
-
diff --git a/test/arch/arm/arch.py b/test/arch/arm/arch.py
index e50a9f54..7f3b321e 100644
--- a/test/arch/arm/arch.py
+++ b/test/arch/arm/arch.py
@@ -700,6 +700,9 @@ reg_tests_armt = [
     ("xxxxxxxx    EOR        R3, R3, R1",
      "83EA0103"),
 
+    ("xxxxxxxx    DSB        SY",
+     "bff34f8f"),
+
 
 ]
 print "#" * 40, 'armthumb', '#' * 40