diff options
Diffstat (limited to 'decoder/source/i_dec/trc_i_decode.cpp')
-rw-r--r-- | decoder/source/i_dec/trc_i_decode.cpp | 51 |
1 files changed, 18 insertions, 33 deletions
diff --git a/decoder/source/i_dec/trc_i_decode.cpp b/decoder/source/i_dec/trc_i_decode.cpp index ab93284848bb5..614fc1d8b45c7 100644 --- a/decoder/source/i_dec/trc_i_decode.cpp +++ b/decoder/source/i_dec/trc_i_decode.cpp @@ -39,21 +39,23 @@ ocsd_err_t TrcIDecode::DecodeInstruction(ocsd_instr_info *instr_info) { ocsd_err_t err = OCSD_OK; - clear_instr_subtype(); - SetArchVersion(instr_info); + struct decode_info info; + + info.instr_sub_type = OCSD_S_INSTR_NONE; + info.arch_version = (uint16_t)(instr_info->pe_type.arch); switch(instr_info->isa) { case ocsd_isa_arm: - err = DecodeA32(instr_info); + err = DecodeA32(instr_info, &info); break; case ocsd_isa_thumb2: - err = DecodeT32(instr_info); + err = DecodeT32(instr_info, &info); break; case ocsd_isa_aarch64: - err = DecodeA64(instr_info); + err = DecodeA64(instr_info, &info); break; case ocsd_isa_tee: @@ -63,27 +65,11 @@ ocsd_err_t TrcIDecode::DecodeInstruction(ocsd_instr_info *instr_info) err = OCSD_ERR_UNSUPPORTED_ISA; break; } - instr_info->sub_type = get_instr_subtype(); + instr_info->sub_type = info.instr_sub_type; return err; } -void TrcIDecode::SetArchVersion(ocsd_instr_info *instr_info) -{ - uint16_t arch = 0x0700; - - switch (instr_info->pe_type.arch) - { - case ARCH_V8: arch = 0x0800; break; - case ARCH_V8r3: arch = 0x0803; break; - case ARCH_V7: - default: - break; - } - set_arch_version(arch); -} - - -ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info) +ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info, struct decode_info *info) { uint32_t branchAddr = 0; arm_barrier_t barrier; @@ -93,10 +79,10 @@ ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info) instr_info->next_isa = instr_info->isa; // assume same ISA instr_info->is_link = 0; - if(inst_ARM_is_indirect_branch(instr_info->opcode)) + if(inst_ARM_is_indirect_branch(instr_info->opcode, info)) { instr_info->type = OCSD_INSTR_BR_INDIRECT; - instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode); + instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode, info); } else if(inst_ARM_is_direct_branch(instr_info->opcode)) { @@ -108,7 +94,7 @@ ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info) branchAddr &= ~0x1; } instr_info->branch_addr = (ocsd_vaddr_t)branchAddr; - instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode); + instr_info->is_link = inst_ARM_is_branch_and_link(instr_info->opcode, info); } else if((barrier = inst_ARM_barrier(instr_info->opcode)) != ARM_BARRIER_NONE) { @@ -137,7 +123,7 @@ ocsd_err_t TrcIDecode::DecodeA32(ocsd_instr_info *instr_info) return OCSD_OK; } -ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info) +ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info, struct decode_info *info) { uint64_t branchAddr = 0; arm_barrier_t barrier; @@ -147,12 +133,12 @@ ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info) instr_info->next_isa = instr_info->isa; // assume same ISA instr_info->is_link = 0; - if(inst_A64_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link)) + if(inst_A64_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link, info)) { instr_info->type = OCSD_INSTR_BR_INDIRECT; // instr_info->is_link = inst_A64_is_branch_and_link(instr_info->opcode); } - else if(inst_A64_is_direct_branch_link(instr_info->opcode, &instr_info->is_link)) + else if(inst_A64_is_direct_branch_link(instr_info->opcode, &instr_info->is_link, info)) { inst_A64_branch_destination(instr_info->instr_addr,instr_info->opcode,&branchAddr); instr_info->type = OCSD_INSTR_BR; @@ -187,7 +173,7 @@ ocsd_err_t TrcIDecode::DecodeA64(ocsd_instr_info *instr_info) return OCSD_OK; } -ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info) +ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info, struct decode_info *info) { uint32_t branchAddr = 0; arm_barrier_t barrier; @@ -206,7 +192,7 @@ ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info) instr_info->is_conditional = 0; - if(inst_Thumb_is_direct_branch_link(instr_info->opcode,&instr_info->is_link, &instr_info->is_conditional)) + if(inst_Thumb_is_direct_branch_link(instr_info->opcode,&instr_info->is_link, &instr_info->is_conditional, info)) { inst_Thumb_branch_destination((uint32_t)instr_info->instr_addr,instr_info->opcode,&branchAddr); instr_info->type = OCSD_INSTR_BR; @@ -214,7 +200,7 @@ ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info) if((branchAddr & 0x1) == 0) instr_info->next_isa = ocsd_isa_arm; } - else if (inst_Thumb_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link)) + else if (inst_Thumb_is_indirect_branch_link(instr_info->opcode, &instr_info->is_link, info)) { instr_info->type = OCSD_INSTR_BR_INDIRECT; } @@ -246,5 +232,4 @@ ocsd_err_t TrcIDecode::DecodeT32(ocsd_instr_info *instr_info) return OCSD_OK; } - /* End of File trc_i_decode.cpp */ |