1af245d11STodd Fiala //===-- NativeThreadProtocol.cpp --------------------------------*- C++ -*-===// 2af245d11STodd Fiala // 3af245d11STodd Fiala // The LLVM Compiler Infrastructure 4af245d11STodd Fiala // 5af245d11STodd Fiala // This file is distributed under the University of Illinois Open Source 6af245d11STodd Fiala // License. See LICENSE.TXT for details. 7af245d11STodd Fiala // 8af245d11STodd Fiala //===----------------------------------------------------------------------===// 9af245d11STodd Fiala 102fe1d0abSChaoren Lin #include "lldb/Host/common/NativeThreadProtocol.h" 11af245d11STodd Fiala 122fe1d0abSChaoren Lin #include "lldb/Host/common/NativeProcessProtocol.h" 132fe1d0abSChaoren Lin #include "lldb/Host/common/NativeRegisterContext.h" 142fe1d0abSChaoren Lin #include "lldb/Host/common/SoftwareBreakpoint.h" 15af245d11STodd Fiala 16af245d11STodd Fiala using namespace lldb; 17af245d11STodd Fiala using namespace lldb_private; 18af245d11STodd Fiala 19b9c1b51eSKate Stone NativeThreadProtocol::NativeThreadProtocol(NativeProcessProtocol *process, 20b9c1b51eSKate Stone lldb::tid_t tid) 21b9c1b51eSKate Stone : m_process_wp(process->shared_from_this()), m_tid(tid) {} 22af245d11STodd Fiala 23*97206d57SZachary Turner Status NativeThreadProtocol::ReadRegister(uint32_t reg, 24b9c1b51eSKate Stone RegisterValue ®_value) { 25af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 26af245d11STodd Fiala if (!register_context_sp) 27*97206d57SZachary Turner return Status("no register context"); 28af245d11STodd Fiala 29b9c1b51eSKate Stone const RegisterInfo *const reg_info = 30b9c1b51eSKate Stone register_context_sp->GetRegisterInfoAtIndex(reg); 31af245d11STodd Fiala if (!reg_info) 32*97206d57SZachary Turner return Status("no register info for reg num %" PRIu32, reg); 33af245d11STodd Fiala 34b9c1b51eSKate Stone return register_context_sp->ReadRegister(reg_info, reg_value); 35b9c1b51eSKate Stone ; 36af245d11STodd Fiala } 37af245d11STodd Fiala 38*97206d57SZachary Turner Status NativeThreadProtocol::WriteRegister(uint32_t reg, 39b9c1b51eSKate Stone const RegisterValue ®_value) { 40af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 41af245d11STodd Fiala if (!register_context_sp) 42*97206d57SZachary Turner return Status("no register context"); 43af245d11STodd Fiala 44b9c1b51eSKate Stone const RegisterInfo *const reg_info = 45b9c1b51eSKate Stone register_context_sp->GetRegisterInfoAtIndex(reg); 46af245d11STodd Fiala if (!reg_info) 47*97206d57SZachary Turner return Status("no register info for reg num %" PRIu32, reg); 48af245d11STodd Fiala 49af245d11STodd Fiala return register_context_sp->WriteRegister(reg_info, reg_value); 50af245d11STodd Fiala } 51af245d11STodd Fiala 52*97206d57SZachary Turner Status NativeThreadProtocol::SaveAllRegisters(lldb::DataBufferSP &data_sp) { 53af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 54af245d11STodd Fiala if (!register_context_sp) 55*97206d57SZachary Turner return Status("no register context"); 56af245d11STodd Fiala return register_context_sp->WriteAllRegisterValues(data_sp); 57af245d11STodd Fiala } 58af245d11STodd Fiala 59*97206d57SZachary Turner Status NativeThreadProtocol::RestoreAllRegisters(lldb::DataBufferSP &data_sp) { 60af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 61af245d11STodd Fiala if (!register_context_sp) 62*97206d57SZachary Turner return Status("no register context"); 63af245d11STodd Fiala return register_context_sp->ReadAllRegisterValues(data_sp); 64af245d11STodd Fiala } 65af245d11STodd Fiala 66b9c1b51eSKate Stone NativeProcessProtocolSP NativeThreadProtocol::GetProcess() { 67af245d11STodd Fiala return m_process_wp.lock(); 68af245d11STodd Fiala } 69