EmulateInstruction.h revision 395fc33dc4b06c048ed35047ec461bc092ef2df3
164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===// 264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// The LLVM Compiler Infrastructure 464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// This file is distributed under the University of Illinois Open Source 664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// License. See LICENSE.TXT for details. 764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===----------------------------------------------------------------------===// 964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 1064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#ifndef lldb_EmulateInstruction_h_ 1164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#define lldb_EmulateInstruction_h_ 1264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 1364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#include "lldb/lldb-include.h" 1431e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton#include "lldb/Core/PluginInterface.h" 155bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 165bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//---------------------------------------------------------------------- 175bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h" 185bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @brief A class that allows emulation of CPU opcodes. 195bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 205bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is a plug-in interface that is accessed through the 215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// standard static FindPlugin function call in the EmulateInstruction 225bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class. The FindPlugin takes a target triple and returns a new object 235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// if there is a plug-in that supports the architecture and OS. Four 245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// callbacks and a baton are provided. The four callbacks are read 255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// register, write register, read memory and write memory. 265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is currently designed for these main use cases: 285bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Auto generation of Call Frame Information (CFI) from assembly code 295bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Predicting single step breakpoint locations 305bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Emulating instructions for breakpoint traps 315bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 325e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// Objects can be asked to read an instruction which will cause a call 335bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// to the read register callback to get the PC, followed by a read 345bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// memory call to read the opcode. If ReadInstruction () returns true, 355bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then a call to EmulateInstruction::EvaluateInstruction () can be 365bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// made. At this point the EmulateInstruction subclass will use all of 375bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callbacks to emulate an instruction. 385bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 395bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients that provide the callbacks can either do the read/write 405bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// registers/memory to actually emulate the instruction on a real or 415e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// virtual CPU, or watch for the EmulateInstruction::Context which 425bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// is context for the read/write register/memory which explains why 435bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callback is being called. Examples of a context are: 445e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// "pushing register 3 onto the stack at offset -12", or "adjusting 455bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// stack pointer by -16". This extra context allows the generation of 465bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// CFI information from assembly code without having to actually do 475bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the read/write register/memory. 485bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 495bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients must be prepared that not all instructions for an 505bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Instruction Set Architecture (ISA) will be emulated. 515bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 525bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Subclasses at the very least should implement the instructions that 535bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// save and restore regiters onto the stack and adjustment to the stack 545bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// pointer. By just implementing a few instructions for an ISA that are 555bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the typical prologue opcodes, you can then generate CFI using a 565bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class that will soon be available. 575bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 585bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions that affect the PC can then 595e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support. 605bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 615bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Implmenting all of the instructions allows for emulation of opcodes 625bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// for breakpoint traps and will pave the way for "thread centric" 635bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// debugging. The current debugging model is "process centric" where 645bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// all threads must be stopped when any thread is stopped since when 655bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// hitting software breakpoints once must disable the breakpoint by 665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the original breakpoint opcde, single stepping and 675bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the breakpoint trap. If all threads were allowed to run 685bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then other threads could miss the breakpoint. 695bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 705bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class centralizes the code that usually is done in separate 715bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// code paths in a debugger (single step prediction, finding save 725bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restore locations of registers for unwinding stack frame variables, 735bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// and emulating the intruction is just a bonus. 745bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//---------------------------------------------------------------------- 755bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 7664c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonnamespace lldb_private { 7764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 7831e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonclass EmulateInstruction : 7931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton public PluginInterface 8064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton{ 8131e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonpublic: 8231e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 8352fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton static EmulateInstruction* 84395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton FindPlugin (const ArchSpec &arch, const char *plugin_name); 8531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 8664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton enum ContextType 8764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 8864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextInvalid = 0, 895bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Read an instruciton opcode from memory 9064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextReadOpcode, 915bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 925bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Usually used for writing a register value whose source value in an 935bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // immediate 9464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextImmediate, 955bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 965bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Exclusively used when saving a register to the stack as part of the 975bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // prologue 985bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg0 = register kind 995bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg1 = register number 1005bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg2 = signed offset from current SP value where register is being 1015bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // stored 10264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextPushRegisterOnStack, 1035bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 104ef85e9162b61fa40ff9d3c9e32476e53cc94aac1Johnny Chen // Exclusively used when restoring a register off the stack as part of 1055bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // the epilogue 1065bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg0 = register kind 1075bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg1 = register number 1085bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg2 = signed offset from current SP value where register is being 1095bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // restored 1105bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton eContextPopRegisterOffStack, 1115bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1125bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Add or subtract a value from the stack 1135bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg0 = register kind for SP 1145bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg1 = register number for SP 1155bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg2 = signed offset being applied to the SP value 11664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextAdjustStackPointer, 117fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 118fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Add or subtract a value from a base address register (other than SP) 119fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg0 = register kind for base register 120fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg1 = register number of base register 121fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg2 = signed offset being applied to base register 122fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextAdjustBaseRegister, 1235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Used in WriteRegister callbacks to indicate where the 1255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg0 = source register kind 1265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg1 = source register number 1275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // arg2 = source signed offset 12864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextRegisterPlusOffset, 1299b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen 130fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Used in WriteMemory callback to indicate where the data came from 131fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg0 = register kind 132fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg1 = register number (register being stored) 133fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg2 = address of store 134fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextRegisterStore, 135fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 1369b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // Used when performing a PC-relative branch where the 1379b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // arg0 = don't care 1389dd30d0b56d859a0ca600760e46b74a6b674672dJohnny Chen // arg1 = imm32 (signed offset) 1399dd30d0b56d859a0ca600760e46b74a6b674672dJohnny Chen // arg2 = target instruction set or don't care 1409b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen eContextRelativeBranchImmediate, 1419b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen 1429b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // Used when performing an absolute branch where the 1439b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // arg0 = target register kind 1449b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // arg1 = target register number 1459b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // arg2 = target instruction set or don't care 1469b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen eContextAbsoluteBranchRegister, 147b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen 148b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // Used when performing a supervisor call to an operating system to 149b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // provide a service: 150b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // arg0 = current instruction set or don't care 151b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // arg1 = immediate data or don't care 152b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // arg2 = don't care 153713c2665a27096b68f3f8956222375354f1292f8Caroline Tice eContextSupervisorCall, 154713c2665a27096b68f3f8956222375354f1292f8Caroline Tice 155713c2665a27096b68f3f8956222375354f1292f8Caroline Tice // Used when random bits are written into a register 156713c2665a27096b68f3f8956222375354f1292f8Caroline Tice // arg0 = target register kind 157713c2665a27096b68f3f8956222375354f1292f8Caroline Tice // arg1 = target register number 158713c2665a27096b68f3f8956222375354f1292f8Caroline Tice // arg2 = don't care 159fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextWriteRegisterRandomBits, 160fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 161fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Used when random bits are written to memory 162fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg0 = target memory address 163fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg1 = don't care 164fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // arg2 = don't care 165fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextWriteMemoryRandomBits 16664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 16764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 1689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice enum InfoType { 1699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterPlusOffset, 1709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterPlusIndirectOffset, 1719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterToRegisterPlusOffset, 1729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeOffset, 1739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegister, 1749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeImmediate, 1759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeImmediateSigned, 1769bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeAddress, 1779bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeModeAndImmediate, 1789bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeModeAndImmediateSigned, 179668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen eInfoTypeMode, 1809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeNoArgs 1819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } InfoType; 1829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 1839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct Register 1849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 1859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice uint32_t kind; 1869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice uint32_t num; 1879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 1889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 1899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 1909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetRegister (uint32_t reg_kind, uint32_t reg_num) 1919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice kind = reg_kind; 1939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice num = reg_num; 1949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 1959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice }; 1969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 19764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton struct Context 19864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 19964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ContextType type; 2009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice enum InfoType info_type; 2019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice union 2029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterPlusOffset 2049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register reg; // base register 2069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_offset; // signed offset added to base register 2079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterPlusOffset; 2089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterPlusIndirectOffset 2109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register base_reg; // base register number 2129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register offset_reg; // offset register kind 2139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterPlusIndirectOffset; 2149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterToRegisterPlusOffset 2169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register data_reg; // source/target register for data 2189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register base_reg; // base register for address calculation 2199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t offset; // offset for address calculation 2209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterToRegisterPlusOffset; 2219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_offset; // signed offset by which to adjust self (for registers only) 2239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register reg; // plain register 2259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice uint64_t immediate; // immediate value 2279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_immediate; // signed immediate value 2299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice lldb::addr_t address; // direct address 2319bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct ModeAndImmediate 2339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice uint32_t mode; // eModeARM or eModeThumb 235668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen uint32_t data_value; // immdiate data 2369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } ModeAndImmediate; 2379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct ModeAndImmediateSigned 2399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2409bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice uint32_t mode; // eModeARM or eModeThumb 2419bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int32_t signed_data_value; // signed immdiate data 2429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } ModeAndImmediateSigned; 2439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 244668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen uint32_t mode; // eModeARM or eModeThumb 2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } info; 2479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetRegisterPlusOffset (Register base_reg, 2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_offset) 2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterPlusOffset; 2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusOffset.reg = base_reg; 2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusOffset.signed_offset = signed_offset; 2559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2569bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetRegisterPlusIndirectOffset (Register base_reg, 2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register offset_reg) 2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterPlusIndirectOffset; 2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusIndirectOffset.base_reg = base_reg; 2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusIndirectOffset.offset_reg = offset_reg; 2649bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetRegisterToRegisterPlusOffset (Register data_reg, 2689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice Register base_reg, 2699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t offset) 2709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterToRegisterPlusOffset; 2729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.data_reg = data_reg; 2739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.base_reg = base_reg; 2749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.offset = offset; 2759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2769bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2779bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2789bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetOffset (int64_t signed_offset) 2799bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeOffset; 2819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.signed_offset = signed_offset; 2829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2849bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetRegister (Register reg) 2869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegister; 2889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.reg = reg; 2899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2909bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2919bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetImmediate (uint64_t immediate) 2939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeImmediate; 2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.immediate = immediate; 2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetImmediateSigned (int64_t signed_immediate) 3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeImmediateSigned; 3029bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.signed_immediate = signed_immediate; 3039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetAddress (lldb::addr_t address) 3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeAddress; 3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.address = address; 3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3129bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetModeAndImmediate (uint32_t mode, uint32_t data_value) 3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeModeAndImmediate; 3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.ModeAndImmediate.mode = mode; 3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.ModeAndImmediate.data_value = data_value; 3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetModeAndImmediateSigned (uint32_t mode, int32_t signed_data_value) 3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeModeAndImmediateSigned; 3239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.ModeAndImmediateSigned.mode = mode; 3249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.ModeAndImmediateSigned.signed_data_value = signed_data_value; 3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 328668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen SetMode (uint32_t mode) 3299bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 330668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen info_type = eInfoTypeMode; 331668b45124a14cbd03e7b4965b3d86fdbf208d282Johnny Chen info.mode = mode; 3329bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3339bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetNoArgs () 3369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeNoArgs; 3389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3399bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 34064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 34164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 34264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton union Opcode 34364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 34464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint8_t inst8; 34564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint16_t inst16; 34664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t inst32; 34764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t inst64; 34864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton union inst 34964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 35064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint8_t bytes[16]; 35164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint8_t length; 35264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 35364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 35464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 35564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton enum OpcodeType 35664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 35764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode8, 35864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode16, 35964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode32, 36064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode64, 36117f5afe9ed10bda3efbce0f26cf0c030331f8b15Greg Clayton eOpcodeBytes 36264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 36364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 36464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton struct Instruction 36564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 36664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton OpcodeType opcode_type; 36764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton Opcode opcode; 36864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 36964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 37064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton typedef size_t (*ReadMemory) (void *baton, 37164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton const Context &context, 37264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 37364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton void *dst, 37464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t length); 37564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 37664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton typedef size_t (*WriteMemory) (void *baton, 37764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton const Context &context, 37864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 37964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton const void *dst, 38064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t length); 38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 38264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton typedef bool (*ReadRegister) (void *baton, 38364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_kind, 38464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_num, 38564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t ®_value); 38664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 38764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton typedef bool (*WriteRegister) (void *baton, 38864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton const Context &context, 38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_kind, 39064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_num, 39164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t reg_value); 39264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 39364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton EmulateInstruction (lldb::ByteOrder byte_order, 39464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t addr_byte_size, 39564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton void *baton, 39664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadMemory read_mem_callback, 39764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteMemory write_mem_callback, 39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadRegister read_reg_callback, 39964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteRegister write_reg_callback); 40064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 40164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual ~EmulateInstruction() 40264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 40364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 40464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 40531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton virtual bool 406395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton SetTargetTriple (const ArchSpec &arch) = 0; 40731e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 40864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual bool 40964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadInstruction () = 0; 41064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 41164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual bool 41264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton EvaluateInstruction () = 0; 41364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 41464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t 41564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadRegisterUnsigned (uint32_t reg_kind, 41664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_num, 41764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t fail_value, 41864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool *success_ptr); 41964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 42064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool 42164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteRegisterUnsigned (const Context &context, 42264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_kind, 42364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_num, 42464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t reg_value); 42564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 42664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t 42764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadMemoryUnsigned (const Context &context, 42864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 42964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t byte_size, 43064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t fail_value, 43164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool *success_ptr); 43264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 43364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool 43464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteMemoryUnsigned (const Context &context, 43564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 43664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t uval, 43764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t uval_byte_size); 43864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 43964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t 44064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton GetAddressByteSize () const 44164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 44264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton return m_addr_byte_size; 44364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 44464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 44564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::ByteOrder 44664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton GetByteOrder () const 44764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 44864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton return m_byte_order; 44964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 45064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 45164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t 45264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton OpcodeAsUnsigned (bool *success_ptr) 45364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 45464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton if (success_ptr) 45564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton *success_ptr = true; 45664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton switch (m_inst.opcode_type) 45764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 45864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode8: return m_inst.opcode.inst8; 45964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode16: return m_inst.opcode.inst16; 46064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode32: return m_inst.opcode.inst32; 46164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcode64: return m_inst.opcode.inst64; 46264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eOpcodeBytes: 46364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton break; 46464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 46564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton if (success_ptr) 46664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton *success_ptr = false; 46764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton return 0; 46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 46964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 47064c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected: 47164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::ByteOrder m_byte_order; 47264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t m_addr_byte_size; 47364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton void * m_baton; 47464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadMemory m_read_mem_callback; 47564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteMemory m_write_mem_callback; 47664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadRegister m_read_reg_callback; 47764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteRegister m_write_reg_callback; 47864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 47964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t m_inst_pc; 48064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton Instruction m_inst; 48164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton //------------------------------------------------------------------ 48264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton // For EmulateInstruction only 48364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton //------------------------------------------------------------------ 48464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton DISALLOW_COPY_AND_ASSIGN (EmulateInstruction); 48564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}; 48664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 48764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton} // namespace lldb_private 48864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 48964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif // lldb_EmulateInstruction_h_ 490