diff options
Diffstat (limited to 'src/arch/arm/v7/thumb_32.c')
-rw-r--r-- | src/arch/arm/v7/thumb_32.c | 151 |
1 files changed, 79 insertions, 72 deletions
diff --git a/src/arch/arm/v7/thumb_32.c b/src/arch/arm/v7/thumb_32.c index b58c206..6af804c 100644 --- a/src/arch/arm/v7/thumb_32.c +++ b/src/arch/arm/v7/thumb_32.c @@ -27,7 +27,7 @@ #include <stdint.h> -#include "opcodes/opcodes_thumb_32.h" +#include "opcodes/thumb_32_opcodes.h" #include "opcodes/opcodes_tmp_thumb_32.h" #include "../../../common/bconst.h" @@ -128,6 +128,9 @@ GArchInstruction *process_armv7_thumb_32_instruction_set_encoding(uint32_t raw) * ยง A6.3 32-bit Thumb instruction encoding */ + if (raw == 0x0b00f04f || raw == 0x4ff000b0) + printf("[INIT] raw = 0x%x - mask :: %d\n", raw, (((raw >> 29) & b111) != b111)); + if (((raw >> 29) & b111) != b111) return NULL; result = NULL; @@ -136,6 +139,9 @@ GArchInstruction *process_armv7_thumb_32_instruction_set_encoding(uint32_t raw) op2 = (raw >> 20) & b1111111; op = (raw >> 15) & b1; + if (raw == 0x0b00f04f) + printf("OP1 :: %d\n", op1); + switch (op1) { case b01: @@ -947,6 +953,7 @@ static GArchInstruction *process_armv7_thumb_32_data_processing_shifted_register result = NULL; + op = (raw >> 21) & b1111; rn = (raw >> 16) & b1111; rds = (((raw >> 8) & b1111) << 1) | ((raw >> 20) & b1); @@ -1065,76 +1072,76 @@ static GArchInstruction *process_armv7_thumb_32_data_processing_register(uint32_ rn = (raw >> 16) & b1111; op2 = (raw >> 4) & b1111; - if ((op1 & b1110) == b0000 && op2 == b0000) - result = armv7_read_thumb_32_instr_lsl_register(raw); - - else if ((op1 & b1110) == b0010 && op2 == b0000) - result = armv7_read_thumb_32_instr_lsr_register(raw); - - else if ((op1 & b1110) == b0100 && op2 == b0000) - result = armv7_read_thumb_32_instr_asr_register(raw); - - else if ((op1 & b1110) == b0110 && op2 == b0000) - result = armv7_read_thumb_32_instr_ror_register(raw); - - else if (op1 == b0000 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_sxth(raw); - else - result = armv7_read_thumb_32_instr_sxtah(raw); - } - - else if (op1 == b0001 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_uxth(raw); - else - result = armv7_read_thumb_32_instr_uxtah(raw); - } - - else if (op1 == b0010 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_sxtb16(raw); - else - result = armv7_read_thumb_32_instr_sxtab16(raw); - } - - else if (op1 == b0011 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_uxtb16(raw); - else - result = armv7_read_thumb_32_instr_uxtab16(raw); - } - - else if (op1 == b0100 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_sxtb(raw); - else - result = armv7_read_thumb_32_instr_sxtab(raw); - } - - else if (op1 == b0101 && (op2 & b1000) == b1000) - { - if (rn == b1111) - result = armv7_read_thumb_32_instr_uxtb(raw); - else - result = armv7_read_thumb_32_instr_uxtab(raw); - } - - else if ((op1 & b1000) == b1000 && (op2 & b1100) == b0000) - result = process_armv7_thumb_32_parallel_addition_and_subtraction_signed(raw); - - else if ((op1 & b1000) == b1000 && (op2 & b1100) == b0100) - result = process_armv7_thumb_32_parallel_addition_and_subtraction_unsigned(raw); - - else if ((op1 & b1100) == b1000 && (op2 & b1100) == b1000) - result = process_armv7_thumb_32_miscellaneous_operations(raw); - - return result; + if ((op1 & b1110) == b0000 && op2 == b0000) + result = armv7_read_thumb_32_instr_lsl_register(raw); + + else if ((op1 & b1110) == b0010 && op2 == b0000) + result = armv7_read_thumb_32_instr_lsr_register(raw); + + else if ((op1 & b1110) == b0100 && op2 == b0000) + result = armv7_read_thumb_32_instr_asr_register(raw); + + else if ((op1 & b1110) == b0110 && op2 == b0000) + result = armv7_read_thumb_32_instr_ror_register(raw); + + else if (op1 == b0000 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_sxth(raw); + else + result = armv7_read_thumb_32_instr_sxtah(raw); + } + + else if (op1 == b0001 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_uxth(raw); + else + result = armv7_read_thumb_32_instr_uxtah(raw); + } + + else if (op1 == b0010 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_sxtb16(raw); + else + result = armv7_read_thumb_32_instr_sxtab16(raw); + } + + else if (op1 == b0011 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_uxtb16(raw); + else + result = armv7_read_thumb_32_instr_uxtab16(raw); + } + + else if (op1 == b0100 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_sxtb(raw); + else + result = armv7_read_thumb_32_instr_sxtab(raw); + } + + else if (op1 == b0101 && (op2 & b1000) == b1000) + { + if (rn == b1111) + result = armv7_read_thumb_32_instr_uxtb(raw); + else + result = armv7_read_thumb_32_instr_uxtab(raw); + } + + else if ((op1 & b1000) == b1000 && (op2 & b1100) == b0000) + result = process_armv7_thumb_32_parallel_addition_and_subtraction_signed(raw); + + else if ((op1 & b1000) == b1000 && (op2 & b1100) == b0100) + result = process_armv7_thumb_32_parallel_addition_and_subtraction_unsigned(raw); + + else if ((op1 & b1100) == b1000 && (op2 & b1100) == b1000) + result = process_armv7_thumb_32_miscellaneous_operations(raw); + + return result; } @@ -1633,7 +1640,7 @@ static GArchInstruction *process_armv7_thumb_32_long_multiply_long_multiply_accu case b101: if ((op2 & b1110) == b1100) - result = armv7_read_thumb_32_instr_(raw); + result = armv7_read_thumb_32_instr_smlsld(raw); break; case b110: |