diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-04-29 23:35:10 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-04-29 23:35:10 (GMT) |
commit | 55dbd294b0d740648bb1b63e6159e3aa9361a2e1 (patch) | |
tree | 7a8b14f003bd2b885e5538249cffca4beee01b08 /src/arch/arm/v7/thumb_32.c | |
parent | b79affc5c12b7c984acd1e434af5b1aa6b94f68f (diff) |
Implemented a new category of instructions from Thumb32.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@522 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/arm/v7/thumb_32.c')
-rw-r--r-- | src/arch/arm/v7/thumb_32.c | 125 |
1 files changed, 124 insertions, 1 deletions
diff --git a/src/arch/arm/v7/thumb_32.c b/src/arch/arm/v7/thumb_32.c index 8fc4d91..9d9de57 100644 --- a/src/arch/arm/v7/thumb_32.c +++ b/src/arch/arm/v7/thumb_32.c @@ -61,6 +61,10 @@ static GArchInstruction *process_armv7_thumb_32_load_word(uint32_t); + +/* Désassemble une instruction ARMv7 classique. */ +static GArchInstruction *process_armv7_thumb_32_load_byte_memory_hints(uint32_t); + /* Désassemble une instruction ARMv7 classique. */ static GArchInstruction *process_armv7_thumb_32_store_single_data_item(uint32_t); @@ -93,7 +97,7 @@ static GArchInstruction *process_armv7_thumb_32_long_multiply_long_multiply_accu #define process_armv7_thumb_32_load_store_dual_load_store_exclusive_table_branch(r) NULL #define process_armv7_thumb_32_coprocessor_advanced_simd_and_floating_point_instructions(r) NULL -#define process_armv7_thumb_32_load_byte_memory_hints(r) NULL + #define process_armv7_thumb_32_load_halfword_memory_hints(r) NULL #define process_armv7_thumb_32_advanced_simd_element_or_structure_load_store_instructions(r) NULL #define process_armv7_thumb_32_move_register_and_immediate_shifts(r) NULL @@ -826,6 +830,125 @@ static GArchInstruction *process_armv7_thumb_32_load_word(uint32_t raw) + + + + +/****************************************************************************** +* * +* Paramètres : raw = donnée brute de 32 bits à désassembler. * +* * +* Description : Désassemble une instruction ARMv7 classique. * +* * +* Retour : Instruction mise en place ou NULL en cas d'échec. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static GArchInstruction *process_armv7_thumb_32_load_byte_memory_hints(uint32_t raw) +{ + GArchInstruction *result; /* Instruction à renvoyer */ + uint32_t op1; /* Champ 'op1' à retrouver */ + uint32_t rn; /* Champ 'rn' à retrouver */ + uint32_t rt; /* Champ 'rt' à retrouver */ + uint32_t op2; /* Champ 'op2' à retrouver */ + + /** + * Suit les directives de : + * § A6.3.9 Load byte, memory hints + */ + + if ((raw & 0xfe700000) != 0xf8100000) return NULL; + + result = NULL; + + op1 = (raw >> 23) & b11; + rn = (raw >> 16) & b1111; + rt = (raw >> 12) & b1111; + op2 = (raw >> 6) & b111111; + + if (op1 == b00 && op2 == b000000 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrb_register(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pld_register(raw); + } + + else if ((op1 & b10) == b00 && rn == b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrb_literal(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pld_literal(raw); + } + + else if (op1 == b00 && (op2 & b100100) == b100100 && rn != b1111) + result = armv7_read_thumb_32_instr_ldrb_immediate_thumb(raw); + + else if (op1 == b00 && (op2 & b111100) == b110000 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrb_immediate_thumb(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pld_immediate(raw); + } + + else if (op1 == b00 && (op2 & b111100) == b111000 && rn != b1111) + result = armv7_read_thumb_32_instr_ldrbt(raw); + + else if (op1 == b01 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrb_immediate_thumb(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pld_immediate(raw); + } + + if (op1 == b10 && op2 == b000000 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrsb_register(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pli_register(raw); + } + + else if ((op1 & b10) == b10 && rn == b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrsb_literal(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pli_immediate_literal(raw); + } + + else if (op1 == b10 && (op2 & b100100) == b100100 && rn != b1111) + result = armv7_read_thumb_32_instr_ldrsb_immediate(raw); + + else if (op1 == b10 && (op2 & b111100) == b110000 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrsb_immediate(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pli_immediate_literal(raw); + } + + else if (op1 == b10 && (op2 & b111100) == b111000 && rn != b1111) + result = armv7_read_thumb_32_instr_ldrsbt(raw); + + else if (op1 == b11 && rn != b1111) + { + if (rt != b1111) + result = armv7_read_thumb_32_instr_ldrsb_immediate(raw); + else /*if (rt == b1111) */ + result = armv7_read_thumb_32_instr_pli_immediate_literal(raw); + } + + return result; + +} + + /****************************************************************************** * * * Paramètres : raw = donnée brute de 32 bits à désassembler. * |