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"
20061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.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
597fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// save and restore registers 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///
64b23bb8e26f227795ba89d79663d5a21951cddb9eFilipe Cabecinhas/// Implementing all of the instructions that affect the PC can then
655e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support.
665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton///
67b23bb8e26f227795ba89d79663d5a21951cddb9eFilipe Cabecinhas/// Implementing 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
707fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// all threads must be stopped when any thread is stopped; when
717fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// hitting software breakpoints we 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
787fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// 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
1007fad24a9fd7226016b28fef78930501a1bef898cJason Molenda        // Usually used for writing a register value whose source value is 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
11575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        // Adjust the frame pointer for the current frame
11675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        eContextSetFramePointer,
11775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
118fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Add or subtract a value from a base address register (other than SP)
119fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextAdjustBaseRegister,
1205bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton
1216b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice        // Add or subtract a value from the PC or store a value to the PC.
1221f954f59df9ce7bf58d0353ab0949656561210d4Caroline Tice        eContextAdjustPC,
1236b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice
1245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton        // Used in WriteRegister callbacks to indicate where the
12564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton        eContextRegisterPlusOffset,
1269b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
127fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used in WriteMemory callback to indicate where the data came from
128fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextRegisterStore,
129fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
1307fac857ec72051dc0a91b027719c275ea672a470Caroline Tice        eContextRegisterLoad,
1317fac857ec72051dc0a91b027719c275ea672a470Caroline Tice
1329b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing a PC-relative branch where the
1339b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextRelativeBranchImmediate,
1349b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen
1359b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        // Used when performing an absolute branch where the
1369b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen        eContextAbsoluteBranchRegister,
137b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen
138b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // Used when performing a supervisor call to an operating system to
139b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen        // provide a service:
140713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        eContextSupervisorCall,
14160299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen
14260299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // Used when performing a MemU operation to read the PC-relative offset
14360299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        // from an address.
14460299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen        eContextTableBranchReadMemory,
145713c2665a27096b68f3f8956222375354f1292f8Caroline Tice
146713c2665a27096b68f3f8956222375354f1292f8Caroline Tice        // Used when random bits are written into a register
147fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        eContextWriteRegisterRandomBits,
148fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice
149fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice        // Used when random bits are written to memory
1505c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eContextWriteMemoryRandomBits,
1515c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
152c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eContextArithmetic,
1530fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice
1540fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice        eContextAdvancePC,
1558ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
156b27771da2fe3256f4a64729ecec05946c27c1a0aCaroline Tice        eContextReturnFromException
15764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
15864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
1599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    enum InfoType {
1609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusOffset,
1619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterPlusIndirectOffset,
1629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegisterToRegisterPlusOffset,
1638ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        eInfoTypeRegisterToRegisterPlusIndirectOffset,
1645c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        eInfoTypeRegisterRegisterOperands,
1659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeOffset,
1669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeRegister,
1679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediate,
1689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeImmediateSigned,
1699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeAddress,
170c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISAAndImmediate,
171c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISAAndImmediateSigned,
172c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        eInfoTypeISA,
1739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        eInfoTypeNoArgs
1749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice    } InfoType;
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            {
184c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo 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            {
190c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register number
191c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo offset_reg;    // offset register kind
1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterPlusIndirectOffset;
1939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
1949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            struct RegisterToRegisterPlusOffset
1959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
196c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo data_reg;      // source/target register for data
197c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register for address calculation
198c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                int64_t offset;         // offset for address calculation
1999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            } RegisterToRegisterPlusOffset;
2009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2018ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            struct RegisterToRegisterPlusIndirectOffset
2028ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            {
203c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo base_reg;      // base register for address calculation
204c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo offset_reg;    // offset register for address calculation
205c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo data_reg;      // source/target register for data
2068ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            } RegisterToRegisterPlusIndirectOffset;
2078ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2085c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            struct RegisterRegisterOperands
2095c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            {
210c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo operand1;      // register containing first operand for binary op
211c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                RegisterInfo operand2;      // register containing second operand for binary op
2125c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            } RegisterRegisterOperands;
2135c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
214c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            int64_t signed_offset;      // signed offset by which to adjust self (for registers only)
2159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
216c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            RegisterInfo reg;               // plain register
2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
218c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            uint64_t unsigned_immediate;// unsigned immediate value
219c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            int64_t signed_immediate;   // signed immediate value
2209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
221c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            lldb::addr_t address;       // direct address
2229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
223c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            struct ISAAndImmediate
2249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
225c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t isa;
226c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t unsigned_data32;   // immdiate data
227c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            } ISAAndImmediate;
2289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
229c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            struct ISAAndImmediateSigned
2309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            {
231c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                uint32_t isa;
232c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                int32_t signed_data32;      // signed immdiate data
233c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            } ISAAndImmediateSigned;
2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
235c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            uint32_t isa;
2369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        } info;
2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
23975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        Context () :
24075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            type (eContextInvalid),
24175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton            info_type (eInfoTypeNoArgs)
24275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        {
24375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        }
24475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton
2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
246c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterPlusOffset (RegisterInfo base_reg,
2479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                               int64_t signed_offset)
2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusOffset;
2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.reg = base_reg;
2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusOffset.signed_offset = signed_offset;
2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
255c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterPlusIndirectOffset (RegisterInfo base_reg,
256c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                       RegisterInfo offset_reg)
2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterPlusIndirectOffset;
2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.base_reg   = base_reg;
2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterPlusIndirectOffset.offset_reg = offset_reg;
2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
264c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterToRegisterPlusOffset (RegisterInfo data_reg,
265c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                         RegisterInfo base_reg,
2669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice                                         int64_t offset)
2679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusOffset;
2699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.data_reg = data_reg;
2709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.base_reg = base_reg;
2719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.RegisterToRegisterPlusOffset.offset   = offset;
2729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
2739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
2749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
275c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterToRegisterPlusIndirectOffset (RegisterInfo base_reg,
276c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                                 RegisterInfo offset_reg,
277c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                                 RegisterInfo data_reg)
2788ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        {
2798ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info_type = eInfoTypeRegisterToRegisterPlusIndirectOffset;
2808ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.base_reg   = base_reg;
2818ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg;
2828ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice            info.RegisterToRegisterPlusIndirectOffset.data_reg   = data_reg;
2838ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        }
2848ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice
2858ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice        void
286c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegisterRegisterOperands (RegisterInfo op1_reg,
287c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                     RegisterInfo op2_reg)
2885c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        {
2895c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info_type = eInfoTypeRegisterRegisterOperands;
2905c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand1 = op1_reg;
2915c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice            info.RegisterRegisterOperands.operand2 = op2_reg;
2925c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        }
2935c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice
2945c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice        void
2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetOffset (int64_t signed_offset)
2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeOffset;
2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_offset = signed_offset;
2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
302c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetRegister (RegisterInfo reg)
3039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeRegister;
3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.reg = reg;
3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediate (uint64_t immediate)
3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediate;
312c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.unsigned_immediate = immediate;
3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetImmediateSigned (int64_t signed_immediate)
3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeImmediateSigned;
3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.signed_immediate = signed_immediate;
3209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetAddress (lldb::addr_t address)
3249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeAddress;
3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info.address = address;
3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
329c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISAAndImmediate (uint32_t isa, uint32_t data)
3309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
331c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISAAndImmediate;
332c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediate.isa = isa;
333c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediate.unsigned_data32 = data;
3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
337c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISAAndImmediateSigned (uint32_t isa, int32_t data)
3389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
339c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISAAndImmediateSigned;
340c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediateSigned.isa = isa;
341c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.ISAAndImmediateSigned.signed_data32 = data;
3429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
345c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        SetISA (uint32_t isa)
3469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
347c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info_type = eInfoTypeISA;
348c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton            info.isa = isa;
3499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
3509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice
3519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        void
3529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        SetNoArgs ()
3539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        {
3549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice            info_type = eInfoTypeNoArgs;
3559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice        }
356c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
357c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton        void
35875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton        Dump (Stream &s,
359c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton              EmulateInstruction *instruction) const;
360c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
36164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    };
36264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
363061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    typedef size_t (*ReadMemoryCallback) (EmulateInstruction *instruction,
364061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                          void *baton,
365061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                          const Context &context,
366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                          lldb::addr_t addr,
367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                          void *dst,
368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                          size_t length);
36964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    typedef size_t (*WriteMemoryCallback) (EmulateInstruction *instruction,
371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           void *baton,
372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           const Context &context,
373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           lldb::addr_t addr,
374061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           const void *dst,
375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                           size_t length);
37664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    typedef bool   (*ReadRegisterCallback)  (EmulateInstruction *instruction,
378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             void *baton,
379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             const RegisterInfo *reg_info,
380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             RegisterValue &reg_value);
38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
382061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    typedef bool   (*WriteRegisterCallback) (EmulateInstruction *instruction,
383061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             void *baton,
384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             const Context &context,
385061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             const RegisterInfo *reg_info,
386061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                                             const RegisterValue &reg_value);
38764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
388888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    EmulateInstruction (const ArchSpec &arch);
38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual ~EmulateInstruction()
39164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
39264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
393888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
394888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Mandatory overrides
395888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
396888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    virtual bool
397888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    SupportsEmulatingIntructionsOfType (InstructionType inst_type) = 0;
39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
39931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton    virtual bool
400395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton    SetTargetTriple (const ArchSpec &arch) = 0;
40131e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton
40264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
40364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadInstruction () = 0;
40464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
40564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    virtual bool
406888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    EvaluateInstruction (uint32_t evaluate_options) = 0;
40764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
4086b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice    virtual bool
409dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice    TestEmulation (Stream *out_stream, ArchSpec &arch, OptionValueDictionary *test_data) = 0;
410888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
411c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    virtual bool
412c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num, RegisterInfo &reg_info) = 0;
413c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
414888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
415888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Optional overrides
416888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //----------------------------------------------------------------------
417888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    virtual bool
418888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    SetInstruction (const Opcode &insn_opcode, const Address &inst_addr, Target *target);
419c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
420c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    virtual bool
421c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    CreateFunctionEntryUnwind (UnwindPlan &unwind_plan);
422c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
423888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    static const char *
424080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    TranslateRegister (uint32_t reg_kind, uint32_t reg_num, std::string &reg_name);
425080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
426061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //----------------------------------------------------------------------
427061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // RegisterInfo variants
428061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //----------------------------------------------------------------------
429061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
430061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegister (const RegisterInfo *reg_info,
431061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  RegisterValue& reg_value);
432061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
43364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
434061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegisterUnsigned (const RegisterInfo *reg_info,
43564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          uint64_t fail_value,
43664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                          bool *success_ptr);
437061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
438061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
439061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegister (const Context &context,
440061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   const RegisterInfo *ref_info,
441061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   const RegisterValue& reg_value);
442061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
443061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
444061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegisterUnsigned (const Context &context,
445061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                           const RegisterInfo *reg_info,
446061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                           uint64_t reg_value);
447061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
448061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //----------------------------------------------------------------------
449061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    // Register kind and number variants
450061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    //----------------------------------------------------------------------
451061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
452061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegister (uint32_t reg_kind,
453061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  uint32_t reg_num,
454061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  RegisterValue& reg_value);
455061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
456061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
457061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegister (const Context &context,
458061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   uint32_t reg_kind,
459061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   uint32_t reg_num,
460061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                   const RegisterValue& reg_value);
46164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
462c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    uint64_t
463061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegisterUnsigned (uint32_t reg_kind,
464061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                          uint32_t reg_num,
465c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          uint64_t fail_value,
466c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                          bool *success_ptr);
467c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegisterUnsigned (const Context &context,
47064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                           uint32_t reg_kind,
471c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                           uint32_t reg_num,
472c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                           uint64_t reg_value);
473c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
474061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
475061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    size_t
476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadMemory (const Context &context,
477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                lldb::addr_t addr,
478061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                void *dst,
479061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                size_t dst_len);
48064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
48164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint64_t
48264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    ReadMemoryUnsigned (const Context &context,
48364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        lldb::addr_t addr,
48464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        size_t byte_size,
48564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        uint64_t fail_value,
48664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                        bool *success_ptr);
48764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
48864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    bool
489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteMemory (const Context &context,
490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                 lldb::addr_t addr,
491061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                 const void *src,
492061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                 size_t src_len);
493061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton
494061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    bool
49564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    WriteMemoryUnsigned (const Context &context,
49664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         lldb::addr_t addr,
49764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         uint64_t uval,
49864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton                         size_t uval_byte_size);
49964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
50064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    uint32_t
50164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetAddressByteSize () const
50264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
503888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch.GetAddressByteSize();
50464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
50564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
50664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    lldb::ByteOrder
50764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    GetByteOrder () const
50864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
509888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch.GetByteOrder();
51064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
51164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
5127bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton    const Opcode &
5137bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton    GetOpcode () const
51464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    {
5157bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton        return m_opcode;
51664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    }
517888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
5183063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    lldb::addr_t
5193063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    GetAddress () const
5203063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    {
5213063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton        return m_addr;
5223063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton    }
5233063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton
524888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    const ArchSpec &
525888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    GetArchitecture () const
526888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
527888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return m_arch;
528888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
52964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
530080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
531080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
532888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadMemoryFrame (EmulateInstruction *instruction,
533888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                     void *baton,
534ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     const Context &context,
535ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     lldb::addr_t addr,
536ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     void *dst,
537ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                     size_t length);
538080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
539080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
540888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteMemoryFrame (EmulateInstruction *instruction,
541888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                      void *baton,
542ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      const Context &context,
543ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      lldb::addr_t addr,
544ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      const void *dst,
545ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                      size_t length);
546080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
547080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
548888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadRegisterFrame  (EmulateInstruction *instruction,
549888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
550061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        const RegisterInfo *reg_info,
551061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        RegisterValue &reg_value);
552080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
553080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
554080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
555888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteRegisterFrame (EmulateInstruction *instruction,
556888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
557ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice                        const Context &context,
558061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        const RegisterInfo *reg_info,
559061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                        const RegisterValue &reg_value);
560080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
561080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
562888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadMemoryDefault (EmulateInstruction *instruction,
563888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                       void *baton,
564080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       const Context &context,
565080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       lldb::addr_t addr,
566080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       void *dst,
567080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                       size_t length);
568080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
569080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static size_t
570888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteMemoryDefault (EmulateInstruction *instruction,
571888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        void *baton,
572080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        const Context &context,
573080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        lldb::addr_t addr,
574080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        const void *dst,
575080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                        size_t length);
576080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
577080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
578888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    ReadRegisterDefault  (EmulateInstruction *instruction,
579888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                          void *baton,
580061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                          const RegisterInfo *reg_info,
581061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                          RegisterValue &reg_value);
582080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
583080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
584080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    static bool
585888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    WriteRegisterDefault (EmulateInstruction *instruction,
586888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                          void *baton,
587080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice                          const Context &context,
588061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                          const RegisterInfo *reg_info,
589061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                          const RegisterValue &reg_value);
590080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
591080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
592080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    SetBaton (void *baton);
593080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
594080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
595061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetCallbacks (ReadMemoryCallback read_mem_callback,
596061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  WriteMemoryCallback write_mem_callback,
597061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  ReadRegisterCallback read_reg_callback,
598061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton                  WriteRegisterCallback write_reg_callback);
599080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
600080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
601061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetReadMemCallback (ReadMemoryCallback read_mem_callback);
602080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
603080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
604061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetWriteMemCallback (WriteMemoryCallback write_mem_callback);
605080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
606080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
607061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetReadRegCallback (ReadRegisterCallback read_reg_callback);
608080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
609080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice    void
610061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    SetWriteRegCallback (WriteRegisterCallback write_reg_callback);
611c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
612c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    static bool
613061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    GetBestRegisterKindAndNumber (const RegisterInfo *reg_info,
614c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                  uint32_t &reg_kind,
615c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                                  uint32_t &reg_num);
616080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
617c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    static uint32_t
618c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton    GetInternalRegisterNumber (RegisterContext *reg_ctx,
619c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton                               const RegisterInfo &reg_info);
620080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice
62164c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected:
622061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ArchSpec                m_arch;
623061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    void *                  m_baton;
624061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadMemoryCallback      m_read_mem_callback;
625061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteMemoryCallback     m_write_mem_callback;
626061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    ReadRegisterCallback    m_read_reg_callback;
627061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    WriteRegisterCallback   m_write_reg_callback;
628061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    lldb::addr_t            m_addr;
629061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton    Opcode                  m_opcode;
630c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
631c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton
632c07d451bb046e47215bd73fda0235362cc6b1a47Greg Claytonprivate:
63364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
63464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    // For EmulateInstruction only
63564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    //------------------------------------------------------------------
63664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton    DISALLOW_COPY_AND_ASSIGN (EmulateInstruction);
63764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton};
63864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
63964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}   // namespace lldb_private
64064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton
64164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif  // lldb_EmulateInstruction_h_
642