summaryrefslogtreecommitdiff
path: root/src/target/arm_disassembler.h
diff options
context:
space:
mode:
authordrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-06-16 16:19:08 +0000
committerdrath <drath@b42882b7-edfa-0310-969c-e2dbd0fdcd60>2006-06-16 16:19:08 +0000
commit1f76f6999974a3a1765aaa96fecc3f2433e7b5b6 (patch)
tree6e72888a73b484eff36b3ed0a7605cbb06a10dc6 /src/target/arm_disassembler.h
parentb9628accd6da0aef6a9fc03efb96e05afab99c99 (diff)
downloadopenocd+libswd-1f76f6999974a3a1765aaa96fecc3f2433e7b5b6.tar.gz
openocd+libswd-1f76f6999974a3a1765aaa96fecc3f2433e7b5b6.tar.bz2
openocd+libswd-1f76f6999974a3a1765aaa96fecc3f2433e7b5b6.tar.xz
openocd+libswd-1f76f6999974a3a1765aaa96fecc3f2433e7b5b6.zip
- keep additional information for decoded instructions
git-svn-id: svn://svn.berlios.de/openocd/trunk@69 b42882b7-edfa-0310-969c-e2dbd0fdcd60
Diffstat (limited to 'src/target/arm_disassembler.h')
-rw-r--r--src/target/arm_disassembler.h67
1 files changed, 64 insertions, 3 deletions
diff --git a/src/target/arm_disassembler.h b/src/target/arm_disassembler.h
index df84ba0f..c6dc6967 100644
--- a/src/target/arm_disassembler.h
+++ b/src/target/arm_disassembler.h
@@ -120,15 +120,76 @@ enum arm_instruction_type
ARM_UNDEFINED_INSTRUCTION = 0xffffffff,
};
+typedef struct arm_b_bl_bx_blx_instr_s
+{
+ int reg_operand;
+ u32 target_address;
+} arm_b_bl_bx_blx_instr_t;
+
+typedef struct arm_data_proc_instr_s
+{
+ int variant; /* 0: immediate, 1: immediate_shift, 2: register_shift */
+ u8 S;
+ u8 Rn;
+ u8 Rd;
+ union
+ {
+ struct {
+ u8 immediate;
+ } immediate;
+ struct {
+ u8 Rm;
+ u8 shift;
+ u8 shift_imm;
+ } immediate_shift;
+ struct {
+ u8 Rm;
+ u8 shift;
+ u8 Rs;
+ } register_shift;
+ } shifter_operand;
+} arm_data_proc_instr_t;
+
+typedef struct arm_load_store_instr_s
+{
+ u8 Rd;
+ u8 Rn;
+ u8 U;
+ int index_mode; /* 0: offset, 1: pre-indexed, 2: post-indexed */
+ int offset_mode; /* 0: immediate, 1: (scaled) register */
+ union
+ {
+ u32 offset;
+ struct {
+ u8 Rm;
+ u8 shift;
+ u8 shift_imm;
+ } reg;
+ } offset;
+} arm_load_store_instr_t;
+
+typedef struct arm_load_store_multiple_instr_s
+{
+ u8 Rn;
+ u32 register_list;
+ u8 addressing_mode; /* 0: IA, 1: IB, 2: DA, 3: DB */
+ u8 S;
+ u8 W;
+} arm_load_store_multiple_instr_t;
+
typedef struct arm_instruction_s
{
enum arm_instruction_type type;
char text[128];
u32 opcode;
- /* target */
- u32 target_address;
-
+ union {
+ arm_b_bl_bx_blx_instr_t b_bl_bx_blx;
+ arm_data_proc_instr_t data_proc;
+ arm_load_store_instr_t load_store;
+ arm_load_store_multiple_instr_t load_store_multiple;
+ } info;
+
} arm_instruction_t;
extern int evaluate_opcode(u32 opcode, u32 address, arm_instruction_t *instruction);