164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===-- EmulateInstruction.h ------------------------------------*- C++ -*-===// 264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// The LLVM Compiler Infrastructure 464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// This file is distributed under the University of Illinois Open Source 664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// License. See LICENSE.TXT for details. 764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton// 864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton//===----------------------------------------------------------------------===// 964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 1064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#ifndef lldb_EmulateInstruction_h_ 1164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#define lldb_EmulateInstruction_h_ 1264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 13080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice#include <string> 14080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 15c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton#include "lldb/lldb-private.h" 16b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton#include "lldb/lldb-public.h" 17080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice#include "lldb/Core/ArchSpec.h" 1831e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton#include "lldb/Core/PluginInterface.h" 197bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton#include "lldb/Core/Opcode.h" 20061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton#include "lldb/Core/RegisterValue.h" 215bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 225bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//---------------------------------------------------------------------- 235bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @class EmulateInstruction EmulateInstruction.h "lldb/Core/EmulateInstruction.h" 245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// @brief A class that allows emulation of CPU opcodes. 255bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 265bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is a plug-in interface that is accessed through the 275bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// standard static FindPlugin function call in the EmulateInstruction 285bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class. The FindPlugin takes a target triple and returns a new object 295bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// if there is a plug-in that supports the architecture and OS. Four 305bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// callbacks and a baton are provided. The four callbacks are read 315bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// register, write register, read memory and write memory. 325bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 335bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class is currently designed for these main use cases: 345bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Auto generation of Call Frame Information (CFI) from assembly code 355bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Predicting single step breakpoint locations 365bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// - Emulating instructions for breakpoint traps 375bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 385e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// Objects can be asked to read an instruction which will cause a call 395bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// to the read register callback to get the PC, followed by a read 405bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// memory call to read the opcode. If ReadInstruction () returns true, 415bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then a call to EmulateInstruction::EvaluateInstruction () can be 425bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// made. At this point the EmulateInstruction subclass will use all of 435bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callbacks to emulate an instruction. 445bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 455bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients that provide the callbacks can either do the read/write 465bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// registers/memory to actually emulate the instruction on a real or 475e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// virtual CPU, or watch for the EmulateInstruction::Context which 485bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// is context for the read/write register/memory which explains why 495bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the callback is being called. Examples of a context are: 505e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// "pushing register 3 onto the stack at offset -12", or "adjusting 515bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// stack pointer by -16". This extra context allows the generation of 525bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// CFI information from assembly code without having to actually do 535bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the read/write register/memory. 545bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 555bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Clients must be prepared that not all instructions for an 565bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Instruction Set Architecture (ISA) will be emulated. 575bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 585bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// Subclasses at the very least should implement the instructions that 597fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// save and restore registers onto the stack and adjustment to the stack 605bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// pointer. By just implementing a few instructions for an ISA that are 615bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// the typical prologue opcodes, you can then generate CFI using a 625bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// class that will soon be available. 635bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 64b23bb8e26f227795ba89d79663d5a21951cddb9eFilipe Cabecinhas/// Implementing all of the instructions that affect the PC can then 655e675ec80e903c53910568e016d2e9091c320dfbJohnny Chen/// allow single step prediction support. 665bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 67b23bb8e26f227795ba89d79663d5a21951cddb9eFilipe Cabecinhas/// Implementing all of the instructions allows for emulation of opcodes 685bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// for breakpoint traps and will pave the way for "thread centric" 695bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// debugging. The current debugging model is "process centric" where 707fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// all threads must be stopped when any thread is stopped; when 717fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// hitting software breakpoints we must disable the breakpoint by 725bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the original breakpoint opcde, single stepping and 735bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// restoring the breakpoint trap. If all threads were allowed to run 745bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// then other threads could miss the breakpoint. 755bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// 765bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// This class centralizes the code that usually is done in separate 775bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// code paths in a debugger (single step prediction, finding save 787fad24a9fd7226016b28fef78930501a1bef898cJason Molenda/// restore locations of registers for unwinding stack frame variables) 795bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton/// and emulating the intruction is just a bonus. 805bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton//---------------------------------------------------------------------- 815bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 8264c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonnamespace lldb_private { 8364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 8431e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonclass EmulateInstruction : 8531e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton public PluginInterface 8664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton{ 8731e2a388b07f337c1bf61de32a39c154f190c06eGreg Claytonpublic: 8831e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 8952fd984f7e67c3a0ab18d5565f40356bcfa84822Greg Clayton static EmulateInstruction* 90888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton FindPlugin (const ArchSpec &arch, 91888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton InstructionType supported_inst_type, 92888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton const char *plugin_name); 9331e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 9464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton enum ContextType 9564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 9664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextInvalid = 0, 975bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Read an instruciton opcode from memory 9864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextReadOpcode, 995bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1007fad24a9fd7226016b28fef78930501a1bef898cJason Molenda // Usually used for writing a register value whose source value is an 1015bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // immediate 10264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextImmediate, 1035bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1045bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Exclusively used when saving a register to the stack as part of the 1055bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // prologue 10664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextPushRegisterOnStack, 1075bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 108ef85e9162b61fa40ff9d3c9e32476e53cc94aac1Johnny Chen // Exclusively used when restoring a register off the stack as part of 1095bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // the epilogue 1105bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton eContextPopRegisterOffStack, 1115bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1125bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Add or subtract a value from the stack 11364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextAdjustStackPointer, 114fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 11575906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton // Adjust the frame pointer for the current frame 11675906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton eContextSetFramePointer, 11775906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 118fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Add or subtract a value from a base address register (other than SP) 119fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextAdjustBaseRegister, 1205bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton 1216b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice // Add or subtract a value from the PC or store a value to the PC. 1221f954f59df9ce7bf58d0353ab0949656561210d4Caroline Tice eContextAdjustPC, 1236b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice 1245bc2096461e984124cf1861d120fc48f0032cecdGreg Clayton // Used in WriteRegister callbacks to indicate where the 12564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton eContextRegisterPlusOffset, 1269b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen 127fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Used in WriteMemory callback to indicate where the data came from 128fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextRegisterStore, 129fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 1307fac857ec72051dc0a91b027719c275ea672a470Caroline Tice eContextRegisterLoad, 1317fac857ec72051dc0a91b027719c275ea672a470Caroline Tice 1329b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // Used when performing a PC-relative branch where the 1339b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen eContextRelativeBranchImmediate, 1349b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen 1359b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen // Used when performing an absolute branch where the 1369b8d783409b5b80af2cf129c45cbc39c9544cccaJohnny Chen eContextAbsoluteBranchRegister, 137b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen 138b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // Used when performing a supervisor call to an operating system to 139b77be414a1a4b74827f30e5944a58d4af0445ff4Johnny Chen // provide a service: 140713c2665a27096b68f3f8956222375354f1292f8Caroline Tice eContextSupervisorCall, 14160299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen 14260299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen // Used when performing a MemU operation to read the PC-relative offset 14360299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen // from an address. 14460299ec172c9bbeab4e1bbffad513d75cd1741deJohnny Chen eContextTableBranchReadMemory, 145713c2665a27096b68f3f8956222375354f1292f8Caroline Tice 146713c2665a27096b68f3f8956222375354f1292f8Caroline Tice // Used when random bits are written into a register 147fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice eContextWriteRegisterRandomBits, 148fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice 149fa17220ce8b3db56b05317fd5e69c450127f8538Caroline Tice // Used when random bits are written to memory 1505c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice eContextWriteMemoryRandomBits, 1515c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice 152c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton eContextArithmetic, 1530fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice 1540fe5a535b87841a5c422f4a79d55c21bf07b50caCaroline Tice eContextAdvancePC, 1558ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice 156b27771da2fe3256f4a64729ecec05946c27c1a0aCaroline Tice eContextReturnFromException 15764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 15864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 1599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice enum InfoType { 1609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterPlusOffset, 1619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterPlusIndirectOffset, 1629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegisterToRegisterPlusOffset, 1638ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice eInfoTypeRegisterToRegisterPlusIndirectOffset, 1645c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice eInfoTypeRegisterRegisterOperands, 1659bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeOffset, 1669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeRegister, 1679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeImmediate, 1689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeImmediateSigned, 1699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeAddress, 170c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton eInfoTypeISAAndImmediate, 171c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton eInfoTypeISAAndImmediateSigned, 172c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton eInfoTypeISA, 1739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice eInfoTypeNoArgs 1749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } InfoType; 1759bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 17664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton struct Context 17764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 17864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ContextType type; 1799bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice enum InfoType info_type; 1809bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice union 1819bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 1829bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterPlusOffset 1839bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 184c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo reg; // base register 1859bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_offset; // signed offset added to base register 1869bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterPlusOffset; 1879bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 1889bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterPlusIndirectOffset 1899bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 190c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo base_reg; // base register number 191c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo offset_reg; // offset register kind 1929bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterPlusIndirectOffset; 1939bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 1949bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice struct RegisterToRegisterPlusOffset 1959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 196c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo data_reg; // source/target register for data 197c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo base_reg; // base register for address calculation 198c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton int64_t offset; // offset for address calculation 1999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } RegisterToRegisterPlusOffset; 2009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2018ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice struct RegisterToRegisterPlusIndirectOffset 2028ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice { 203c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo base_reg; // base register for address calculation 204c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo offset_reg; // offset register for address calculation 205c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo data_reg; // source/target register for data 2068ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice } RegisterToRegisterPlusIndirectOffset; 2078ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice 2085c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice struct RegisterRegisterOperands 2095c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice { 210c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo operand1; // register containing first operand for binary op 211c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo operand2; // register containing second operand for binary op 2125c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice } RegisterRegisterOperands; 2135c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice 214c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton int64_t signed_offset; // signed offset by which to adjust self (for registers only) 2159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 216c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo reg; // plain register 2179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 218c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint64_t unsigned_immediate;// unsigned immediate value 219c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton int64_t signed_immediate; // signed immediate value 2209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 221c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton lldb::addr_t address; // direct address 2229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 223c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton struct ISAAndImmediate 2249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 225c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t isa; 226c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t unsigned_data32; // immdiate data 227c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton } ISAAndImmediate; 2289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 229c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton struct ISAAndImmediateSigned 2309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 231c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t isa; 232c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton int32_t signed_data32; // signed immdiate data 233c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton } ISAAndImmediateSigned; 2349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 235c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t isa; 2369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2379bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } info; 2389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 23975906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton Context () : 24075906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton type (eContextInvalid), 24175906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton info_type (eInfoTypeNoArgs) 24275906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton { 24375906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton } 24475906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton 2459bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 246c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegisterPlusOffset (RegisterInfo base_reg, 2479bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t signed_offset) 2489bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterPlusOffset; 2509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusOffset.reg = base_reg; 2519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusOffset.signed_offset = signed_offset; 2529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 255c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegisterPlusIndirectOffset (RegisterInfo base_reg, 256c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo offset_reg) 2579bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2589bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterPlusIndirectOffset; 2599bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusIndirectOffset.base_reg = base_reg; 2609bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterPlusIndirectOffset.offset_reg = offset_reg; 2619bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2629bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2639bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 264c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegisterToRegisterPlusOffset (RegisterInfo data_reg, 265c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo base_reg, 2669bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice int64_t offset) 2679bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2689bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegisterToRegisterPlusOffset; 2699bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.data_reg = data_reg; 2709bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.base_reg = base_reg; 2719bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.RegisterToRegisterPlusOffset.offset = offset; 2729bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 2739bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 2749bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 275c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegisterToRegisterPlusIndirectOffset (RegisterInfo base_reg, 276c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo offset_reg, 277c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo data_reg) 2788ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice { 2798ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice info_type = eInfoTypeRegisterToRegisterPlusIndirectOffset; 2808ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice info.RegisterToRegisterPlusIndirectOffset.base_reg = base_reg; 2818ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice info.RegisterToRegisterPlusIndirectOffset.offset_reg = offset_reg; 2828ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice info.RegisterToRegisterPlusIndirectOffset.data_reg = data_reg; 2838ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice } 2848ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice 2858ce836dbf416c4dfdbede109be5cc09b95918fd0Caroline Tice void 286c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegisterRegisterOperands (RegisterInfo op1_reg, 287c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton RegisterInfo op2_reg) 2885c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice { 2895c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice info_type = eInfoTypeRegisterRegisterOperands; 2905c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice info.RegisterRegisterOperands.operand1 = op1_reg; 2915c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice info.RegisterRegisterOperands.operand2 = op2_reg; 2925c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice } 2935c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice 2945c1e2edcc5230fbf0995efcc32e9c0548a97a2d2Caroline Tice void 2959bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetOffset (int64_t signed_offset) 2969bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 2979bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeOffset; 2989bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.signed_offset = signed_offset; 2999bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3009bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3019bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 302c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetRegister (RegisterInfo reg) 3039bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3049bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeRegister; 3059bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.reg = reg; 3069bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3079bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3089bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3099bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetImmediate (uint64_t immediate) 3109bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3119bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeImmediate; 312c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.unsigned_immediate = immediate; 3139bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3149bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3159bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3169bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetImmediateSigned (int64_t signed_immediate) 3179bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3189bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeImmediateSigned; 3199bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.signed_immediate = signed_immediate; 3209bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3219bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3229bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3239bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetAddress (lldb::addr_t address) 3249bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3259bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeAddress; 3269bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info.address = address; 3279bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3289bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 329c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetISAAndImmediate (uint32_t isa, uint32_t data) 3309bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 331c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info_type = eInfoTypeISAAndImmediate; 332c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.ISAAndImmediate.isa = isa; 333c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.ISAAndImmediate.unsigned_data32 = data; 3349bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3359bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3369bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 337c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetISAAndImmediateSigned (uint32_t isa, int32_t data) 3389bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 339c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info_type = eInfoTypeISAAndImmediateSigned; 340c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.ISAAndImmediateSigned.isa = isa; 341c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.ISAAndImmediateSigned.signed_data32 = data; 3429bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3439bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3449bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 345c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton SetISA (uint32_t isa) 3469bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 347c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info_type = eInfoTypeISA; 348c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton info.isa = isa; 3499bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 3509bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice 3519bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice void 3529bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice SetNoArgs () 3539bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice { 3549bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice info_type = eInfoTypeNoArgs; 3559bfe7f219fb47d93c2b866ad5a6342a827d0dbd6Caroline Tice } 356c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 357c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton void 35875906e4ec98af3717e415727a8d663a4e246bb4fGreg Clayton Dump (Stream &s, 359c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton EmulateInstruction *instruction) const; 360c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 36164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton }; 36264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 363061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton typedef size_t (*ReadMemoryCallback) (EmulateInstruction *instruction, 364061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *baton, 365061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const Context &context, 366061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t addr, 367061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *dst, 368061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton size_t length); 36964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 370061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton typedef size_t (*WriteMemoryCallback) (EmulateInstruction *instruction, 371061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *baton, 372061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const Context &context, 373061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t addr, 374061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const void *dst, 375061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton size_t length); 37664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 377061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton typedef bool (*ReadRegisterCallback) (EmulateInstruction *instruction, 378061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *baton, 379061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 380061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue ®_value); 38164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 382061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton typedef bool (*WriteRegisterCallback) (EmulateInstruction *instruction, 383061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *baton, 384061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const Context &context, 385061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 386061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue ®_value); 38764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 388888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton EmulateInstruction (const ArchSpec &arch); 38964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 39064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual ~EmulateInstruction() 39164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 39264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 393888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton //---------------------------------------------------------------------- 394888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton // Mandatory overrides 395888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton //---------------------------------------------------------------------- 396888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton virtual bool 397888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton SupportsEmulatingIntructionsOfType (InstructionType inst_type) = 0; 39864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 39931e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton virtual bool 400395fc33dc4b06c048ed35047ec461bc092ef2df3Greg Clayton SetTargetTriple (const ArchSpec &arch) = 0; 40131e2a388b07f337c1bf61de32a39c154f190c06eGreg Clayton 40264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual bool 40364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadInstruction () = 0; 40464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 40564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton virtual bool 406888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton EvaluateInstruction (uint32_t evaluate_options) = 0; 40764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 4086b8d3b5e7f0507aca2ee1c0937d7ec80fa2a9c5bCaroline Tice virtual bool 409dfb2e20724a90a4a10558ddaee18b72a1c51e499Caroline Tice TestEmulation (Stream *out_stream, ArchSpec &arch, OptionValueDictionary *test_data) = 0; 410888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton 411c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton virtual bool 412c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num, RegisterInfo ®_info) = 0; 413c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 414888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton //---------------------------------------------------------------------- 415888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton // Optional overrides 416888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton //---------------------------------------------------------------------- 417888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton virtual bool 418888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton SetInstruction (const Opcode &insn_opcode, const Address &inst_addr, Target *target); 419c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 420c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton virtual bool 421c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton CreateFunctionEntryUnwind (UnwindPlan &unwind_plan); 422c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 423888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton static const char * 424080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice TranslateRegister (uint32_t reg_kind, uint32_t reg_num, std::string ®_name); 425080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 426061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //---------------------------------------------------------------------- 427061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton // RegisterInfo variants 428061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //---------------------------------------------------------------------- 429061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 430061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegister (const RegisterInfo *reg_info, 431061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue& reg_value); 432061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 43364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t 434061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegisterUnsigned (const RegisterInfo *reg_info, 43564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t fail_value, 43664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool *success_ptr); 437061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 438061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 439061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegister (const Context &context, 440061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *ref_info, 441061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue& reg_value); 442061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 443061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 444061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegisterUnsigned (const Context &context, 445061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 446061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint64_t reg_value); 447061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 448061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //---------------------------------------------------------------------- 449061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton // Register kind and number variants 450061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton //---------------------------------------------------------------------- 451061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 452061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegister (uint32_t reg_kind, 453061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t reg_num, 454061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue& reg_value); 455061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 456061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 457061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegister (const Context &context, 458061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t reg_kind, 459061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t reg_num, 460061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue& reg_value); 46164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 462c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint64_t 463061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegisterUnsigned (uint32_t reg_kind, 464061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint32_t reg_num, 465c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint64_t fail_value, 466c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton bool *success_ptr); 467c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 46864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool 469061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegisterUnsigned (const Context &context, 47064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t reg_kind, 471c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t reg_num, 472c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint64_t reg_value); 473c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 474061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 475061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton size_t 476061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadMemory (const Context &context, 477061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t addr, 478061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void *dst, 479061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton size_t dst_len); 48064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 48164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t 48264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton ReadMemoryUnsigned (const Context &context, 48364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 48464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t byte_size, 48564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t fail_value, 48664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool *success_ptr); 48764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 48864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton bool 489061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteMemory (const Context &context, 490061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t addr, 491061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const void *src, 492061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton size_t src_len); 493061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 494061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton bool 49564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton WriteMemoryUnsigned (const Context &context, 49664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::addr_t addr, 49764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint64_t uval, 49864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton size_t uval_byte_size); 49964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 50064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton uint32_t 50164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton GetAddressByteSize () const 50264c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 503888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton return m_arch.GetAddressByteSize(); 50464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 50564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 50664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton lldb::ByteOrder 50764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton GetByteOrder () const 50864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 509888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton return m_arch.GetByteOrder(); 51064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 51164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 5127bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton const Opcode & 5137bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton GetOpcode () const 51464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton { 5157bc390873f7c1c798c36c8003c4b82597f67c703Greg Clayton return m_opcode; 51664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton } 517888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton 5183063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton lldb::addr_t 5193063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton GetAddress () const 5203063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton { 5213063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton return m_addr; 5223063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton } 5233063c95c54ac0303287c34f9f5af7ba7b6b8f0bcGreg Clayton 524888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton const ArchSpec & 525888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton GetArchitecture () const 526888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton { 527888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton return m_arch; 528888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton } 52964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 530080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 531080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static size_t 532888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton ReadMemoryFrame (EmulateInstruction *instruction, 533888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 534ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice const Context &context, 535ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice lldb::addr_t addr, 536ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice void *dst, 537ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice size_t length); 538080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 539080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static size_t 540888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton WriteMemoryFrame (EmulateInstruction *instruction, 541888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 542ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice const Context &context, 543ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice lldb::addr_t addr, 544ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice const void *dst, 545ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice size_t length); 546080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 547080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static bool 548888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton ReadRegisterFrame (EmulateInstruction *instruction, 549888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 550061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 551061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue ®_value); 552080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 553080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 554080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static bool 555888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton WriteRegisterFrame (EmulateInstruction *instruction, 556888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 557ea69d6ddc37e25d57973699463110b6c3233f0a0Caroline Tice const Context &context, 558061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 559061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue ®_value); 560080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 561080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static size_t 562888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton ReadMemoryDefault (EmulateInstruction *instruction, 563888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 564080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice const Context &context, 565080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice lldb::addr_t addr, 566080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void *dst, 567080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice size_t length); 568080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 569080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static size_t 570888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton WriteMemoryDefault (EmulateInstruction *instruction, 571888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 572080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice const Context &context, 573080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice lldb::addr_t addr, 574080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice const void *dst, 575080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice size_t length); 576080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 577080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static bool 578888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton ReadRegisterDefault (EmulateInstruction *instruction, 579888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 580061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 581061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton RegisterValue ®_value); 582080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 583080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 584080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice static bool 585888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton WriteRegisterDefault (EmulateInstruction *instruction, 586888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton void *baton, 587080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice const Context &context, 588061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterInfo *reg_info, 589061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue ®_value); 590080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 591080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 592080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice SetBaton (void *baton); 593080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 594080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 595061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetCallbacks (ReadMemoryCallback read_mem_callback, 596061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteMemoryCallback write_mem_callback, 597061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegisterCallback read_reg_callback, 598061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegisterCallback write_reg_callback); 599080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 600080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 601061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetReadMemCallback (ReadMemoryCallback read_mem_callback); 602080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 603080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 604061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetWriteMemCallback (WriteMemoryCallback write_mem_callback); 605080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 606080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 607061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetReadRegCallback (ReadRegisterCallback read_reg_callback); 608080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 609080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice void 610061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton SetWriteRegCallback (WriteRegisterCallback write_reg_callback); 611c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 612c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton static bool 613061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton GetBestRegisterKindAndNumber (const RegisterInfo *reg_info, 614c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t ®_kind, 615c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton uint32_t ®_num); 616080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 617c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton static uint32_t 618c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton GetInternalRegisterNumber (RegisterContext *reg_ctx, 619c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton const RegisterInfo ®_info); 620080bf61255afcffd7ccfe0402d3715f77f6627b9Caroline Tice 62164c8443d255f44267490c8c839f4a9365cf55ea7Greg Claytonprotected: 622061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ArchSpec m_arch; 623061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton void * m_baton; 624061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadMemoryCallback m_read_mem_callback; 625061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteMemoryCallback m_write_mem_callback; 626061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton ReadRegisterCallback m_read_reg_callback; 627061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton WriteRegisterCallback m_write_reg_callback; 628061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton lldb::addr_t m_addr; 629061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Opcode m_opcode; 630c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 631c07d451bb046e47215bd73fda0235362cc6b1a47Greg Clayton 632c07d451bb046e47215bd73fda0235362cc6b1a47Greg Claytonprivate: 63364c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton //------------------------------------------------------------------ 63464c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton // For EmulateInstruction only 63564c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton //------------------------------------------------------------------ 63664c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton DISALLOW_COPY_AND_ASSIGN (EmulateInstruction); 63764c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton}; 63864c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 63964c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton} // namespace lldb_private 64064c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton 64164c8443d255f44267490c8c839f4a9365cf55ea7Greg Clayton#endif // lldb_EmulateInstruction_h_ 642