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