From 7a834754c404b72c555f8032d4f7aeed1710ff3c Mon Sep 17 00:00:00 2001 From: Cyrille Bagard Date: Fri, 16 Jan 2015 07:47:57 +0000 Subject: Supported new ARMv7 instructions and fixed several bugs in ARM/Thumb decodings. git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@456 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a --- ChangeLog | 37 ++++++++ src/arch/arm/v7/helpers.h | 7 ++ src/arch/arm/v7/opcodes/opcodes_tmp_arm.h | 1 - src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h | 10 --- src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h | 1 - src/arch/arm/v7/opdefs/Makefile.am | 2 + src/arch/arm/v7/opdefs/adc_A882.d | 2 +- src/arch/arm/v7/opdefs/bic_A8822.d | 2 +- src/arch/arm/v7/opdefs/cmp_A8837.d | 2 +- src/arch/arm/v7/opdefs/cmp_A8838.d | 4 +- src/arch/arm/v7/opdefs/eor_A8847.d | 2 +- src/arch/arm/v7/opdefs/movt_A88106.d | 67 ++++++++++++++ src/arch/arm/v7/opdefs/mvn_A88116.d | 2 +- src/arch/arm/v7/opdefs/rsb_A88152.d | 2 +- src/arch/arm/v7/opdefs/sub_A88223.d | 2 +- src/arch/arm/v7/opdefs/sub_A88225.d | 116 +++++++++++++++++++++++++ src/arch/arm/v7/opdefs/yield_A88426.d | 2 +- src/arch/arm/v7/thumb_32.c | 4 +- 18 files changed, 241 insertions(+), 24 deletions(-) create mode 100644 src/arch/arm/v7/opdefs/movt_A88106.d create mode 100644 src/arch/arm/v7/opdefs/sub_A88225.d diff --git a/ChangeLog b/ChangeLog index b02c2cb..8943ab8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,40 @@ +15-01-16 Cyrille Bagard + + * src/arch/arm/v7/helpers.h: + Create a virtual macro helper named 'Imm16'. + + * src/arch/arm/v7/opcodes/opcodes_tmp_arm.h: + * src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h: + * src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h: + Update missing prototypes. + + * src/arch/arm/v7/opdefs/adc_A882.d: + * src/arch/arm/v7/opdefs/bic_A8822.d: + * src/arch/arm/v7/opdefs/cmp_A8837.d: + * src/arch/arm/v7/opdefs/cmp_A8838.d: + * src/arch/arm/v7/opdefs/eor_A8847.d: + Fix mistakes between lower cases and upper cases in encodings. + + * src/arch/arm/v7/opdefs/Makefile.am: + Add new definitions to ARMV7_DEFS. + + * src/arch/arm/v7/opdefs/movt_A88106.d: + New entry: support a new ARMv7 instruction. + + * src/arch/arm/v7/opdefs/mvn_A88116.d: + * src/arch/arm/v7/opdefs/rsb_A88152.d: + * src/arch/arm/v7/opdefs/sub_A88223.d: + Fix mistakes between lower cases and upper cases in encodings. + + * src/arch/arm/v7/opdefs/sub_A88225.d: + New entry: support a new ARMv7 instruction. + + * src/arch/arm/v7/opdefs/yield_A88426.d: + Fix mistakes between lower cases and upper cases in encodings. + + * src/arch/arm/v7/thumb_32.c: + Fix a bug due to typo: b1111 vs b11111. + 15-01-15 Cyrille Bagard * src/dialogs/export.c: diff --git a/src/arch/arm/v7/helpers.h b/src/arch/arm/v7/helpers.h index 919611e..0a1d934 100644 --- a/src/arch/arm/v7/helpers.h +++ b/src/arch/arm/v7/helpers.h @@ -39,6 +39,13 @@ +#define Imm16(imm16) \ + ({ \ + GArchOperand *__result; \ + __result = g_imm_operand_new_from_value(MDS_16_BITS_UNSIGNED, (uint16_t)imm16); \ + __result; \ + }) + #define ARMExpandImm_C(imm12, c) \ ({ \ GArchOperand *__result; \ diff --git a/src/arch/arm/v7/opcodes/opcodes_tmp_arm.h b/src/arch/arm/v7/opcodes/opcodes_tmp_arm.h index 4fbf93d..36e2193 100644 --- a/src/arch/arm/v7/opcodes/opcodes_tmp_arm.h +++ b/src/arch/arm/v7/opcodes/opcodes_tmp_arm.h @@ -8,7 +8,6 @@ #define armv7_read_arm_instr_ldm_ldmia_ldmfd_arm(r) NULL #define armv7_read_arm_instr_ldm_user_registers(r) NULL #define armv7_read_arm_instr_lsr_immediate(r) NULL -#define armv7_read_arm_instr_movt(r) NULL #define armv7_read_arm_instr_ror_immediate(r) NULL #define armv7_read_arm_instr_rrx(r) NULL #define armv7_read_arm_instr_stmda_stmed(r) NULL diff --git a/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h b/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h index 990d1c6..b30a543 100644 --- a/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h +++ b/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_16.h @@ -1,16 +1,11 @@ #ifndef thumb_16_def_tmp_h #define thumb_16_def_tmp_h -#define armv7_read_thumb_16_instr_adc_register(r) NULL #define armv7_read_thumb_16_instr_and_register(r) NULL #define armv7_read_thumb_16_instr_asr_immediate(r) NULL #define armv7_read_thumb_16_instr_asr_register(r) NULL -#define armv7_read_thumb_16_instr_bic_register(r) NULL #define armv7_read_thumb_16_instr_bkpt(r) NULL #define armv7_read_thumb_16_instr_cmn_register(r) NULL -#define armv7_read_thumb_16_instr_cmp_immediate(r) NULL -#define armv7_read_thumb_16_instr_cmp_register(r) NULL #define armv7_read_thumb_16_instr_cps_thumb(r) NULL -#define armv7_read_thumb_16_instr_eor_register(r) NULL #define armv7_read_thumb_16_instr_it(r) NULL #define armv7_read_thumb_16_instr_ldm_ldmia_ldmfd_thumb(r) NULL #define armv7_read_thumb_16_instr_ldrb_register(r) NULL @@ -22,13 +17,11 @@ #define armv7_read_thumb_16_instr_lsr_immediate(r) NULL #define armv7_read_thumb_16_instr_lsr_register(r) NULL #define armv7_read_thumb_16_instr_mul(r) NULL -#define armv7_read_thumb_16_instr_mvn_register(r) NULL #define armv7_read_thumb_16_instr_orr_register(r) NULL #define armv7_read_thumb_16_instr_rev(r) NULL #define armv7_read_thumb_16_instr_rev16(r) NULL #define armv7_read_thumb_16_instr_revsh(r) NULL #define armv7_read_thumb_16_instr_ror_register(r) NULL -#define armv7_read_thumb_16_instr_rsb_immediate(r) NULL #define armv7_read_thumb_16_instr_sbc_register(r) NULL #define armv7_read_thumb_16_instr_setend(r) NULL #define armv7_read_thumb_16_instr_sev(r) NULL @@ -38,8 +31,6 @@ #define armv7_read_thumb_16_instr_strh_register(r) NULL #define armv7_read_thumb_16_instr_str_register(r) NULL #define armv7_read_thumb_16_instr_sub_immediate_thumb(r) NULL -#define armv7_read_thumb_16_instr_sub_register(r) NULL -#define armv7_read_thumb_16_instr_sub_sp_minus_immediate(r) NULL #define armv7_read_thumb_16_instr_svc_previously_swi(r) NULL #define armv7_read_thumb_16_instr_sxtb(r) NULL #define armv7_read_thumb_16_instr_sxth(r) NULL @@ -49,5 +40,4 @@ #define armv7_read_thumb_16_instr_uxth(r) NULL #define armv7_read_thumb_16_instr_wfe(r) NULL #define armv7_read_thumb_16_instr_wfi(r) NULL -#define armv7_read_thumb_16_instr_yield(r) NULL #endif diff --git a/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h b/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h index 4ed909c..115b515 100644 --- a/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h +++ b/src/arch/arm/v7/opcodes/opcodes_tmp_thumb_32.h @@ -21,7 +21,6 @@ #define armv7_read_thumb_32_instr_ldrt(r) NULL #define armv7_read_thumb_32_instr_lsl_register(r) NULL #define armv7_read_thumb_32_instr_lsr_register(r) NULL -#define armv7_read_thumb_32_instr_movt(r) NULL #define armv7_read_thumb_32_instr_mrs(r) NULL #define armv7_read_thumb_32_instr_mrs_banked_register(r) NULL #define armv7_read_thumb_32_instr_msr_banked_register(r) NULL diff --git a/src/arch/arm/v7/opdefs/Makefile.am b/src/arch/arm/v7/opdefs/Makefile.am index 223cf41..44dda82 100644 --- a/src/arch/arm/v7/opdefs/Makefile.am +++ b/src/arch/arm/v7/opdefs/Makefile.am @@ -57,6 +57,7 @@ ARMV7_DEFS = \ mov_A88102.d \ mov_A88103.d \ mov_A88104.d \ + movt_A88106.d \ mul_A88114.d \ mvn_A88115.d \ mvn_A88116.d \ @@ -78,6 +79,7 @@ ARMV7_DEFS = \ strb_A88206.d \ sub_A88222.d \ sub_A88223.d \ + sub_A88225.d \ teq_A88237.d \ teq_A88238.d \ tst_A88240.d \ diff --git a/src/arch/arm/v7/opdefs/adc_A882.d b/src/arch/arm/v7/opdefs/adc_A882.d index 9c62b24..a43cadb 100644 --- a/src/arch/arm/v7/opdefs/adc_A882.d +++ b/src/arch/arm/v7/opdefs/adc_A882.d @@ -23,7 +23,7 @@ @title ADC (register) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 0 1 0 1 Rm(3) Rdn(3) diff --git a/src/arch/arm/v7/opdefs/bic_A8822.d b/src/arch/arm/v7/opdefs/bic_A8822.d index 4ad55cb..03f7948 100644 --- a/src/arch/arm/v7/opdefs/bic_A8822.d +++ b/src/arch/arm/v7/opdefs/bic_A8822.d @@ -23,7 +23,7 @@ @title BIC (register) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 1 1 1 0 Rm(3) Rdn(3) diff --git a/src/arch/arm/v7/opdefs/cmp_A8837.d b/src/arch/arm/v7/opdefs/cmp_A8837.d index 24587df..bcfe5d2 100644 --- a/src/arch/arm/v7/opdefs/cmp_A8837.d +++ b/src/arch/arm/v7/opdefs/cmp_A8837.d @@ -23,7 +23,7 @@ @title CMP (immediate) -@encoding(T1) { +@encoding(t1) { @half 0 0 1 0 1 Rn(3) imm8(8) diff --git a/src/arch/arm/v7/opdefs/cmp_A8838.d b/src/arch/arm/v7/opdefs/cmp_A8838.d index a24df29..7ffe3d9 100644 --- a/src/arch/arm/v7/opdefs/cmp_A8838.d +++ b/src/arch/arm/v7/opdefs/cmp_A8838.d @@ -23,7 +23,7 @@ @title CMP (register) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 1 0 1 0 Rm(3) Rn(3) @@ -38,7 +38,7 @@ } -@encoding(T2) { +@encoding(t2) { @half 0 1 0 0 0 1 0 1 N(1) Rm(4) Rn(3) diff --git a/src/arch/arm/v7/opdefs/eor_A8847.d b/src/arch/arm/v7/opdefs/eor_A8847.d index eb651f3..3d7f5b5 100644 --- a/src/arch/arm/v7/opdefs/eor_A8847.d +++ b/src/arch/arm/v7/opdefs/eor_A8847.d @@ -23,7 +23,7 @@ @title EOR (register) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 0 0 0 1 Rm(3) Rdn(3) diff --git a/src/arch/arm/v7/opdefs/movt_A88106.d b/src/arch/arm/v7/opdefs/movt_A88106.d new file mode 100644 index 0000000..a5ad4f1 --- /dev/null +++ b/src/arch/arm/v7/opdefs/movt_A88106.d @@ -0,0 +1,67 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * ##FILE## - traduction d'instructions ARMv7 + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + + +@title MOVT + +@encoding(T1) { + + @word 1 1 1 1 0 i(1) 1 0 1 1 0 0 imm4(4) 0 imm3(3) Rd((4) imm8(8) + + @syntax + + @conv { + + Rd = Register(Rd) + imm16 = Imm16(imm4:i:imm3:imm8) + + } + + @rules { + + //if d IN {13,15} then UNPREDICTABLE; + + } + +} + +@encoding(A1) { + + @word cond(4) 0 0 1 1 0 1 0 0 imm4(4) Rd(4) imm12(12) + + @syntax {c} + + @conv { + + c = Condition(cond) + Rd = Register(Rd) + imm16 = Imm16(imm4:imm12) + + } + + @rules { + + //if d == 15 then UNPREDICTABLE; + + } + +} diff --git a/src/arch/arm/v7/opdefs/mvn_A88116.d b/src/arch/arm/v7/opdefs/mvn_A88116.d index 7e9434c..3c97db4 100644 --- a/src/arch/arm/v7/opdefs/mvn_A88116.d +++ b/src/arch/arm/v7/opdefs/mvn_A88116.d @@ -23,7 +23,7 @@ @title MVN (register) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 1 1 1 1 Rm(3) Rd(3) diff --git a/src/arch/arm/v7/opdefs/rsb_A88152.d b/src/arch/arm/v7/opdefs/rsb_A88152.d index 320d62e..f7bee59 100644 --- a/src/arch/arm/v7/opdefs/rsb_A88152.d +++ b/src/arch/arm/v7/opdefs/rsb_A88152.d @@ -23,7 +23,7 @@ @title RSB (immediate) -@encoding(T1) { +@encoding(t1) { @half 0 1 0 0 0 0 1 0 0 1 Rn(3) Rd(3) diff --git a/src/arch/arm/v7/opdefs/sub_A88223.d b/src/arch/arm/v7/opdefs/sub_A88223.d index 025139f..3693bc4 100644 --- a/src/arch/arm/v7/opdefs/sub_A88223.d +++ b/src/arch/arm/v7/opdefs/sub_A88223.d @@ -23,7 +23,7 @@ @title SUB (register) -@encoding(T1) { +@encoding(t1) { @half 0 0 0 1 1 0 1 Rm(3) Rn(3) Rd(3) diff --git a/src/arch/arm/v7/opdefs/sub_A88225.d b/src/arch/arm/v7/opdefs/sub_A88225.d new file mode 100644 index 0000000..9c29624 --- /dev/null +++ b/src/arch/arm/v7/opdefs/sub_A88225.d @@ -0,0 +1,116 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * ##FILE## - traduction d'instructions ARMv7 + * + * Copyright (C) 2014 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * Chrysalide is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * Chrysalide is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see . + */ + + +@title SUB (SP minus immediate) + +@encoding(t1) { + + @half 1 0 1 1 0 0 0 0 1 imm7(7) + + @syntax + + @conv { + + SP1 = Register(13) + SP2 = Register(13) + const = ZeroExtend(imm7:'00', 9, 32); + + } + + @rules { + + //setflags = FALSE + + } + +} + +@encoding(T2) { + + @word 1 1 1 1 0 i(1) 0 1 1 0 1 S(1) 1 1 0 1 0 imm3(3) Rd(4) imm8(8) + + @syntax {S} ".W" + + @conv { + + S = SetFlags(S) + Rd = Register(Rd) + SP = Register(13) + const = ThumbExpandImm(i:imm3:imm8) + + } + + @rules { + + //if Rd == '1111' && S == '1' then SEE CMP (immediate); + //if d == 15 && S == '0' then UNPREDICTABLE; + + } + +} + +@encoding(T3) { + + @word 1 1 1 1 0 i(1) 1 0 1 0 1 0 1 1 0 1 0 imm3(3) Rd(4) imm8(8) + + @syntax "subw" + + @conv { + + Rd = Register(Rd) + SP = Register(13) + const = ZeroExtend((i:imm3:imm8, 12, 32) + + } + + @rules { + + //if d == 15 then UNPREDICTABLE; + + } + +} + +@encoding(A1) { + + @word cond(4) 0 0 1 0 0 1 0 S(1) 1 1 0 1 Rd(4) imm12(12) + + @syntax {S} {c} + + @conv { + + S = SetFlags(S) + c = Condition(cond) + Rd = Register(Rd) + SP = Register(13) + const = ARMExpandImm(imm12) + + } + + @rules { + + //if Rd == '1111' && S == '1' then SEE SUBS PC, LR and related instructions; + + } + +} diff --git a/src/arch/arm/v7/opdefs/yield_A88426.d b/src/arch/arm/v7/opdefs/yield_A88426.d index 6de27d1..c0b4be0 100644 --- a/src/arch/arm/v7/opdefs/yield_A88426.d +++ b/src/arch/arm/v7/opdefs/yield_A88426.d @@ -23,7 +23,7 @@ @title YIELD -@encoding(T1) { +@encoding(t1) { @half 1 0 1 1 1 1 1 1 0 0 0 1 0 0 0 0 diff --git a/src/arch/arm/v7/thumb_32.c b/src/arch/arm/v7/thumb_32.c index 8ea6ecb..757abc4 100644 --- a/src/arch/arm/v7/thumb_32.c +++ b/src/arch/arm/v7/thumb_32.c @@ -263,7 +263,7 @@ static GArchInstruction *process_armv7_thumb_32_data_processing_modified_immedia case b0010: - if (rn == b11111) + if (rn == b1111) result = armv7_read_thumb_32_instr_mov_immediate(raw); else result = armv7_read_thumb_32_instr_orr_immediate(raw); @@ -272,7 +272,7 @@ static GArchInstruction *process_armv7_thumb_32_data_processing_modified_immedia case b0011: - if (rn == b11111) + if (rn == b1111) result = armv7_read_thumb_32_instr_mvn_immediate(raw); else result = armv7_read_thumb_32_instr_orn_immediate(raw); -- cgit v0.11.2-87-g4458