EmulateInstruction.h revision 8ce836dbf416c4dfdbede109be5cc09b95918fd0
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
1364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#include "lldb/lldb-include.h"
1431e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton#include "lldb/Core/PluginInterface.h"
155bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
165bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
175bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h"
185bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @brief A class that allows emulation of CPU opcodes.
195bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
205bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is a plug-in interface that is accessed through the
215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// standard static FindPlugin function call in the EmulateInstruction
225bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class. The FindPlugin takes a target triple and returns a new object
235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// if there is a plug-in that supports the architecture and OS. Four
245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// callbacks and a baton are provided. The four callbacks are read
255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// register, write register, read memory and write memory.
265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is currently designed for these main use cases:
285bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Auto generation of Call Frame Information (CFI) from assembly code
295bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Predicting single step breakpoint locations
305bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Emulating instructions for breakpoint traps
315bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
325e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// Objects can be asked to read an instruction which will cause a call
335bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// to the read register callback to get the PC, followed by a read
345bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// memory call to read the opcode. If ReadInstruction () returns true,
355bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then a call to EmulateInstruction::EvaluateInstruction () can be
365bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// made. At this point the EmulateInstruction subclass will use all of
375bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callbacks to emulate an instruction.
385bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
395bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients that provide the callbacks can either do the read/write
405bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// registers/memory to actually emulate the instruction on a real or
415e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// virtual CPU, or watch for the EmulateInstruction::Context which
425bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// is context for the read/write register/memory which explains why
435bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callback is being called. Examples of a context are:
445e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// "pushing register 3 onto the stack at offset -12", or "adjusting
455bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// stack pointer by -16". This extra context allows the generation of
465bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// CFI information from assembly code without having to actually do
475bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the read/write register/memory.
485bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
495bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients must be prepared that not all instructions for an
505bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Instruction Set Architecture (ISA) will be emulated.
515bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
525bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Subclasses at the very least should implement the instructions that
535bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// save and restore regiters onto the stack and adjustment to the stack
545bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// pointer. By just implementing a few instructions for an ISA that are
555bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the typical prologue opcodes, you can then generate CFI using a
565bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class that will soon be available.
575bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
585bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions that affect the PC can then
595e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support.
605bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
615bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions allows for emulation of opcodes
625bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// for breakpoint traps and will pave the way for "thread centric"
635bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// debugging. The current debugging model is "process centric" where
645bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// all threads must be stopped when any thread is stopped since when
655bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// hitting software breakpoints once must disable the breakpoint by
665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the original breakpoint opcde, single stepping and
675bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the breakpoint trap. If all threads were allowed to run
685bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then other threads could miss the breakpoint.
695bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
705bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class centralizes the code that usually is done in separate
715bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// code paths in a debugger (single step prediction, finding save
725bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restore locations of registers for unwinding stack frame variables,
735bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// and emulating the intruction is just a bonus.
745bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//----------------------------------------------------------------------
755bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
7664c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonnamespace lldb_private {
7764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
7831e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonclass EmulateInstruction :
7931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    public PluginInterface
8064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton{
8131e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonpublic:
8231e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
8352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton    static EmulateInstruction*
84395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    FindPlugin (const ArchSpec &arch, const char *plugin_name);
8531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
8664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    enum ContextType
8764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
8864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextInvalid = 0,
895bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Read an instruciton opcode from memory
9064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextReadOpcode,
915bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
925bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Usually used for writing a register value whose source value in an
935bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // immediate
9464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextImmediate,
955bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
965bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Exclusively used when saving a register to the stack as part of the
975bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // prologue
9864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextPushRegisterOnStack,
995bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
100ef85e9162b61fa40ff9d3c9e32476e53cc94aac1Johnny Chen        // Exclusively used when restoring a register off the stack as part of
1015bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // the epilogue
1025bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        eContextPopRegisterOffStack,
1035bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1045bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Add or subtract a value from the stack
10564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextAdjustStackPointer,
106fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
107fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Add or subtract a value from a base address register (other than SP)
108fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextAdjustBaseRegister,
1095bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1105bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Used in WriteRegister callbacks to indicate where the
11164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextRegisterPlusOffset,
1129b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
113fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used in WriteMemory callback to indicate where the data came from
114fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextRegisterStore,
115fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
1167fac857ec72051dc0a91b027719c275ea672a470Caroline Tice        eContextRegisterLoad,
1177fac857ec72051dc0a91b027719c275ea672a470Caroline Tice
1189b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing a PC-relative branch where the
1199b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextRelativeBranchImmediate,
1209b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
1219b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing an absolute branch where the
1229b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextAbsoluteBranchRegister,
123b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen
124b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // Used when performing a supervisor call to an operating system to
125b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // provide a service:
126713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        eContextSupervisorCall,
12760299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen
12860299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // Used when performing a MemU operation to read the PC-relative offset
12960299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // from an address.
13060299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        eContextTableBranchReadMemory,
131713c2665a27096b68f3f8956222375354f1292f8Caroline Tice
132713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // Used when random bits are written into a register
133fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextWriteRegisterRandomBits,
134fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
135fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used when random bits are written to memory
1365c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eContextWriteMemoryRandomBits,
1375c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
138dcc11b3b8882b3522244a25d2915c9086b44e596Caroline Tice        eContextMultiplication,
1398ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
140b27771da2fe3256f4a64729ecec05946c27c1a0aCaroline Tice        eContextAddition,
1418ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
142b27771da2fe3256f4a64729ecec05946c27c1a0aCaroline Tice        eContextReturnFromException
14364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
14464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    enum InfoType {
1469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusOffset,
1479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusIndirectOffset,
1489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterToRegisterPlusOffset,
1498ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        eInfoTypeRegisterToRegisterPlusIndirectOffset,
1505c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eInfoTypeRegisterRegisterOperands,
1519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeOffset,
1529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegister,
1539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediate,
1549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediateSigned,
1559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeAddress,
1569bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeModeAndImmediate,
1579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeModeAndImmediateSigned,
158668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen        eInfoTypeMode,
1599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeNoArgs
1609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    } InfoType;
1619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    struct Register
1639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    {
1649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        uint32_t kind;
1659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        uint32_t num;
1669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
1699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegister (uint32_t reg_kind, uint32_t reg_num)
1709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
1719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            kind = reg_kind;
1729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            num = reg_num;
1739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
1749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    };
1759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
17664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    struct Context
17764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
17864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        ContextType type;
1799bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        enum InfoType info_type;
1809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        union
1819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
1829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusOffset
1839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
1849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register reg;          // base register
1859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int64_t signed_offset; // signed offset added to base register
1869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusOffset;
1879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterPlusIndirectOffset
1899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
1909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register base_reg;    // base register number
1919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register offset_reg;  // offset register kind
1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusIndirectOffset;
1939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterToRegisterPlusOffset
1959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
1969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register data_reg;  // source/target register for data
1979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                Register base_reg;  // base register for address calculation
1989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int64_t offset;     // offset for address calculation
1999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterToRegisterPlusOffset;
2009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2018ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            struct RegisterToRegisterPlusIndirectOffset
2028ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            {
2038ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice                Register base_reg;   // base register for address calculation
2048ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice                Register offset_reg; // offset register for address calculation
2058ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice                Register data_reg;   // source/target register for data
2068ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            } RegisterToRegisterPlusIndirectOffset;
2078ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2085c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            struct RegisterRegisterOperands
2095c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            {
2105c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice                Register operand1;  // register containing first operand for binary op
2115c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice                Register operand2;  // register containing second operand for binary op
2125c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            } RegisterRegisterOperands;
2135c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
2149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            int64_t signed_offset; // signed offset by which to adjust self (for registers only)
2159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            Register reg;          // plain register
2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            uint64_t immediate;    // immediate value
2199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            int64_t signed_immediate; // signed immediate value
2219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            lldb::addr_t address;        // direct address
2239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct ModeAndImmediate
2259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                uint32_t mode;        // eModeARM or eModeThumb
227668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen                uint32_t data_value;  // immdiate data
2289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } ModeAndImmediate;
2299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct ModeAndImmediateSigned
2319bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
2329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                uint32_t mode;             // eModeARM or eModeThumb
2339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                int32_t signed_data_value; // signed immdiate data
2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } ModeAndImmediateSigned;
2359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
236668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            uint32_t mode;         // eModeARM or eModeThumb
2379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        } info;
2399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2409bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterPlusOffset (Register base_reg,
2429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                               int64_t signed_offset)
2439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusOffset;
2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.reg = base_reg;
2469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.signed_offset = signed_offset;
2479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterPlusIndirectOffset (Register base_reg,
2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                       Register offset_reg)
2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusIndirectOffset;
2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.base_reg   = base_reg;
2559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
2569bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegisterToRegisterPlusOffset (Register data_reg,
2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         Register base_reg,
2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         int64_t offset)
2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusOffset;
2649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.data_reg = data_reg;
2659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.base_reg = base_reg;
2669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.offset   = offset;
2679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2708ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        SetRegisterToRegisterPlusIndirectOffset (Register base_reg,
2718ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice                                                 Register offset_reg,
2728ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice                                                 Register data_reg)
2738ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        {
2748ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusIndirectOffset;
2758ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.base_reg   = base_reg;
2768ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg;
2778ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.data_reg   = data_reg;
2788ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        }
2798ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2808ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        void
2815c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        SetRegisterRegisterOperands (Register op1_reg,
2825c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice                                     Register op2_reg)
2835c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        {
2845c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info_type = eInfoTypeRegisterRegisterOperands;
2855c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand1 = op1_reg;
2865c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand2 = op2_reg;
2875c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        }
2885c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
2895c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        void
2909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetOffset (int64_t signed_offset)
2919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeOffset;
2939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_offset = signed_offset;
2949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetRegister (Register reg)
2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegister;
3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.reg = reg;
3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediate (uint64_t immediate)
3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediate;
3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.immediate = immediate;
3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediateSigned (int64_t signed_immediate)
3129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediateSigned;
3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_immediate = signed_immediate;
3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetAddress (lldb::addr_t address)
3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeAddress;
3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.address = address;
3229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetModeAndImmediate (uint32_t mode, uint32_t data_value)
3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeModeAndImmediate;
3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediate.mode = mode;
3289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediate.data_value = data_value;
3299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3319bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetModeAndImmediateSigned (uint32_t mode, int32_t signed_data_value)
3339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeModeAndImmediateSigned;
3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediateSigned.mode = mode;
3369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.ModeAndImmediateSigned.signed_data_value = signed_data_value;
3379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
340668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen        SetMode (uint32_t mode)
3419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
342668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            info_type = eInfoTypeMode;
343668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen            info.mode = mode;
3449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetNoArgs ()
3489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeNoArgs;
3509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
35264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
35364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
35464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    union Opcode
35564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
35664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint8_t inst8;
35764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint16_t inst16;
35864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint32_t inst32;
35964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        uint64_t inst64;
36064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        union inst
36164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        {
36264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            uint8_t bytes[16];
36364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            uint8_t length;
36464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        };
36564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
36664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
36764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    enum OpcodeType
36864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
36964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode8,
37064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode16,
37164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode32,
37264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eOpcode64,
37317f5afe9ed10bda3efbce0f26cf0c030331f8b15Greg Clayton        eOpcodeBytes
37464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
37564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
37664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    struct Instruction
37764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
37864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        OpcodeType opcode_type;
37964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        Opcode opcode;
38064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
38264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef size_t (*ReadMemory) (void *baton,
38364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  const Context &context,
38464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  lldb::addr_t addr,
38564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  void *dst,
38664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                  size_t length);
38764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
38864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef size_t (*WriteMemory) (void *baton,
38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const Context &context,
39064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   lldb::addr_t addr,
39164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   const void *dst,
39264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                   size_t length);
39364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef bool   (*ReadRegister)  (void *baton,
39564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_kind,
39664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_num,
39764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t &reg_value);
39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    typedef bool   (*WriteRegister) (void *baton,
40064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     const Context &context,
40164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_kind,
40264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint32_t reg_num,
40364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                                     uint64_t reg_value);
40464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
40564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    EmulateInstruction (lldb::ByteOrder byte_order,
40664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint32_t addr_byte_size,
40764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        void *baton,
40864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        ReadMemory read_mem_callback,
40964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        WriteMemory write_mem_callback,
41064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        ReadRegister read_reg_callback,
41164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        WriteRegister write_reg_callback);
41264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
41364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual ~EmulateInstruction()
41464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
41564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
41664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
41731e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    virtual bool
418395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    SetTargetTriple (const ArchSpec &arch) = 0;
41931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
42064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
42164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadInstruction () = 0;
42264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
42364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
42464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    EvaluateInstruction () = 0;
42564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
42664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
42764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegisterUnsigned (uint32_t reg_kind,
42864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint32_t reg_num,
42964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint64_t fail_value,
43064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          bool *success_ptr);
43164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
43264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
43364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegisterUnsigned (const Context &context,
43464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_kind,
43564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_num,
43664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint64_t reg_value);
43764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
43864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
43964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemoryUnsigned (const Context &context,
44064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        lldb::addr_t addr,
44164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        size_t byte_size,
44264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint64_t fail_value,
44364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        bool *success_ptr);
44464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
44564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
44664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemoryUnsigned (const Context &context,
44764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         lldb::addr_t addr,
44864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         uint64_t uval,
44964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         size_t uval_byte_size);
45064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
45164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t
45264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetAddressByteSize () const
45364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
45464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return m_addr_byte_size;
45564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
45664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
45764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder
45864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetByteOrder () const
45964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
46064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return m_byte_order;
46164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
46264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
46364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
46464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    OpcodeAsUnsigned (bool *success_ptr)
46564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
46664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        if (success_ptr)
46764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            *success_ptr = true;
46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        switch (m_inst.opcode_type)
46964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        {
470f6aaf7de798144df2a04d6630dfa1cd0acf33350Benjamin Kramer        case eOpcode8:     return m_inst.opcode.inst8;
471f6aaf7de798144df2a04d6630dfa1cd0acf33350Benjamin Kramer        case eOpcode16:    return m_inst.opcode.inst16;
472f6aaf7de798144df2a04d6630dfa1cd0acf33350Benjamin Kramer        case eOpcode32:    return m_inst.opcode.inst32;
473f6aaf7de798144df2a04d6630dfa1cd0acf33350Benjamin Kramer        case eOpcode64:    return m_inst.opcode.inst64;
474f6aaf7de798144df2a04d6630dfa1cd0acf33350Benjamin Kramer        case eOpcodeBytes: break;
47564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        }
47664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        if (success_ptr)
47764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton            *success_ptr = false;
47864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        return 0;
47964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
48064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
48164c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected:
48264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder     m_byte_order;
48364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t            m_addr_byte_size;
48464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    void *              m_baton;
48564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemory          m_read_mem_callback;
48664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemory         m_write_mem_callback;
48764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadRegister        m_read_reg_callback;
48864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteRegister       m_write_reg_callback;
48964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
49064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::addr_t m_inst_pc;
49164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    Instruction m_inst;
49264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
49364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    // For EmulateInstruction only
49464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
49564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (EmulateInstruction);
49664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton};
49764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
49864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}   // namespace lldb_private
49964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
50064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif  // lldb_EmulateInstruction_h_
501