EmulateInstruction.h revision c07d451bb046e47215bd73fda0235362cc6b1a47
164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===//
264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//                     The LLVM Compiler Infrastructure
464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// This file is distributed under the University of Illinois Open Source
664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// License. See LICENSE.TXT for details.
764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//
864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===----------------------------------------------------------------------===//
964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#ifndef lldb_EmulateInstruction_h_
1164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#define lldb_EmulateInstruction_h_
1264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
13080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice#include <string>
14080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
15c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton#include "lldb/lldb-private.h"
16b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h"
17080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice#include "lldb/Core/ArchSpec.h"
1831e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton#include "lldb/Core/PluginInterface.h"
197bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton#include "lldb/Core/Opcode.h"
20dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice#include "lldb/Interpreter/NamedOptionValue.h"
215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
225bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h"
245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @brief A class that allows emulation of CPU opcodes.
255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is a plug-in interface that is accessed through the
275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// standard static FindPlugin function call in the EmulateInstruction
285bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class. The FindPlugin takes a target triple and returns a new object
295bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// if there is a plug-in that supports the architecture and OS. Four
305bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// callbacks and a baton are provided. The four callbacks are read
315bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// register, write register, read memory and write memory.
325bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
335bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is currently designed for these main use cases:
345bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Auto generation of Call Frame Information (CFI) from assembly code
355bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Predicting single step breakpoint locations
365bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Emulating instructions for breakpoint traps
375bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
385e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// Objects can be asked to read an instruction which will cause a call
395bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// to the read register callback to get the PC, followed by a read
405bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// memory call to read the opcode. If ReadInstruction () returns true,
415bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then a call to EmulateInstruction::EvaluateInstruction () can be
425bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// made. At this point the EmulateInstruction subclass will use all of
435bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callbacks to emulate an instruction.
445bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
455bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients that provide the callbacks can either do the read/write
465bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// registers/memory to actually emulate the instruction on a real or
475e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// virtual CPU, or watch for the EmulateInstruction::Context which
485bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// is context for the read/write register/memory which explains why
495bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callback is being called. Examples of a context are:
505e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// "pushing register 3 onto the stack at offset -12", or "adjusting
515bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// stack pointer by -16". This extra context allows the generation of
525bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// CFI information from assembly code without having to actually do
535bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the read/write register/memory.
545bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
555bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients must be prepared that not all instructions for an
565bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Instruction Set Architecture (ISA) will be emulated.
575bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
585bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Subclasses at the very least should implement the instructions that
595bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// save and restore regiters onto the stack and adjustment to the stack
605bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// pointer. By just implementing a few instructions for an ISA that are
615bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the typical prologue opcodes, you can then generate CFI using a
625bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class that will soon be available.
635bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
645bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions that affect the PC can then
655e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support.
665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
675bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions allows for emulation of opcodes
685bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// for breakpoint traps and will pave the way for "thread centric"
695bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// debugging. The current debugging model is "process centric" where
705bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// all threads must be stopped when any thread is stopped since when
715bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// hitting software breakpoints once must disable the breakpoint by
725bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the original breakpoint opcde, single stepping and
735bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the breakpoint trap. If all threads were allowed to run
745bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then other threads could miss the breakpoint.
755bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
765bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class centralizes the code that usually is done in separate
775bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// code paths in a debugger (single step prediction, finding save
785bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restore locations of registers for unwinding stack frame variables,
795bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// and emulating the intruction is just a bonus.
805bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
815bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
8264c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonnamespace lldb_private {
8364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
8431e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonclass EmulateInstruction :
8531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    public PluginInterface
8664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton{
8731e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonpublic:
8831e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
8952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    static EmulateInstruction*
90888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    FindPlugin (const ArchSpec &arch,
91888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                InstructionType supported_inst_type,
92888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                const char *plugin_name);
9331e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
9464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    enum ContextType
9564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
9664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextInvalid = 0,
975bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Read an instruciton opcode from memory
9864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextReadOpcode,
995bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1005bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Usually used for writing a register value whose source value in an
1015bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // immediate
10264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextImmediate,
1035bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1045bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Exclusively used when saving a register to the stack as part of the
1055bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // prologue
10664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextPushRegisterOnStack,
1075bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
108ef85e9162b61fa40ff9d3c9e32476e53cc94aac1Johnny Chen        // Exclusively used when restoring a register off the stack as part of
1095bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // the epilogue
1105bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        eContextPopRegisterOffStack,
1115bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1125bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Add or subtract a value from the stack
11364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextAdjustStackPointer,
114fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
115fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Add or subtract a value from a base address register (other than SP)
116fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextAdjustBaseRegister,
1175bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1186b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice        // Add or subtract a value from the PC or store a value to the PC.
1191f954f59df9ce7bf58d0353ab0949656561210d4Caroline Tice        eContextAdjustPC,
1206b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice
1215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Used in WriteRegister callbacks to indicate where the
12264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextRegisterPlusOffset,
1239b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
124fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used in WriteMemory callback to indicate where the data came from
125fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextRegisterStore,
126fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
1277fac857ec72051dc0a91b027719c275ea672a470Caroline Tice        eContextRegisterLoad,
1287fac857ec72051dc0a91b027719c275ea672a470Caroline Tice
1299b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing a PC-relative branch where the
1309b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextRelativeBranchImmediate,
1319b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
1329b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing an absolute branch where the
1339b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextAbsoluteBranchRegister,
134b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen
135b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // Used when performing a supervisor call to an operating system to
136b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // provide a service:
137713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        eContextSupervisorCall,
13860299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen
13960299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // Used when performing a MemU operation to read the PC-relative offset
14060299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // from an address.
14160299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        eContextTableBranchReadMemory,
142713c2665a27096b68f3f8956222375354f1292f8Caroline Tice
143713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // Used when random bits are written into a register
144fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextWriteRegisterRandomBits,
145fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
146fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used when random bits are written to memory
1475c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eContextWriteMemoryRandomBits,
1485c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
149c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eContextArithmetic,
1500fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice
1510fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice        eContextAdvancePC,
1528ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
153b27771da2fe3256f4a64729ecec05946c27c1a0aCaroline Tice        eContextReturnFromException
15464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
15564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1569bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    enum InfoType {
1579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusOffset,
1589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusIndirectOffset,
1599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterToRegisterPlusOffset,
1608ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        eInfoTypeRegisterToRegisterPlusIndirectOffset,
1615c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eInfoTypeRegisterRegisterOperands,
1629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeOffset,
1639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegister,
1649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediate,
1659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediateSigned,
1669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeAddress,
167c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISAAndImmediate,
168c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISAAndImmediateSigned,
169c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISA,
1709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeNoArgs
1719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    } InfoType;
1729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
17364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    struct Context
17464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
17564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        ContextType type;
1769bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        enum InfoType info_type;
1779bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        union
1789bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
1799bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusOffset
1809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
181c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo reg;          // base register
1829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int64_t signed_offset; // signed offset added to base register
1839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusOffset;
1849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusIndirectOffset
1869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
187c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register number
188c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo offset_reg;    // offset register kind
1899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusIndirectOffset;
1909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterToRegisterPlusOffset
1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
193c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo data_reg;      // source/target register for data
194c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register for address calculation
195c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                int64_t offset;         // offset for address calculation
1969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterToRegisterPlusOffset;
1979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1988ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            struct RegisterToRegisterPlusIndirectOffset
1998ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            {
200c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register for address calculation
201c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo offset_reg;    // offset register for address calculation
202c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo data_reg;      // source/target register for data
2038ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            } RegisterToRegisterPlusIndirectOffset;
2048ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2055c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            struct RegisterRegisterOperands
2065c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            {
207c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo operand1;      // register containing first operand for binary op
208c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo operand2;      // register containing second operand for binary op
2095c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            } RegisterRegisterOperands;
2105c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
211c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            int64_t signed_offset;      // signed offset by which to adjust self (for registers only)
2129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
213c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            RegisterInfo reg;               // plain register
2149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
215c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            uint64_t unsigned_immediate;// unsigned immediate value
216c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            int64_t signed_immediate;   // signed immediate value
2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
218c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            lldb::addr_t address;       // direct address
2199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
220c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            struct ISAAndImmediate
2219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
222c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t isa;
223c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t unsigned_data32;   // immdiate data
224c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            } ISAAndImmediate;
2259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
226c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            struct ISAAndImmediateSigned
2279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
228c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t isa;
229c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                int32_t signed_data32;      // signed immdiate data
230c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            } ISAAndImmediateSigned;
2319bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
232c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            uint32_t isa;
2339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        } info;
2359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
237c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterPlusOffset (RegisterInfo base_reg,
2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                               int64_t signed_offset)
2399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2409bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusOffset;
2419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.reg = base_reg;
2429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.signed_offset = signed_offset;
2439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
246c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterPlusIndirectOffset (RegisterInfo base_reg,
247c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                       RegisterInfo offset_reg)
2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusIndirectOffset;
2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.base_reg   = base_reg;
2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
255c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterToRegisterPlusOffset (RegisterInfo data_reg,
256c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                         RegisterInfo base_reg,
2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         int64_t offset)
2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusOffset;
2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.data_reg = data_reg;
2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.base_reg = base_reg;
2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.offset   = offset;
2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
266c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterToRegisterPlusIndirectOffset (RegisterInfo base_reg,
267c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                                 RegisterInfo offset_reg,
268c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                                 RegisterInfo data_reg)
2698ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        {
2708ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusIndirectOffset;
2718ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.base_reg   = base_reg;
2728ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg;
2738ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.data_reg   = data_reg;
2748ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        }
2758ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2768ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        void
277c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterRegisterOperands (RegisterInfo op1_reg,
278c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                     RegisterInfo op2_reg)
2795c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        {
2805c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info_type = eInfoTypeRegisterRegisterOperands;
2815c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand1 = op1_reg;
2825c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand2 = op2_reg;
2835c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        }
2845c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
2855c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        void
2869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetOffset (int64_t signed_offset)
2879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeOffset;
2899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_offset = signed_offset;
2909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
293c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegister (RegisterInfo reg)
2949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegister;
2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.reg = reg;
2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediate (uint64_t immediate)
3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediate;
303c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.unsigned_immediate = immediate;
3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediateSigned (int64_t signed_immediate)
3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediateSigned;
3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_immediate = signed_immediate;
3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetAddress (lldb::addr_t address)
3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeAddress;
3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.address = address;
3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
320c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISAAndImmediate (uint32_t isa, uint32_t data)
3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
322c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISAAndImmediate;
323c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediate.isa = isa;
324c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediate.unsigned_data32 = data;
3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
328c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISAAndImmediateSigned (uint32_t isa, int32_t data)
3299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
330c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISAAndImmediateSigned;
331c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediateSigned.isa = isa;
332c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediateSigned.signed_data32 = data;
3339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
336c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISA (uint32_t isa)
3379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
338c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISA;
339c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.isa = isa;
3409bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetNoArgs ()
3449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeNoArgs;
3469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
347c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
348c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        void
349c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        Dump (FILE *fh,
350c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton              EmulateInstruction *instruction) const;
351c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
35264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
35364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
354888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    typedef size_t (*ReadMemory) (EmulateInstruction *instruction,
355888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                  void *baton,
35664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  const Context &context,
35764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  lldb::addr_t addr,
35864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  void *dst,
35964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  size_t length);
36064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
361888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    typedef size_t (*WriteMemory) (EmulateInstruction *instruction,
362888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                   void *baton,
36364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const Context &context,
36464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   lldb::addr_t addr,
36564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const void *dst,
36664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   size_t length);
36764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
368888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    typedef bool   (*ReadRegister)  (EmulateInstruction *instruction,
369888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                     void *baton,
370c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                     const RegisterInfo &reg_info,
37164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t &reg_value);
37264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
373888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    typedef bool   (*WriteRegister) (EmulateInstruction *instruction,
374888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                     void *baton,
37564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     const Context &context,
376c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                     const RegisterInfo &reg_info,
37764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t reg_value);
37864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
379888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    EmulateInstruction (const ArchSpec &arch);
38064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual ~EmulateInstruction()
38264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
38364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
384888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
385888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Mandatory overrides
386888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
387888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    virtual bool
388888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    SupportsEmulatingIntructionsOfType (InstructionType inst_type) = 0;
38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39031e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    virtual bool
391395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    SetTargetTriple (const ArchSpec &arch) = 0;
39231e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
39364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
39464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadInstruction () = 0;
39564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
397888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    EvaluateInstruction (uint32_t evaluate_options) = 0;
39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
3996b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice    virtual bool
400dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice    TestEmulation (Stream *out_stream, ArchSpec &arch, OptionValueDictionary *test_data) = 0;
401888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
402c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    virtual bool
403c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num, RegisterInfo &reg_info) = 0;
404c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
405888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
406888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Optional overrides
407888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
408888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    virtual bool
409888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    SetInstruction (const Opcode &insn_opcode, const Address &inst_addr, Target *target);
410c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
411c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    virtual bool
412c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    CreateFunctionEntryUnwind (UnwindPlan &unwind_plan);
413c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
414888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    static const char *
415080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    TranslateRegister (uint32_t reg_kind, uint32_t reg_num, std::string &reg_name);
416080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
41764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
41864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegisterUnsigned (uint32_t reg_kind,
41964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint32_t reg_num,
42064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint64_t fail_value,
42164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          bool *success_ptr);
42264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
423c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    uint64_t
424c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    ReadRegisterUnsigned (const RegisterInfo &reg_info,
425c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          uint64_t fail_value,
426c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          bool *success_ptr);
427c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
42864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
42964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegisterUnsigned (const Context &context,
43064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_kind,
431c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                           uint32_t reg_num,
432c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                           uint64_t reg_value);
433c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
434c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    bool
435c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    WriteRegisterUnsigned (const Context &context,
436c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                           const RegisterInfo &reg_info,
43764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint64_t reg_value);
43864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
43964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
44064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemoryUnsigned (const Context &context,
44164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        lldb::addr_t addr,
44264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        size_t byte_size,
44364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint64_t fail_value,
44464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        bool *success_ptr);
44564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
44664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
44764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemoryUnsigned (const Context &context,
44864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         lldb::addr_t addr,
44964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         uint64_t uval,
45064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         size_t uval_byte_size);
45164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
45264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t
45364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetAddressByteSize () const
45464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
455888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch.GetAddressByteSize();
45664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
45764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
45864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder
45964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetByteOrder () const
46064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
461888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch.GetByteOrder();
46264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
46364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
4647bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton    const Opcode &
4657bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton    GetOpcode () const
46664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
4677bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton        return m_opcode;
46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
469888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
470888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    const ArchSpec &
471888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    GetArchitecture () const
472888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
473888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch;
474888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
47564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
476080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
477080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
478888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadMemoryFrame (EmulateInstruction *instruction,
479888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                     void *baton,
480ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     const Context &context,
481ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     lldb::addr_t addr,
482ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     void *dst,
483ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     size_t length);
484080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
485080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
486888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteMemoryFrame (EmulateInstruction *instruction,
487888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                      void *baton,
488ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      const Context &context,
489ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      lldb::addr_t addr,
490ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      const void *dst,
491ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      size_t length);
492080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
493080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
494888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadRegisterFrame  (EmulateInstruction *instruction,
495888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
496c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                        const RegisterInfo &reg_info,
497ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                        uint64_t &reg_value);
498080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
499080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
500080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
501888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteRegisterFrame (EmulateInstruction *instruction,
502888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
503ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                        const Context &context,
504c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                        const RegisterInfo &reg_info,
505ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                        uint64_t reg_value);
506080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
507080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
508888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadMemoryDefault (EmulateInstruction *instruction,
509888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                       void *baton,
510080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       const Context &context,
511080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       lldb::addr_t addr,
512080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       void *dst,
513080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       size_t length);
514080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
515080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
516888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteMemoryDefault (EmulateInstruction *instruction,
517888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
518080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        const Context &context,
519080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        lldb::addr_t addr,
520080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        const void *dst,
521080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        size_t length);
522080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
523080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
524888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadRegisterDefault  (EmulateInstruction *instruction,
525888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                          void *baton,
526c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          const RegisterInfo &reg_info,
527080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                          uint64_t &reg_value);
528080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
529080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
530080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
531888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteRegisterDefault (EmulateInstruction *instruction,
532888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                          void *baton,
533080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                          const Context &context,
534c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          const RegisterInfo &reg_info,
535080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                          uint64_t reg_value);
536080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
537080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
538080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetBaton (void *baton);
539080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
540080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
541080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetCallbacks (ReadMemory read_mem_callback,
542080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                  WriteMemory write_mem_callback,
543080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                  ReadRegister read_reg_callback,
544080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                  WriteRegister write_reg_callback);
545080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
546080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
547080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetReadMemCallback (ReadMemory read_mem_callback);
548080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
549080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
550080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetWriteMemCallback (WriteMemory write_mem_callback);
551080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
552080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
553080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetReadRegCallback (ReadRegister read_reg_callback);
554080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
555080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
556080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetWriteRegCallback (WriteRegister write_reg_callback);
557c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
558c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    static bool
559c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    GetBestRegisterKindAndNumber (const RegisterInfo &reg_info,
560c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                  uint32_t &reg_kind,
561c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                  uint32_t &reg_num);
562080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
563c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    static uint32_t
564c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    GetInternalRegisterNumber (RegisterContext *reg_ctx,
565c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                               const RegisterInfo &reg_info);
566080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
56764c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected:
568080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    ArchSpec            m_arch;
56964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    void *              m_baton;
57064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemory          m_read_mem_callback;
57164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemory         m_write_mem_callback;
57264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegister        m_read_reg_callback;
57364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegister       m_write_reg_callback;
574b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    lldb::addr_t        m_opcode_pc;
575b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton    Opcode              m_opcode;
576c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
577c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
578c07d451bb046e47215bd73fda0235362cc6b1a47Greg Claytonprivate:
57964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
58064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    // For EmulateInstruction only
58164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
58264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (EmulateInstruction);
58364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton};
58464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
58564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}   // namespace lldb_private
58664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
58764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif  // lldb_EmulateInstruction_h_
588