diff options
| author | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-04-05 16:26:05 +0200 |
|---|---|---|
| committer | Fabrice Desclaux <fabrice.desclaux@cea.fr> | 2018-04-18 09:54:48 +0200 |
| commit | ae0cc091837b9ef025eed65296d28d603098a433 (patch) | |
| tree | 99da9f50553ec2c82b8d92ffb99c47398c29c504 | |
| parent | dd51f5871fd21b0a6da7f318661f3cb9fd62ad50 (diff) | |
| download | miasm-ae0cc091837b9ef025eed65296d28d603098a433.tar.gz miasm-ae0cc091837b9ef025eed65296d28d603098a433.zip | |
Arm: add dsb
Diffstat (limited to '')
| -rw-r--r-- | miasm2/arch/arm/arch.py | 47 | ||||
| -rw-r--r-- | test/arch/arm/arch.py | 3 |
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 |