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 (uint32_t 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 (uint32_t 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,
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,
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 uint32_t reg_kind, reg_num;
396 if (GetBestRegisterKindAndNumber (reg_info, reg_kind, reg_num))
397 reg_value.SetUInt64((uint64_t)reg_kind << 24 | reg_num);
399 reg_value.SetUInt64(0);
405 EmulateInstruction::WriteRegisterDefault (EmulateInstruction *instruction,
407 const Context &context,
408 const RegisterInfo *reg_info,
409 const RegisterValue ®_value)
411 StreamFile strm (stdout, false);
412 strm.Printf (" Write to Register (name = %s, value = " , reg_info->name);
413 reg_value.Dump(&strm, reg_info, false, false, eFormatDefault);
414 strm.PutCString (", context = ");
415 context.Dump (strm, instruction);
421 EmulateInstruction::Context::Dump (Stream &strm,
422 EmulateInstruction *instruction) const
426 case eContextReadOpcode:
427 strm.PutCString ("reading opcode");
430 case eContextImmediate:
431 strm.PutCString ("immediate");
434 case eContextPushRegisterOnStack:
435 strm.PutCString ("push register");
438 case eContextPopRegisterOffStack:
439 strm.PutCString ("pop register");
442 case eContextAdjustStackPointer:
443 strm.PutCString ("adjust sp");
446 case eContextSetFramePointer:
447 strm.PutCString ("set frame pointer");
450 case eContextAdjustBaseRegister:
451 strm.PutCString ("adjusting (writing value back to) a base register");
454 case eContextRegisterPlusOffset:
455 strm.PutCString ("register + offset");
458 case eContextRegisterStore:
459 strm.PutCString ("store register");
462 case eContextRegisterLoad:
463 strm.PutCString ("load register");
466 case eContextRelativeBranchImmediate:
467 strm.PutCString ("relative branch immediate");
470 case eContextAbsoluteBranchRegister:
471 strm.PutCString ("absolute branch register");
474 case eContextSupervisorCall:
475 strm.PutCString ("supervisor call");
478 case eContextTableBranchReadMemory:
479 strm.PutCString ("table branch read memory");
482 case eContextWriteRegisterRandomBits:
483 strm.PutCString ("write random bits to a register");
486 case eContextWriteMemoryRandomBits:
487 strm.PutCString ("write random bits to a memory address");
490 case eContextArithmetic:
491 strm.PutCString ("arithmetic");
494 case eContextReturnFromException:
495 strm.PutCString ("return from exception");
499 strm.PutCString ("unrecognized context.");
505 case eInfoTypeRegisterPlusOffset:
507 strm.Printf (" (reg_plus_offset = %s%+" PRId64 ")",
508 info.RegisterPlusOffset.reg.name,
509 info.RegisterPlusOffset.signed_offset);
513 case eInfoTypeRegisterPlusIndirectOffset:
515 strm.Printf (" (reg_plus_reg = %s + %s)",
516 info.RegisterPlusIndirectOffset.base_reg.name,
517 info.RegisterPlusIndirectOffset.offset_reg.name);
521 case eInfoTypeRegisterToRegisterPlusOffset:
523 strm.Printf (" (base_and_imm_offset = %s%+" PRId64 ", data_reg = %s)",
524 info.RegisterToRegisterPlusOffset.base_reg.name,
525 info.RegisterToRegisterPlusOffset.offset,
526 info.RegisterToRegisterPlusOffset.data_reg.name);
530 case eInfoTypeRegisterToRegisterPlusIndirectOffset:
532 strm.Printf (" (base_and_reg_offset = %s + %s, data_reg = %s)",
533 info.RegisterToRegisterPlusIndirectOffset.base_reg.name,
534 info.RegisterToRegisterPlusIndirectOffset.offset_reg.name,
535 info.RegisterToRegisterPlusIndirectOffset.data_reg.name);
539 case eInfoTypeRegisterRegisterOperands:
541 strm.Printf (" (register to register binary op: %s and %s)",
542 info.RegisterRegisterOperands.operand1.name,
543 info.RegisterRegisterOperands.operand2.name);
547 case eInfoTypeOffset:
548 strm.Printf (" (signed_offset = %+" PRId64 ")", info.signed_offset);
551 case eInfoTypeRegister:
552 strm.Printf (" (reg = %s)", info.reg.name);
555 case eInfoTypeImmediate:
556 strm.Printf (" (unsigned_immediate = %" PRIu64 " (0x%16.16" PRIx64 "))",
557 info.unsigned_immediate,
558 info.unsigned_immediate);
561 case eInfoTypeImmediateSigned:
562 strm.Printf (" (signed_immediate = %+" PRId64 " (0x%16.16" PRIx64 "))",
563 info.signed_immediate,
564 info.signed_immediate);
567 case eInfoTypeAddress:
568 strm.Printf (" (address = 0x%" PRIx64 ")", info.address);
571 case eInfoTypeISAAndImmediate:
572 strm.Printf (" (isa = %u, unsigned_immediate = %u (0x%8.8x))",
573 info.ISAAndImmediate.isa,
574 info.ISAAndImmediate.unsigned_data32,
575 info.ISAAndImmediate.unsigned_data32);
578 case eInfoTypeISAAndImmediateSigned:
579 strm.Printf (" (isa = %u, signed_immediate = %i (0x%8.8x))",
580 info.ISAAndImmediateSigned.isa,
581 info.ISAAndImmediateSigned.signed_data32,
582 info.ISAAndImmediateSigned.signed_data32);
586 strm.Printf (" (isa = %u)", info.isa);
589 case eInfoTypeNoArgs:
595 EmulateInstruction::SetInstruction (const Opcode &opcode, const Address &inst_addr, Target *target)
598 m_addr = LLDB_INVALID_ADDRESS;
599 if (inst_addr.IsValid())
602 m_addr = inst_addr.GetLoadAddress (target);
603 if (m_addr == LLDB_INVALID_ADDRESS)
604 m_addr = inst_addr.GetFileAddress ();
610 EmulateInstruction::GetBestRegisterKindAndNumber (const RegisterInfo *reg_info,
614 // Generic and DWARF should be the two most popular register kinds when
615 // emulating instructions since they are the most platform agnostic...
616 reg_num = reg_info->kinds[eRegisterKindGeneric];
617 if (reg_num != LLDB_INVALID_REGNUM)
619 reg_kind = eRegisterKindGeneric;
623 reg_num = reg_info->kinds[eRegisterKindDWARF];
624 if (reg_num != LLDB_INVALID_REGNUM)
626 reg_kind = eRegisterKindDWARF;
630 reg_num = reg_info->kinds[eRegisterKindLLDB];
631 if (reg_num != LLDB_INVALID_REGNUM)
633 reg_kind = eRegisterKindLLDB;
637 reg_num = reg_info->kinds[eRegisterKindGCC];
638 if (reg_num != LLDB_INVALID_REGNUM)
640 reg_kind = eRegisterKindGCC;
644 reg_num = reg_info->kinds[eRegisterKindGDB];
645 if (reg_num != LLDB_INVALID_REGNUM)
647 reg_kind = eRegisterKindGDB;
654 EmulateInstruction::GetInternalRegisterNumber (RegisterContext *reg_ctx, const RegisterInfo ®_info)
656 uint32_t reg_kind, reg_num;
657 if (reg_ctx && GetBestRegisterKindAndNumber (®_info, reg_kind, reg_num))
658 return reg_ctx->ConvertRegisterKindToRegisterNumber (reg_kind, reg_num);
659 return LLDB_INVALID_REGNUM;
664 EmulateInstruction::CreateFunctionEntryUnwind (UnwindPlan &unwind_plan)