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