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 &reg_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 &reg_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