EmulateInstructionARM.h revision 2b8e8b0d1ea00d0076ac20568c2ce2a2a1fe0240
1//===-- lldb_EmulateInstructionARM.h ------------------------------------*- C++ -*-===//
2//
3//                     The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#ifndef lldb_EmulateInstructionARM_h_
11#define lldb_EmulateInstructionARM_h_
12
13#include "lldb/Core/EmulateInstruction.h"
14#include "lldb/Core/Error.h"
15
16namespace lldb_private {
17
18class EmulateInstructionARM : public EmulateInstruction
19{
20public:
21    typedef enum
22    {
23        eEncodingA1,
24        eEncodingA2,
25        eEncodingA3,
26        eEncodingA4,
27        eEncodingA5,
28        eEncodingT1,
29        eEncodingT2,
30        eEncodingT3,
31        eEncodingT4,
32        eEncodingT5,
33    } ARMEncoding;
34
35
36    static void
37    Initialize ();
38
39    static void
40    Terminate ();
41
42    virtual const char *
43    GetPluginName()
44    {
45        return "EmulateInstructionARM";
46    }
47
48    virtual const char *
49    GetShortPluginName()
50    {
51        return "lldb.emulate-instruction.arm";
52    }
53
54    virtual uint32_t
55    GetPluginVersion()
56    {
57        return 1;
58    }
59
60    virtual void
61    GetPluginCommandHelp (const char *command, Stream *strm)
62    {
63    }
64
65    virtual lldb_private::Error
66    ExecutePluginCommand (Args &command, Stream *strm)
67    {
68        Error error;
69        error.SetErrorString("no plug-in commands are supported");
70        return error;
71    }
72
73    virtual Log *
74    EnablePluginLogging (Stream *strm, Args &command)
75    {
76        return NULL;
77    }
78
79    enum Mode
80    {
81        eModeInvalid,
82        eModeARM,
83        eModeThumb
84    };
85
86    EmulateInstructionARM (void *baton,
87                           ReadMemory read_mem_callback,
88                           WriteMemory write_mem_callback,
89                           ReadRegister read_reg_callback,
90                           WriteRegister write_reg_callback) :
91        EmulateInstruction (lldb::eByteOrderLittle, // Byte order for ARM
92                            4,                      // Address size in byte
93                            baton,
94                            read_mem_callback,
95                            write_mem_callback,
96                            read_reg_callback,
97                            write_reg_callback),
98        m_arm_isa (0),
99        m_inst_mode (eModeInvalid),
100        m_inst_cpsr (0)
101    {
102    }
103
104
105    virtual bool
106    SetTargetTriple (const ConstString &triple);
107
108    virtual bool
109    ReadInstruction ();
110
111    virtual bool
112    EvaluateInstruction ();
113
114    bool
115    ConditionPassed ();
116
117    uint32_t
118    CurrentCond ();
119
120protected:
121
122    // Typedef for the callback function used during the emulation.
123    // Pass along (ARMEncoding)encoding as the callback data.
124    typedef enum
125    {
126        eSize16,
127        eSize32
128    } ARMInstrSize;
129
130    typedef struct
131    {
132        uint32_t mask;
133        uint32_t value;
134        uint32_t variants;
135        EmulateInstructionARM::ARMEncoding encoding;
136        ARMInstrSize size;
137        bool (EmulateInstructionARM::*callback) (EmulateInstructionARM::ARMEncoding encoding);
138        const char *name;
139    }  ARMOpcode;
140
141
142    static ARMOpcode*
143    GetARMOpcodeForInstruction (const uint32_t opcode);
144
145    static ARMOpcode*
146    GetThumbOpcodeForInstruction (const uint32_t opcode);
147
148    bool
149    EmulatePush (ARMEncoding encoding);
150
151    bool
152    EmulatePop (ARMEncoding encoding);
153
154    bool
155    EmulateAddRdSPImmediate (ARMEncoding encoding);
156
157    bool
158    EmulateMovRdSP (ARMEncoding encoding);
159
160    bool
161    EmulateMovLowHigh (ARMEncoding encoding);
162
163    bool
164    EmulateLDRRdPCRelative (ARMEncoding encoding);
165
166    bool
167    EmulateAddSPImmediate (ARMEncoding encoding);
168
169    bool
170    EmulateAddSPRm (ARMEncoding encoding);
171
172    bool
173    EmulateSubR7IPImmediate (ARMEncoding encoding);
174
175    bool
176    EmulateSubIPSPImmediate (ARMEncoding encoding);
177
178    bool
179    EmulateSubSPImmdiate (ARMEncoding encoding);
180
181    bool
182    EmulateSTRRtSP (ARMEncoding encoding);
183
184    bool
185    EmulateVPUSH (ARMEncoding encoding);
186
187    uint32_t m_arm_isa;
188    Mode m_inst_mode;
189    uint32_t m_inst_cpsr;
190};
191
192}   // namespace lldb_private
193
194#endif  // lldb_EmulateInstructionARM_h_
195