NativeRegisterContext.cpp revision 278425
1275072Semaste//===-- NativeRegisterContext.cpp -------------------------*- C++ -*-===//
2275072Semaste//
3275072Semaste//                     The LLVM Compiler Infrastructure
4275072Semaste//
5275072Semaste// This file is distributed under the University of Illinois Open Source
6275072Semaste// License. See LICENSE.TXT for details.
7275072Semaste//
8275072Semaste//===----------------------------------------------------------------------===//
9275072Semaste
10278425Semaste#include "lldb/Host/common/NativeRegisterContext.h"
11275072Semaste
12275072Semaste#include "lldb/Core/Log.h"
13275072Semaste#include "lldb/Core/RegisterValue.h"
14275072Semaste
15275072Semaste#include "lldb/lldb-private-log.h"
16275072Semaste
17278425Semaste#include "lldb/Host/common/NativeProcessProtocol.h"
18278425Semaste#include "lldb/Host/common/NativeThreadProtocol.h"
19275072Semaste
20275072Semasteusing namespace lldb;
21275072Semasteusing namespace lldb_private;
22275072Semaste
23275072SemasteNativeRegisterContext::NativeRegisterContext (NativeThreadProtocol &thread, uint32_t concrete_frame_idx) :
24275072Semaste    m_thread (thread),
25275072Semaste    m_concrete_frame_idx (concrete_frame_idx)
26275072Semaste{
27275072Semaste}
28275072Semaste
29275072Semaste//----------------------------------------------------------------------
30275072Semaste// Destructor
31275072Semaste//----------------------------------------------------------------------
32275072SemasteNativeRegisterContext::~NativeRegisterContext()
33275072Semaste{
34275072Semaste}
35275072Semaste
36275072Semaste// FIXME revisit invalidation, process stop ids, etc.  Right now we don't
37275072Semaste// support caching in NativeRegisterContext.  We can do this later by
38275072Semaste// utilizing NativeProcessProtocol::GetStopID () and adding a stop id to
39275072Semaste// NativeRegisterContext.
40275072Semaste
41275072Semaste// void
42275072Semaste// NativeRegisterContext::InvalidateIfNeeded (bool force)
43275072Semaste// {
44275072Semaste//     ProcessSP process_sp (m_thread.GetProcess());
45275072Semaste//     bool invalidate = force;
46275072Semaste//     uint32_t process_stop_id = UINT32_MAX;
47275072Semaste
48275072Semaste//     if (process_sp)
49275072Semaste//         process_stop_id = process_sp->GetStopID();
50275072Semaste//     else
51275072Semaste//         invalidate = true;
52275072Semaste
53275072Semaste//     if (!invalidate)
54275072Semaste//         invalidate = process_stop_id != GetStopID();
55275072Semaste
56275072Semaste//     if (invalidate)
57275072Semaste//     {
58275072Semaste//         InvalidateAllRegisters ();
59275072Semaste//         SetStopID (process_stop_id);
60275072Semaste//     }
61275072Semaste// }
62275072Semaste
63275072Semaste
64275072Semasteconst RegisterInfo *
65275072SemasteNativeRegisterContext::GetRegisterInfoByName (const char *reg_name, uint32_t start_idx)
66275072Semaste{
67275072Semaste    if (reg_name && reg_name[0])
68275072Semaste    {
69275072Semaste        const uint32_t num_registers = GetRegisterCount();
70275072Semaste        for (uint32_t reg = start_idx; reg < num_registers; ++reg)
71275072Semaste        {
72275072Semaste            const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg);
73275072Semaste
74275072Semaste            if ((reg_info->name != nullptr && ::strcasecmp (reg_info->name, reg_name) == 0) ||
75275072Semaste                (reg_info->alt_name != nullptr && ::strcasecmp (reg_info->alt_name, reg_name) == 0))
76275072Semaste            {
77275072Semaste                return reg_info;
78275072Semaste            }
79275072Semaste        }
80275072Semaste    }
81275072Semaste    return nullptr;
82275072Semaste}
83275072Semaste
84275072Semasteconst RegisterInfo *
85275072SemasteNativeRegisterContext::GetRegisterInfo (uint32_t kind, uint32_t num)
86275072Semaste{
87275072Semaste    const uint32_t reg_num = ConvertRegisterKindToRegisterNumber(kind, num);
88275072Semaste    if (reg_num == LLDB_INVALID_REGNUM)
89275072Semaste        return nullptr;
90275072Semaste    return GetRegisterInfoAtIndex (reg_num);
91275072Semaste}
92275072Semaste
93275072Semasteconst char *
94275072SemasteNativeRegisterContext::GetRegisterName (uint32_t reg)
95275072Semaste{
96275072Semaste    const RegisterInfo * reg_info = GetRegisterInfoAtIndex(reg);
97275072Semaste    if (reg_info)
98275072Semaste        return reg_info->name;
99275072Semaste    return nullptr;
100275072Semaste}
101275072Semaste
102275072Semasteconst char*
103275072SemasteNativeRegisterContext::GetRegisterSetNameForRegisterAtIndex (uint32_t reg_index) const
104275072Semaste{
105275072Semaste    const RegisterInfo *const reg_info = GetRegisterInfoAtIndex(reg_index);
106275072Semaste    if (!reg_info)
107275072Semaste        return nullptr;
108275072Semaste
109275072Semaste    for (uint32_t set_index = 0; set_index < GetRegisterSetCount (); ++set_index)
110275072Semaste    {
111275072Semaste        const RegisterSet *const reg_set = GetRegisterSet (set_index);
112275072Semaste        if (!reg_set)
113275072Semaste            continue;
114275072Semaste
115275072Semaste        for (uint32_t reg_num_index = 0; reg_num_index < reg_set->num_registers; ++reg_num_index)
116275072Semaste        {
117275072Semaste            const uint32_t reg_num = reg_set->registers[reg_num_index];
118275072Semaste            // FIXME double check we're checking the right register kind here.
119275072Semaste            if (reg_info->kinds[RegisterKind::eRegisterKindLLDB] == reg_num)
120275072Semaste            {
121275072Semaste                // The given register is a member of this register set.  Return the register set name.
122275072Semaste                return reg_set->name;
123275072Semaste            }
124275072Semaste        }
125275072Semaste    }
126275072Semaste
127275072Semaste    // Didn't find it.
128275072Semaste    return nullptr;
129275072Semaste}
130275072Semaste
131275072Semastelldb::addr_t
132275072SemasteNativeRegisterContext::GetPC (lldb::addr_t fail_value)
133275072Semaste{
134275072Semaste    Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
135275072Semaste
136275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
137275072Semaste    if (log)
138275072Semaste        log->Printf ("NativeRegisterContext::%s using reg index %" PRIu32 " (default %" PRIu64 ")", __FUNCTION__, reg, fail_value);
139275072Semaste
140275072Semaste    const uint64_t retval = ReadRegisterAsUnsigned (reg, fail_value);
141275072Semaste
142275072Semaste    if (log)
143275072Semaste        log->Printf ("NativeRegisterContext::%s " PRIu32 " retval %" PRIu64, __FUNCTION__, retval);
144275072Semaste
145275072Semaste    return retval;
146275072Semaste}
147275072Semaste
148275072SemasteError
149275072SemasteNativeRegisterContext::SetPC (lldb::addr_t pc)
150275072Semaste{
151275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
152275072Semaste    return WriteRegisterFromUnsigned (reg, pc);
153275072Semaste}
154275072Semaste
155275072Semastelldb::addr_t
156275072SemasteNativeRegisterContext::GetSP (lldb::addr_t fail_value)
157275072Semaste{
158275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
159275072Semaste    return ReadRegisterAsUnsigned (reg, fail_value);
160275072Semaste}
161275072Semaste
162275072SemasteError
163275072SemasteNativeRegisterContext::SetSP (lldb::addr_t sp)
164275072Semaste{
165275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
166275072Semaste    return WriteRegisterFromUnsigned (reg, sp);
167275072Semaste}
168275072Semaste
169275072Semastelldb::addr_t
170275072SemasteNativeRegisterContext::GetFP (lldb::addr_t fail_value)
171275072Semaste{
172275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP);
173275072Semaste    return ReadRegisterAsUnsigned (reg, fail_value);
174275072Semaste}
175275072Semaste
176275072SemasteError
177275072SemasteNativeRegisterContext::SetFP (lldb::addr_t fp)
178275072Semaste{
179275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FP);
180275072Semaste    return WriteRegisterFromUnsigned (reg, fp);
181275072Semaste}
182275072Semaste
183275072Semastelldb::addr_t
184275072SemasteNativeRegisterContext::GetReturnAddress (lldb::addr_t fail_value)
185275072Semaste{
186275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA);
187275072Semaste    return ReadRegisterAsUnsigned (reg, fail_value);
188275072Semaste}
189275072Semaste
190275072Semastelldb::addr_t
191275072SemasteNativeRegisterContext::GetFlags (lldb::addr_t fail_value)
192275072Semaste{
193275072Semaste    uint32_t reg = ConvertRegisterKindToRegisterNumber (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
194275072Semaste    return ReadRegisterAsUnsigned (reg, fail_value);
195275072Semaste}
196275072Semaste
197275072Semaste
198275072Semastelldb::addr_t
199275072SemasteNativeRegisterContext::ReadRegisterAsUnsigned (uint32_t reg, lldb::addr_t fail_value)
200275072Semaste{
201275072Semaste    if (reg != LLDB_INVALID_REGNUM)
202275072Semaste        return ReadRegisterAsUnsigned (GetRegisterInfoAtIndex (reg), fail_value);
203275072Semaste    return fail_value;
204275072Semaste}
205275072Semaste
206275072Semasteuint64_t
207275072SemasteNativeRegisterContext::ReadRegisterAsUnsigned (const RegisterInfo *reg_info, lldb::addr_t fail_value)
208275072Semaste{
209275072Semaste    Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
210275072Semaste
211275072Semaste    if (reg_info)
212275072Semaste    {
213275072Semaste        RegisterValue value;
214275072Semaste        Error error = ReadRegister (reg_info, value);
215275072Semaste        if (error.Success ())
216275072Semaste        {
217275072Semaste            if (log)
218275072Semaste                log->Printf ("NativeRegisterContext::%s ReadRegister() succeeded, value %" PRIu64, __FUNCTION__, value.GetAsUInt64());
219275072Semaste            return value.GetAsUInt64();
220275072Semaste        }
221275072Semaste        else
222275072Semaste        {
223275072Semaste            if (log)
224275072Semaste                log->Printf ("NativeRegisterContext::%s ReadRegister() failed, error %s", __FUNCTION__, error.AsCString ());
225275072Semaste        }
226275072Semaste    }
227275072Semaste    else
228275072Semaste    {
229275072Semaste        if (log)
230275072Semaste            log->Printf ("NativeRegisterContext::%s ReadRegister() null reg_info", __FUNCTION__);
231275072Semaste    }
232275072Semaste    return fail_value;
233275072Semaste}
234275072Semaste
235275072SemasteError
236275072SemasteNativeRegisterContext::WriteRegisterFromUnsigned (uint32_t reg, uint64_t uval)
237275072Semaste{
238275072Semaste    if (reg == LLDB_INVALID_REGNUM)
239275072Semaste        return Error ("NativeRegisterContext::%s (): reg is invalid", __FUNCTION__);
240275072Semaste    return WriteRegisterFromUnsigned (GetRegisterInfoAtIndex (reg), uval);
241275072Semaste}
242275072Semaste
243275072SemasteError
244275072SemasteNativeRegisterContext::WriteRegisterFromUnsigned (const RegisterInfo *reg_info, uint64_t uval)
245275072Semaste{
246275072Semaste    assert (reg_info);
247275072Semaste    if (!reg_info)
248275072Semaste        return Error ("reg_info is nullptr");
249275072Semaste
250275072Semaste    RegisterValue value;
251275072Semaste    if (!value.SetUInt(uval, reg_info->byte_size))
252275072Semaste        return Error ("RegisterValue::SetUInt () failed");
253275072Semaste
254275072Semaste    return WriteRegister (reg_info, value);
255275072Semaste}
256275072Semaste
257275072Semastelldb::tid_t
258275072SemasteNativeRegisterContext::GetThreadID() const
259275072Semaste{
260275072Semaste    return m_thread.GetID();
261275072Semaste}
262275072Semaste
263275072Semasteuint32_t
264275072SemasteNativeRegisterContext::NumSupportedHardwareBreakpoints ()
265275072Semaste{
266275072Semaste    return 0;
267275072Semaste}
268275072Semaste
269275072Semasteuint32_t
270275072SemasteNativeRegisterContext::SetHardwareBreakpoint (lldb::addr_t addr, size_t size)
271275072Semaste{
272275072Semaste    return LLDB_INVALID_INDEX32;
273275072Semaste}
274275072Semaste
275275072Semastebool
276275072SemasteNativeRegisterContext::ClearHardwareBreakpoint (uint32_t hw_idx)
277275072Semaste{
278275072Semaste    return false;
279275072Semaste}
280275072Semaste
281275072Semaste
282275072Semasteuint32_t
283275072SemasteNativeRegisterContext::NumSupportedHardwareWatchpoints ()
284275072Semaste{
285275072Semaste    return 0;
286275072Semaste}
287275072Semaste
288275072Semasteuint32_t
289275072SemasteNativeRegisterContext::SetHardwareWatchpoint (lldb::addr_t addr, size_t size, uint32_t watch_flags)
290275072Semaste{
291275072Semaste    return LLDB_INVALID_INDEX32;
292275072Semaste}
293275072Semaste
294275072Semastebool
295275072SemasteNativeRegisterContext::ClearHardwareWatchpoint (uint32_t hw_index)
296275072Semaste{
297275072Semaste    return false;
298275072Semaste}
299275072Semaste
300278425SemasteError
301278425SemasteNativeRegisterContext::ClearAllHardwareWatchpoints ()
302278425Semaste{
303278425Semaste    return Error ("not implemented");
304278425Semaste}
305278425Semaste
306275072Semastebool
307275072SemasteNativeRegisterContext::HardwareSingleStep (bool enable)
308275072Semaste{
309275072Semaste    return false;
310275072Semaste}
311275072Semaste
312275072SemasteError
313275072SemasteNativeRegisterContext::ReadRegisterValueFromMemory (
314275072Semaste    const RegisterInfo *reg_info,
315275072Semaste    lldb::addr_t src_addr,
316275072Semaste    lldb::addr_t src_len,
317275072Semaste    RegisterValue &reg_value)
318275072Semaste{
319275072Semaste    Error error;
320275072Semaste    if (reg_info == nullptr)
321275072Semaste    {
322275072Semaste        error.SetErrorString ("invalid register info argument.");
323275072Semaste        return error;
324275072Semaste    }
325275072Semaste
326275072Semaste
327275072Semaste    // Moving from addr into a register
328275072Semaste    //
329275072Semaste    // Case 1: src_len == dst_len
330275072Semaste    //
331275072Semaste    //   |AABBCCDD| Address contents
332275072Semaste    //   |AABBCCDD| Register contents
333275072Semaste    //
334275072Semaste    // Case 2: src_len > dst_len
335275072Semaste    //
336275072Semaste    //   Error!  (The register should always be big enough to hold the data)
337275072Semaste    //
338275072Semaste    // Case 3: src_len < dst_len
339275072Semaste    //
340275072Semaste    //   |AABB| Address contents
341275072Semaste    //   |AABB0000| Register contents [on little-endian hardware]
342275072Semaste    //   |0000AABB| Register contents [on big-endian hardware]
343275072Semaste    if (src_len > RegisterValue::kMaxRegisterByteSize)
344275072Semaste    {
345275072Semaste        error.SetErrorString ("register too small to receive memory data");
346275072Semaste        return error;
347275072Semaste    }
348275072Semaste
349275072Semaste    const lldb::addr_t dst_len = reg_info->byte_size;
350275072Semaste
351275072Semaste    if (src_len > dst_len)
352275072Semaste    {
353275072Semaste        error.SetErrorStringWithFormat("%" PRIu64 " bytes is too big to store in register %s (%" PRIu64 " bytes)", src_len, reg_info->name, dst_len);
354275072Semaste        return error;
355275072Semaste    }
356275072Semaste
357275072Semaste    NativeProcessProtocolSP process_sp (m_thread.GetProcess ());
358275072Semaste    if (!process_sp)
359275072Semaste    {
360275072Semaste        error.SetErrorString("invalid process");
361275072Semaste        return error;
362275072Semaste    }
363275072Semaste
364275072Semaste    uint8_t src[RegisterValue::kMaxRegisterByteSize];
365275072Semaste
366275072Semaste    // Read the memory
367275072Semaste    lldb::addr_t bytes_read;
368275072Semaste    error = process_sp->ReadMemory (src_addr, src, src_len, bytes_read);
369275072Semaste    if (error.Fail ())
370275072Semaste        return error;
371275072Semaste
372275072Semaste    // Make sure the memory read succeeded...
373275072Semaste    if (bytes_read != src_len)
374275072Semaste    {
375275072Semaste        // This might happen if we read _some_ bytes but not all
376275072Semaste        error.SetErrorStringWithFormat("read %" PRIu64 " of %" PRIu64 " bytes", bytes_read, src_len);
377275072Semaste        return error;
378275072Semaste    }
379275072Semaste
380275072Semaste    // We now have a memory buffer that contains the part or all of the register
381275072Semaste    // value. Set the register value using this memory data.
382275072Semaste    // TODO: we might need to add a parameter to this function in case the byte
383275072Semaste    // order of the memory data doesn't match the process. For now we are assuming
384275072Semaste    // they are the same.
385275072Semaste    lldb::ByteOrder byte_order;
386275072Semaste    if (!process_sp->GetByteOrder (byte_order))
387275072Semaste    {
388275072Semaste        error.SetErrorString ( "NativeProcessProtocol::GetByteOrder () failed");
389275072Semaste        return error;
390275072Semaste    }
391275072Semaste
392275072Semaste    reg_value.SetFromMemoryData (
393275072Semaste        reg_info,
394275072Semaste        src,
395275072Semaste        src_len,
396275072Semaste        byte_order,
397275072Semaste        error);
398275072Semaste
399275072Semaste    return error;
400275072Semaste}
401275072Semaste
402275072SemasteError
403275072SemasteNativeRegisterContext::WriteRegisterValueToMemory (
404275072Semaste    const RegisterInfo *reg_info,
405275072Semaste    lldb::addr_t dst_addr,
406275072Semaste    lldb::addr_t dst_len,
407275072Semaste    const RegisterValue &reg_value)
408275072Semaste{
409275072Semaste
410275072Semaste    uint8_t dst[RegisterValue::kMaxRegisterByteSize];
411275072Semaste
412275072Semaste    Error error;
413275072Semaste
414275072Semaste    NativeProcessProtocolSP process_sp (m_thread.GetProcess ());
415275072Semaste    if (process_sp)
416275072Semaste    {
417275072Semaste
418275072Semaste        // TODO: we might need to add a parameter to this function in case the byte
419275072Semaste        // order of the memory data doesn't match the process. For now we are assuming
420275072Semaste        // they are the same.
421275072Semaste        lldb::ByteOrder byte_order;
422275072Semaste        if (!process_sp->GetByteOrder (byte_order))
423275072Semaste            return Error ("NativeProcessProtocol::GetByteOrder () failed");
424275072Semaste
425275072Semaste        const lldb::addr_t bytes_copied = reg_value.GetAsMemoryData (
426275072Semaste            reg_info,
427275072Semaste            dst,
428275072Semaste            dst_len,
429275072Semaste            byte_order,
430275072Semaste            error);
431275072Semaste
432275072Semaste        if (error.Success())
433275072Semaste        {
434275072Semaste            if (bytes_copied == 0)
435275072Semaste            {
436275072Semaste                error.SetErrorString("byte copy failed.");
437275072Semaste            }
438275072Semaste            else
439275072Semaste            {
440275072Semaste                lldb::addr_t bytes_written;
441275072Semaste                error = process_sp->WriteMemory (dst_addr, dst, bytes_copied, bytes_written);
442275072Semaste                if (error.Fail ())
443275072Semaste                    return error;
444275072Semaste
445275072Semaste                if (bytes_written != bytes_copied)
446275072Semaste                {
447275072Semaste                    // This might happen if we read _some_ bytes but not all
448275072Semaste                    error.SetErrorStringWithFormat("only wrote %" PRIu64 " of %" PRIu64 " bytes", bytes_written, bytes_copied);
449275072Semaste                }
450275072Semaste            }
451275072Semaste        }
452275072Semaste    }
453275072Semaste    else
454275072Semaste        error.SetErrorString("invalid process");
455275072Semaste
456275072Semaste    return error;
457275072Semaste}
458275072Semaste
459275072Semasteuint32_t
460275072SemasteNativeRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) const
461275072Semaste{
462275072Semaste    const uint32_t num_regs = GetRegisterCount();
463275072Semaste
464275072Semaste    assert (kind < kNumRegisterKinds);
465275072Semaste    for (uint32_t reg_idx = 0; reg_idx < num_regs; ++reg_idx)
466275072Semaste    {
467275072Semaste        const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg_idx);
468275072Semaste
469275072Semaste        if (reg_info->kinds[kind] == num)
470275072Semaste            return reg_idx;
471275072Semaste    }
472275072Semaste
473275072Semaste    return LLDB_INVALID_REGNUM;
474275072Semaste}
475275072Semaste
476275072Semaste
477