2013-09-05 03:00:12 +00:00
|
|
|
// Copyright 2006 The Android Open Source Project
|
|
|
|
|
2014-09-06 18:37:19 +00:00
|
|
|
#pragma once
|
2013-09-05 03:00:12 +00:00
|
|
|
|
2014-09-06 18:37:19 +00:00
|
|
|
#include <cstdint>
|
|
|
|
#include <string>
|
2013-09-05 03:00:12 +00:00
|
|
|
|
|
|
|
// Note: this list of opcodes must match the list used to initialize
|
|
|
|
// the opflags[] array in opcode.cpp.
|
|
|
|
enum Opcode {
|
|
|
|
OP_INVALID,
|
|
|
|
OP_UNDEFINED,
|
|
|
|
OP_ADC,
|
|
|
|
OP_ADD,
|
|
|
|
OP_AND,
|
|
|
|
OP_B,
|
|
|
|
OP_BL,
|
|
|
|
OP_BIC,
|
|
|
|
OP_BKPT,
|
|
|
|
OP_BLX,
|
|
|
|
OP_BX,
|
|
|
|
OP_CDP,
|
|
|
|
OP_CLZ,
|
|
|
|
OP_CMN,
|
|
|
|
OP_CMP,
|
|
|
|
OP_EOR,
|
|
|
|
OP_LDC,
|
|
|
|
OP_LDM,
|
|
|
|
OP_LDR,
|
|
|
|
OP_LDRB,
|
|
|
|
OP_LDRBT,
|
|
|
|
OP_LDRH,
|
|
|
|
OP_LDRSB,
|
|
|
|
OP_LDRSH,
|
|
|
|
OP_LDRT,
|
|
|
|
OP_MCR,
|
|
|
|
OP_MLA,
|
|
|
|
OP_MOV,
|
|
|
|
OP_MRC,
|
|
|
|
OP_MRS,
|
|
|
|
OP_MSR,
|
|
|
|
OP_MUL,
|
|
|
|
OP_MVN,
|
2015-08-05 10:12:24 +00:00
|
|
|
OP_NOP,
|
2013-09-05 03:00:12 +00:00
|
|
|
OP_ORR,
|
|
|
|
OP_PLD,
|
|
|
|
OP_RSB,
|
|
|
|
OP_RSC,
|
|
|
|
OP_SBC,
|
2015-08-05 10:12:24 +00:00
|
|
|
OP_SEV,
|
2013-09-05 03:00:12 +00:00
|
|
|
OP_SMLAL,
|
|
|
|
OP_SMULL,
|
|
|
|
OP_STC,
|
|
|
|
OP_STM,
|
|
|
|
OP_STR,
|
|
|
|
OP_STRB,
|
|
|
|
OP_STRBT,
|
|
|
|
OP_STRH,
|
|
|
|
OP_STRT,
|
|
|
|
OP_SUB,
|
|
|
|
OP_SWI,
|
|
|
|
OP_SWP,
|
|
|
|
OP_SWPB,
|
|
|
|
OP_TEQ,
|
|
|
|
OP_TST,
|
|
|
|
OP_UMLAL,
|
|
|
|
OP_UMULL,
|
2015-08-05 10:12:24 +00:00
|
|
|
OP_WFE,
|
|
|
|
OP_WFI,
|
|
|
|
OP_YIELD,
|
2013-09-05 03:00:12 +00:00
|
|
|
|
|
|
|
// Define thumb opcodes
|
|
|
|
OP_THUMB_UNDEFINED,
|
|
|
|
OP_THUMB_ADC,
|
|
|
|
OP_THUMB_ADD,
|
|
|
|
OP_THUMB_AND,
|
|
|
|
OP_THUMB_ASR,
|
|
|
|
OP_THUMB_B,
|
|
|
|
OP_THUMB_BIC,
|
|
|
|
OP_THUMB_BKPT,
|
|
|
|
OP_THUMB_BL,
|
|
|
|
OP_THUMB_BLX,
|
|
|
|
OP_THUMB_BX,
|
|
|
|
OP_THUMB_CMN,
|
|
|
|
OP_THUMB_CMP,
|
|
|
|
OP_THUMB_EOR,
|
|
|
|
OP_THUMB_LDMIA,
|
|
|
|
OP_THUMB_LDR,
|
|
|
|
OP_THUMB_LDRB,
|
|
|
|
OP_THUMB_LDRH,
|
|
|
|
OP_THUMB_LDRSB,
|
|
|
|
OP_THUMB_LDRSH,
|
|
|
|
OP_THUMB_LSL,
|
|
|
|
OP_THUMB_LSR,
|
|
|
|
OP_THUMB_MOV,
|
|
|
|
OP_THUMB_MUL,
|
|
|
|
OP_THUMB_MVN,
|
|
|
|
OP_THUMB_NEG,
|
|
|
|
OP_THUMB_ORR,
|
|
|
|
OP_THUMB_POP,
|
|
|
|
OP_THUMB_PUSH,
|
|
|
|
OP_THUMB_ROR,
|
|
|
|
OP_THUMB_SBC,
|
|
|
|
OP_THUMB_STMIA,
|
|
|
|
OP_THUMB_STR,
|
|
|
|
OP_THUMB_STRB,
|
|
|
|
OP_THUMB_STRH,
|
|
|
|
OP_THUMB_SUB,
|
|
|
|
OP_THUMB_SWI,
|
|
|
|
OP_THUMB_TST,
|
|
|
|
|
|
|
|
OP_END // must be last
|
|
|
|
};
|
|
|
|
|
2014-04-05 02:25:12 +00:00
|
|
|
class ARM_Disasm {
|
2013-09-05 03:00:12 +00:00
|
|
|
public:
|
2014-09-06 18:37:19 +00:00
|
|
|
static std::string Disassemble(uint32_t addr, uint32_t insn);
|
|
|
|
static Opcode Decode(uint32_t insn);
|
2013-09-05 03:00:12 +00:00
|
|
|
|
|
|
|
private:
|
2014-09-06 18:37:19 +00:00
|
|
|
static Opcode Decode00(uint32_t insn);
|
|
|
|
static Opcode Decode01(uint32_t insn);
|
|
|
|
static Opcode Decode10(uint32_t insn);
|
|
|
|
static Opcode Decode11(uint32_t insn);
|
|
|
|
static Opcode DecodeMUL(uint32_t insn);
|
2015-08-05 10:12:24 +00:00
|
|
|
static Opcode DecodeMSRImmAndHints(uint32_t insn);
|
2014-09-06 18:37:19 +00:00
|
|
|
static Opcode DecodeLDRH(uint32_t insn);
|
|
|
|
static Opcode DecodeALU(uint32_t insn);
|
2013-09-05 03:00:12 +00:00
|
|
|
|
2014-09-06 18:37:19 +00:00
|
|
|
static std::string DisassembleALU(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleBranch(uint32_t addr, Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleBX(uint32_t insn);
|
|
|
|
static std::string DisassembleBKPT(uint32_t insn);
|
|
|
|
static std::string DisassembleCLZ(uint32_t insn);
|
|
|
|
static std::string DisassembleMemblock(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleMem(uint32_t insn);
|
|
|
|
static std::string DisassembleMemHalf(uint32_t insn);
|
|
|
|
static std::string DisassembleMCR(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleMLA(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleUMLAL(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleMUL(Opcode opcode, uint32_t insn);
|
|
|
|
static std::string DisassembleMRS(uint32_t insn);
|
|
|
|
static std::string DisassembleMSR(uint32_t insn);
|
2015-08-05 10:12:24 +00:00
|
|
|
static std::string DisassembleNoOperands(Opcode opcode, uint32_t insn);
|
2014-09-06 18:37:19 +00:00
|
|
|
static std::string DisassemblePLD(uint32_t insn);
|
|
|
|
static std::string DisassembleSWI(uint32_t insn);
|
|
|
|
static std::string DisassembleSWP(Opcode opcode, uint32_t insn);
|
2013-09-05 03:00:12 +00:00
|
|
|
};
|