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