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