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