ThreadElfCore.cpp revision 254721
1254721Semaste//===-- ThreadElfCore.cpp --------------------------------------*- C++ -*-===//
2254721Semaste//
3254721Semaste//                     The LLVM Compiler Infrastructure
4254721Semaste//
5254721Semaste// This file is distributed under the University of Illinois Open Source
6254721Semaste// License. See LICENSE.TXT for details.
7254721Semaste//
8254721Semaste//===----------------------------------------------------------------------===//
9254721Semaste
10254721Semaste#include "lldb/Core/DataExtractor.h"
11254721Semaste#include "lldb/Target/RegisterContext.h"
12254721Semaste#include "lldb/Target/StopInfo.h"
13254721Semaste#include "lldb/Target/Target.h"
14254721Semaste#include "lldb/Target/Unwind.h"
15254721Semaste#include "ProcessPOSIXLog.h"
16254721Semaste
17254721Semaste#include "ThreadElfCore.h"
18254721Semaste#include "ProcessElfCore.h"
19254721Semaste#include "RegisterContextCoreFreeBSD_x86_64.h"
20254721Semaste#include "RegisterContextCoreLinux_x86_64.h"
21254721Semaste
22254721Semasteusing namespace lldb;
23254721Semasteusing namespace lldb_private;
24254721Semaste
25254721Semaste//----------------------------------------------------------------------
26254721Semaste// Construct a Thread object with given data
27254721Semaste//----------------------------------------------------------------------
28254721SemasteThreadElfCore::ThreadElfCore (Process &process, tid_t tid,
29254721Semaste                              const ThreadData &td) :
30254721Semaste    Thread(process, tid),
31254721Semaste    m_thread_name(td.name),
32254721Semaste    m_thread_reg_ctx_sp (),
33254721Semaste    m_signo(td.signo),
34254721Semaste    m_gpregset_data(td.gpregset),
35254721Semaste    m_fpregset_data(td.fpregset)
36254721Semaste{
37254721Semaste}
38254721Semaste
39254721SemasteThreadElfCore::~ThreadElfCore ()
40254721Semaste{
41254721Semaste    DestroyThread();
42254721Semaste}
43254721Semaste
44254721Semastevoid
45254721SemasteThreadElfCore::RefreshStateAfterStop()
46254721Semaste{
47254721Semaste    GetRegisterContext()->InvalidateIfNeeded (false);
48254721Semaste}
49254721Semaste
50254721Semastevoid
51254721SemasteThreadElfCore::ClearStackFrames ()
52254721Semaste{
53254721Semaste    Unwind *unwinder = GetUnwinder ();
54254721Semaste    if (unwinder)
55254721Semaste        unwinder->Clear();
56254721Semaste    Thread::ClearStackFrames();
57254721Semaste}
58254721Semaste
59254721SemasteRegisterContextSP
60254721SemasteThreadElfCore::GetRegisterContext ()
61254721Semaste{
62254721Semaste    if (m_reg_context_sp.get() == NULL) {
63254721Semaste        m_reg_context_sp = CreateRegisterContextForFrame (NULL);
64254721Semaste    }
65254721Semaste    return m_reg_context_sp;
66254721Semaste}
67254721Semaste
68254721SemasteRegisterContextSP
69254721SemasteThreadElfCore::CreateRegisterContextForFrame (StackFrame *frame)
70254721Semaste{
71254721Semaste    RegisterContextSP reg_ctx_sp;
72254721Semaste    uint32_t concrete_frame_idx = 0;
73254721Semaste    Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD));
74254721Semaste
75254721Semaste    if (frame)
76254721Semaste        concrete_frame_idx = frame->GetConcreteFrameIndex ();
77254721Semaste
78254721Semaste    if (concrete_frame_idx == 0)
79254721Semaste    {
80254721Semaste        if (m_thread_reg_ctx_sp)
81254721Semaste            return m_thread_reg_ctx_sp;
82254721Semaste
83254721Semaste        ProcessElfCore *process = static_cast<ProcessElfCore *>(GetProcess().get());
84254721Semaste        ArchSpec arch = process->GetArchitecture();
85254721Semaste        switch (arch.GetMachine())
86254721Semaste        {
87254721Semaste            case llvm::Triple::x86_64:
88254721Semaste                switch (arch.GetTriple().getOS())
89254721Semaste                {
90254721Semaste                    case llvm::Triple::FreeBSD:
91254721Semaste                        m_thread_reg_ctx_sp.reset(new RegisterContextCoreFreeBSD_x86_64 (*this, m_gpregset_data, m_fpregset_data));
92254721Semaste                        break;
93254721Semaste                    case llvm::Triple::Linux:
94254721Semaste                        m_thread_reg_ctx_sp.reset(new RegisterContextCoreLinux_x86_64 (*this, m_gpregset_data, m_fpregset_data));
95254721Semaste                        break;
96254721Semaste                    default:
97254721Semaste                        if (log)
98254721Semaste                            log->Printf ("elf-core::%s:: OS(%d) not supported",
99254721Semaste                                         __FUNCTION__, arch.GetTriple().getOS());
100254721Semaste                        assert (false && "OS not supported");
101254721Semaste                        break;
102254721Semaste                }
103254721Semaste                break;
104254721Semaste            default:
105254721Semaste                if (log)
106254721Semaste                    log->Printf ("elf-core::%s:: Architecture(%d) not supported",
107254721Semaste                                 __FUNCTION__, arch.GetMachine());
108254721Semaste                assert (false && "Architecture not supported");
109254721Semaste        }
110254721Semaste        reg_ctx_sp = m_thread_reg_ctx_sp;
111254721Semaste    }
112254721Semaste    else if (m_unwinder_ap.get())
113254721Semaste    {
114254721Semaste        reg_ctx_sp = m_unwinder_ap->CreateRegisterContextForFrame (frame);
115254721Semaste    }
116254721Semaste    return reg_ctx_sp;
117254721Semaste}
118254721Semaste
119254721Semastebool
120254721SemasteThreadElfCore::CalculateStopInfo ()
121254721Semaste{
122254721Semaste    ProcessSP process_sp (GetProcess());
123254721Semaste    if (process_sp)
124254721Semaste    {
125254721Semaste        SetStopInfo(StopInfo::CreateStopReasonWithSignal (*this, m_signo));
126254721Semaste        return true;
127254721Semaste    }
128254721Semaste    return false;
129254721Semaste}
130254721Semaste
131254721Semaste//----------------------------------------------------------------
132254721Semaste// Parse PRSTATUS from NOTE entry
133254721Semaste//----------------------------------------------------------------
134254721SemasteELFLinuxPrStatus::ELFLinuxPrStatus()
135254721Semaste{
136254721Semaste    memset(this, 0, sizeof(ELFLinuxPrStatus));
137254721Semaste}
138254721Semaste
139254721Semastebool
140254721SemasteELFLinuxPrStatus::Parse(DataExtractor &data, ArchSpec &arch)
141254721Semaste{
142254721Semaste    ByteOrder byteorder = data.GetByteOrder();
143254721Semaste    size_t len;
144254721Semaste    switch(arch.GetCore())
145254721Semaste    {
146254721Semaste        case ArchSpec::eCore_x86_64_x86_64:
147254721Semaste            len = data.ExtractBytes(0, ELFLINUXPRSTATUS64_SIZE, byteorder, this);
148254721Semaste            return len == ELFLINUXPRSTATUS64_SIZE;
149254721Semaste        default:
150254721Semaste            return false;
151254721Semaste    }
152254721Semaste}
153254721Semaste
154254721Semaste//----------------------------------------------------------------
155254721Semaste// Parse PRPSINFO from NOTE entry
156254721Semaste//----------------------------------------------------------------
157254721SemasteELFLinuxPrPsInfo::ELFLinuxPrPsInfo()
158254721Semaste{
159254721Semaste    memset(this, 0, sizeof(ELFLinuxPrPsInfo));
160254721Semaste}
161254721Semaste
162254721Semastebool
163254721SemasteELFLinuxPrPsInfo::Parse(DataExtractor &data, ArchSpec &arch)
164254721Semaste{
165254721Semaste    ByteOrder byteorder = data.GetByteOrder();
166254721Semaste    size_t len;
167254721Semaste    switch(arch.GetCore())
168254721Semaste    {
169254721Semaste        case ArchSpec::eCore_x86_64_x86_64:
170254721Semaste            len = data.ExtractBytes(0, ELFLINUXPRPSINFO64_SIZE, byteorder, this);
171254721Semaste            return len == ELFLINUXPRPSINFO64_SIZE;
172254721Semaste        default:
173254721Semaste            return false;
174254721Semaste    }
175254721Semaste}
176254721Semaste
177