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 19*82abefa4SPavel Labath NativeThreadProtocol::NativeThreadProtocol(NativeProcessProtocol &process, 20b9c1b51eSKate Stone lldb::tid_t tid) 21*82abefa4SPavel Labath : m_process(process), m_tid(tid) {} 22af245d11STodd Fiala 2397206d57SZachary Turner Status NativeThreadProtocol::ReadRegister(uint32_t reg, 24b9c1b51eSKate Stone RegisterValue ®_value) { 25af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 26af245d11STodd Fiala if (!register_context_sp) 2797206d57SZachary 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) 3297206d57SZachary 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 3897206d57SZachary 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) 4297206d57SZachary 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) 4797206d57SZachary 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 5297206d57SZachary Turner Status NativeThreadProtocol::SaveAllRegisters(lldb::DataBufferSP &data_sp) { 53af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 54af245d11STodd Fiala if (!register_context_sp) 5597206d57SZachary Turner return Status("no register context"); 56af245d11STodd Fiala return register_context_sp->WriteAllRegisterValues(data_sp); 57af245d11STodd Fiala } 58af245d11STodd Fiala 5997206d57SZachary Turner Status NativeThreadProtocol::RestoreAllRegisters(lldb::DataBufferSP &data_sp) { 60af245d11STodd Fiala NativeRegisterContextSP register_context_sp = GetRegisterContext(); 61af245d11STodd Fiala if (!register_context_sp) 6297206d57SZachary Turner return Status("no register context"); 63af245d11STodd Fiala return register_context_sp->ReadAllRegisterValues(data_sp); 64af245d11STodd Fiala } 65