1//===-- ThreadElfCore.h -----------------------------------------*- C++ -*-===// 2// 3// The LLVM Compiler Infrastructure 4// 5// This file is distributed under the University of Illinois Open Source 6// License. See LICENSE.TXT for details. 7// 8//===----------------------------------------------------------------------===// 9 10#ifndef liblldb_ThreadElfCore_h_ 11#define liblldb_ThreadElfCore_h_ 12 13// C Includes 14// C++ Includes 15#include <string> 16 17// Other libraries and framework includes 18// Project includes 19#include "lldb/Target/Thread.h" 20#include "lldb/Core/DataExtractor.h" 21 22struct compat_timeval 23{ 24 int64_t tv_sec; 25 int32_t tv_usec; 26}; 27 28// PRSTATUS structure's size differs based on architecture. 29// Currently parsing done only for x86-64 architecture by 30// simply reading data from the buffer. 31// The following macros are used to specify the size. 32// Calculating size using sizeof() wont work because of padding. 33#define ELFLINUXPRSTATUS64_SIZE (112) 34#define ELFLINUXPRPSINFO64_SIZE (132) 35 36#undef si_signo 37#undef si_code 38#undef si_errno 39 40struct ELFLinuxPrStatus 41{ 42 int32_t si_signo; 43 int32_t si_code; 44 int32_t si_errno; 45 46 int16_t pr_cursig; 47 48 uint64_t pr_sigpend; 49 uint64_t pr_sighold; 50 51 uint32_t pr_pid; 52 uint32_t pr_ppid; 53 uint32_t pr_pgrp; 54 uint32_t pr_sid; 55 56 compat_timeval pr_utime; 57 compat_timeval pr_stime; 58 compat_timeval pr_cutime; 59 compat_timeval pr_cstime; 60 61 ELFLinuxPrStatus(); 62 63 bool 64 Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch); 65 66 static size_t 67 GetSize(lldb_private::ArchSpec &arch) 68 { 69 switch(arch.GetCore()) 70 { 71 case lldb_private::ArchSpec::eCore_x86_64_x86_64: 72 return ELFLINUXPRSTATUS64_SIZE; 73 default: 74 return 0; 75 } 76 } 77}; 78 79struct ELFLinuxPrPsInfo 80{ 81 char pr_state; 82 char pr_sname; 83 char pr_zomb; 84 char pr_nice; 85 uint64_t pr_flag; 86 uint32_t pr_uid; 87 uint32_t pr_gid; 88 int32_t pr_pid; 89 int32_t pr_ppid; 90 int32_t pr_pgrp; 91 int32_t pr_sid; 92 char pr_fname[16]; 93 char pr_psargs[80]; 94 95 ELFLinuxPrPsInfo(); 96 97 bool 98 Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch); 99 100 static size_t 101 GetSize(lldb_private::ArchSpec &arch) 102 { 103 switch(arch.GetCore()) 104 { 105 case lldb_private::ArchSpec::eCore_x86_64_x86_64: 106 return ELFLINUXPRPSINFO64_SIZE; 107 default: 108 return 0; 109 } 110 } 111}; 112 113struct ThreadData 114{ 115 lldb_private::DataExtractor gpregset; 116 lldb_private::DataExtractor fpregset; 117 lldb_private::DataExtractor vregset; 118 lldb::tid_t tid; 119 int signo; 120 std::string name; 121}; 122 123class ThreadElfCore : public lldb_private::Thread 124{ 125public: 126 ThreadElfCore (lldb_private::Process &process, const ThreadData &td); 127 128 ~ThreadElfCore() override; 129 130 void 131 RefreshStateAfterStop() override; 132 133 lldb::RegisterContextSP 134 GetRegisterContext() override; 135 136 lldb::RegisterContextSP 137 CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override; 138 139 void 140 ClearStackFrames() override; 141 142 static bool 143 ThreadIDIsValid (lldb::tid_t thread) 144 { 145 return thread != 0; 146 } 147 148 const char * 149 GetName() override 150 { 151 if (m_thread_name.empty()) 152 return NULL; 153 return m_thread_name.c_str(); 154 } 155 156 void 157 SetName(const char *name) override 158 { 159 if (name && name[0]) 160 m_thread_name.assign (name); 161 else 162 m_thread_name.clear(); 163 } 164 165protected: 166 //------------------------------------------------------------------ 167 // Member variables. 168 //------------------------------------------------------------------ 169 std::string m_thread_name; 170 lldb::RegisterContextSP m_thread_reg_ctx_sp; 171 172 int m_signo; 173 174 lldb_private::DataExtractor m_gpregset_data; 175 lldb_private::DataExtractor m_fpregset_data; 176 lldb_private::DataExtractor m_vregset_data; 177 178 bool CalculateStopInfo() override; 179}; 180 181#endif // liblldb_ThreadElfCore_h_ 182