diff options
Diffstat (limited to 'lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h')
-rw-r--r-- | lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h | 418 |
1 files changed, 161 insertions, 257 deletions
diff --git a/lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h b/lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h index d9333c2824d..1da330497b3 100644 --- a/lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h +++ b/lldb/source/Plugins/Instruction/ARM64/EmulateInstructionARM64.h @@ -14,288 +14,192 @@ // C++ Includes // Other libraries and framework includes // Project includes +#include "Plugins/Process/Utility/ARMDefines.h" #include "lldb/Core/EmulateInstruction.h" #include "lldb/Core/Error.h" #include "lldb/Interpreter/OptionValue.h" -#include "Plugins/Process/Utility/ARMDefines.h" -class EmulateInstructionARM64 : public lldb_private::EmulateInstruction -{ -public: - EmulateInstructionARM64 (const lldb_private::ArchSpec &arch) : - EmulateInstruction (arch), - m_opcode_pstate (), - m_emulated_pstate (), - m_ignore_conditions (false) - { - } +class EmulateInstructionARM64 : public lldb_private::EmulateInstruction { +public: + EmulateInstructionARM64(const lldb_private::ArchSpec &arch) + : EmulateInstruction(arch), m_opcode_pstate(), m_emulated_pstate(), + m_ignore_conditions(false) {} - static void - Initialize (); - - static void - Terminate (); - - static lldb_private::ConstString - GetPluginNameStatic (); - - static const char * - GetPluginDescriptionStatic (); - - static lldb_private::EmulateInstruction * - CreateInstance (const lldb_private::ArchSpec &arch, - lldb_private::InstructionType inst_type); - - static bool - SupportsEmulatingInstructionsOfTypeStatic (lldb_private::InstructionType inst_type) - { - switch (inst_type) - { - case lldb_private::eInstructionTypeAny: - case lldb_private::eInstructionTypePrologueEpilogue: - return true; - - case lldb_private::eInstructionTypePCModifying: - case lldb_private::eInstructionTypeAll: - return false; - } - return false; - } + static void Initialize(); - lldb_private::ConstString - GetPluginName() override; + static void Terminate(); - uint32_t - GetPluginVersion() override - { - return 1; - } + static lldb_private::ConstString GetPluginNameStatic(); - bool - SetTargetTriple(const lldb_private::ArchSpec &arch) override; - - bool - SupportsEmulatingInstructionsOfType(lldb_private::InstructionType inst_type) override - { - return SupportsEmulatingInstructionsOfTypeStatic (inst_type); - } + static const char *GetPluginDescriptionStatic(); - bool - ReadInstruction() override; - - bool - EvaluateInstruction(uint32_t evaluate_options) override; - - bool - TestEmulation(lldb_private::Stream *out_stream, - lldb_private::ArchSpec &arch, - lldb_private::OptionValueDictionary *test_data) override - { - return false; + static lldb_private::EmulateInstruction * + CreateInstance(const lldb_private::ArchSpec &arch, + lldb_private::InstructionType inst_type); + + static bool SupportsEmulatingInstructionsOfTypeStatic( + lldb_private::InstructionType inst_type) { + switch (inst_type) { + case lldb_private::eInstructionTypeAny: + case lldb_private::eInstructionTypePrologueEpilogue: + return true; + + case lldb_private::eInstructionTypePCModifying: + case lldb_private::eInstructionTypeAll: + return false; } + return false; + } + + lldb_private::ConstString GetPluginName() override; - bool - GetRegisterInfo(lldb::RegisterKind reg_kind, - uint32_t reg_num, - lldb_private::RegisterInfo ®_info) override; - - bool - CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override; - - typedef enum - { - AddrMode_OFF, - AddrMode_PRE, - AddrMode_POST - } AddrMode; - - typedef enum - { - BranchType_CALL, - BranchType_ERET, - BranchType_DRET, - BranchType_RET, - BranchType_JMP - } BranchType; - - typedef enum - { - CountOp_CLZ, - CountOp_CLS, - CountOp_CNT - } CountOp; - - typedef enum - { - RevOp_RBIT, - RevOp_REV16, - RevOp_REV32, - RevOp_REV64 - } RevOp; - - typedef enum - { - BitwiseOp_NOT, - BitwiseOp_RBIT - } BitwiseOp; - - typedef enum - { - EL0 = 0, - EL1 = 1, - EL2 = 2, - EL3 = 3 - } ExceptionLevel; - - typedef enum - { - ExtendType_SXTB, - ExtendType_SXTH, - ExtendType_SXTW, - ExtendType_SXTX, - ExtendType_UXTB, - ExtendType_UXTH, - ExtendType_UXTW, - ExtendType_UXTX - } ExtendType; - - typedef enum - { - ExtractType_LEFT, - ExtractType_RIGHT - } ExtractType; - - typedef enum - { - LogicalOp_AND, - LogicalOp_EOR, - LogicalOp_ORR - } LogicalOp; - - typedef enum - { - MemOp_LOAD, - MemOp_STORE, - MemOp_PREFETCH, - MemOp_NOP - } MemOp; - - typedef enum - { - MoveWideOp_N, - MoveWideOp_Z, - MoveWideOp_K - } MoveWideOp; - - typedef enum { - ShiftType_LSL, - ShiftType_LSR, - ShiftType_ASR, - ShiftType_ROR - } ShiftType; - - typedef enum - { - SP0 = 0, - SPx = 1 - } StackPointerSelection; - - typedef enum - { - Unpredictable_WBOVERLAP, - Unpredictable_LDPOVERLAP - } Unpredictable; - - typedef enum - { - Constraint_NONE, - Constraint_UNKNOWN, - Constraint_SUPPRESSWB, - Constraint_NOP - } ConstraintType; - - typedef enum - { - AccType_NORMAL, - AccType_UNPRIV, - AccType_STREAM, - AccType_ALIGNED, - AccType_ORDERED - } AccType; - - typedef struct - { - uint32_t - N:1, - V:1, - C:1, - Z:1, // condition code flags – can also be accessed as PSTATE.[N,Z,C,V] - Q:1, // AArch32 only – CSPR.Q bit - IT:8, // AArch32 only – CPSR.IT bits - J:1, // AArch32 only – CSPR.J bit - T:1, // AArch32 only – CPSR.T bit - SS:1, // Single step process state bit - IL:1, // Illegal state bit - D:1, - A:1, - I:1, - F:1, // Interrupt masks – can also be accessed as PSTATE.[D,A,I,F] - E:1, // AArch32 only – CSPR.E bit - M:5, // AArch32 only – mode encodings - RW:1, // Current register width – 0 is AArch64, 1 is AArch32 - EL:2, // Current exception level (see ExceptionLevel enum) - SP:1; // AArch64 only - Stack Pointer selection (see StackPointerSelection enum) - } ProcState; + uint32_t GetPluginVersion() override { return 1; } + + bool SetTargetTriple(const lldb_private::ArchSpec &arch) override; + + bool SupportsEmulatingInstructionsOfType( + lldb_private::InstructionType inst_type) override { + return SupportsEmulatingInstructionsOfTypeStatic(inst_type); + } + + bool ReadInstruction() override; + + bool EvaluateInstruction(uint32_t evaluate_options) override; + + bool TestEmulation(lldb_private::Stream *out_stream, + lldb_private::ArchSpec &arch, + lldb_private::OptionValueDictionary *test_data) override { + return false; + } + + bool GetRegisterInfo(lldb::RegisterKind reg_kind, uint32_t reg_num, + lldb_private::RegisterInfo ®_info) override; + + bool + CreateFunctionEntryUnwind(lldb_private::UnwindPlan &unwind_plan) override; + + typedef enum { AddrMode_OFF, AddrMode_PRE, AddrMode_POST } AddrMode; + + typedef enum { + BranchType_CALL, + BranchType_ERET, + BranchType_DRET, + BranchType_RET, + BranchType_JMP + } BranchType; + + typedef enum { CountOp_CLZ, CountOp_CLS, CountOp_CNT } CountOp; + + typedef enum { RevOp_RBIT, RevOp_REV16, RevOp_REV32, RevOp_REV64 } RevOp; + + typedef enum { BitwiseOp_NOT, BitwiseOp_RBIT } BitwiseOp; + + typedef enum { EL0 = 0, EL1 = 1, EL2 = 2, EL3 = 3 } ExceptionLevel; + + typedef enum { + ExtendType_SXTB, + ExtendType_SXTH, + ExtendType_SXTW, + ExtendType_SXTX, + ExtendType_UXTB, + ExtendType_UXTH, + ExtendType_UXTW, + ExtendType_UXTX + } ExtendType; + + typedef enum { ExtractType_LEFT, ExtractType_RIGHT } ExtractType; + + typedef enum { LogicalOp_AND, LogicalOp_EOR, LogicalOp_ORR } LogicalOp; + + typedef enum { MemOp_LOAD, MemOp_STORE, MemOp_PREFETCH, MemOp_NOP } MemOp; + + typedef enum { MoveWideOp_N, MoveWideOp_Z, MoveWideOp_K } MoveWideOp; + + typedef enum { + ShiftType_LSL, + ShiftType_LSR, + ShiftType_ASR, + ShiftType_ROR + } ShiftType; + + typedef enum { SP0 = 0, SPx = 1 } StackPointerSelection; + + typedef enum { + Unpredictable_WBOVERLAP, + Unpredictable_LDPOVERLAP + } Unpredictable; + + typedef enum { + Constraint_NONE, + Constraint_UNKNOWN, + Constraint_SUPPRESSWB, + Constraint_NOP + } ConstraintType; + + typedef enum { + AccType_NORMAL, + AccType_UNPRIV, + AccType_STREAM, + AccType_ALIGNED, + AccType_ORDERED + } AccType; + + typedef struct { + uint32_t N : 1, V : 1, C : 1, + Z : 1, // condition code flags – can also be accessed as + // PSTATE.[N,Z,C,V] + Q : 1, // AArch32 only – CSPR.Q bit + IT : 8, // AArch32 only – CPSR.IT bits + J : 1, // AArch32 only – CSPR.J bit + T : 1, // AArch32 only – CPSR.T bit + SS : 1, // Single step process state bit + IL : 1, // Illegal state bit + D : 1, A : 1, I : 1, + F : 1, // Interrupt masks – can also be accessed as PSTATE.[D,A,I,F] + E : 1, // AArch32 only – CSPR.E bit + M : 5, // AArch32 only – mode encodings + RW : 1, // Current register width – 0 is AArch64, 1 is AArch32 + EL : 2, // Current exception level (see ExceptionLevel enum) + SP : 1; // AArch64 only - Stack Pointer selection (see + // StackPointerSelection enum) + } ProcState; protected: - typedef struct - { - uint32_t mask; - uint32_t value; - uint32_t vfp_variants; - bool (EmulateInstructionARM64::*callback) (const uint32_t opcode); - const char *name; - } Opcode; - - static Opcode* - GetOpcodeForInstruction (const uint32_t opcode); + typedef struct { + uint32_t mask; + uint32_t value; + uint32_t vfp_variants; + bool (EmulateInstructionARM64::*callback)(const uint32_t opcode); + const char *name; + } Opcode; + + static Opcode *GetOpcodeForInstruction(const uint32_t opcode); - uint32_t - GetFramePointerRegisterNumber() const; + uint32_t GetFramePointerRegisterNumber() const; - bool - BranchTo (const Context &context, uint32_t N, lldb::addr_t target); + bool BranchTo(const Context &context, uint32_t N, lldb::addr_t target); - bool - ConditionHolds (const uint32_t cond); + bool ConditionHolds(const uint32_t cond); - bool - UsingAArch32 (); + bool UsingAArch32(); - bool - EmulateADDSUBImm (const uint32_t opcode); + bool EmulateADDSUBImm(const uint32_t opcode); - template <AddrMode a_mode> bool - EmulateLDPSTP (const uint32_t opcode); + template <AddrMode a_mode> bool EmulateLDPSTP(const uint32_t opcode); - template <AddrMode a_mode> bool - EmulateLDRSTRImm (const uint32_t opcode); + template <AddrMode a_mode> bool EmulateLDRSTRImm(const uint32_t opcode); - bool - EmulateB (const uint32_t opcode); + bool EmulateB(const uint32_t opcode); - bool - EmulateBcond (const uint32_t opcode); + bool EmulateBcond(const uint32_t opcode); - bool - EmulateCBZ (const uint32_t opcode); + bool EmulateCBZ(const uint32_t opcode); - bool - EmulateTBZ (const uint32_t opcode); + bool EmulateTBZ(const uint32_t opcode); - ProcState m_opcode_pstate; - ProcState m_emulated_pstate; // This can get updated by the opcode. - bool m_ignore_conditions; + ProcState m_opcode_pstate; + ProcState m_emulated_pstate; // This can get updated by the opcode. + bool m_ignore_conditions; }; #endif // EmulateInstructionARM64_h_ |