1 //===-- EmulateInstruction.h ------------------------------------*- C++ -*-===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 #include "lldb/Core/EmulateInstruction.h"
12 #include "lldb/Core/Address.h"
13 #include "lldb/Core/DataExtractor.h"
14 #include "lldb/Core/Error.h"
15 #include "lldb/Core/PluginManager.h"
16 #include "lldb/Core/RegisterValue.h"
17 #include "lldb/Core/StreamFile.h"
18 #include "lldb/Core/StreamString.h"
19 #include "lldb/Host/Endian.h"
20 #include "lldb/Symbol/UnwindPlan.h"
21 #include "lldb/Target/Process.h"
22 #include "lldb/Target/RegisterContext.h"
23 #include "lldb/Target/Target.h"
24 #include "lldb/Target/Thread.h"
27 using namespace lldb_private;
30 EmulateInstruction::FindPlugin (const ArchSpec &arch, InstructionType supported_inst_type, const char *plugin_name)
32 EmulateInstructionCreateInstance create_callback = NULL;
35 ConstString const_plugin_name (plugin_name);
36 create_callback = PluginManager::GetEmulateInstructionCreateCallbackForPluginName (const_plugin_name);
39 EmulateInstruction *emulate_insn_ptr = create_callback(arch, supported_inst_type);
41 return emulate_insn_ptr;
46 for (uint32_t idx = 0; (create_callback = PluginManager::GetEmulateInstructionCreateCallbackAtIndex(idx)) != NULL; ++idx)
48 EmulateInstruction *emulate_insn_ptr = create_callback(arch, supported_inst_type);
50 return emulate_insn_ptr;
56 EmulateInstruction::EmulateInstruction (const ArchSpec &arch) :
59 m_read_mem_callback (&ReadMemoryDefault),
60 m_write_mem_callback (&WriteMemoryDefault),
61 m_read_reg_callback (&ReadRegisterDefault),
62 m_write_reg_callback (&WriteRegisterDefault),
63 m_addr (LLDB_INVALID_ADDRESS)
65 ::memset (&m_opcode, 0, sizeof (m_opcode));
70 EmulateInstruction::ReadRegister (const RegisterInfo *reg_info, RegisterValue& reg_value)
72 if (m_read_reg_callback)
73 return m_read_reg_callback (this, m_baton, reg_info, reg_value);
78 EmulateInstruction::ReadRegister (lldb::RegisterKind reg_kind, uint32_t reg_num, RegisterValue& reg_value)
80 RegisterInfo reg_info;
81 if (GetRegisterInfo(reg_kind, reg_num, reg_info))
82 return ReadRegister (®_info, reg_value);
87 EmulateInstruction::ReadRegisterUnsigned (lldb::RegisterKind reg_kind,
92 RegisterValue reg_value;
93 if (ReadRegister (reg_kind, reg_num, reg_value))
94 return reg_value.GetAsUInt64(fail_value, success_ptr);
101 EmulateInstruction::ReadRegisterUnsigned (const RegisterInfo *reg_info,
105 RegisterValue reg_value;
106 if (ReadRegister (reg_info, reg_value))
107 return reg_value.GetAsUInt64(fail_value, success_ptr);
109 *success_ptr = false;
114 EmulateInstruction::WriteRegister (const Context &context,
115 const RegisterInfo *reg_info,
116 const RegisterValue& reg_value)
118 if (m_write_reg_callback)
119 return m_write_reg_callback (this, m_baton, context, reg_info, reg_value);
124 EmulateInstruction::WriteRegister (const Context &context,
125 lldb::RegisterKind reg_kind,
127 const RegisterValue& reg_value)
129 RegisterInfo reg_info;
130 if (GetRegisterInfo(reg_kind, reg_num, reg_info))
131 return WriteRegister (context, ®_info, reg_value);
137 EmulateInstruction::WriteRegisterUnsigned (const Context &context,
138 lldb::RegisterKind reg_kind,
143 RegisterInfo reg_info;
144 if (GetRegisterInfo(reg_kind, reg_num, reg_info))
146 RegisterValue reg_value;
147 if (reg_value.SetUInt(uint_value, reg_info.byte_size))
148 return WriteRegister (context, ®_info, reg_value);
154 EmulateInstruction::WriteRegisterUnsigned (const Context &context,
155 const RegisterInfo *reg_info,
161 RegisterValue reg_value;
162 if (reg_value.SetUInt(uint_value, reg_info->byte_size))
163 return WriteRegister (context, reg_info, reg_value);
169 EmulateInstruction::ReadMemory (const Context &context,
174 if (m_read_mem_callback)
175 return m_read_mem_callback (this, m_baton, context, addr, dst, dst_len) == dst_len;
180 EmulateInstruction::ReadMemoryUnsigned (const Context &context, lldb::addr_t addr, size_t byte_size, uint64_t fail_value, bool *success_ptr)
183 bool success = false;
186 uint8_t buf[sizeof(uint64_t)];
187 size_t bytes_read = m_read_mem_callback (this, m_baton, context, addr, buf, byte_size);
188 if (bytes_read == byte_size)
190 lldb::offset_t offset = 0;
191 DataExtractor data (buf, byte_size, GetByteOrder(), GetAddressByteSize());
192 uval64 = data.GetMaxU64 (&offset, byte_size);
198 *success_ptr = success;
207 EmulateInstruction::WriteMemoryUnsigned (const Context &context,
210 size_t uval_byte_size)
212 StreamString strm(Stream::eBinary, GetAddressByteSize(), GetByteOrder());
213 strm.PutMaxHex64 (uval, uval_byte_size);
215 size_t bytes_written = m_write_mem_callback (this, m_baton, context, addr, strm.GetData(), uval_byte_size);
216 if (bytes_written == uval_byte_size)
222 EmulateInstruction::WriteMemory (const Context &context,
227 if (m_write_mem_callback)
228 return m_write_mem_callback (this, m_baton, context, addr, src, src_len) == src_len;
234 EmulateInstruction::SetBaton (void *baton)
240 EmulateInstruction::SetCallbacks (ReadMemoryCallback read_mem_callback,
241 WriteMemoryCallback write_mem_callback,
242 ReadRegisterCallback read_reg_callback,
243 WriteRegisterCallback write_reg_callback)
245 m_read_mem_callback = read_mem_callback;
246 m_write_mem_callback = write_mem_callback;
247 m_read_reg_callback = read_reg_callback;
248 m_write_reg_callback = write_reg_callback;
252 EmulateInstruction::SetReadMemCallback (ReadMemoryCallback read_mem_callback)
254 m_read_mem_callback = read_mem_callback;
259 EmulateInstruction::SetWriteMemCallback (WriteMemoryCallback write_mem_callback)
261 m_write_mem_callback = write_mem_callback;
266 EmulateInstruction::SetReadRegCallback (ReadRegisterCallback read_reg_callback)
268 m_read_reg_callback = read_reg_callback;
273 EmulateInstruction::SetWriteRegCallback (WriteRegisterCallback write_reg_callback)
275 m_write_reg_callback = write_reg_callback;
281 // Read & Write Memory and Registers callback functions.
285 EmulateInstruction::ReadMemoryFrame (EmulateInstruction *instruction,
287 const Context &context,
292 if (!baton || dst == NULL || dst_len == 0)
295 StackFrame *frame = (StackFrame *) baton;
297 ProcessSP process_sp (frame->CalculateProcess());
301 return process_sp->ReadMemory (addr, dst, dst_len, error);
307 EmulateInstruction::WriteMemoryFrame (EmulateInstruction *instruction,
309 const Context &context,
314 if (!baton || src == NULL || src_len == 0)
317 StackFrame *frame = (StackFrame *) baton;
319 ProcessSP process_sp (frame->CalculateProcess());
323 return process_sp->WriteMemory (addr, src, src_len, error);
330 EmulateInstruction::ReadRegisterFrame (EmulateInstruction *instruction,
332 const RegisterInfo *reg_info,
333 RegisterValue ®_value)
338 StackFrame *frame = (StackFrame *) baton;
339 return frame->GetRegisterContext()->ReadRegister (reg_info, reg_value);
343 EmulateInstruction::WriteRegisterFrame (EmulateInstruction *instruction,
345 const Context &context,
346 const RegisterInfo *reg_info,
347 const RegisterValue ®_value)
352 StackFrame *frame = (StackFrame *) baton;
353 return frame->GetRegisterContext()->WriteRegister (reg_info, reg_value);
357 EmulateInstruction::ReadMemoryDefault (EmulateInstruction *instruction,
359 const Context &context,
364 StreamFile strm (stdout, false);
365 strm.Printf (" Read from Memory (address = 0x%" PRIx64 ", length = %" PRIu64 ", context = ", addr, (uint64_t)length);
366 context.Dump (strm, instruction);
368 *((uint64_t *) dst) = 0xdeadbeef;
373 EmulateInstruction::WriteMemoryDefault (EmulateInstruction *instruction,
375 const Context &context,
380 StreamFile strm (stdout, false);
381 strm.Printf (" Write to Memory (address = 0x%" PRIx64 ", length = %" PRIu64 ", context = ", addr, (uint64_t)length);
382 context.Dump (strm, instruction);
388 EmulateInstruction::ReadRegisterDefault (EmulateInstruction *instruction,
390 const RegisterInfo *reg_info,
391 RegisterValue ®_value)
393 StreamFile strm (stdout, false);
394 strm.Printf (" Read Register (%s)\n", reg_info->name);
395 lldb::RegisterKind reg_kind;
397 if (GetBestRegisterKindAndNumber (reg_info, reg_kind, reg_num))
398 reg_value.SetUInt64((uint64_t)reg_kind << 24 | reg_num);
400 reg_value.SetUInt64(0);
406 EmulateInstruction::WriteRegisterDefault (EmulateInstruction *instruction,
408 const Context &context,
409 const RegisterInfo *reg_info,
410 const RegisterValue ®_value)
412 StreamFile strm (stdout, false);
413 strm.Printf (" Write to Register (name = %s, value = " , reg_info->name);
414 reg_value.Dump(&strm, reg_info, false, false, eFormatDefault);
415 strm.PutCString (", context = ");
416 context.Dump (strm, instruction);
422 EmulateInstruction::Context::Dump (Stream &strm,
423 EmulateInstruction *instruction) const
427 case eContextReadOpcode:
428 strm.PutCString ("reading opcode");
431 case eContextImmediate:
432 strm.PutCString ("immediate");
435 case eContextPushRegisterOnStack:
436 strm.PutCString ("push register");
439 case eContextPopRegisterOffStack:
440 strm.PutCString ("pop register");
443 case eContextAdjustStackPointer:
444 strm.PutCString ("adjust sp");
447 case eContextSetFramePointer:
448 strm.PutCString ("set frame pointer");
451 case eContextAdjustBaseRegister:
452 strm.PutCString ("adjusting (writing value back to) a base register");
455 case eContextRegisterPlusOffset:
456 strm.PutCString ("register + offset");
459 case eContextRegisterStore:
460 strm.PutCString ("store register");
463 case eContextRegisterLoad:
464 strm.PutCString ("load register");
467 case eContextRelativeBranchImmediate:
468 strm.PutCString ("relative branch immediate");
471 case eContextAbsoluteBranchRegister:
472 strm.PutCString ("absolute branch register");
475 case eContextSupervisorCall:
476 strm.PutCString ("supervisor call");
479 case eContextTableBranchReadMemory:
480 strm.PutCString ("table branch read memory");
483 case eContextWriteRegisterRandomBits:
484 strm.PutCString ("write random bits to a register");
487 case eContextWriteMemoryRandomBits:
488 strm.PutCString ("write random bits to a memory address");
491 case eContextArithmetic:
492 strm.PutCString ("arithmetic");
495 case eContextReturnFromException:
496 strm.PutCString ("return from exception");
500 strm.PutCString ("unrecognized context.");
506 case eInfoTypeRegisterPlusOffset:
508 strm.Printf (" (reg_plus_offset = %s%+" PRId64 ")",
509 info.RegisterPlusOffset.reg.name,
510 info.RegisterPlusOffset.signed_offset);
514 case eInfoTypeRegisterPlusIndirectOffset:
516 strm.Printf (" (reg_plus_reg = %s + %s)",
517 info.RegisterPlusIndirectOffset.base_reg.name,
518 info.RegisterPlusIndirectOffset.offset_reg.name);
522 case eInfoTypeRegisterToRegisterPlusOffset:
524 strm.Printf (" (base_and_imm_offset = %s%+" PRId64 ", data_reg = %s)",
525 info.RegisterToRegisterPlusOffset.base_reg.name,
526 info.RegisterToRegisterPlusOffset.offset,
527 info.RegisterToRegisterPlusOffset.data_reg.name);
531 case eInfoTypeRegisterToRegisterPlusIndirectOffset:
533 strm.Printf (" (base_and_reg_offset = %s + %s, data_reg = %s)",
534 info.RegisterToRegisterPlusIndirectOffset.base_reg.name,
535 info.RegisterToRegisterPlusIndirectOffset.offset_reg.name,
536 info.RegisterToRegisterPlusIndirectOffset.data_reg.name);
540 case eInfoTypeRegisterRegisterOperands:
542 strm.Printf (" (register to register binary op: %s and %s)",
543 info.RegisterRegisterOperands.operand1.name,
544 info.RegisterRegisterOperands.operand2.name);
548 case eInfoTypeOffset:
549 strm.Printf (" (signed_offset = %+" PRId64 ")", info.signed_offset);
552 case eInfoTypeRegister:
553 strm.Printf (" (reg = %s)", info.reg.name);
556 case eInfoTypeImmediate:
557 strm.Printf (" (unsigned_immediate = %" PRIu64 " (0x%16.16" PRIx64 "))",
558 info.unsigned_immediate,
559 info.unsigned_immediate);
562 case eInfoTypeImmediateSigned:
563 strm.Printf (" (signed_immediate = %+" PRId64 " (0x%16.16" PRIx64 "))",
564 info.signed_immediate,
565 info.signed_immediate);
568 case eInfoTypeAddress:
569 strm.Printf (" (address = 0x%" PRIx64 ")", info.address);
572 case eInfoTypeISAAndImmediate:
573 strm.Printf (" (isa = %u, unsigned_immediate = %u (0x%8.8x))",
574 info.ISAAndImmediate.isa,
575 info.ISAAndImmediate.unsigned_data32,
576 info.ISAAndImmediate.unsigned_data32);
579 case eInfoTypeISAAndImmediateSigned:
580 strm.Printf (" (isa = %u, signed_immediate = %i (0x%8.8x))",
581 info.ISAAndImmediateSigned.isa,
582 info.ISAAndImmediateSigned.signed_data32,
583 info.ISAAndImmediateSigned.signed_data32);
587 strm.Printf (" (isa = %u)", info.isa);
590 case eInfoTypeNoArgs:
596 EmulateInstruction::SetInstruction (const Opcode &opcode, const Address &inst_addr, Target *target)
599 m_addr = LLDB_INVALID_ADDRESS;
600 if (inst_addr.IsValid())
603 m_addr = inst_addr.GetLoadAddress (target);
604 if (m_addr == LLDB_INVALID_ADDRESS)
605 m_addr = inst_addr.GetFileAddress ();
611 EmulateInstruction::GetBestRegisterKindAndNumber (const RegisterInfo *reg_info,
612 lldb::RegisterKind ®_kind,
615 // Generic and DWARF should be the two most popular register kinds when
616 // emulating instructions since they are the most platform agnostic...
617 reg_num = reg_info->kinds[eRegisterKindGeneric];
618 if (reg_num != LLDB_INVALID_REGNUM)
620 reg_kind = eRegisterKindGeneric;
624 reg_num = reg_info->kinds[eRegisterKindDWARF];
625 if (reg_num != LLDB_INVALID_REGNUM)
627 reg_kind = eRegisterKindDWARF;
631 reg_num = reg_info->kinds[eRegisterKindLLDB];
632 if (reg_num != LLDB_INVALID_REGNUM)
634 reg_kind = eRegisterKindLLDB;
638 reg_num = reg_info->kinds[eRegisterKindGCC];
639 if (reg_num != LLDB_INVALID_REGNUM)
641 reg_kind = eRegisterKindGCC;
645 reg_num = reg_info->kinds[eRegisterKindGDB];
646 if (reg_num != LLDB_INVALID_REGNUM)
648 reg_kind = eRegisterKindGDB;
655 EmulateInstruction::GetInternalRegisterNumber (RegisterContext *reg_ctx, const RegisterInfo ®_info)
657 lldb::RegisterKind reg_kind;
659 if (reg_ctx && GetBestRegisterKindAndNumber (®_info, reg_kind, reg_num))
660 return reg_ctx->ConvertRegisterKindToRegisterNumber (reg_kind, reg_num);
661 return LLDB_INVALID_REGNUM;
666 EmulateInstruction::CreateFunctionEntryUnwind (UnwindPlan &unwind_plan)