1254721Semaste//===-- ThreadElfCore.h ----------------------------------------*- 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#ifndef liblldb_ThreadElfCore_h_
11254721Semaste#define liblldb_ThreadElfCore_h_
12254721Semaste
13254721Semaste#include <string>
14254721Semaste
15254721Semaste#include "lldb/Target/Thread.h"
16254721Semaste#include "lldb/Core/DataExtractor.h"
17254721Semaste
18254721Semastestruct compat_timeval
19254721Semaste{
20254721Semaste    int64_t tv_sec;
21254721Semaste    int32_t tv_usec;
22254721Semaste};
23254721Semaste
24254721Semaste// PRSTATUS structure's size differs based on architecture.
25254721Semaste// Currently parsing done only for x86-64 architecture by
26254721Semaste// simply reading data from the buffer.
27254721Semaste// The following macros are used to specify the size.
28254721Semaste// Calculating size using sizeof() wont work because of padding.
29254721Semaste#define ELFLINUXPRSTATUS64_SIZE (112)
30254721Semaste#define ELFLINUXPRPSINFO64_SIZE (132)
31254721Semaste
32263363Semaste#undef si_signo
33263363Semaste#undef si_code
34263363Semaste#undef si_errno
35263363Semaste
36254721Semastestruct ELFLinuxPrStatus
37254721Semaste{
38254721Semaste    int32_t         si_signo;
39254721Semaste    int32_t         si_code;
40254721Semaste    int32_t         si_errno;
41254721Semaste
42254721Semaste    int16_t         pr_cursig;
43254721Semaste
44254721Semaste    uint64_t        pr_sigpend;
45254721Semaste    uint64_t        pr_sighold;
46254721Semaste
47254721Semaste    uint32_t        pr_pid;
48254721Semaste    uint32_t        pr_ppid;
49254721Semaste    uint32_t        pr_pgrp;
50254721Semaste    uint32_t        pr_sid;
51254721Semaste
52254721Semaste    compat_timeval  pr_utime;
53254721Semaste    compat_timeval  pr_stime;
54254721Semaste    compat_timeval  pr_cutime;
55254721Semaste    compat_timeval  pr_cstime;
56254721Semaste
57254721Semaste    ELFLinuxPrStatus();
58254721Semaste
59254721Semaste    bool
60254721Semaste    Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch);
61254721Semaste
62254721Semaste    static size_t
63254721Semaste    GetSize(lldb_private::ArchSpec &arch)
64254721Semaste    {
65254721Semaste        switch(arch.GetCore())
66254721Semaste        {
67254721Semaste            case lldb_private::ArchSpec::eCore_x86_64_x86_64:
68254721Semaste                return ELFLINUXPRSTATUS64_SIZE;
69254721Semaste            default:
70254721Semaste                return 0;
71254721Semaste        }
72254721Semaste    }
73254721Semaste};
74254721Semaste
75254721Semastestruct ELFLinuxPrPsInfo
76254721Semaste{
77254721Semaste    char        pr_state;
78254721Semaste    char        pr_sname;
79254721Semaste    char        pr_zomb;
80254721Semaste    char        pr_nice;
81254721Semaste    uint64_t    pr_flag;
82254721Semaste    uint32_t    pr_uid;
83254721Semaste    uint32_t    pr_gid;
84254721Semaste    int32_t     pr_pid;
85254721Semaste    int32_t     pr_ppid;
86254721Semaste    int32_t     pr_pgrp;
87254721Semaste    int32_t     pr_sid;
88254721Semaste    char        pr_fname[16];
89254721Semaste    char        pr_psargs[80];
90254721Semaste
91254721Semaste    ELFLinuxPrPsInfo();
92254721Semaste
93254721Semaste    bool
94254721Semaste    Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch);
95254721Semaste
96254721Semaste    static size_t
97254721Semaste    GetSize(lldb_private::ArchSpec &arch)
98254721Semaste    {
99254721Semaste        switch(arch.GetCore())
100254721Semaste        {
101254721Semaste            case lldb_private::ArchSpec::eCore_x86_64_x86_64:
102254721Semaste                return ELFLINUXPRPSINFO64_SIZE;
103254721Semaste            default:
104254721Semaste                return 0;
105254721Semaste        }
106254721Semaste    }
107254721Semaste
108254721Semaste};
109254721Semaste
110254721Semastestruct ThreadData
111254721Semaste{
112254721Semaste    lldb_private::DataExtractor gpregset;
113254721Semaste    lldb_private::DataExtractor fpregset;
114254721Semaste    int signo;
115254721Semaste    std::string name;
116254721Semaste};
117254721Semaste
118254721Semasteclass ThreadElfCore : public lldb_private::Thread
119254721Semaste{
120254721Semastepublic:
121254721Semaste    ThreadElfCore (lldb_private::Process &process, lldb::tid_t tid,
122254721Semaste                   const ThreadData &td);
123254721Semaste
124254721Semaste    virtual
125254721Semaste    ~ThreadElfCore ();
126254721Semaste
127254721Semaste    virtual void
128254721Semaste    RefreshStateAfterStop();
129254721Semaste
130254721Semaste    virtual lldb::RegisterContextSP
131254721Semaste    GetRegisterContext ();
132254721Semaste
133254721Semaste    virtual lldb::RegisterContextSP
134254721Semaste    CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
135254721Semaste
136254721Semaste    virtual void
137254721Semaste    ClearStackFrames ();
138254721Semaste
139254721Semaste    static bool
140254721Semaste    ThreadIDIsValid (lldb::tid_t thread)
141254721Semaste    {
142254721Semaste        return thread != 0;
143254721Semaste    }
144254721Semaste
145254721Semaste    virtual const char *
146254721Semaste    GetName ()
147254721Semaste    {
148254721Semaste        if (m_thread_name.empty())
149254721Semaste            return NULL;
150254721Semaste        return m_thread_name.c_str();
151254721Semaste    }
152254721Semaste
153254721Semaste    void
154254721Semaste    SetName (const char *name)
155254721Semaste    {
156254721Semaste        if (name && name[0])
157254721Semaste            m_thread_name.assign (name);
158254721Semaste        else
159254721Semaste            m_thread_name.clear();
160254721Semaste    }
161254721Semaste
162254721Semasteprotected:
163254721Semaste    //------------------------------------------------------------------
164254721Semaste    // Member variables.
165254721Semaste    //------------------------------------------------------------------
166254721Semaste    std::string m_thread_name;
167254721Semaste    lldb::RegisterContextSP m_thread_reg_ctx_sp;
168254721Semaste
169254721Semaste    int m_signo;
170254721Semaste
171254721Semaste    lldb_private::DataExtractor m_gpregset_data;
172254721Semaste    lldb_private::DataExtractor m_fpregset_data;
173254721Semaste
174254721Semaste    virtual bool CalculateStopInfo();
175254721Semaste
176254721Semaste};
177254721Semaste
178254721Semaste#endif  // liblldb_ThreadElfCore_h_
179