summaryrefslogtreecommitdiff
path: root/src/arch/arm/v7/thumb_32.c
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2014-12-03 22:41:29 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2014-12-03 22:41:29 (GMT)
commit172fce9bab61de1ffa89f731b5d10f96e209afc1 (patch)
tree31aee5a141979fa99bbf88cbf2b7990de0ec3832 /src/arch/arm/v7/thumb_32.c
parentf7ef27195f8c9dc35e5e210a333b74fcfae5ad71 (diff)
Begun to support more than the only 'ARMv7' architecture for ARM (ARM / Thumb16 / Thumb32).
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@433 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/arch/arm/v7/thumb_32.c')
-rw-r--r--src/arch/arm/v7/thumb_32.c151
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: