UnwindAssemblyInstEmulation.cpp revision 888a7334344778d1a4edbd58b5852ae4d53ffed9
1f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//===-- UnwindAssemblyInstEmulation.cpp --------------------------*- C++ -*-===//
2f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
3f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//                     The LLVM Compiler Infrastructure
4f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
5f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// This file is distributed under the University of Illinois Open Source
6f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// License. See LICENSE.TXT for details.
7f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//
8f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//===----------------------------------------------------------------------===//
9f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
10f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "UnwindAssemblyInstEmulation.h"
11f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
12f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "llvm-c/EnhancedDisassembly.h"
13f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
14f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/Address.h"
15f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/ArchSpec.h"
16888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/DataBufferHeap.h"
17888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/Disassembler.h"
18888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/Error.h"
19f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Core/PluginManager.h"
20888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#include "lldb/Core/StreamFile.h"
21f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/ExecutionContext.h"
22f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Process.h"
23f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Thread.h"
24f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton#include "lldb/Target/Target.h"
25f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
26f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonusing namespace lldb;
27f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonusing namespace lldb_private;
28f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
29f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
30f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
31f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//-----------------------------------------------------------------------------------------------
32f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//  UnwindAssemblyParser_x86 method definitions
33f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//-----------------------------------------------------------------------------------------------
34f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
35f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
36888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::GetNonCallSiteUnwindPlanFromAssembly (AddressRange& range,
37888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                   Thread& thread,
38888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                   UnwindPlan& unwind_plan)
39f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
40888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#if 0
41888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindPlan::Row row;
42888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindPlan::Row::RegisterLocation regloc;
43888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
44888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->SetRegisterKind (eRegisterKindGeneric);
45888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetCFARegister (LLDB_REGNUM_GENERIC_FP);
46888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetCFAOffset (2 * 8);
47888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetOffset (0);
48888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
49888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetAtCFAPlusOffset (2 * -8);
50888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_FP, regloc);
51888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetAtCFAPlusOffset (1 * -8);
52888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_PC, regloc);
53888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    regloc.SetIsCFAPlusOffset (0);
54888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    row.SetRegisterInfo (LLDB_REGNUM_GENERIC_SP, regloc);
55888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
56888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->AppendRow (row);
57888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    m_unwind_plan_sp->SetSourceName ("x86_64 architectural default");
58888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#endif
59888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
60888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    if (range.GetByteSize() > 0 &&
61888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        range.GetBaseAddress().IsValid() &&
62888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        m_inst_emulator_ap.get())
63888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
64888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#if  0
65888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        Target &target = thread.GetProcess().GetTarget();
66888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        const ArchSpec &target_arch = target.GetArchitecture();
67888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        bool prefer_file_cache = true;
68888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        Error error;
69888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        DataBufferHeap data_buffer (range.GetByteSize(), 0);
70888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        if (target.ReadMemory (range.GetBaseAddress(),
71888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               prefer_file_cache,
72888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               data_buffer.GetBytes(),
73888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               data_buffer.GetByteSize(),
74888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                               error) == data_buffer.GetByteSize())
75888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        {
76888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            DataExtractor data (data_buffer.GetBytes(),
77888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                data_buffer.GetByteSize(),
78888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                target_arch.GetByteOrder(),
79888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                target_arch.GetAddressByteSize());
80888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        }
81888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton#endif
82888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        StreamFile strm (stdout, false);
83888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
84888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        ExecutionContext exe_ctx;
85888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        thread.CalculateExecutionContext(exe_ctx);
86888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        DisassemblerSP disasm_sp (Disassembler::DisassembleRange (m_arch,
87888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  NULL,
88888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  exe_ctx,
89888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                                  range));
90888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        if (disasm_sp)
91888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        {
92888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
93888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_range_ptr = ⦥
94888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_thread_ptr = &thread;
95888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            m_unwind_plan_ptr = &unwind_plan;
96888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
97888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const uint32_t addr_byte_size = m_arch.GetAddressByteSize();
98888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool show_address = true;
99888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool show_bytes = true;
100888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const bool raw = false;
101888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // Initialize the stack pointer with a known value. In the 32 bit case
102888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // it will be 0x80000000, and in the 64 bit case 0x8000000000000000.
103888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            // We use the address byte size to be safe for any future addresss sizes
104888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            SetRegisterValue (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, (1ull << ((addr_byte_size * 8) - 1)));
105888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
106888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const InstructionList &inst_list = disasm_sp->GetInstructionList ();
107888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            const size_t num_instructions = inst_list.GetSize();
108888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            for (size_t idx=0; idx<num_instructions; ++idx)
109888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            {
110888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                Instruction *inst = inst_list.GetInstructionAtIndex (idx).get();
111888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                if (inst)
112888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                {
113888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                    inst->Dump(&strm, inst_list.GetMaxOpcocdeByteSize (), show_address, show_bytes, &exe_ctx, raw);
114888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                    strm.EOL();
115888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
116888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                    m_inst_emulator_ap->SetInstruction (inst->GetOpcode(), inst->GetAddress(), exe_ctx.target);
117888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                    m_inst_emulator_ap->EvaluateInstruction (eEmulateInstructionOptionIgnoreConditions);
118888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                }
119888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            }
120888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        }
121888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
122f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
123f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
124f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
125f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
126888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::GetFastUnwindPlan (AddressRange& func,
127888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                Thread& thread,
128888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                UnwindPlan &unwind_plan)
129f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
130f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
131f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
132f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
133f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonbool
134888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::FirstNonPrologueInsn (AddressRange& func,
135888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Target& target,
136888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Thread* thread,
137888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                                   Address& first_non_prologue_insn)
138f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
139f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return false;
140f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
141f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
1428badcb2503ed2e2884a48f66099c1d48494817f4Greg ClaytonUnwindAssembly *
143f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::CreateInstance (const ArchSpec &arch)
144f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
145888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    std::auto_ptr<lldb_private::EmulateInstruction> inst_emulator_ap (EmulateInstruction::FindPlugin (arch, eInstructionTypePrologueEpilogue, NULL));
146888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // Make sure that all prologue instructions are handled
147888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    if (inst_emulator_ap.get())
148888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        return new UnwindAssemblyInstEmulation (arch, inst_emulator_ap.release());
149f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return NULL;
150f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
151f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
152f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
153f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//------------------------------------------------------------------
154f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton// PluginInterface protocol in UnwindAssemblyParser_x86
155f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton//------------------------------------------------------------------
156f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
157f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
158f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginName()
159f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
160f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "UnwindAssemblyInstEmulation";
161f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
162f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
163f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
164f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetShortPluginName()
165f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
166f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "unwindassembly.inst-emulation";
167f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
168f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
169f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
170f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonuint32_t
171f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginVersion()
172f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
173f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return 1;
174f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
175f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
176f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonvoid
177f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::Initialize()
178f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
179f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    PluginManager::RegisterPlugin (GetPluginNameStatic(),
180f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton                                   GetPluginDescriptionStatic(),
181f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton                                   CreateInstance);
182f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
183f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
184f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonvoid
185f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::Terminate()
186f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
187f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    PluginManager::UnregisterPlugin (CreateInstance);
188f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
189f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
190f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
191f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
192f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginNameStatic()
193f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
194f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "UnwindAssemblyInstEmulation";
195f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
196f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton
197f6e287a873007543f3b419a71546ab8f007be90bGreg Claytonconst char *
198f6e287a873007543f3b419a71546ab8f007be90bGreg ClaytonUnwindAssemblyInstEmulation::GetPluginDescriptionStatic()
199f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton{
200f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton    return "Instruction emulation based unwind information.";
201f6e287a873007543f3b419a71546ab8f007be90bGreg Clayton}
202888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
203888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
204888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
205888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonsize_t
206888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::ReadMemory (EmulateInstruction *instruction,
207888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         void *baton,
208888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         const EmulateInstruction::Context &context,
209888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         lldb::addr_t addr,
210888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         void *dst,
211888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                         size_t dst_len)
212888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
213888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    //UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
214888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    printf ("UnwindAssemblyInstEmulation::ReadMemory    (context.type = %i, context.info_type = %i, addr = 0x%16.16llx, dst = %p, dst_len = %zu)\n",
215888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            context.type,
216888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            context.info_type,
217888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            addr,
218888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            dst,
219888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            dst_len);
220888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return dst_len;
221888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
222888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
223888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonsize_t
224888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::WriteMemory (EmulateInstruction *instruction,
225888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          void *baton,
226888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          const EmulateInstruction::Context &context,
227888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          lldb::addr_t addr,
228888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          const void *dst,
229888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                          size_t dst_len)
230888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
231888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    // UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
232888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
233888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    DataExtractor data (dst,
234888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        dst_len,
235888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        instruction->GetArchitecture ().GetByteOrder(),
236888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                        instruction->GetArchitecture ().GetAddressByteSize());
237888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    StreamFile strm(stdout, false);
238888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
239888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    strm.Printf ("UnwindAssemblyInstEmulation::WriteMemory   (context.type = %i, context.info_type = %i, ",
240888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                 context.type,
241888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                 context.info_type);
242888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    data.Dump(&strm, 0, eFormatBytes, 1, dst_len, UINT32_MAX, addr, 0, 0);
243888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    strm.EOL();
244888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return dst_len;
245888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
246888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
247888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonbool
248888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::ReadRegister (EmulateInstruction *instruction,
249888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                           void *baton,
250888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                           uint32_t reg_kind,
251888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                           uint32_t reg_num,
252888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                           uint64_t &reg_value)
253888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
254888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
255888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    const char *reg_name = instruction->GetRegisterName (reg_kind, reg_num);
256888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
257888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    reg_value = inst_emulator->GetRegisterValue (reg_kind, reg_num);
258888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
259888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    printf ("UnwindAssemblyInstEmulation::ReadRegister  (name = \"%s\") => value = 0x%16.16llx\n", reg_name, reg_value);
260888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
261888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return true;
262888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
263888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
264888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Claytonbool
265888a7334344778d1a4edbd58b5852ae4d53ffed9Greg ClaytonUnwindAssemblyInstEmulation::WriteRegister (EmulateInstruction *instruction,
266888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            void *baton,
267888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            const EmulateInstruction::Context &context,
268888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            uint32_t reg_kind,
269888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            uint32_t reg_num,
270888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton                                            uint64_t reg_value)
271888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton{
272888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    UnwindAssemblyInstEmulation *inst_emulator = (UnwindAssemblyInstEmulation *)baton;
273888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    const char *reg_name = instruction->GetRegisterName (reg_kind, reg_num);
274888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
275888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    printf ("UnwindAssemblyInstEmulation::WriteRegister (name = \"%s\", value = 0x%16.16llx, context.type = %i, context.info_type = %i)\n",
276888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            reg_name,
277888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            reg_value,
278888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            context.type,
279888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            context.info_type);
280888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
281888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    inst_emulator->SetRegisterValue (reg_kind, reg_num, reg_value);
282888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
283888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    switch (context.type)
284888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    {
285888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextInvalid:
286888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextReadOpcode:
287888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextImmediate:
288888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustBaseRegister:
289888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterPlusOffset:
290888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustPC:
291888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterStore:
292888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRegisterLoad:
293888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextRelativeBranchImmediate:
294888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAbsoluteBranchRegister:
295888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextSupervisorCall:
296888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextTableBranchReadMemory:
297888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextWriteRegisterRandomBits:
298888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextWriteMemoryRandomBits:
299888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextMultiplication:
300888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAddition:
301888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextSubtraction:
302888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdvancePC:
303888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextReturnFromException:
304888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
305888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
306888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextPushRegisterOnStack:
307888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
308888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
309888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextPopRegisterOffStack:
310888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
311888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
312888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton        case EmulateInstruction::eContextAdjustStackPointer:
313888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton            break;
314888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    }
315888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton    return true;
316888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton}
317888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
318888a7334344778d1a4edbd58b5852ae4d53ffed9Greg Clayton
319