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