1*af245d11STodd Fiala //===-- NativeThreadProtocol.cpp --------------------------------*- C++ -*-===// 2*af245d11STodd Fiala // 3*af245d11STodd Fiala // The LLVM Compiler Infrastructure 4*af245d11STodd Fiala // 5*af245d11STodd Fiala // This file is distributed under the University of Illinois Open Source 6*af245d11STodd Fiala // License. See LICENSE.TXT for details. 7*af245d11STodd Fiala // 8*af245d11STodd Fiala //===----------------------------------------------------------------------===// 9*af245d11STodd Fiala 10*af245d11STodd Fiala #include "NativeThreadProtocol.h" 11*af245d11STodd Fiala 12*af245d11STodd Fiala #include "NativeProcessProtocol.h" 13*af245d11STodd Fiala #include "lldb/Target/NativeRegisterContext.h" 14*af245d11STodd Fiala #include "SoftwareBreakpoint.h" 15*af245d11STodd Fiala 16*af245d11STodd Fiala using namespace lldb; 17*af245d11STodd Fiala using namespace lldb_private; 18*af245d11STodd Fiala 19*af245d11STodd Fiala NativeThreadProtocol::NativeThreadProtocol (NativeProcessProtocol *process, lldb::tid_t tid) : 20*af245d11STodd Fiala m_process_wp (process->shared_from_this ()), 21*af245d11STodd Fiala m_tid (tid) 22*af245d11STodd Fiala { 23*af245d11STodd Fiala } 24*af245d11STodd Fiala 25*af245d11STodd Fiala Error 26*af245d11STodd Fiala NativeThreadProtocol::ReadRegister (uint32_t reg, RegisterValue ®_value) 27*af245d11STodd Fiala { 28*af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext (); 29*af245d11STodd Fiala if (!register_context_sp) 30*af245d11STodd Fiala return Error ("no register context"); 31*af245d11STodd Fiala 32*af245d11STodd Fiala const RegisterInfo *const reg_info = register_context_sp->GetRegisterInfoAtIndex (reg); 33*af245d11STodd Fiala if (!reg_info) 34*af245d11STodd Fiala return Error ("no register info for reg num %" PRIu32, reg); 35*af245d11STodd Fiala 36*af245d11STodd Fiala return register_context_sp->ReadRegister (reg_info, reg_value);; 37*af245d11STodd Fiala } 38*af245d11STodd Fiala 39*af245d11STodd Fiala Error 40*af245d11STodd Fiala NativeThreadProtocol::WriteRegister (uint32_t reg, const RegisterValue ®_value) 41*af245d11STodd Fiala { 42*af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext (); 43*af245d11STodd Fiala if (!register_context_sp) 44*af245d11STodd Fiala return Error ("no register context"); 45*af245d11STodd Fiala 46*af245d11STodd Fiala const RegisterInfo *const reg_info = register_context_sp->GetRegisterInfoAtIndex (reg); 47*af245d11STodd Fiala if (!reg_info) 48*af245d11STodd Fiala return Error ("no register info for reg num %" PRIu32, reg); 49*af245d11STodd Fiala 50*af245d11STodd Fiala return register_context_sp->WriteRegister (reg_info, reg_value); 51*af245d11STodd Fiala } 52*af245d11STodd Fiala 53*af245d11STodd Fiala Error 54*af245d11STodd Fiala NativeThreadProtocol::SaveAllRegisters (lldb::DataBufferSP &data_sp) 55*af245d11STodd Fiala { 56*af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext (); 57*af245d11STodd Fiala if (!register_context_sp) 58*af245d11STodd Fiala return Error ("no register context"); 59*af245d11STodd Fiala return register_context_sp->WriteAllRegisterValues (data_sp); 60*af245d11STodd Fiala } 61*af245d11STodd Fiala 62*af245d11STodd Fiala Error 63*af245d11STodd Fiala NativeThreadProtocol::RestoreAllRegisters (lldb::DataBufferSP &data_sp) 64*af245d11STodd Fiala { 65*af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext (); 66*af245d11STodd Fiala if (!register_context_sp) 67*af245d11STodd Fiala return Error ("no register context"); 68*af245d11STodd Fiala return register_context_sp->ReadAllRegisterValues (data_sp); 69*af245d11STodd Fiala } 70*af245d11STodd Fiala 71*af245d11STodd Fiala NativeProcessProtocolSP 72*af245d11STodd Fiala NativeThreadProtocol::GetProcess () 73*af245d11STodd Fiala { 74*af245d11STodd Fiala return m_process_wp.lock (); 75*af245d11STodd Fiala } 76*af245d11STodd Fiala 77*af245d11STodd Fiala uint32_t 78*af245d11STodd Fiala NativeThreadProtocol::TranslateStopInfoToGdbSignal (const ThreadStopInfo &stop_info) const 79*af245d11STodd Fiala { 80*af245d11STodd Fiala // Default: no translation. Do the real translation where there 81*af245d11STodd Fiala // is access to the host signal numbers. 82*af245d11STodd Fiala switch (stop_info.reason) 83*af245d11STodd Fiala { 84*af245d11STodd Fiala case eStopReasonSignal: 85*af245d11STodd Fiala return stop_info.details.signal.signo; 86*af245d11STodd Fiala break; 87*af245d11STodd Fiala 88*af245d11STodd Fiala case eStopReasonException: 89*af245d11STodd Fiala // FIXME verify the way to specify pass-thru here. 90*af245d11STodd Fiala return static_cast<uint32_t> (stop_info.details.exception.type); 91*af245d11STodd Fiala break; 92*af245d11STodd Fiala 93*af245d11STodd Fiala default: 94*af245d11STodd Fiala assert (0 && "unexpected stop_info.reason found"); 95*af245d11STodd Fiala return 0; 96*af245d11STodd Fiala } 97*af245d11STodd Fiala } 98