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 22 struct compat_timeval 23 { 24 alignas(8) uint64_t tv_sec; 25 alignas(8) uint64_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 32 #undef si_signo 33 #undef si_code 34 #undef si_errno 35 36 struct ELFLinuxPrStatus 37 { 38 int32_t si_signo; 39 int32_t si_code; 40 int32_t si_errno; 41 42 int16_t pr_cursig; 43 44 alignas(8) uint64_t pr_sigpend; 45 alignas(8) uint64_t pr_sighold; 46 47 uint32_t pr_pid; 48 uint32_t pr_ppid; 49 uint32_t pr_pgrp; 50 uint32_t pr_sid; 51 52 compat_timeval pr_utime; 53 compat_timeval pr_stime; 54 compat_timeval pr_cutime; 55 compat_timeval pr_cstime; 56 57 ELFLinuxPrStatus(); 58 59 bool 60 Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch); 61 62 static size_t 63 GetSize(lldb_private::ArchSpec &arch) 64 { 65 switch(arch.GetCore()) 66 { 67 case lldb_private::ArchSpec::eCore_s390x_generic: 68 case lldb_private::ArchSpec::eCore_x86_64_x86_64: 69 return sizeof(ELFLinuxPrStatus); 70 default: 71 return 0; 72 } 73 } 74 }; 75 76 static_assert(sizeof(ELFLinuxPrStatus) == 112, "sizeof ELFLinuxPrStatus is not correct!"); 77 78 struct ELFLinuxPrPsInfo 79 { 80 char pr_state; 81 char pr_sname; 82 char pr_zomb; 83 char pr_nice; 84 alignas(8) uint64_t pr_flag; 85 uint32_t pr_uid; 86 uint32_t pr_gid; 87 int32_t pr_pid; 88 int32_t pr_ppid; 89 int32_t pr_pgrp; 90 int32_t pr_sid; 91 char pr_fname[16]; 92 char pr_psargs[80]; 93 94 ELFLinuxPrPsInfo(); 95 96 bool 97 Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch); 98 99 static size_t 100 GetSize(lldb_private::ArchSpec &arch) 101 { 102 switch(arch.GetCore()) 103 { 104 case lldb_private::ArchSpec::eCore_s390x_generic: 105 case lldb_private::ArchSpec::eCore_x86_64_x86_64: 106 return sizeof(ELFLinuxPrPsInfo); 107 default: 108 return 0; 109 } 110 } 111 }; 112 113 static_assert(sizeof(ELFLinuxPrPsInfo) == 136, "sizeof ELFLinuxPrPsInfo is not correct!"); 114 115 struct ThreadData 116 { 117 lldb_private::DataExtractor gpregset; 118 lldb_private::DataExtractor fpregset; 119 lldb_private::DataExtractor vregset; 120 lldb::tid_t tid; 121 int signo; 122 std::string name; 123 }; 124 125 class ThreadElfCore : public lldb_private::Thread 126 { 127 public: 128 ThreadElfCore (lldb_private::Process &process, const ThreadData &td); 129 130 ~ThreadElfCore() override; 131 132 void 133 RefreshStateAfterStop() override; 134 135 lldb::RegisterContextSP 136 GetRegisterContext() override; 137 138 lldb::RegisterContextSP 139 CreateRegisterContextForFrame(lldb_private::StackFrame *frame) override; 140 141 void 142 ClearStackFrames() override; 143 144 static bool 145 ThreadIDIsValid (lldb::tid_t thread) 146 { 147 return thread != 0; 148 } 149 150 const char * 151 GetName() override 152 { 153 if (m_thread_name.empty()) 154 return NULL; 155 return m_thread_name.c_str(); 156 } 157 158 void 159 SetName(const char *name) override 160 { 161 if (name && name[0]) 162 m_thread_name.assign (name); 163 else 164 m_thread_name.clear(); 165 } 166 167 protected: 168 //------------------------------------------------------------------ 169 // Member variables. 170 //------------------------------------------------------------------ 171 std::string m_thread_name; 172 lldb::RegisterContextSP m_thread_reg_ctx_sp; 173 174 int m_signo; 175 176 lldb_private::DataExtractor m_gpregset_data; 177 lldb_private::DataExtractor m_fpregset_data; 178 lldb_private::DataExtractor m_vregset_data; 179 180 bool CalculateStopInfo() override; 181 }; 182 183 #endif // liblldb_ThreadElfCore_h_ 184